
//	This function displays a date entry calendar control linked to a specific form field

var	gi_Calendar_Object = null;			// Calendar object
var	gi_Calendar_Cells = new Array();	// Cell objects
var	gi_Calendar_Month_Cell = null;		// Cell containing Month name
var	gi_Calendar_Year_Cell = null;		// Cell containing Year
var	gi_Calendar_Target_Field = null;	// Target Date field
var	gi_Calendar_Days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var	gi_Calendar_Months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
var	gi_Calendar_MaxDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var	gi_Calendar_LeapDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var	gi_Calendar_Display_Year = 0;
var	gi_Calendar_Display_Month = 0;
var	gi_Calendar_Selected_Year = 0;
var	gi_Calendar_Selected_Month = 0;
var	gi_Calendar_Selected_Day = 0;
var	gi_Calendar_oDate = null;

//	Increment the Display Year
function	gi_Calendar_Next_Year()
{
	gi_Calendar_Display_Year++;
	gi_Calendar_Redraw();
}

//	Decrement the Display Year
function	gi_Calendar_Prev_Year()
{
	gi_Calendar_Display_Year--;
	gi_Calendar_Redraw();
}

//	Increment the Display Month
function	gi_Calendar_Next_Month()
{
	gi_Calendar_Display_Month++;
	if	(gi_Calendar_Display_Month > 12)
	{
		gi_Calendar_Display_Month = 1;
		gi_Calendar_Display_Year++;
	}
	gi_Calendar_Redraw();
}

//	Decrement the Display Year
function	gi_Calendar_Prev_Month()
{
	gi_Calendar_Display_Month--;
	if	(gi_Calendar_Display_Month == 0)
	{
		gi_Calendar_Display_Month = 12;
		gi_Calendar_Display_Year--;
	}
	gi_Calendar_Redraw();
}

function gi_Calendar_IsLeap(nYear)
{
	return	(((nYear % 4 == 0) && (nYear % 100 != 0)) || (nYear % 400 == 0));
}

//	Set the look of a Cell
function	gi_Calendar_Cell_Look(oCell, nHover)
{
	if	(oCell.gi_Day != 0)
	{
		if	(
			(gi_Calendar_Display_Year == gi_Calendar_Selected_Year) &&
			(gi_Calendar_Display_Month == gi_Calendar_Selected_Month) &&
			(gi_Calendar_Selected_Day == oCell.gi_Day)
			)
			{
				if	(nHover)
					gi_Common_SetClass(oCell, "gi_calendar_cell_selected_hover");
				else
					gi_Common_SetClass(oCell, "gi_calendar_cell_selected");
			}
		else
			{
				if	(nHover)
					gi_Common_SetClass(oCell, "gi_calendar_cell_hover");
				else
					gi_Common_SetClass(oCell, "gi_calendar_cell_normal");
			}
		oCell.innerHTML = oCell.gi_Day;
	}
	else
	{
		gi_Common_SetClass(oCell, "gi_calendar_cell_blank");
		oCell.innerHTML = "&nbsp;";
	}
}

//	React to a MouseOver event on a Header Cell
function	gi_Calendar_Head_MouseOver(oEvent)
{
	var	oCell = gi_Common_GetElement(oEvent);
	
	gi_Common_SetClass(oCell, "gi_calendar_head_hover gi_calendar_pointer");
}

//	React to a MouseOut event on a Header Cell
function	gi_Calendar_Head_MouseOut(oEvent)
{
	var	oCell = gi_Common_GetElement(oEvent);

	gi_Common_SetClass(oCell, "gi_calendar_head gi_calendar_pointer");
}

//	React to a MouseOver event on a Cell
function	gi_Calendar_Cell_MouseOver(oEvent)
{
	var	oCell = gi_Common_GetElement(oEvent);

	gi_Calendar_Cell_Look(oCell, 1);
}

//	React to a MouseOut event on a Cell
function	gi_Calendar_Cell_MouseOut(oEvent)
{
	var	oCell = gi_Common_GetElement(oEvent);

	gi_Calendar_Cell_Look(oCell, 0);
}

