/*****global variables*******/

var staticServerPath="http://www.opentable.com";



var OTpInputMonth;

var OTpInputDay;

var OTpInputYear;

var OTtoday = new Date();

var OTjavaDate=OTtoday;

var OTyear = OTtoday.getFullYear();

var OTjavaYear=OTyear;

var OTmonth = OTtoday.getMonth();

var OTjavaMonth=OTtoday.getMonth();

var OTinputDateField;

var OTinputDate;

var OTdefaultDate;

var OTvertical;

var OTtInputMonth;

var OTtInputDay;

var OTtInputYear;

var OTcalShim;

var OTkCal;

var OTkCalShim;

var defaultDateString = 'mm/dd/yyyy';



var OTpkId = "";

var OTpkJsMOver = " ";

var OTpkJsMOut = " ";

var OTpkJsOnClick = " ";

var OTactiveCal = "";

var foo = true; //debugging var

var OTjavaLimitYear = 2020;





// Utilities functions



function stopBubble(e) {

	if(e.stopPropagation) {

		e.stopPropagation();

	} else {

		e.cancelBubble = true;

	}

}



function wrtPkDayDtls(pkLabel){

	var tlabel = pkLabel.toString();

	document.getElementById('pkDayDtls').innerHTML = tlabel;

	clickLayer('pkDayDtls', 2, -15);

}



function killAllCalendars() {

		OTkCal = OTactiveCal;

		OTkCalShim = OTactiveCal+"Shim";

		setVisible(false,OTactiveCal, OTactiveCal+"Shim");

}



function parseToDoubleDigit(number) {

	return (number < 10) ? '0' + number : number;

}



function parseToSingleDigit(number) {

	var str = '' + number;

	return str = str.replace(/^0+/g, '');

}



function getAllDaysInMonth(month)  {

	var days;

	var year = (month >= OTjavaMonth) ? OTjavaYear : OTjavaYear + 1;

	if (month==0 || month==2 || month==4 || month==6 || month==7 || month==9 || month==11)  { days=31; }

	else if (month==3 || month==5 || month==8 || month==10) { days=30; }

	else if (month==1)  {

		if (isThisLeapYear(year)) { days=29; }

		else { days=28; }

	}

	return (days);

}



function isThisLeapYear (Year) {

	if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) { return (true); }

	else { return (false); }

}



function parseDate(dateString){



	/****utitility and subfunctions*******/

	function trim(sString){

		var re1 = /\s{2,10}/g;  //precompile reg ex's for performance

		sString = sString.replace(re1, ' ');

		while(sString.substring(0,1) == ' '){

		sString = sString.substring(1, sString.length);

		}

		while(sString.substring(sString.length-1, sString.length) == ' '){

		sString = sString.substring(0,sString.length-1);

		}



	return sString;

	}

	/******/



	function delimit(sString){

		var thisString;

		var re1 = /,\s/g;

		var re2 = /([|]|[.]|[,]|[;]|[\s]|[\/])/g; //BUG: ugly, but mozilla has problems with some character class formations 

		thisString = sString.replace(re1, ',');

		thisString = thisString.replace(re2, '|');

		thisString = thisString.toLowerCase();



		return thisString;

	}



	/*****/

	function convertMonthAbbreviation(inputString){

		var alphaMonth;

		var numericMonth;

		var numericString;

		var re1 = /^[a-zA-Z]*/;

		var re2 = /^[a-zA-Z]{3}/;

		var alphaMonthArray = new Array("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" );



		if(inputString.length < 3) return;

		if(inputString.match(re1)){

		alphaMonth = inputString.match(re2);

			for(i=0;i<alphaMonthArray.length;i++){

				if(alphaMonth == alphaMonthArray[i]) {

				numericMonth = i + 1;

				numericString = inputString.replace(re1, numericMonth);

				return numericString;

				}

			}

		}

	}

	/*****/

	function matchPattern(sString){

		var normString = sString;

		var normStringTwo = sString;

		var testPattern =  /^(\d{1,2})([|]\d{1,2})([|](\d{2}){1,2})?$/i;//check if input conforms to allowed input patterns

		var re2 = /^([a-zA-z])/;



	

		if(normString.match(re2)){

			normStringTwo = convertMonthAbbreviation(normString);

		} 



		if(normStringTwo.match(testPattern)) {

			return normStringTwo;

		}

		

		

	

		return normString;

	}

	/****************Main Function-Accepts initial Inputs*****************************/

	function parseDateMain(dateString){

		var inputString;

		var normString;

		var normStringTwo;

		//alert(dateString);

		

		inputString = trim(dateString);

		normString = delimit(inputString);

		normStringTwo = matchPattern(normString);



		setDateInputs(normStringTwo);



	}

	/****Output Function***/



	function setDateInputs(dateString){

		var re1 = "|";

		



		if(dateString != null)

		{

			var dateTokenArray = dateString.split(re1);//tokenize input into array

			if ((defaultDateString == "mm/dd/yyyy") || (defaultDateString == "mm/dd/yy")) {

				OTpInputMonth = dateTokenArray[0];

				OTpInputDay = dateTokenArray[1];

				OTpInputYear = dateTokenArray[2];

			}

			else if ((defaultDateString == "yyyy/mm/dd") || (defaultDateString == "yy/mm/dd")) {

				OTpInputMonth = dateTokenArray[1];

				OTpInputDay = dateTokenArray[2];

				OTpInputYear = dateTokenArray[0];



			}

			else if ((defaultDateString == "dd/mm/yyyy") || (defaultDateString == "dd/mm/yy") || 

			(defaultDateString == "dd.mm.yyyy") || (defaultDateString == "dd.mm.yy")) {

				OTpInputMonth = dateTokenArray[1];

				OTpInputDay = dateTokenArray[0];

				OTpInputYear = dateTokenArray[2];

			}

			else {

				return;

			}	

		}else{

			return;

		}

	}



	parseDateMain(dateString);

}





