//--------------------------------------------------------------------------------------
function showPulldowns()
{
	var sels = document.body.getElementsByTagName("SELECT");
	if ( sels ) {
		for ( var i = 0; i < sels.length; i++ ) 
			sels[i].style.visibility="visible";
	}
}
//--------------------------------------------------------------------------------------
function hidePulldowns(left,top,right,bottom)
{
	var sels = document.body.getElementsByTagName("SELECT");
	var sel;
	if ( sels ) {
		for ( var i = 0; i < sels.length; i++ ) 
		{
			sel = sels[i];
			if (!sel.coords)
			{
				sel.coords={'left':GetX(sel),'top':GetY(sel)};
				sel.coords.bottom=sel.coords.top + sel.offsetHeight;
				sel.coords.right=sel.coords.left + sel.offsetWidth;
			}
			//!(sel.top > bottom || sel.bottom < top || sel.left > right || sel.right < left)
			// ^^^ out of bounds rule - invert and get the following
			if(		sel.coords.top    < bottom 
				&&  sel.coords.bottom > top 
				&&  sel.coords.left   < right 
				&&  sel.coords.right  > left)
				sel.style.visibility="hidden";
		}
	}
	return;
}
//--------------------------------------------------------------------------------------
var months = new Array('January','February','March','April','May',
						'June','July','August','September','October',
						'November','December');
