// PopupCalendar. (C) 2000-2005, Virtual Technologies Ltd.
function Calendar() {
	this.gPopUp = false;
	this.gWinCal = null;
	this.gReturnItem = null;
	this.originalDate = null;
	this.currentDate = new Date();
		
	// Названия месяцев и дней недели
	if (isIE) {
		this.gMonthsNames = [
				"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
				"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь",
				"Ошибка"
				];
		this.gWeekDaysNames = ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"];
	} else {
		this.gMonthsNames = [
				"January", "February", "March", "April", "May", "June",
				"July", "August", "September", "October", "November", "December",
				"Error"
			];
		this.gWeekDaysNames = ["Su", "Mo", "Tu", "Wd", "Th", "Fr", "Sa"];
	}

	//визуальные свойства
//	this.gLinkColor="black";
	this.gOutputFormat = "DD.MM.YYYY";
//	this.gBGColor = "#d0f0f0"; //"#D0D0D0";
//	this.gTblBGColor = "#B0E0E0";
//	this.gFGColor = "black";
//	this.gFontFace = "Arial";
//	this.gTextColor = "black";
//	this.gHeaderColor="darkblue";
//	this.gHeaderBGColor = "#d0e0e0";
//	this.gWeekEndColor = "red";
//	this.gWeekEndBGColor = "#a0d0d0";
	this.gCalendarStyle = "Russian";

	//методы
	/** Получить имя месяца */
	this.getMonthName = function(monthNo) {
		return this.gMonthsNames[Math.min(12, monthNo)];
	}
	/** Получить имя дня недели */
	this.getWeekDayName = function(dayNo) {
		return this.gWeekDaysNames[dayNo % 7];
	}
	/** Выполнить операцию над месяцем. */
	this.addMonth = function(dDate, n) {
		var dDate = new Date(dDate);
		dDate.setMonth(dDate.getMonth() + n);
		return dDate;
	}
	/** Выполнить операцию над днем. */
	this.addDate = function(dDate, n) {
		var dDate = new Date(dDate);
		dDate.setDate(dDate.getDate() + n);
		return dDate;
	}
	
	/** Вывод HTML-кода отображения календаря */	
	this.show = function() {
		//	Здесь начинается страница.
		var stLink = "../common/styles/ws4.css";
		if (document.location.href.toLowerCase().indexOf("common") >= 0)
			stLink = "../styles/ws4.css";
		var s = "<html" + ">"
			+"<head" + "><title>...&nbsp;&nbsp;Calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
			+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</title>"
			+"<META http-equiv='Content-Type' content='text/html; charset=windows-1251'>"
			+"<link href='" + stLink + "' rel='STYLESHEET' type='text/css' />"
			+"</head>"
			+"<body"
			+" topmargin=0 leftmargin=0 marginwidth=0 marginheight=0"
			+" style='border: 1 solid #7F7F7F;"
			+" background-color: #EAE9E8;"
			+" overflow:hidden;" 
			+" margin-left: 20px;"
			+" margin-right: 0px;'"
//			+" bgcolor='"+this.gBGColor+"'"
//			+" link='" + this.gLinkColor + "'"
//			+" vlink='" + this.gLinkColor + "'"
//			+" alink='" + this.gLinkColor + "'"
//			+" text='" + this.gTextColor + "'"
			+">"
			+ this.makeHTML()
			;
		if (isIE)
			s += "<script>document.frm.selMonth.focus()</script>";
		s += "</body" + "></html" + ">";
		this.gWinCal.document.open();
		this.gWinCal.document.write(s)
		this.gWinCal.document.close();
	}

	/** Генерация HTML-кода для отображения календаря */	
	this.makeHTML = function() {
		if (this.currentDate == null)
			this.currentDate = new Date();
		else if (this.currentDate.getFullYear() == 1970
				&& this.currentDate.getMonth() == 0
				&& this.currentDate.getDate() == 1)
			this.currentDate = new Date();
		else
			this.currentDate = new Date(this.currentDate.getTime());
		//	Здесь начинается страница.
		var s = "<form id=frm name=frm>";

		var prevYear = this.addMonth(this.currentDate, -12);	
		var prevMonth = this.addMonth(this.currentDate, -1);	
		var nextYear = this.addMonth(this.currentDate,  12);	
		var nextMonth = this.addMonth(this.currentDate,  1);	
		
		s += "<TABLE id='wsCalendar' cellspacing=0"
			+"><TR><td align=center valign=top>";
		// Показать навигационные кнопки
		s += "<TABLE id='wsNavigator' cellspacing=0 width=100% height=40"
			+"><colgroup><col align=left width='1'><col align=right width='*'><col align=center width='1'><col align=center width='1'><col align=left width='*'><col align=right width='1'></colgroup"
			+"><TR>"
			;
		s += this.makeButton(prevYear, prevYear.getFullYear());
		s += this.makeButton(prevMonth, "&lt;&lt;");
		s += "<td>" + this.makeYearSelector(this.currentDate) + "</td>";
		s += "<td>" + this.makeMonthSelector(this.currentDate) + "</td>";
		s += this.makeButton(nextMonth, "&gt;&gt;");
		s += this.makeButton(nextYear, nextYear.getFullYear());
		s += "</TR></TABLE>";
		
		// Рисуем календарь..
		s += "<table id='wsPanel' width=100% cellspacing=0 cellpadding=0 border=0>"
			+"<colgroup><col align=center width='33%'><col align=center width='33%'><col align=center width='33%'></colgroup>"
			+ "<tr>"
			+ this.makeButton(prevMonth, this.getMonthName(prevMonth.getMonth()))
			+ this.makeButton(this.currentDate, "<b>" + this.getMonthName(this.currentDate.getMonth()) + "</b>")
			+ this.makeButton(nextMonth, this.getMonthName(nextMonth.getMonth()))
			+ "</tr></table>"
			+ "<table width=100% cellspacing=0 height=130 cellpadding=0 border=0>"
			+ "<tr>"
			+ "<td>&nbsp;</td>"
			+ "<td>" + this.makeCalendarPanel(-1) + "</td>"
			+ "<td>&nbsp;&nbsp;&nbsp;</td>"
			+ "<td>" + this.makeCalendarPanel(0) + "</td>"
			+ "<td>&nbsp;&nbsp;&nbsp;</td>"
			+ "<td>" + this.makeCalendarPanel(1) + "</td>"
			+ "<td>&nbsp;&nbsp;</td>"
			+ "</tr></table>"
			;
		var dToday = new Date();
		s += "<TABLE id='wsGoToday' cellspacing=0 width=100%" 
			+"><TR>";
		s += "<TD align='right'>Сегодня "+ dToday.getDate() + ",</TD>";
		s += this.makeButton(new Date(), this.getMonthName(dToday.getMonth())+ " " + dToday.getYear());
		s += "</TR></TABLE>";

		s += "</td></tr></table></form>";
		return s;
	}

	/** Сформировать навигационную кнопку */
	this.makeButton = function(curDate, sTxt) {
		var s = "<TD>";
		if ((isIE)&&(!this.gPopUp))
			s += "<a href=\"javascript:";
		else
			s += "<a href='#' onclick=\"";
		
		if (this.gPopUp)
			s +="parent.Build_Calendar(";
		else
			s +="window.opener.Build_Calendar(";
		
		s += curDate.getFullYear() + "," + curDate.getMonth()
			+");\">" + sTxt + "</a>"
			+ "</TD>";
		return s;
	}
	
	/** Сформировать селектор месяцев */
	this.makeMonthSelector = function(curDate) {
		var s = "<select style='width:100' name=selMonth onchange='";
		if ((isIE)&&(!this.gPopUp))
			s += "window.opener.Build_Calendar(";
		else
			s += "parent.Build_Calendar(";
//		if (this.gPopUp)
//			s += "parent.Build_Calendar(";
//		else
//			s += "window.opener.Build_Calendar(";
			
		s += curDate.getFullYear() + ", this.selectedIndex"
			+ ")'>";
		var i;
		for(i = 0; i < 12; i++) {
			s += "<option value='" + i + "'";
			if (i == curDate.getMonth())
				s += " selected";
			s += ">" + this.getMonthName(i) + "</option>";
		}
		s += "</select>";
		return s;
	}
	
	/** Сформировать селектор лет */
	this.makeYearSelector = function(curDate) {
		var s;
		s = "<select style='width:60' onchange='";
		if ((isIE)&&(!this.gPopUp))
			s += "window.opener.Build_Calendar(";
		else
			s += "parent.Build_Calendar(";
//		if (this.gPopUp)
//			s += "parent.Build_Calendar(";
//		else
//			s += "window.opener.Build_Calendar(";
			
		s += " 1900 + this.selectedIndex, " + curDate.getMonth() 
			+")'>";
		var i = 1900;
		var n = 2100;
		for(; i < n; i++) {
			s += "<option value='" + i + "'";
			if (i == curDate.getFullYear())
				s += " selected";
			s += ">" + i + "</option>";
		}
		s += "</select>";
		return s;
	}
	
	/** Сформировать панель календаря для текущей даты */
	this.makeCalendarPanel = function(deltaMonth) {
		var s = "<TABLE id='wsPanel' width=100%"
				+" cellspacing=0"
				+">"
				+ this.makeHeader()
				+ this.makeDays(deltaMonth)
				+ "</TABLE>"
				;
		return s;
	}

	/** Сформировать строку дней недели */
	this.makeHeader = function() {
		var vCode = "";
		var i, n;
		if (this.gCalendarStyle == "Russian") {
			i = 1; n = 8;
		} else {
			i = 0; n = 7;
		}
		vCode += "<TR>";
		for(; i < n; i++) {
			var ids = "wsWeekDayLabel";
			if (i == 6 || i % 7 == 0) {
				ids = "wsWeekEndLabel";
			}
			vCode += "<TD id='" + ids + "'>"
					+ this.getWeekDayName(i % 7) 
					+"</TD>"
					;
		}
		vCode += "</TR>";
		return vCode;
	}

	/** Сформировать дни месяца */	
	this.makeDays = function(deltaMonth) {
		var vDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), 1);
		vDate.setMonth(vDate.getMonth() + deltaMonth);
		var actMonth = vDate.getMonth();
		var vFirstDay = vDate.getDay();
		if (this.gCalendarStyle == "Russian")		
			vFirstDay--;
		if (vFirstDay < 0)
			vFirstDay += 7;
		if (vFirstDay != 0)
			vDate = this.addDate(vDate, -vFirstDay);
		var vCode = "";	
		var w;
		for(w = 0; w < 6; w++) {
			vCode += "<tr>";
			var d;
			for(d = 0; d < 7; d++) {
				if (vDate.getMonth() == actMonth)
					vCode += this.makeDayButton(vDate, d);
				else
					vCode += "<td>&nbsp;</td>";
				vDate.setDate(vDate.getDate() + 1);
			}
			vCode += "</tr>";
		}
		return vCode;
	}

	/** Сформировать кнопку выбора дня */
	this.makeDayButton = function(vDate, weekDay) {
		var isCurrentMonth = vDate.getFullYear() == this.currentDate.getFullYear()
					&& vDate.getMonth() == this.currentDate.getMonth()
					;
		var isOriginal = false;
		if (this.originalDate != null) {
			isOriginal = vDate.getFullYear() == this.originalDate.getFullYear()
					&& vDate.getMonth() == this.originalDate.getMonth()
					&& vDate.getDate() == this.originalDate.getDate()
					;
		}
		var isWeekEnd = this.isWeekEnd(weekDay);
		var isToday = new Date();
		isToday = vDate.getFullYear() == isToday.getFullYear()
					&& vDate.getMonth() == isToday.getMonth()
					&& vDate.getDate() == isToday.getDate()
					;
		var s = "<TD>";
		if (!isIE)
			s += "<a href=\"javascript:";
		else
			s += "<a href='#' onclick=\"";
		if (this.gPopUp)
			s += "parent.document.";
		else
			s += "self.opener.document.";

		s += this.gReturnItem + ".value='" + this.format(vDate)+"';"

		if (!this.gPopUp)
			s +="window.close();"
		else
			s +="parent.vWinCal.hide();"
		s +="\"";
		if (isOriginal) s += "id='wsOriginal'";
		s += "\">"
			;
		if (isCurrentMonth) s += "<span style='color:#404040'>";
		if (isToday) s += "<span style='color:red'>";
		if (isWeekEnd) s+= "<span style='font-weight:bold'>";
		s += vDate.getDate();
		if (isWeekEnd) s += "</span>";
		if (isToday) s += "</span>";
		if (isCurrentMonth) s += "</span>";
		s +=  "</A>"
			+ "</TD>\r\n"
			;
		return s;
	}
	
	// Return special formatting for the weekend day.
	this.isWeekEnd = function(weekday) {
		if (	weekday == 6 
			|| (weekday == 0 && this.gCalendarStyle != "Russian") 
			|| ((weekday == 5 && this.gCalendarStyle == "Russian")))
			return true;(" BGCOLOR=\"" + this.gWeekEndBGColor + "\"");
		return false;
	}
	
	/** Преобразование строки в дату */
	this.convert = function(s) {
		if (s == null || s.length == 0)
			return null;
		
		// удалить конечные пробелы
		var n = s.length - 1;
		while( n >= 0 ) {
			if ( s.charAt( n ) != ' ' )
				break;
			n--;
		}
		s = s.substring(0, n + 1);
		// удалить начальные пробелы
		var n = s.length;
		var i = 0;
		while( i < n ) {
			if ( s.charAt( i ) != ' ' )
				break;
			i++;
		}
		s = s.substring( i, n );
		
		while( s.indexOf(",") > 0 ) {
			s = s.replace(",", ".");
		}
		while( s.indexOf("/") > 0 ) {
			s = s.replace("/", ".");
		}
		while( s.indexOf("-") > 0 ) {
			s = s.replace("-", ".");
		}
		while( s.indexOf("  ") > 0 ) {
			s = s.replace("  ", " ");
		}
		while( s.indexOf(" ") > 0 ) {
			s = s.replace(" ", ".");
		}

		var d = new Date();
		var y, m, d, hh, mm;
		y = d.getYear();
		m = d.getMonth();
		d = d.getDate();
		hh = 0;
		mm = 0;
		var i = s.indexOf('.');
		if (i > 0) {
			d = parseInt(s.substring(0, i), 10);
			s = s.substring(i + 1);
			i = s.indexOf('.');
			if (i > 0) {
				m = parseInt(s.substring(0, i), 10) - 1;
				s = s.substring(i + 1);
				y = parseInt(s, 10);
				if (y < 30)
					y += 2000;
			} else {
				m = parseInt(s, 10) - 1;
			}
			if (this.gOutputFormat.substring(0, 5) == "MM.DD")
			{
				var tmp = d - 1;
				d = m + 1;
				m = tmp;
			}
		} else {
			d = parseInt(s, 10);
		}
		i = s.indexOf(' ');
		if (i > 0) {
			s = s.substring(i + 1);
			hh = parseInt(s, 10);
			i = s.indexOf(':');
			if (i > 0) {
				s = s.substring(i + 1);
				mm = parseInt(s, 10);
			}
		}
		return new Date(y, m, d, hh, mm);
	}
	
	/** Форматирует данные в зависимости от запрошенного формата */
	this.format = function(dDate) {
		if (dDate == null) return "";
		if (isNaN(dDate)) return "";
		var vDD = new String(dDate.getDate());
		if (vDD.length < 2) 		vDD = "0" + vDD;
		var vMM = new String(dDate.getMonth()+1);
		if (vMM.length < 2) 		vMM = "0" + vMM;
		var vMONTH = this.getMonthName(dDate.getMonth());
		var vMON = vMONTH.substr(0,3).toUpperCase();
		var vYYYY = new String(dDate.getFullYear());
		var vYY = vYYYY.substr(2,2);
	
		switch (this.gOutputFormat) {
			case "YYYYMMDD": 		return vYYYY + vMM + vDD;

			case "DD.MM.YYYY": 		return vDD + "." + vMM + "." + vYYYY;
			case "DD/MM/YYYY":		return vDD + "/" + vMM + "/" + vYYYY;
			case "DD/MM/YY":		return vDD + "/" + vMM + "/" + vYY;
			case "DD-MM-YYYY": 		return vDD + "-" + vMM + "-" + vYYYY;
			case "DD-MM-YY": 		return vDD + "-" + vMM + "-" + vYY;
	
			case "MM.DD.YYYY": 		return vMM + "." + vDD + "." + vYYYY;
			case "MM/DD/YYYY":		return vMM + "/" + vDD + "/" + vYYYY;
			case "MM/DD/YY":		return vMM + "/" + vDD + "/" + vYY;
			case "MM-DD-YYYY": 		return vMM + "-" + vDD + "-" + vYYYY;
			case "MM-DD-YY": 		return vMM + "-" + vDD + "-" + vYY;
	
			case "DD MON YYYY": 	return vDD + " " + vMON + " " + vYYYY;
			case "DD/MON/YYYY": 	return vDD + "/" + vMON + "/" + vYYYY;
			case "DD/MON/YY":	 	return vDD + "/" + vMON + "/" + vYY;
			case "DD-MON-YYYY": 	return vDD + "-" + vMON + "-" + vYYYY;
			case "DD-MON-YY": 		return vDD + "-" + vMON + "-" + vYY;
	
			case "DD MONTH YYYY": 	return vDD + " " + vMONTH + " " + vYYYY;
		}
		return vDD + " " + vMON + " " + vYYYY;
	}	
}