function processMonth(startMonthField,endMonthField) {

	endMonthField.selectedIndex = startMonthField.selectedIndex;

}



function process(num,cal) {





	if(num == -1) {

		if(OTmonth == 0) {

			OTmonth = 11;

			OTyear--;

			OTtoday.setFullYear(OTyear);

		}

		else { OTmonth--; }

	}

	if(num == 1) {

		if(OTmonth == 11) {

			OTmonth = 0;

			OTyear++;

			OTtoday.setFullYear(OTyear);

		}

		else { OTmonth++; }

	}

	// OTmonth set twice for bug #10002

	OTtoday.setMonth(OTmonth);

	OTtoday.setMonth(OTmonth);

	writeCalendar(cal);

}



function returnMonth(thismonth,thisYear) {



	MonthDayOrder = "[Month] [Year]";



	monthArray = new Array(

		"JANUARY", 

		"FEBRUARY", 

		"MARCH", 

		"APRIL", 

		"MAY", 

		"JUNE", 

		"JULY", 

		"AUGUST", 

		"SEPTEMBER", 

		"OCTOBER", 

		"NOVEMBER", 

		"DECEMBER"

		);

		

	MonthDayOrder = MonthDayOrder.replace("[Month]",monthArray[thismonth]);

	MonthDayOrder = MonthDayOrder.replace("[Year]",thisYear);

		

	return MonthDayOrder;

}



function setVisible(state,sCal,sCalShim) {

	if(!state) {

		sCal = OTkCal;

		sCalShim = OTkCalShim;

	}

	if(document.getElementById(sCal)) {

		var divRef = document.getElementById(sCal);

	} else { return; }

	if(document.getElementById(sCalShim)) {

		var ifrRef = document.getElementById(sCalShim);

	} else { return; }

	if(state) {

		divRef.style.display = "block";

		ifrRef.style.width = divRef.offsetWidth;

		ifrRef.style.height = divRef.offsetHeight;

		ifrRef.style.top = divRef.style.top;

		ifrRef.style.left = divRef.style.left;

		ifrRef.style.zIndex = divRef.style.zIndex - 1;

		ifrRef.style.display = "block";

		ifrRef.onClick = true;

	} else { 

		divRef.style.display = "none";

		ifrRef.style.display = "none";

	}

}



function closeCalendar(cCal, cCalShim) {

	OTkCal = cCal;

	OTkCalShim = cCalShim;

	setVisible(false);

}