var Days = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var __calendarDateFormat=101;
var __calendar_date_rx = new RegExp(getDateRegExp(__calendarDateFormat));
function setCalendarDateFormat(num)
{
	__calendarDateFormat= Number(num) ||  __calendarDateFormat ;
	__calendar_date_rx = new RegExp(getDateRegExp(__calendarDateFormat));
}
//----------------------------------------------------------------------------------------------------
function Date2Str(d) {
	var format_str;
	switch (__calendarDateFormat)
	{
	case 104:
		format_str="d.m.Y";
		break;
	default:
		format_str="m/d/Y";
	}
	return DateToStr(d,format_str);
}
//----------------------------------------------------------------------------------------------------
function getParsableString(str)
{
	var ret,arr;
	switch (__calendarDateFormat)
	{
	case 104:
		arr = str.split(".");
		ret = arr[1] + "/" + arr[0] + "/" + arr[2];
		break;
	default:
		ret=str;
	}
	return ret;
}
//----------------------------------------------------------------------------------------------------
function getDateRegExp(format)
{
	var day30 = '(30|[12][0-9]|0?[1-9])';
	var day30m = '(11|0?[469])';
	var day31 = '(3[01]|[12][0-9]|0?[1-9])';
	var day31m = '(1[02]|0?[13578])';
	var day28 =  '(2[0-8]|1[0-9]|0?[1-9])';
	var day29 = '([12][0-9]|0?[1-9])';
	
	var leap  =   '20([02468][048]|[13579][26])';
	var nonleap = '20([02468][1235679]|[13579][01345789])';
	if (!format)
		format=101;
	if (format == 101)
		return  "(" + day31m + "/" + day31 + "|" +
				day30m + "/" + day30 + ")/20\\d\\d|" + 
				"0?2/(" + day28 + "/" + nonleap + "|" +
				"" + day29 + "/" +leap + ")";
	if (format == 120)
		return "(" + leap + "-(0?2-" + day29 + "|" + day31m + "-" + day31 + "|" +
				 day30m + "-" + day30 + ")|" + 
				 nonleap + "-(0?2-" + day28 + "|" + day31m + "-" + day31 + "|" +
				 day30m + "-" + day30 + "))";

}
//---------------------------------------------------------------------------------------------------
// converts date to string according format string.
function DateToStr(date,date_format) {
// date format:
//	d 		- date (2 digits)
//	lday	-	full day name
//	sday	-	three letters shortening day
//	m		-	month (two digits)
//	mon		-	month (three-letter shortening)
//	month	-	full month's name
//	y		-	two digits year
//	Y		-	four digits year
	var res=date_format || "d/m/Y";
	var subst={};
	var d =date.getDate();
	subst['d'] = String(d).length == 1 ? "0" + String(d) : String(d);
	var m = date.getMonth()+1;
	subst['m'] = String(m).length == 1 ? "0" + String(m) : String(m);
	subst.month = months[date.getMonth()];
	subst['mon'] = subst.month.substr(0,3);
	subst['lday'] = Days[date.getDay()]
	subst['sday'] = subst['lday'].substr(0,3);
	var min = date.getMinutes();
	subst['min'] = String(min).length == 1 ? "0" + String(min) : String(min);
	var h = date.getHours();
	subst['h'] = String(h).length == 1 ? "0" + String(h) : String(h);
	var s = date.getSeconds();
	subst['s'] = String(s).length == 1 ? "0" + String(s) : String(s);
	subst['Y'] = String(date.getFullYear());
	subst['y'] = subst['Y'].substr(2);
	var rx = new RegExp("(?:mon(?:th)?|[ls]day|m[oi]n|[dmhsyY])","g");
	var rxfunc = function($0){return subst[$0]};
	res = res.replace(rx,rxfunc);
	return(res);
}
//---------------------------------------------------------------------------------------------------
function time_int_itself(when)
{
	var from = new Date(),till = new Date();
	switch(when)
	{
		case 'today':
			till.setDate(till.getDate()+1);
			break;
		case 'yesterday':
			from.setDate(from.getDate()-1);
			break;
		case 'this week':
			from.setDate(from.getDate() -  from.getDay() + 1)
			till.setDate(till.getDate() + 7 -  till.getDay() + 1)
			break;
		case 'last week':
			from.setDate(from.getDate() - 7 -  from.getDay() + 1)
			till.setDate(till.getDate() -  till.getDay() + 1)
			break;
		case 'this month':
			from.setDate(1);
			till.setMonth(till.getMonth()+1);
			till.setDate(1);
			break;
		case 'last month':
			from.setMonth(from.getMonth()-1);
			from.setDate(1);
			till.setDate(1);
			break;
		case 'this year':
			from.setMonth(0);
			from.setDate(1);
			till.setFullYear(till.getFullYear() +1);
			till.setMonth(0);
			till.setDate(1);
			break;
		case 'last year':
			from.setFullYear(from.getFullYear()-1);
			from.setMonth(0);
			from.setDate(1);
			till.setMonth(0);
			till.setDate(1);
			break;
		default:
			return["",""];
	}
	return [from,till];
}
/////////////////////-----------------------------------------------------------------
function time_int(when,formname,date_from,date_till)
{
	var interval = time_int_itself(when);
	date_from = date_from || "date_from";
	date_till = date_till || "date_till";
	var form=document.forms[formname];
	if (!form)
		return;
	if (form[date_from])	
		form[date_from].value=interval[0]? Date2Str(interval[0]) : "";
	if (form[date_till])	
		form[date_till].value=interval[1]? Date2Str(interval[1]) : "";
}
/////////////////////-----------------------------------------------------------------
function isStrDate(strDate) {
	return __calendar_date_rx.test(strDate);
}

function GetMonthName(num) {
	var res="";
	switch(num) {
		case 0: res="January"; break;
		case 1: res="February"; break;
		case 2: res="March"; break;
		case 3: res="April"; break;
		case 4: res="May"; break;
		case 5: res="June"; break;
		case 6: res="July"; break;
		case 7: res="August"; break;
		case 8: res="September"; break;
		case 9: res="October"; break;
		case 10: res="November"; break;
		case 11: res="December"; break;
	}
	return(res);
}

function DaysInMonth(d) {
	var tmp=new Date(d);
	tmp.setDate(1);
	tmp.setMonth(tmp.getMonth()+1);
	tmp.setDate(tmp.getDate()-1);
	return(tmp.getDate());
}

