/* --------------------------------------------------------------
	FileName: 	VSICalendar.js
	Author:		Simon Laing
	Date:		08/10/2007
	Purpose:	Javascript routines for use with VSICalendar .net UserControl

	Dependancies:	None
	Depended upon:	VSICalendar.ascx

	Notes:		Do not modify this file directly, modify the Code base, then redistribute
	
	History:	08/10/2007: File Created (Simon Laing)
---------------------------------------------------------------*/

/* ----------------------- Constants ------------------------- */

var month=new Array(12);
month[0]="January";
month[1]="February";
month[2]="March";
month[3]="April";
month[4]="May";
month[5]="June";
month[6]="July";
month[7]="August";
month[8]="September";
month[9]="October";
month[10]="November";
month[11]="December";

var daysInMonth=new Array(12);
daysInMonth[0]=31;
daysInMonth[1]=28;
daysInMonth[2]=31;
daysInMonth[3]=30;
daysInMonth[4]=31;
daysInMonth[5]=30;
daysInMonth[6]=31;
daysInMonth[7]=31;
daysInMonth[8]=30;
daysInMonth[9]=31;
daysInMonth[10]=30;
daysInMonth[11]=31;

var weekday=new Array(7);
weekday[0]="Sunday";
weekday[1]="Monday";
weekday[2]="Tuesday";
weekday[3]="Wednesday";
weekday[4]="Thursday";
weekday[5]="Friday";
weekday[6]="Saturday";

/* ----------------------------------------------------------- */
/* ----------------------- Generics  ------------------------- */

function getOptionIndex(objSelect, value)
{
	var i = 0;
	for (i = 0; i < objSelect.options.length; i++)
	{
		if (objSelect.options[i].value == value)
		{
			return i;
		}
	}

	return -1;
}

function isLeapYear(numYear)
{
	if ((numYear % 4) == 0)
	{
		return true;
	}
	
	return false;
}

function leadingZero(numDigit)
{
	if (numDigit <= 9) return "0" + numDigit;
	return numDigit;
}

function countSelectedDates(objSelectedDates)
{
	if (objSelectedDates.value == "" || objSelectedDates.value == "|")
	{
		return 0;
	}

	var numDates = 0;
	numDates = objSelectedDates.value.split("|").length - 1;
	return numDates;
}

function dateToAmerican(strDate)
{
	var strNewDate = "";
	
	strNewDate = strNewDate + strDate.split("/")[1] + "/";
	strNewDate = strNewDate + strDate.split("/")[0] + "/";
	strNewDate = strNewDate + strDate.split("/")[2];
	
	return strNewDate;
}

/* ----------------------------------------------------------- */
/* ----------------------- Routines  ------------------------- */

function initYears(objSettings)
{
	var cboSelectYear = document.getElementById(objSettings.Context + "_selectYear");
	var numStart = objSettings.YearFrom;
	var numEnd = objSettings.YearTo;
	var i = 0;

	cboSelectYear.length = 0;

	for (i = numStart; i <= numEnd; i++)
	{
		if (objSettings.FourDigitYear == true)
		{
			var objYear = new Option(i, i);
		}
		else
		{
			var numTranslated = i;
			numTranslated = numTranslated - 2000;

			if (numTranslated < 0)
			{
				numTranslated = numTranslated + 100;
			}

			var objYear = new Option(i, numTranslated);
		}
		cboSelectYear.options[cboSelectYear.options.length] = objYear;
	}
}

function moveNextMonth(objSettings)
{
	var dtmCurrentMonth = new Date();
	dtmCurrentMonth.setTime(Date.parse(objSettings.VisibleDate));
	dtmCurrentMonth.setDate(1);
	dtmCurrentMonth.setMonth(dtmCurrentMonth.getMonth() + 1);

	objSettings.VisibleDate = "" + leadingZero(dtmCurrentMonth.getMonth() + 1) + "/" + leadingZero(dtmCurrentMonth.getDate() + 1) + "/" + dtmCurrentMonth.getFullYear();

	displayDates(objSettings);

	if (objSettings.RaiseEventOnMonthChanged == true)
	{
		fire_VisibleMonthChanged(objSettings);
	}
}

