// *******   Copyright (c) OTS 2001   *********
var calendarWin;
var targetDate;
var numDaysInFutureToDisplay=334;	// Show up to 10 months ahead.
// Havee to pass two datepart filds  datepart_day , datepart_month
//pass these to all functions 
// function SetDate(d, textBoxName) - sets the dates to the fields on the form
// for each selected date have to get day and month and populate the appropriate form field
function NewCalendar(name,datefield_day, datefield_month, type, departVal, returnVal)
{
	var departDateStr = parseDate(departVal);  // date in the departure date control
	var returnDateStr = parseDate(returnVal);  // date in the return date control
	if (type=="return" || type=="multi") {targetDateStr=departDateStr;}
	else {targetDateStr=departDateStr;}

	// establish a "target month" to display...

	
	if (targetDateStr.length>0) targetDate = new Date(targetDateStr); //use target date
	else if (returnDateStr.length>0) targetDate = new Date(returnDateStr); //use return date
	else if (departDateStr.length>0) targetDate = new Date(departDateStr); //use depart date
	else targetDate= new Date(); //use today

	month = targetDate.getMonth()+1;
	year  = targetDate.getYear(); 
	if (year<200) year+=1900; // for NetScape

	showCalendar(name, datefield_day, datefield_month,  type, month, year, departDateStr, returnDateStr);
}


function updateCalendar(name,datefield_day, datefield_month, type, month, year, departVal, returnVal)
{

	var departDateStr = parseDateUS(departVal);  // date in the departure date control
	var returnDateStr = parseDateUS(returnVal);  // date in the return date control

	showCalendar(name,datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr);
}

function showCalendar(name,datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr)
{
	var browserWidth = screen.availWidth;
	var browserHeight= screen.availHeight;	
	var x = 0;
	var y = 0;

	// correction due to frames since window coords opens in relation to browser
	x = x + (browserWidth / 2 - 75);
	y = y + (browserHeight / 2 - 105);

	var winOptions = "left="+x+",screenX="+x+",top="+y+",screenY="+y;
	winOptions += ",toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0";
	winOptions += ",resizable=1,height=136,width=135,innerHeight=148,innerWidth=135";
		 
	calendarWin = window.open("", "calendar",winOptions);
	calendarWin.focus();

	calendarWin.document.open();
	calendarWin.document.write(CalendarHTML(name,datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr));
	calendarWin.document.close();
}




function CalendarHTML(name, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr)
{
	//alert("entered CalendarHTML");
	var result = "";
	var todaysDate = new Date();
	result += '<html>\n';
	result += '<head>\n';
	result += '<link href="../calendar.css" rel="stylesheet" type="text/css">'
	result += '<title>';
	result += (type=="return")?"Return":"Depart";
	result += '</title>';
	result += '</head>\n';
	result += '<body topmargin=0 leftmargin=0>\n';
	result += '<TABLE  cellspacing="0"  cellpadding="0" border="0">\n';
	
	result += '<TR>\n';
	
//left arrow
	var pmonth = month-1;
	var pyear = year;
	if (pmonth<1){pmonth=12;pyear=year-1;}
	var previousDate = new Date(pyear,pmonth);
	result += '	<TD width="18" class="previous">';
	if (previousDate.valueOf()>=todaysDate.valueOf())
	{
	result += '<A HREF="javascript:window.opener.updateCalendar(\'' +
				name + "','" +datefield_day +"','"+ datefield_month +"','"+type + "', " + pmonth + ", " + pyear + 
				", '" + departDateStr + "', '" + returnDateStr + '\')">';
	}
	result += '&nbsp;&nbsp;&nbsp;</a></TD>\n';

//month and year
	var month0 = month-1;
	var monthName = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
result += "		<TD align='center' width='100' class='cal_monthtitle'>" + monthName[month0] + "&nbsp;" + year + "</TD>\n";
	
//right arrow
	var nmonth = month+1;
	var nyear = year;
	if (nmonth>12){nmonth=1;nyear=year+1;}
	result += '	<TD  width="18" class="future">';
	var nextDate = new Date(nyear,nmonth-1);

	if (nextDate.valueOf() < todaysDate.valueOf()+(numDaysInFutureToDisplay*24*60*60*1000))
	{
		result += '	<A HREF="javascript:window.opener.updateCalendar(\'' +
					name + "','" +datefield_day +"','"+ datefield_month +"','"+ type + "', " + nmonth + ", " + nyear +
					", '" + departDateStr + "', '" + returnDateStr + '\')">';
	}					
	result += '&nbsp;&nbsp;&nbsp;</a></TD>\n';
	result += '</TR>\n';
	
	
	
	
	
	
	
	
	result += '<TR>\n';
	result += '	<TD align="center" VALIGN="Top" colspan="3">\n';

	result += CalendarTable(name, datefield_day, datefield_month,  type, month, year, departDateStr, returnDateStr);

	result += '	</TD>\n';
	result += '</TR>\n';
	
	// close link if required
	//result += '<TR>\n';
	//result += ' <TD colspan="3" align="center"><A class="cal_winclose" HREF="javascript:window.close();">Close</A></TD>\n';
	//result += '</TR>\n';
	
	
	
	
	
	result += '</TABLE>\n';
	result += '</body>\n';
	result += '<!-- vk -->';
	result += '</html>\n';

	return result;
}