//------------------------------------------------------------------------------------------
function GetX(input) {
  var img=input;
  var X=0;
  do {X+=img.offsetLeft;} while (img=img.offsetParent);
  return X;
}
//------------------------------------------------------------------------------------------
function GetY(input) {
  var img=input;
  var Y=0;
  do {Y+=img.offsetTop} while ((img=img.offsetParent)!=null);
  return(Y);
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
function ShowCalendar(input) {
	// IE check
	if (navigator.appName!="Microsoft Internet Explorer") return;

	var left = document.all["calendar"].style.left = GetX(document.all["img_" + input]) - document.all["calendar"].style.width;
	var top = document.all["calendar"].style.top = GetY(document.all["img_" + input]) + document.all["img_" + input].height;
	var right = left + calendar.offsetWidth;
	var bottom = top + calendar.offsetHeight;
	hidePulldowns(left,top,right,bottom);
	document.all["calendar"].style.visibility="visible";
	DrawMonth(input,document.all[input].value);
}
//------------------------------------------------------------------------------------------
function HideCalendar() {
	// IE check
	if (navigator.appName!="Microsoft Internet Explorer") return;
	if (String(document.all["calendar"].style) == "undefined") return;

	document.all["calendar"].style.visibility="hidden";
	showPulldowns();
}
//------------------------------------------------------------------------------------------
function DrawMonth(input,datestr) {
	var sel_d=new Date();
	if (datestr)
		sel_d=new Date(Date.parse(getParsableString(datestr)));
	
	var d=new Date();
	var month,day;
	if (datestr)
		d=new Date(Date.parse(getParsableString(datestr)));
	document.all["monthname"].innerHTML=GetMonthName(d.getMonth())+", "+d.getFullYear();
	
	var tmp=new Date(d);
	tmp.setDate(1);
	tmp.setDate(tmp.getDate()-1);
	document.all["prevmonth"].href="javascript:DrawMonth('"+input+"','"+Date2Str(tmp)+"');";
	tmp.setDate(tmp.getDate()+1);
	tmp.setMonth(tmp.getMonth()+1);
	document.all["nextmonth"].href="javascript:DrawMonth('"+input+"','"+Date2Str(tmp)+"');";
	
	tmp=new Date(d);
	tmp.setDate(1);
	var firstcol=tmp.getDay();
	var firstrow=1;
	if (firstcol==0)
		firstrow=2;
	tmp.setDate(1-((firstrow-1)*7+firstcol));
	for (var i=1; i<=6; i++) {
		for (var j=0; j<=6; j++) {
			var id="d"+i+"-"+j;
			var cell="c"+i+"-"+j;
			document.all[id].href="javascript:SetDate('"+input+"','"+Date2Str(tmp)+"');";
			document.all[id].innerHTML=tmp.getDate();

			document.all[cell].style.backgroundColor="#ffffff";
			
			if (d.getMonth()==tmp.getMonth()) {
				document.all[id].style.fontWeight="normal";
				document.all[id].style.color="#000000";
				document.all[id].style.textDecoration="none";
			}
			else {
				document.all[id].style.fontWeight="normal";
				document.all[id].style.color="#888888";
				document.all[id].style.textDecoration="none";
			}

			if (tmp.getDate()==sel_d.getDate()&&
				tmp.getMonth()==sel_d.getMonth()&&
				tmp.getFullYear()==sel_d.getFullYear()) {
				document.all[id].style.color="#ffffff";
				document.all[id].style.fontWeight="bold";
				document.all[id].style.textDecoration="none";
				document.all[cell].style.backgroundColor="#000000";
			}
			tmp.setDate(tmp.getDate()+1);
		}
	}
	var str=Date2Str(new Date());
	document.all["today_link"].href="javascript:SetDate('"+input+"','"+str+"');";
	document.all["today_link"].innerHTML="Today: "+str;
}

function SetDate(input,value) {
	HideCalendar();
	var inp = document.all[input];
	var oldvalue = inp.value;
	inp.value=value;
	if (inp.onchange && !inp.onchange())
		inp.value=oldvalue
}