function movePrevMonth(objSettings)
{
	var dtmCurrentMonth = new Date();
	dtmCurrentMonth.setTime(Date.parse(objSettings.VisibleDate));
	dtmCurrentMonth.setDate(1);
	dtmCurrentMonth.setMonth(dtmCurrentMonth.getMonth() - 1);

	objSettings.VisibleDate = "" + leadingZero(dtmCurrentMonth.getMonth() + 1) + "/" + leadingZero(dtmCurrentMonth.getDate() + 1) + "/" + dtmCurrentMonth.getFullYear();

	displayDates(objSettings);

	if (objSettings.RaiseEventOnMonthChanged == true)
	{
		fire_VisibleMonthChanged(objSettings);
	}
}

function displayDates(objSettings)
{
	initYears(objSettings);

	if (objSettings.VisibleDate == "")
	{
		//get todays date...
		var dtmToday = new Date();
		objSettings.VisibleDate = "" + leadingZero(dtmToday.getMonth() + 1) + "/" + leadingZero(dtmToday.getDate() + 1) + "/" + dtmToday.getFullYear();
	}

	var tblCalendar = document.getElementById(objSettings.Context);

	var dtmCurrentMonth = new Date();
	dtmCurrentMonth.setTime(Date.parse(objSettings.VisibleDate));

	dtmCurrentMonth.setDate(1); //go to the first day in the month;

	clearDates(objSettings);
	
	setDates(objSettings, dtmCurrentMonth.getDay(), dtmCurrentMonth.getMonth(), dtmCurrentMonth.getFullYear());
	showMonthSelection(objSettings, dtmCurrentMonth.getMonth(), dtmCurrentMonth.getFullYear());
}

function showMonthSelection(objSettings, numSelectedMonth, numYear)
{
	var cboSelectMonth = document.getElementById(objSettings.Context + "_selectMonth");
	var cboSelectYear = document.getElementById(objSettings.Context + "_selectYear");
	var divMonthText = document.getElementById(objSettings.Context + "_monthText");
	var numYearIndex = getOptionIndex(cboSelectYear, numYear);

	cboSelectMonth.selectedIndex = numSelectedMonth;

	if (numYearIndex >= 0 && numYearIndex < cboSelectYear.options.length)
	{
		cboSelectYear.selectedIndex = numYearIndex;
		divMonthText.innerHTML = cboSelectMonth.options[cboSelectMonth.selectedIndex].text + " " + cboSelectYear.options[cboSelectYear.selectedIndex].text;
	}
	else
	{
		cboSelectYear.selectedIndex = -1;
		divMonthText.innerHTML = cboSelectMonth.options[cboSelectMonth.selectedIndex].text + " " + numYear;
	}
}

function changeMonth(objSettings, objSelect)
{
	var dtmCurrentMonth = new Date();
	var cboSelectYear = document.getElementById(objSettings.Context + "_selectYear");
	dtmCurrentMonth.setTime(Date.parse(objSettings.VisibleDate));
	var numMonth = objSelect.options[objSelect.selectedIndex].value;
	var numYear = cboSelectYear.options[cboSelectYear.selectedIndex].value;

	objSettings.VisibleDate = "" + leadingZero(numMonth) + "/01/" + numYear;

	displayDates(objSettings);

	if (objSettings.RaiseEventOnMonthChanged == true)
	{
		fire_VisibleMonthChanged(objSettings);
	}
}

function changeYear(objSettings, objSelect)
{
	var dtmCurrentMonth = new Date();
	dtmCurrentMonth.setTime(Date.parse(objSettings.VisibleDate));
	var numYear = objSelect.options[objSelect.selectedIndex].value;
	var cboSelectMonth = document.getElementById(objSettings.Context + "_selectMonth");
	var numMonth = cboSelectMonth.options[cboSelectMonth.selectedIndex].value;

	objSettings.VisibleDate = "" + leadingZero(numMonth) + "/01/" + numYear;

	displayDates(objSettings);

	if (objSettings.RaiseEventOnMonthChanged == true)
	{
		fire_VisibleMonthChanged(objSettings);
	}
}