function CalendarTable(name, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr)
{
	var result = "";
	var month0 = month-1;
	
	result += '<TABLE width="135" border="0" cellpadding="1">\n';
	result += "	<TR><TD align='center' class='cal_daytitle'>S</TD>\n";
	result += "		<TD align='center'  class='cal_daytitle'>M</TD>\n";
	result += "		<TD align='center'  class='cal_daytitle'>T</TD>\n";
	result += "		<TD align='center'  class='cal_daytitle'>W</TD>\n";
	result += "		<TD align='center' class='cal_daytitle' >T</TD>\n";
	result += "		<TD align='center' class='cal_daytitle' >F</TD>\n";
	result += "		<TD align='center' class='cal_daytitle' >S</TD>\n";
		
	result += CalendarRows(name, datefield_day, datefield_month, type, month0, year, departDateStr, returnDateStr);

	result += '</TABLE>\n';
	return result;
}





function CalendarRows(name, datefield_day, datefield_month, type, month0, year, departDateStr, returnDateStr)
{
	var result= "";
	var milliDay = 1000*24*60*60; // milliseconds per day
	var today = new Date();
	var firstValidMilli = today.getTime()
	var lastValidMilli = today.getTime() + (numDaysInFutureToDisplay * milliDay); 
	var DayOne = new Date(year, month0, 1, 12, 0, 0, 0);   // Set to the middle of the day. Margin for error.
	var dayOfWeek = DayOne.getDay(); // 0 - Sunday, 1 - Monday, ...
	var currentMilli = DayOne.getTime() - (milliDay*dayOfWeek); // first day of week
	var currentDate = new Date(currentMilli);
	var currentDay = currentDate.getDate();
	var currentMonth = currentDate.getMonth();
	var currentYear = currentDate.getFullYear();

	if (departDateStr.length==0) 
		{ departMonth=0;departDay=0;}
	else {
		departDate = new Date(departDateStr);
		departMonth = departDate.getMonth();
		departDay   = departDate.getDate();
		if (type=="return" || type=="multi"){
			// make first valid date the depart date...
			departMilli = departDate.getTime();
			if(departMilli>firstValidMilli) firstValidMilli = departMilli;
		}
	}

	if (returnDateStr.length==0) { returnMonth=0;returnDay=0;}
	else {
		returnDate = new Date(returnDateStr);
		returnMonth = returnDate.getMonth();
		returnDay   = returnDate.getDate();
		//if (type!="return" && type!="multi") {
			// make last valid date equal return date
			//returnMilli = returnDate.getTime();
			//if (returnMilli<lastValidMilli) lastValidMilli = returnMilli;
		//}
	}

	// loop over weeks
	var weeks=0;
	while ((month0 >= currentMonth && year==currentYear) || (year>currentYear))
	{
		weeks++;
		result += "<TR>\n"; // open the week row

		// loop over days of the week
		for (d=0; d<7; d++) {

			var isToday = today.getMonth()==currentDate.getMonth()
						  && today.getDate()==currentDate.getDate()
						  && today.getYear()==currentDate.getYear();

			var notValid = currentMilli< firstValidMilli || currentMilli>lastValidMilli;

			var bold = isToday;

			var dayColor = "#000000"; //default black
			if (notValid) dayColor = "#999999"; 
			// grey for invalid days
			if (currentDay==departDay && currentMonth==departMonth) {bold=true;dayColor="#cc0000";} 
			if (currentDay==returnDay && currentMonth==returnMonth) {bold=true;dayColor="#cc0000";} 

			// ========= stuff left of the day number ===========

			result += "<TD valign='top' align='center' ";
			if (month0 == currentMonth) result += "class='thismonth'";
			else result += "class='num'";
			result += ">";
			//if (notValid) result += "<STRIKE>";
			
			if (notValid) result += "";
			
			else 
			{
				result += "<A HREF=\"javascript:window.opener.SetDate('"+ datefield_day+"','"+ datefield_month+"','" + 
							currentDay  + "','" + 
							(currentMonth+1)  + "','" + 
							truncateYear(currentYear) + "' , '" + name + "')\" class=num>";
			}
			
			result += "<span style='color:" + dayColor +"'>";
			if (bold) result += "<B>";

			// ========= the day number ===========

			result += currentDay;

			// ========= stuff right of the day number ===========

			if (bold) result += "</B>";
			result += "</span>";
			//if (notValid) result += "</STRIKE>";
			if (notValid) result += "";
			
			else result += "</A>";
			result += "</TD>\n";

			// move to next day.
			currentMilli += milliDay;
			currentDate.setTime(currentMilli);
			currentDay = currentDate.getDate();
			currentMonth = currentDate.getMonth();
			currentYear  = currentDate.getFullYear();
		}
		result += "</TR>\n"; // close the week row
	}
	if (weeks<6){
		// put out filler line
		
	}
	return result;
}