//	React to a MouseClick event on a Cell
function	gi_Calendar_Cell_Click(oEvent)
{
	var	oCell = gi_Common_GetElement(oEvent);

	if	(oCell.gi_Day != 0)
	{
		gi_Calendar_Target_Field.value = oCell.innerHTML + "/" + gi_Calendar_Display_Month + "/" + gi_Calendar_Display_Year;
		gi_Calendar_Close();
	}
}

function gi_Calendar_Redraw()
{
	var	nFirstDay, i, nDay = 1, nMaxDays;
		
	gi_Calendar_oDate.setFullYear(gi_Calendar_Display_Year);
	gi_Calendar_oDate.setMonth(gi_Calendar_Display_Month - 1);
	gi_Calendar_oDate.setDate(nDay);
	nFirstDay = gi_Calendar_oDate.getDay();
	
	gi_Calendar_Month_Cell.innerHTML = gi_Calendar_Months[gi_Calendar_Display_Month - 1];
	gi_Calendar_Year_Cell.innerHTML = gi_Calendar_Display_Year;

	if	(gi_Calendar_IsLeap(gi_Calendar_Display_Year))
		nMaxDays = gi_Calendar_LeapDays[gi_Calendar_Display_Month - 1];
	else
		nMaxDays = gi_Calendar_MaxDays[gi_Calendar_Display_Month - 1];
		
	for	(i = 0; i < 42; i++)
	{
		if	((i < nFirstDay) || (nDay > nMaxDays))
			gi_Calendar_Cells[i].gi_Day = 0;
		else
			gi_Calendar_Cells[i].gi_Day = nDay++;
		gi_Calendar_Cell_Look(gi_Calendar_Cells[i], 0);
	}
}

function gi_Calendar_Close()
{
	gi_Calendar_Object.style.visibility = "hidden";
}

function gi_Calendar_Init()
{
	var	oRow, oCell, oText, oTBody;
	var	i, j;
		
	gi_Calendar_Object = document.createElement("table");
	oTBody = document.createElement("tbody");
	gi_Calendar_Object.appendChild(oTBody);
	gi_Calendar_Object.id = "gi_calendar";
	gi_Common_SetClass(gi_Calendar_Object, "gi_calendar_box");

	oRow = document.createElement("tr");
	oTBody.appendChild(oRow);

	oCell = document.createElement("td");
	oText = document.createTextNode("<<");
	oCell.appendChild(oText);
	gi_Common_SetClass(oCell, "gi_calendar_head gi_calendar_pointer");
	oCell.onmouseover = gi_Calendar_Head_MouseOver;
	oCell.onmouseout = gi_Calendar_Head_MouseOut;
	oCell.onclick = gi_Calendar_Prev_Year;
	oRow.appendChild(oCell);

	oCell = document.createElement("td");
	oText = document.createTextNode("<");
	oCell.appendChild(oText);
	gi_Common_SetClass(oCell, "gi_calendar_head gi_calendar_pointer");
	oCell.onmouseover = gi_Calendar_Head_MouseOver;
	oCell.onmouseout = gi_Calendar_Head_MouseOut;
	oCell.onclick = gi_Calendar_Prev_Month;
	oRow.appendChild(oCell);

	oCell = document.createElement("td");
	oText = document.createTextNode(gi_Calendar_Months[gi_Calendar_Display_Month - 1]);
	oCell.appendChild(oText);
	gi_Common_SetClass(oCell, "gi_calendar_head");
	oRow.appendChild(oCell);
	gi_Calendar_Month_Cell = oCell;

	oCell = document.createElement("td");
	oText = document.createTextNode(gi_Calendar_Display_Year);
	oCell.appendChild(oText);
	gi_Common_SetClass(oCell, "gi_calendar_head");
	oRow.appendChild(oCell);
	gi_Calendar_Year_Cell = oCell;

	oCell = document.createElement("td");
	oText = document.createTextNode(">");
	oCell.appendChild(oText);
	gi_Common_SetClass(oCell, "gi_calendar_head gi_calendar_pointer");
	oCell.onmouseover = gi_Calendar_Head_MouseOver;
	oCell.onmouseout = gi_Calendar_Head_MouseOut;
	oCell.onclick = gi_Calendar_Next_Month;
	oRow.appendChild(oCell);

	oCell = document.createElement("td");
	oText = document.createTextNode(">>");
	oCell.appendChild(oText);
	gi_Common_SetClass(oCell, "gi_calendar_head gi_calendar_pointer");
	oCell.onmouseover = gi_Calendar_Head_MouseOver;
	oCell.onmouseout = gi_Calendar_Head_MouseOut;
	oCell.onclick = gi_Calendar_Next_Year;
	oRow.appendChild(oCell);

	oCell = document.createElement("td");
	oText = document.createTextNode("x");
	oCell.appendChild(oText);
	gi_Common_SetClass(oCell, "gi_calendar_head gi_calendar_pointer");
	oCell.onmouseover = gi_Calendar_Head_MouseOver;
	oCell.onmouseout = gi_Calendar_Head_MouseOut;
	oCell.onclick = gi_Calendar_Close;
	oRow.appendChild(oCell);

	oRow = document.createElement("tr");
	oTBody.appendChild(oRow);
	for	(j = 0; j < 7; j++)
	{
		oCell = document.createElement("td");
		oText = document.createTextNode(gi_Calendar_Days[j]);
		oCell.appendChild(oText);
		gi_Common_SetClass(oCell, "gi_calendar_subhead");
		oRow.appendChild(oCell);
	}

	for	(i = 0; i < 6; i++)
	{
		oRow = document.createElement("tr");
		oTBody.appendChild(oRow);
		for	(j = 0; j < 7; j++)
		{
			oCell = document.createElement("td");
			oText = document.createTextNode("");
			oCell.appendChild(oText);
			oCell.onmouseover = gi_Calendar_Cell_MouseOver;
			oCell.onmouseout = gi_Calendar_Cell_MouseOut;
			oCell.onclick = gi_Calendar_Cell_Click;
			oCell.gi_Day = 0;
			oRow.appendChild(oCell);
			gi_Calendar_Cells[i * 7 + j] = oCell;
		}
	}

	document.body.appendChild(gi_Calendar_Object);
}