function setDates(objSettings, numFirstDay, monthNo, year)
{
	var i = 0;
	var dayNo = 1;

	if (numFirstDay == 0) numFirstDay = 7;

	var numDaysInMonth = daysInMonth[monthNo] + numFirstDay;

	if (isLeapYear(year) == true && monthNo == 1)
	{
		numDaysInMonth = numDaysInMonth + 1;
	}

	for (i = numFirstDay; i < numDaysInMonth; i++)
	{
		var objTD = document.getElementById(objSettings.Context + "_" + i);

		if (objTD)
		{
			objTD.title = leadingZero(dayNo) + "/" + leadingZero(monthNo + 1) + "/" + year;
			objTD.innerHTML = dayNo;
			objTD.className = objSettings.Day;

			if (isDateSelected(objSettings, objTD.title))
			{			
				if (!isTDWeekend(objSettings, objTD))
				{
					objTD.className = objSettings.SelectedDay;
				}
				else
				{
					objTD.className = objSettings.SelectedWeekend;
				}

				if (objSettings.InHiglightRange == true && objSettings.MaximumDates == 2)
				{
					//change the selection css class slightly - to show the difference between date 1 and date 2
					objTD.className = objTD.className + "_End"
				}
			}
			else
			{
				if (isTDHighlighted(objSettings, objTD) == true)
				{
					objTD.className = objSettings.DayHighlighted;
					objSettings.InHiglightRange = true;
				}
			}

			if (isTDDisabled(objSettings, leadingZero(monthNo + 1) + "/" + leadingZero(dayNo) + "/" + year))
			{
				objTD.className = objSettings.DayDisabled;
			}
		}
		else
		{
			alert("could not access: " + objSettings.Context + "_" + i);
		}

		dayNo++;
	}

	showPrevMonthDays(objSettings, numFirstDay);
	showNextMonthDays(objSettings, numFirstDay, monthNo);
}

function isTDDisabled(objSettings, strDate)
{
	var dtmDisableBefore = new Date();
	var dtmDisableAfter = new Date();
	var dtmTD = new Date();

	dtmDisableBefore.setTime(Date.parse(objSettings.DisableBefore));
	dtmDisableAfter.setTime(Date.parse(objSettings.DisableAfter));

	dtmTD.setTime(Date.parse(strDate));

	if (dtmTD.getTime() < dtmDisableBefore.getTime())
	{
		return true;
	}

	if (dtmTD.getTime() > dtmDisableAfter.getTime())
	{
		return true;
	}

	return false;
}

function isTDHighlighted(objSettings, objTD)
{
	var objHighlightDates = document.getElementById(objSettings.txtHighlightDates);
	var strTemp = objHighlightDates.value;
	strTemp = strTemp.replace("|" + objTD.title, "");

	if ((strTemp != objHighlightDates.value || objHighlightDates.value == objTD.title) && objTD.title != "")
	{
		return true;
	}
	else
	{
		return false;
	}
}