function Build_Calendar(p_year, p_month) {
	if (p_year == null || p_year == 0)
		gCal.currentDate = new Date();
	else
		gCal.currentDate = new Date(p_year, p_month, 1);
	gCal.show();
}

/* 
	p_month : 0-11 для Янв-Дек;
	p_year	: 4-символа год
	p_format: Формат Даты (mm/dd/yyyy, dd/mm/yy, ...)
	p_item	: Return Item.
*/
function show_calendar(p_form, p_field, outputFormat, src_item) {
	var p_item = p_form + "." + p_field;
	var v = eval("document." + p_item);
	var p_date = v.value;

	gCal = new Calendar();
	if (outputFormat == null)	outputFormat = "DD.MM.YYYY";
	gCal.gOutputFormat = outputFormat;
	
	if (window.createPopup != null) {
		vWinCal = window.createPopup();
		vWinCal.document.body.scroll = 'no';
		vWinCal.show(10, 10, 500, 230, v);
		gCal.gPopUp = true;
	} else {
		//обработка потери фокуса календариком
		window.onfocus = function() {
			window.onfocus = null;
			if (!vWinCal.closed)
				vWinCal.close();
		}
		vWinCal = window.open("", "Calendar", "width=460,height=220,status=no,resizable=no,top=200,left=200");
		vWinCal.opener = self;
		gCal.gPopUp = false;
	}
	
	p_date = gCal.convert(p_date);
	gCal.originalDate = p_date;
	if (p_date == null) {
		p_date = new Date();
	} else {
		v.value = gCal.format(p_date);
	}		
	p_month = p_date.getMonth();
	p_year = p_date.getFullYear();
	// Показываем календарь
	gCal.gWinCal = vWinCal;
	gCal.gReturnItem = p_item;

	Build_Calendar(p_year, p_month);
}

function c2date(d) {
	return gCal.convert(d);
}
function date2s(d) {
	var tmpCal = new Calendar();
	tmpCal.gOutputFormat = "YYYYMMDD";
	return tmpCal.format(d);
}
function date2c(d, outputFormat) {
	var tmpCal = new Calendar();
	tmpCal.gOutputFormat = outputFormat;
	return tmpCal.format(d);
}
function submitDate(frm, fld)
{
	var d = frm[fld + "_"].value;
	if (d.indexOf("+") == 0 || d.indexOf("-") == 0)
	{
		frm[fld].value = d;
		return;
	}
	frm[fld].value = date2s(c2date(d));
}

var isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;
// Определяем версию Internet Explorer
if (isIE) {
	var rg = new RegExp("MSIE ([0-9]+)\.([0-9]+)", "i");
	rg.exec(navigator.appVersion);
	var IEVersion=parseFloat(RegExp.$1+"."+RegExp.$2);
}
	
var gNow = new Date();
var vWinCal;
var gCal = new Calendar();
gCal.gOutputFormat = vtCalculatorOutputFormat;