/**
 * Search for the text box named textBoxName on the document, and if found
 * set it's value to d. Closes the calendar window.
 * @param d value to put in text box.
 * @param textBoxName the name of the text box. This is assumed to be
 * unique on the calling document. The text box is assumed to be on a form
 * on the document.
 */
 
 
 /*
 ****************************************************************************
	 *1. Pass name of form into function
	 *2. Pass type i.e. is it depsart or return
	 *3. If depart date field - update depart date field
	 *4. IF return update return date field
	 
	For months- Loop through option array to select the correct value- dates are not written in order in the form
*****************************************************************************
*/

function SetDate(datefield_day, datefield_month,day, month,year,textBoxName)
{
	var docLength = document.forms.length;
	
	var trriger_date = day+"/"+ month +"/" + year;
	
	
	
	for(var formIdx = 0; formIdx < docLength; formIdx++)
	{ 
	    
		var form = document.forms[formIdx];
		
		var formLength = form.length;
		for(var i = 0; i < formLength; i++){
		
		if(form.elements[i].name == textBoxName )
			{
				
				form.elements[i].value = trriger_date;
				
				
			}
			
			//  SET date fro day
			if(form.elements[i].name ==datefield_day )
			{
				
				//form.elements[i].value = day;

				
			
			form.elements[i].selectedIndex=day-1;

			}
			
			//  SET date for month
			if(form.elements[i].name ==datefield_month )
			{
				
				var select_length = form.elements[i].name.length
				
				for ( var idx = 0 ; idx < select_length ; idx ++)
				
					{
						if(form.elements[i].options[idx].value == month)
							{
							
								form.elements[i].selectedIndex = idx;
								break;
							}//end if
					
					}//end for
				
			}
		}
		calendarWin.close()
	}
	
}





//Assumes US date
//outputs US format
function parseDate(inDate)
{
	var sDate = new String(inDate)
	var sep="/";
	var index1 = sDate.indexOf(sep);
	if (index1==-1){sep=".";index1 = sDate.indexOf(sep);}
	if (index1==-1){sep="-";index1 = sDate.indexOf(sep);}
	if (index1==-1){sep="\\";index1 = sDate.indexOf(sep);}
	if (index1==-1) return ""; // bad, no seperator found.
	var index2 = sDate.lastIndexOf(sep);
	if (index1>=index2) return ""; // bad, only one seperator
	var sDay = sDate.substring(0,index1);
	if (!isDigits(sDay)) return "";
	var sMonth = sDate.substring(index1+1, index2);
	if (!isDigits(sMonth)) return "";
	var sYear = sDate.substring(index2+1);
	if (!isDigits(sYear)) return "";
	month=sMonth-0;day=sDay-0;year=sYear-0; // convert to numbers
	if (month<1 || month>12) return "";
	if (year<100) year += 2000;
	if (year<1900 || year>2100) return "";
	var daysPerMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if (year%100==0) {if(year%400==0)daysPerMonth[1]=29;}
	else {if(year%4==0)daysPerMonth[1]=29;}
	if(day<1 || day>daysPerMonth[month-1]) return "";
	//
	// if you get here it is a good date...
	//
	return month + "/" + day + "/" + year;
}






//Assumes UK date input
//outputs US format
function parseDateUS(inDate)
{
	var sDate = new String(inDate)
	var sep="/";
	var index1 = sDate.indexOf(sep);
	if (index1==-1){sep=".";index1 = sDate.indexOf(sep);}
	if (index1==-1){sep="-";index1 = sDate.indexOf(sep);}
	if (index1==-1){sep="\\";index1 = sDate.indexOf(sep);}
	if (index1==-1) return ""; // bad, no seperator found.
	var index2 = sDate.lastIndexOf(sep);
	if (index1>=index2) return ""; // bad, only one seperator
	var sMonth = sDate.substring(0,index1);
	if (!isDigits(sMonth)) return "";
	var sDay = sDate.substring(index1+1, index2);
	if (!isDigits(sDay)) return "";
	var sYear = sDate.substring(index2+1);
	if (!isDigits(sYear)) return "";
	
	month=sMonth-0;day=sDay-0;year=sYear-0; // convert to numbers
	if (month<1 || month>12) return "";
	if (year<100) year += 2000;
	if (year<1900 || year>2100) return "";
	var daysPerMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if (year%100==0) {if(year%400==0)daysPerMonth[1]=29;}
	else {if(year%4==0)daysPerMonth[1]=29;}
	if(day<1 || day>daysPerMonth[month-1]) return "";
	//
	// if you get here it is a good date...
	//
	return month + "/" + day + "/" + year;
}




function isDigits(ch)
{
	if (ch.length<=0) return false;
	for (d=0; d<ch.length; d++) {if (ch.charAt(d) < "0" || ch.charAt(d) > "9") return false;}
	return true;
}




function truncateYear(yr)
{
	var yrStr = new String(yr);
	return yrStr.slice(2,4);
}