function showPrevMonthDays(objSettings, numFirstDay)
{
	var i = 0;
	var dtmCurrentMonth = new Date();
	dtmCurrentMonth.setTime(Date.parse(objSettings.VisibleDate));
	dtmCurrentMonth.setDate(1);

	for (i = numFirstDay - 1; i >= 1; i--)
	{
		dtmCurrentMonth.setDate(dtmCurrentMonth.getDate() - 1);
		var objTD = document.getElementById(objSettings.Context + "_" + i);

		objTD.className = objSettings.DayOtherMonth;
		objTD.title = leadingZero(dtmCurrentMonth.getDate()) + "/" + leadingZero(dtmCurrentMonth.getMonth() + 1) + "/" + dtmCurrentMonth.getFullYear();
		objTD.innerHTML = dtmCurrentMonth.getDate();

		if (objSettings.AllowSelectOtherMonth == false)
		{
			objTD.title = "";
			objTD.innerHTML = "";
		}

		if (isTDHighlighted(objSettings, objTD) == true)
		{
			objTD.className = objSettings.SelectedOtherMonthDay;
			objSettings.InHiglightRange = true;
		}

		if (isDateSelected(objSettings, objTD.title))
		{
			objTD.className = objSettings.SelectedOtherMonthDay;
		}

		if (isTDDisabled(objSettings, leadingZero(dtmCurrentMonth.getMonth() + 1) + "/" + leadingZero(dtmCurrentMonth.getDate()) + "/" + dtmCurrentMonth.getFullYear()))
		{
			objTD.className = objSettings.DayDisabled;
		}
	}
}

function showNextMonthDays(objSettings, numFirstDay, monthNo)
{
	var i = 0;
	var dtmCurrentMonth = new Date();
	dtmCurrentMonth.setTime(Date.parse(objSettings.VisibleDate));

	var numDaysInMonth = daysInMonth[monthNo];

	if (isLeapYear(dtmCurrentMonth.getFullYear()) == true && monthNo == 1)
	{
		numDaysInMonth = 29;
	}

	dtmCurrentMonth.setDate(numDaysInMonth);

	for (i = numDaysInMonth + numFirstDay; i <= 42; i++)
	{
		dtmCurrentMonth.setDate(dtmCurrentMonth.getDate() + 1);
		var objTD = document.getElementById(objSettings.Context + "_" + i);

		objTD.className = objSettings.DayOtherMonth;
		objTD.title = leadingZero(dtmCurrentMonth.getDate()) + "/" + leadingZero(dtmCurrentMonth.getMonth() + 1) + "/" + dtmCurrentMonth.getFullYear();
		objTD.innerHTML = dtmCurrentMonth.getDate();

		if (objSettings.AllowSelectOtherMonth == false)
		{
			objTD.title = "";
			objTD.innerHTML = "";
		}

		if (isTDHighlighted(objSettings, objTD) == true)
		{
			objTD.className = objSettings.SelectedOtherMonthDay; 
			objSettings.InHiglightRange = true;
		}

		if (isDateSelected(objSettings, objTD.title))
		{
			objTD.className = objSettings.SelectedOtherMonthDay;
		}

		if (isTDDisabled(objSettings, leadingZero(dtmCurrentMonth.getMonth() + 1) + "/" + leadingZero(dtmCurrentMonth.getDate()) + "/" + dtmCurrentMonth.getFullYear()))
		{
			objTD.className = objSettings.DayDisabled;
		}
	}
}

function isDateSelected(objSettings, strDate)
{
	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);
	var strTemp = objSelectedDates.value;
	strTemp = strTemp.replace("|" + strDate, "");

	if (strTemp != objSelectedDates.value && strDate != "")
	{
		return true;
	}
	else
	{
		return false;
	}
}

function clearDates(objSettings)
{
	var i = 0;
	for (i = 1; i <= 42; i++)
	{
		var objTD = document.getElementById(objSettings.Context + "_" + i);
		objTD.title = "";
		objTD.innerHTML = "";
		if (isTDWeekend(objSettings, objTD))
		{
			objTD.className = objSettings.Weekend;
		}
		else
		{
			objTD.className = objSettings.Day;
		}
	}
}

function isTDWeekend(objSettings, objTD)
{
	var numDay = objTD.id.replace(objSettings.Context + "_", "");

	if (numDay % 7 == 0)
	{
		return true;
	}

	numDay++;

	if (numDay % 7 == 0)
	{
		return true;
	}

	return false;
}