function gi_Calendar_IParse(s)
{
	var	n = 0, i;
	
	for	(i = 0; i < s.length; i++)
		if	(s.charAt(i) != " ")
			if	((s.charAt(i) < "0") || (s.charAt(i) > "9"))
				return 0;
			else
				n = n * 10 + (s.charAt(i) - "0");
				
	return n;
}

function gi_Calendar(sTargetField)
{
	var	nYear, nMonth, nDay, n, sDate, pos;
	
	// set default values for Calendar as today's date
	gi_Calendar_oDate = new Date(2000, 1, 1, 0, 0, 0);
	gi_Calendar_Display_Year = gi_Calendar_oDate.getFullYear();
	gi_Calendar_Display_Month = gi_Calendar_oDate.getMonth() + 1;

	gi_Calendar_Selected_Day = 0;
	gi_Calendar_Selected_Month = 0;
	gi_Calendar_Selected_Year = 0;
		
	// access current value stored in Target Field as dd/mm/yyyy
	gi_Calendar_Target_Field = document.getElementById(sTargetField);
	sDate = gi_Calendar_Target_Field.value.split("/");
	if	(sDate.length == 3)
	{
		nDay = gi_Calendar_IParse(sDate[0]);
		nMonth = gi_Calendar_IParse(sDate[1]);
		nYear = gi_Calendar_IParse(sDate[2]);
		if	(nDay && nMonth && nYear)
			if	((nYear > 99) && (nYear < 10000) && (nMonth < 13))
			{
				if	(gi_Calendar_IsLeap(nYear))
					n = gi_Calendar_LeapDays[nMonth - 1];
				else
					n = gi_Calendar_MaxDays[nMonth - 1];
				if	(nDay <= n)
				{
					gi_Calendar_Selected_Year = nYear;
					gi_Calendar_Selected_Month = nMonth;
					gi_Calendar_Selected_Day = nDay;

					gi_Calendar_Display_Year = gi_Calendar_Selected_Year;
					gi_Calendar_Display_Month = gi_Calendar_Selected_Month;
				}
			}
	}
		
	pos = gi_Common_GetPos(gi_Calendar_Target_Field);
	gi_Calendar_Object.style.left = pos[0] + "px";
	gi_Calendar_Object.style.top = pos[1] + "px";
	gi_Calendar_Redraw();
	gi_Calendar_Object.style.visibility = "visible";
}

gi_Handler_Add("onload", "gi_Calendar_Init();");

