var calendarWin;
var targetDate;

function NewCalendar(name, 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, type, month, year, departDateStr, returnDateStr);
}

function updateCalendar(name, 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, type, month, year, departDateStr, returnDateStr);
}

function showCalendar(name, 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=0,height=195,width=165,innerHeight=195,innerWidth=165";
		 
	calendarWin = window.open("", "calendar",winOptions);
	calendarWin.focus();

	calendarWin.document.open();
	calendarWin.document.write(CalendarHTML(name, type, month, year, departDateStr, returnDateStr));
	calendarWin.document.close();
}
function CalendarHTML(name, type, month, year, departDateStr, returnDateStr)
{
	//alert("entered CalendarHTML");
	var result = "";
	var todaysDate = new Date();
	result += '<html>\n';
	result += '<head>\n';
	result += '<title>';
	result += (type=="return")?"Return":"Depart";
	result += '</title>\n';
	result += '<body style="font-family: Arial;" bgcolor="#FFFFFF" topmargin="4" leftmargin="4" marginheight="4" marginwidth="4">\n';
	
	result += '<TABLE width="150" cellspacing="0" cellpadding="0" border="0">\n';
	result += '<TR>\n';
	result += '	<TD colspan="3" align="center" VALIGN="Top">\n';

	result += CalendarTable(name, type, month, year, departDateStr, returnDateStr);

	result += '	</TD>\n';
	result += '</TR>\n';
	result += "<TR><TD colspan='3'><img src='images/1x1trans.gif' width='1' height='4' border='0'></TD></TR>\n";
	result += "<TR><TD colspan='3' bgcolor='#CCFF00'><img src='images/1x1trans.gif' width='1' height='3' border='0'></TD></TR>\n";
	result += "<TR><TD colspan='3'><img src='images/1x1trans.gif' width='1' height='10' border='0'></TD></TR>\n";
	result += '<TR>\n';

	var pmonth = month-1;
	var pyear = year;
	if (pmonth<1){pmonth=12;pyear=year-1;}
	var previousDate = new Date(pyear,pmonth);
	result += '	<TD align="left" valign="top">';
	
	if (previousDate.valueOf()>=todaysDate.valueOf())
	{
	result += '<A HREF="javascript:window.opener.updateCalendar(\'' +
				name + "','" + type + "', " + pmonth + ", " + pyear + 
				", '" + departDateStr + "', '" + returnDateStr + '\')">';
	}
	result += '<img src="images/go_left.gif" width="17" height="17" alt="Back to previous month" border="0"></a></TD>\n';

	result += ' <TD align="center" valign="top"><A HREF="javascript:window.close();"><img src="images/close.gif" width="51" height="17" alt="Close Window" border="0"></A></TD>\n';
	var nmonth = month+1;
	var nyear = year;
	if (nmonth>12){nmonth=1;nyear=year+1;}
	result += '	<TD align="right" valign="top">';
	var nextDate = new Date(nyear,nmonth-1);

	if (nextDate.valueOf()<todaysDate.valueOf()+(330*24*60*60*1000))
	{
	result += '	<A HREF="javascript:window.opener.updateCalendar(\'' +
				name + "','" + type + "', " + nmonth + ", " + nyear +
				", '" + departDateStr + "', '" + returnDateStr + '\')">';
	}					
	result += '<img src="images/go_right.gif" width="17" height="17" alt="Next month" border="0"></a></TD>\n';
	result += '</TR>\n';
	result += '</TABLE>\n';
	result += '</body>\n';
	result += '</html>\n';

	return result;
}