function isTDSelected(objSettings, objTD)
{
	if (objTD.className == objSettings.SelectedDay || 
	    objTD.className == objSettings.SelectedWeekend || 
	    objTD.className == objSettings.SelectedOtherMonthDay)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function removeAllDates(objSettings)
{
	var i = 0;
	for (i = 1; i <= 42; i++)
	{
		var objTD = document.getElementById(objSettings.Context + "_" + i);

		if (objTD.className == objSettings.SelectedDay)
		{
			objTD.className = objSettings.Day;
		}

		if (objTD.className == objSettings.SelectedOtherMonthDay)
		{
			objTD.className = objSettings.DayOtherMonth;
		}

		if (objTD.className == objSettings.SelectedWeekend)
		{
			objTD.className = objSettings.Weekend;
		}
	}

	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);
	objSelectedDates.value = "";
}

function fire_SelectedDateChanged(objSettings)
{
	var strEventTriggerButton = objSettings.btnSelectedDateChanged;
	var strVisibleDateAsp = objSettings.txtVisibleDate;
	var objEventTriggerButton = document.getElementById(strEventTriggerButton);
	var objVisibleDateAsp = document.getElementById(strVisibleDateAsp)

	if (!objEventTriggerButton)
	{
		alert("Could not access required elements to perform postback!");
		return;
	}

	objVisibleDateAsp.value = objSettings.VisibleDate;

	if (objSettings.RaiseEventOnDateChanged == true)
	{
		objEventTriggerButton.click();
	}

	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);
}

function fire_VisibleMonthChanged(objSettings)
{
	var strEventTriggerButton = objSettings.btnVisibleMonthChanged;
	var strVisibleDateAsp = objSettings.txtVisibleDate;
	var objEventTriggerButton = document.getElementById(strEventTriggerButton);
	var objVisibleDateAsp = document.getElementById(strVisibleDateAsp)

	if (!objEventTriggerButton)
	{
		alert("Could not access required elements to perform postback!");
		return;
	}

	objVisibleDateAsp.value = objSettings.VisibleDate;

	if (objSettings.RaiseEventOnMonthChanged == true)
	{
		objEventTriggerButton.click();
	}
}

function toggleDay(objSettings, objTD)
{
	var blnAdd = false;
	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);

	if (objTD.className == objSettings.DayDisabled)
	{
		return false;
	}

	if ((objTD.className == objSettings.DayOtherMonth || objTD.className == objSettings.SelectedOtherMonthDay ) && objSettings.AllowSelectOtherMonth == false)
	{
		return false;
	}

	if (!isTDSelected(objSettings, objTD))
	{
		var numSelectedDates = countSelectedDates(objSelectedDates);
		if (numSelectedDates >= objSettings.MaximumDates && objSettings.MaximumDates > 0)
		{
			alert(objSettings.MaximumDateSelectionMessage);
			return;
		}			

		if (objTD.className == objSettings.Day) {objTD.className = objSettings.SelectedDay}
		if (objTD.className == objSettings.Weekend) {objTD.className = objSettings.SelectedWeekend}
		if (objTD.className == objSettings.DayOtherMonth) {objTD.className = objSettings.SelectedOtherMonthDay}

		//if this is the second selection (objSelectedDates.value != "") then this must be the end of the selection range

		if (objSettings.MaximumDates == 2 && objSelectedDates.value != "")
		{
			objTD.className = objTD.className + "_End";
		}

		blnAdd = true;
	}
	else
	{
		if (objSettings.MultipleDates == true)
		{
			if (objTD.className == objSettings.SelectedDay) {objTD.className = objSettings.Day}
			if (objTD.className == objSettings.SelectedWeekend) {objTD.className = objSettings.Weekend}
			if (objTD.className == objSettings.SelectedOtherMonthDay) {objTD.className = objSettings.DayOtherMonth}
			objTD.className = objTD.className.replace("_End", "");
		}
	}

	if (objSettings.MultipleDates == false)
	{
		//remove all dates

		if (blnAdd == true)
		{
			removeAllDates(objSettings);

			//add this date
			objSelectedDates.value = "|" + objTD.title;
			if (objTD.className == objSettings.Day) {objTD.className = objSettings.SelectedDay}
			if (objTD.className == objSettings.Weekend) {objTD.className = objSettings.SelectedWeekend}
			if (objTD.className == objSettings.DayOtherMonth) {objTD.className = objSettings.SelectedOtherMonthDay}
		}
		else
		{
			//selecting an already selected date - in one date only mode - nothing changes, return so that the event is not raised.
			return;
		}
	}
	else
	{
		if (blnAdd == true)
		{
			//add this date
			objSelectedDates.value += "|" + objTD.title;
		}
		else
		{
			//remove this date
			objSelectedDates.value = objSelectedDates.value.replace("|" + objTD.title, "");
		}
	}


	if (objSettings.ExternalDisplay != "")
	{	
		var objExternalDisplay = document.getElementById(objSettings.ExternalDisplay);
		if (!objExternalDisplay)
		{
			alert("Cannot access external display component: " + objSettings.ExternalDisplay + ".");
		}
		else
		{
			var strTemp = objSelectedDates.value;
			strTemp = strTemp.substring(1, strTemp.length);
			objExternalDisplay.value = strTemp;
		}
	}

	fire_SelectedDateChanged(objSettings);
	if (objSettings.SelectDateJavaScript != "")
	{
		objSettings.OnSelectDateJavaScript(objSettings, objTD.title, blnAdd);
	}
}