function setField(userDateField, userSiblingDate, userDate, userVertical) {

	// First off, lets kill all calendars if any.

//	alert("set field");

	

	killAllCalendars();

	OTinputDateField = userDateField;

	OTinputDate = userDate;

	OTvertical = userVertical;



	var dToday = OTtoday;

	OTdefaultDate = dToday.getMonth()+1+'/'+dToday.getDate()+'/'+OTjavaYear;



	if (OTinputDate == defaultDateString) {

		if (userSiblingDate == defaultDateString) {

			OTinputDate = OTdefaultDate;

		} else {

			OTinputDate = userSiblingDate;

		}

	} else if (OTinputDate.length < 1) {

		OTinputDate = OTdefaultDate;

	}



	try {

		parseDate(OTinputDate);

	} catch(e) {

		parseDate(OTdefaultDate);

	}



	if (parseToSingleDigit(OTpInputMonth) > 12) {

		parseDate(OTdefaultDate);

	}



	OTtInputMonth =  parseToSingleDigit(OTpInputMonth);

	OTtInputDay = parseToSingleDigit(OTpInputDay);

	OTtInputYear = ((OTpInputYear.length <= 2) ? '20' + OTpInputYear : OTpInputYear);



	OTmonth = OTtInputMonth - 1;

	OTtoday.setMonth(OTmonth);

	OTyear = OTtInputYear;

	OTtoday.setFullYear(OTyear);

}



function returnDate(inDay,cal) {

	var thisDay = inDay;

	var thisMonth = OTmonth + 1;

	var thisYear = OTyear;

	var thisYearString = '' + thisYear;

	

	

	if ((defaultDateString == "mm/dd/yyyy") || (defaultDateString == "mm/dd/yy")) {

		OTinputDateField.value = parseToDoubleDigit(thisMonth) + '/' + parseToDoubleDigit(thisDay) + '/' + (thisYear);

	}

	else if ((defaultDateString == "yyyy/mm/dd") || (defaultDateString == "yy/mm/dd")) {

		OTinputDateField.value = (thisYear) + '/' + parseToDoubleDigit(thisMonth) + '/' + parseToDoubleDigit(thisDay);

	}

	else if ((defaultDateString == "dd/mm/yyyy") || (defaultDateString == "dd/mm/yy")) {

		OTinputDateField.value = parseToDoubleDigit(thisDay) + '/' + parseToDoubleDigit(thisMonth) + '/' + (thisYear);

	}

	else if ((defaultDateString == "dd.mm.yyyy") || (defaultDateString == "dd.mm.yy")) {

		OTinputDateField.value = parseToDoubleDigit(thisDay) + '.' + parseToDoubleDigit(thisMonth) + '.' + (thisYear);

	}



	closeCalendar(cal, OTcalShim);

}