function CalendarTable(name, type, month, year, departDateStr, returnDateStr)
{
	var result = "";
	var month0 = month-1;
	var monthName = new Array("JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER");
	result += '<TABLE width="151" border="0" cellpadding="0">\n';
	result += "	<TR>\n";
	result += "		<TD align='center' valign='top'><img src='/images/flights/ts_smlbar2.gif' width=151 height=6 border=0></TD>\n";
	result += "	</TR>\n";
	result += '</TABLE>\n';
	result += '<TABLE width="149" border="0" cellpadding="1">\n';
	result += "	<TR>\n";
	result += "		<TD colspan='7' align='center' bgcolor='#00CC66'><font family='Arial' color='#FFFFFF' size='2'><b>" + monthName[month0] + " " + year + "</font></b></TD>\n";
	result += "	</TR>\n";
	result += "	<TR><TD align='center' bgcolor='#CCFF00'><font color='#000000' size='1'><b>S</b></font></TD>\n";
	result += "		<TD align='center' bgcolor='#CCFF00'><font color='#000000' size='1'><b>M</b></font></TD>\n";
	result += "		<TD align='center' bgcolor='#CCFF00'><font color='#000000' size='1'><b>T</b></font></TD>\n";
	result += "		<TD align='center' bgcolor='#CCFF00'><font color='#000000' size='1'><b>W</b></font></TD>\n";
	result += "		<TD align='center' bgcolor='#CCFF00'><font color='#000000' size='1'><b>T</b></font></TD>\n";
	result += "		<TD align='center' bgcolor='#CCFF00'><font color='#000000' size='1'><b>F</b></font></TD>\n";
	result += "		<TD align='center' bgcolor='#CCFF00'><font color='#000000' size='1'><b>S</b></font></TD>\n";
	
	result += CalendarRows(name, type, month0, year, departDateStr, returnDateStr);

	result += '</TABLE>\n';
	return result;
}

function CalendarRows(name, type, month0, year, departDateStr, returnDateStr)
{	
	var hidResult = "";
	var result= "";
	var milliDay = 1000*24*60*60; // milliseconds per day
	var today = new Date();
	var firstValidMilli = today.getTime() - milliDay; // correct for time of day compare
	var lastValidMilli = today.getTime() + (330 * milliDay); // week later
	var DayOne = new Date(year, month0, 1);
	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.getYear();
	if (currentYear<200) currentYear+=1900;

	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 = "#00CC66"; //default blue
			if (notValid) dayColor = "#999999"; // grey for invalid days
			if (currentDay==departDay && currentMonth==departMonth) {bold=true;dayColor="#CCFF00";} // coreblue for depart
			if (currentDay==returnDay && currentMonth==returnMonth) {bold=true;dayColor="#CCFF00";} // blue for return

			// ========= stuff left of the day number ===========

			result += "<TD  valign='top' align='center' ";
			if (month0 == currentMonth) result += "bgcolor='#E3E3E3'";
			result += ">";
			//if (notValid) result += "<STRIKE>";
			if (!notValid) 
			{
				result += "<A HREF=\"javascript:window.opener.SetDate('" + 
							currentDay  + "/" + 
							(currentMonth+1)  + "/" + 
							(currentYear) + "' , '" + name + "')\" style='text-decoration:none; font-weight:bold'>";
					}			
				if (!notValid) 
				{			
							hidResult += "<A HREF=\"javascript:window.opener.dbDate('" + 
							currentYear  + "-" + 
							(currentMonth+1)  + "-" + 
							(currentDay) + "' , '" + "')\" style='text-decoration:none; font-weight:bold'>";
			}
			
			result += "<font size='1' color='" + dayColor + "'>";
			if (bold) result += "<B>";

			// ========= the day number ===========

			result += currentDay;

			// ========= stuff right of the day number ===========

			if (bold) result += "</B>";
			result += "</font>";
			//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.getYear();
			if (currentYear<200) currentYear+=1900;
		}
		result += "</TR>\n"; // close the week row
	}
	if (weeks<6){
		// put out filler line
		result += "<TR><TD  colspan='7'><img src='/images/1x1trans.gif' width='1' height='12' border='0'></TD></TR>\n";
	}
	return result;
	return hidResult;
}


function dbDate(d)

{
	var length = document.pricesearch.elements.length;
	for(var i = 0; i < length; i++)
	{
		if(document.pricesearch.elements[i].name == "hiddenDate")
			break;
	}
}
	

function SetDate(d, textBoxName)
{
	var length = document.pricesearch.elements.length;
	for(var i = 0; i < length; i++)
	{
		if(document.pricesearch.elements[i].name == textBoxName)
			break;
	}

	if(i < length)
		document.pricesearch.elements[i].value = d;

	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 year + "/" + month + "/" + day;
}

//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 year + "/" + month + "/" + day;
}

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);
}