/* ---------------------------------------------------------------------------------------------------------------------------------------
	API FUNCTIONS 
--------------------------------------------------------------------------------------------------------------------------------------- */

//set a selected date, and show it.
function VSICalendar_setSelectedDate(objSettings, strDate)
{
	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);

	objSelectedDates.value = "|" + strDate;
	
	VSICalendar_setVisibleDate(objSettings, strDate); //this will update the calendar also
}

//get selected dates array
function VSICalendar_getSelectedDates(objSettings)
{
	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);

	return objSelectedDates.value.split("|")
}

//is date selected?
function VSICalendar_isDateSelected(objSettings)
{
	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);

	return (countSelectedDates(objSelectedDates) > 0)
}

//show a specific date/month
function VSICalendar_setVisibleDate(objSettings, strDate)
{
	var objVisibleDate = document.getElementById(objSettings.txtVisibleDate);
	var strAmerican = dateToAmerican(strDate);

	objVisibleDate.value = strAmerican;
	objSettings.VisibleDate = strAmerican;
	
	displayDates(objSettings);
}

//go to todays date
function VSICalendar_moveToToday(objSettings)
{
	var dtmToday = new Date();
	var strDate = leadingZero(dtmToday.getDate()) + "/" + leadingZero(dtmToday.getMonth()) + "/" + dtmToday.getFullYear();
	
	VSICalendar_setVisibleDate(objSettings, strDate);
}

//remove all selected dates
function VSICalendar_removeSelectedDates(objSettings)
{
	var objSelectedDates = document.getElementById(objSettings.txtSelectedDates);

	objSelectedDates.value = "";
	
	displayDates(objSettings); //refresh the display, incase there are any selected dates in the current view
}

function openCalendar1()
{
	var popupCalendar = document.getElementById("popupCalendar1");
	if (popupCalendar.style.display == "block"){
		popupCalendar.style.display = "none";
	} else {
		popupCalendar.style.display = "block";
	}
}
function closeCalendar1()
{
	var popupCalendar = document.getElementById("popupCalendar1");
	popupCalendar.style.display = "none";
}
function closeCalendar2()
{
	var popupCalendar = document.getElementById("popupCalendar2");
	popupCalendar.style.display = "none";
}
function closeCalendar3()
{
	var popupCalendar = document.getElementById("popupCalendar3");
	popupCalendar.style.display = "none";
}
function openCalendarX(num)
{
	var popupCalendar = document.getElementById("popupCalendar" + num);
	if (popupCalendar.style.display == "block"){
		popupCalendar.style.display = "none";
	} else {
		popupCalendar.style.display = "block";
	}
}
function closeCalendarX(num)
{
	var popupCalendar = document.getElementById("popupCalendar" + num);
	popupCalendar.style.display = "none";
}