function writeCalendar(cal) {

//alert(OTvertical);

	OTactiveCal = cal;

	OTcalShim = cal + "Shim";

	blankColumn = "<td class='clickableDays partOfCal'>&nbsp;</td>"

	tableOutput = "<table cellpadding='0' cellspacing='0' border='0'><tr><td class='partOfCal' colspan='7'></td></tr><tr><td class='weekdays partOfCal'>" + 

					"S"  + 

					"</td><td class='weekdays partOfCal'>" + 

					"M" + 

					"</td><td class='weekdays partOfCal'>" + 

					"T" + 

					"</td><td class='weekdays partOfCal'>" + 

					"W" + 

					"</td><td class='weekdays partOfCal'>" + 

					"T" + 

					"</td><td class='weekdays partOfCal'>" + 

					"F" + 

					"</td><td class='weekdays partOfCal'>" + 

					"S" + 

					"</td></tr><tr align='right'>"



 	var days = getAllDaysInMonth(OTmonth);

	var firstOfMonth = new Date (OTyear, OTmonth, 1);

	var startingPos  = firstOfMonth.getDay()

	startingPos -= parseInt(0)



	if (startingPos < 0) {

		startingPos = 7+startingPos;

	}



	days += startingPos;



	//

//alert(startingPos + ":" + days);



	var columnCount = 0;



	for (i = 0; i < startingPos; i++) {

		tableOutput += blankColumn;

		columnCount++;

	}



	var currentDay = 0;

   	for (i = startingPos; i < days; i++) {

		currentDay = i-startingPos+1;

		var pStyle = " ";

		var pStyleCode = " ";

		var sltdDt = " ";

		var sltdDtA= " ";



		var pkMonth = parseToDoubleDigit(OTmonth + 1); //modify date segments for peak date id's

		var pkCurrentDay;

		pkCurrentDay = parseToDoubleDigit(currentDay);

		OTyear = "" + OTyear;  //javascript internal bug; force type to year

		pkYear = OTyear.substring(2,4);

		

		var pkId = " ";	  

		  pkId = "pk" + pkMonth  + pkCurrentDay + pkYear;

		  OTpkJsMOver = " ";

		  OTpkJsMOut = " ";

		  OTpkJsOnClick = " ";



			if(OTvertical == "flights"){ // Render peak days for AIR only  



			// Private function to pop peak day bubble

			function checkPkDays(pkId){

			var label = " ";

			var showLabel

				for (var i in peakDays){

				label = peakDays[i];



					if(pkId == i){



							OTpkJsMOver = " onmouseover='wrtPkDayDtls(\"" + label + "\");' ";

							OTpkJsMOut =  " onmouseout='javascript:hideLayer(\"pkDayDtls\");' ";

							OTpkJsOnClick = " onclick='javascript:hideLayer(\"pkDayDtls\");' "

							pStyleCode = " pkD "

					}

				}

			}





			checkPkDays(pkId);

		}



		if(OTmonth + 1 == OTtInputMonth && (currentDay == OTtInputDay)) { sltdDt = "style=\"border:1px solid #9CADBD; background-color:#FFEF9C;\""

	 sltdDtA="style=\"background-color:#FFEF9C;\""

 } 



		var verticalDate = OTjavaDate;



		var nonClickableDayString = "<td " + OTpkJsMOver + OTpkJsMOut + OTpkJsOnClick + " class='nonclickableDays partOfCal " + pStyleCode + "' " + ">" + currentDay + "</td>";



		var clickableDayString = "<td " + OTpkJsMOver + OTpkJsMOut + OTpkJsOnClick + " class='clickableDays partOfCal " +  pStyleCode +  "' " + " id='" + OTpkId + "' " + sltdDt + "><a href=javascript:returnDate(" + currentDay + ",'" + cal + "'); class='clickableDays partOfCal " + pStyleCode + "' " + " id=' " + OTpkId   + "' " + sltdDtA + ">" + currentDay + "</a></td>"



//alert (nonClickableDayString);

//alert(clickableDayString);

//For Past Purchase vertical we have to show the previous/past date, the below check is done for that.

		if(OTvertical != 'pastpurchase') {

		//alert("javamonth = " + OTjavaMonth + " OTjavaYear :" + OTjavaYear + " current day : " + currentDay + " vertical date: " + verticalDate);

		if (OTmonth <= OTjavaMonth && OTyear == OTjavaYear) {

			if (OTmonth == OTjavaMonth && currentDay >= verticalDate.getDate()) {

				tableOutput += clickableDayString;

			} else {

				tableOutput += nonClickableDayString;

			}

		} else if (OTyear >= OTjavaLimitYear) {

			if ((OTmonth > javaLimitMonth) || (OTmonth == javaLimitMonth && currentDay >= javaLimitDate) || (OTyear > OTjavaLimitYear)){

				tableOutput += nonClickableDayString;

			} else {

				tableOutput += clickableDayString;

			}

		} else if (OTyear < OTjavaYear) {

			tableOutput += nonClickableDayString;

		} else {

			tableOutput += clickableDayString;

		}

		 } else {

				tableOutput += clickableDayString;

		 }



		columnCount++;

		if (columnCount % 7 == 0) {

			tableOutput += "</tr><tr>";

		}

	}



	for (i=days; i<42; i++)  {

		tableOutput += blankColumn;

		columnCount++;



		if (columnCount % 7 == 0) {

			tableOutput += "</tr>";

			if (i<41) {

				tableOutput += "<tr>";

			}

		}

	}



var leftarrow;

var rightarrow;





if(OTvertical == 'pastpurchase') {

	//Show left arrow of the calendar as the customer can go and check any past dates for past purchase vertical

	leftarrow="<a class='partOfCal' href='javascript:process(-1,\"" + cal + "\")'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/left.gif' width='11' height='17' border='0'></a>"

}

else {

	if(OTmonth==OTjavaMonth && OTyear==OTjavaYear) leftarrow="<img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='11' height='17' border='0'>"

	else leftarrow="<a class='partOfCal' href='javascript:process(-1,\"" + cal + "\")'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/left.gif' width='11' height='17' border='0'></a>"



}



//Show right arrow of the calendar as the customer can go and check any future dates for past purchase vertical

if(OTvertical == 'pastpurchase') {

	rightarrow="<a class='partOfCal' href='javascript:process(1,\"" + cal + "\")'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/right.gif' width='11' height='17' border='0'></a>"

}

else {

	if((OTmonth==OTjavaMonth-1) && (OTyear==OTjavaYear+1)) rightarrow="<img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='11' height='17' border='0'>"

	else rightarrow="<a class='partOfCal' href='javascript:process(1,\"" + cal + "\")'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/right.gif' width='11' height='17' border='0'></a>"

}





tableOutput += "</table>";



//alert(tableOutput)



monthOutput = "<table cellspacing='0' cellpadding='0' border='0' id=imageCal><tr><td class='partOfCal' bgcolor='#333333' colspan='5'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='1' height='1' border='0'></td></tr><tr><td class='partOfCal' bgcolor='#333333'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='1' height='1' border='0'></td><td class='partOfCal' bgcolor='#FFFFFF'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='1' height='1' border='0'></td><td class='partOfCal'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='150' height='1' border='0'><br class='partOfCal' /><table cellpadding='0' cellspacing='0' border='0' bgcolor='#9CADBD'><tr><td class='partOfCal' bgcolor='#9CADBD' height='15' valign='top'>" + leftarrow + "</td><td align='center' valign='middle' class='months partOfCal' bgcolor='#9CADBD'>" + returnMonth(OTmonth,OTyear) + "</td><td class='partOfCal' align='right' bgcolor='#9CADBD' valign='top'>" + rightarrow + "</td></tr></table>";



disclaimer = "<table cellspacing='0' cellpadding='0' border='0'><tr><td class='partOfCal' bgcolor='#333333' colspan='2'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='1' height='1' border='0'></td></tr><tr><td class='partOfCal' align='center' valign='bottom'></td><td class='partOfCal' align='right' valign='bottom'><a class='partOfCal' href='javascript:closeCalendar(\"" + cal + "\",\"" + OTcalShim + "\")'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/close.gif' width='16' height='12' border='0' vspace=3 align=right></a></td></tr></table></td><td class='partOfCal' bgcolor='#FFFFFF'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='1' height='1' border='0'></td><td class='partOfCal' bgcolor='#333333'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='1' height='1' border='0'></td></tr><tr><td class='partOfCal' bgcolor='#333333' colspan='5'><img class='partOfCal' src='"+staticServerPath +"/img/dnbase/spacer.gif' width='1' height='1' border='0'></td></tr></table>";

tableOutput = (monthOutput + tableOutput) + disclaimer;



	document.getElementById(cal).innerHTML=tableOutput;

	setVisible(true,cal,OTcalShim);



}





// any click outside of the calendar will hide all calendars

function exteriorCloseCal(e) {

	var myObj = new Object;

	if( !e ) {

		if( window.event ) {

			e = window.event;

		} else {

			return;

		}

	}

	if (document.all) {

		myObj = e.srcElement;

	} else {

		myObj = e.target;

	}

	// we close all calendars on every click on the document, UNLESS that click is:

	// 1) on a calendar, noted by a match to class name partOfCal or 2) is on a named input field (which call the calendar)

	// all objects in calendar must be part of class partOfCal

	if (myObj.className.indexOf("partOfCal") == -1 && myObj.name != 'startDate' && myObj.name != 'endDate' && myObj.name != 'travelStartDate') {

		killAllCalendars();

	}

}

document.onclick=exteriorCloseCal;
