// JavaScript Document




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

var pInputMonth;
var pInputDay;
var pInputYear;
var today = new Date();
var javaDate=today;
var year = today.getFullYear();
var javaYear=year;
var month = today.getMonth();
var javaMonth=today.getMonth();
var inputDateField;
var inputDate;
var defaultDate;
var vertical;
var tInputMonth;
var tInputDay;
var tInputYear;
var calShim;
var kCal;
var kCalShim;
var defaultDateString = 'mm/dd/yyyy';

var pkId = "";
var pkJsMOver = " ";
var pkJsMOut = " ";
var pkJsOnClick = " ";
var activeCal = "";
var foo = true; //debugging var
var javaLimitYear = 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() {
		kCal = activeCal;
		kCalShim = activeCal+"Shim";
		setVisible(false,activeCal, activeCal+"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 >= javaMonth) ? javaYear : javaYear + 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")) {
				pInputMonth = dateTokenArray[0];
				pInputDay = dateTokenArray[1];
				pInputYear = dateTokenArray[2];
			}
			else if ((defaultDateString == "yyyy/mm/dd") || (defaultDateString == "yy/mm/dd")) {
				pInputMonth = dateTokenArray[1];
				pInputDay = dateTokenArray[2];
				pInputYear = dateTokenArray[0];

			}
			else if ((defaultDateString == "dd/mm/yyyy") || (defaultDateString == "dd/mm/yy") || 
			(defaultDateString == "dd.mm.yyyy") || (defaultDateString == "dd.mm.yy")) {
				pInputMonth = dateTokenArray[1];
				pInputDay = dateTokenArray[0];
				pInputYear = dateTokenArray[2];
			}
			else {
				return;
			}	
		}else{
			return;
		}
	}

	parseDateMain(dateString);
}


function processMonth(startMonthField,endMonthField) {
	endMonthField.selectedIndex = startMonthField.selectedIndex;
}

function process(num,cal) {


	if(num == -1) {
		if(month == 0) {
			month = 11;
			year--;
			today.setFullYear(year);
		}
		else { month--; }
	}
	if(num == 1) {
		if(month == 11) {
			month = 0;
			year++;
			today.setFullYear(year);
		}
		else { month++; }
	}
	// month set twice for bug #10002
	today.setMonth(month);
	today.setMonth(month);
	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 = kCal;
		sCalShim = kCalShim;
	}
	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) {
	kCal = cCal;
	kCalShim = cCalShim;
	setVisible(false);
}

function setField(userDateField, userSiblingDate, userDate, userVertical) {
	// First off, lets kill all calendars if any.
	//	alert("set field");
	killAllCalendars();
	inputDateField = userDateField;
	inputDate = userDate;
	vertical = userVertical;


	var dToday = today;
	defaultDate = dToday.getMonth()+1+'/'+dToday.getDate()+'/'+javaYear;

	if (inputDate == defaultDateString) {
		if (userSiblingDate == defaultDateString) {
			inputDate = defaultDate;
		} else {
			inputDate = userSiblingDate;
		}
	} else if (inputDate.length < 1) {
		inputDate = defaultDate;
	}

	try {
		parseDate(inputDate);
	} catch(e) {
		parseDate(defaultDate);
	}

	if (parseToSingleDigit(pInputMonth) > 12) {
		parseDate(defaultDate);
	}

	tInputMonth =  parseToSingleDigit(pInputMonth);
	tInputDay = parseToSingleDigit(pInputDay);
	tInputYear = ((pInputYear.length <= 2) ? '20' + pInputYear : pInputYear);

	month = tInputMonth - 1;
	today.setMonth(month);
	year = tInputYear;
	today.setFullYear(year);
}

function returnDate(inDay,cal) {
	// write the new date to the date field
	var thisDay = inDay;
	var thisMonth = month + 1;
	var thisYear = year;
	var thisYearString = '' + thisYear;
	
	
	if ((defaultDateString == "mm/dd/yyyy") || (defaultDateString == "mm/dd/yy")) {
		inputDateField.value = parseToDoubleDigit(thisMonth) + '/' + parseToDoubleDigit(thisDay) + '/' + (thisYear);
	}
	else if ((defaultDateString == "yyyy/mm/dd") || (defaultDateString == "yy/mm/dd")) {
		inputDateField.value = (thisYear) + '/' + parseToDoubleDigit(thisMonth) + '/' + parseToDoubleDigit(thisDay);
	}
	else if ((defaultDateString == "dd/mm/yyyy") || (defaultDateString == "dd/mm/yy")) {
		inputDateField.value = parseToDoubleDigit(thisDay) + '/' + parseToDoubleDigit(thisMonth) + '/' + (thisYear);
	}
	else if ((defaultDateString == "dd.mm.yyyy") || (defaultDateString == "dd.mm.yy")) {
		inputDateField.value = parseToDoubleDigit(thisDay) + '.' + parseToDoubleDigit(thisMonth) + '.' + (thisYear);
	}

	closeCalendar(cal, calShim);
	
	SelectResTime(ShowDay(thisMonth,thisDay,thisYear));
}

function writeCalendar(cal) {
//alert(vertical);
	activeCal = cal;
	calShim = 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(month);
	var firstOfMonth = new Date (year, month, 1);
	var startingPos  = firstOfMonth.getDay()
	startingPos -= parseInt(0)
	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(month + 1); //modify date segments for peak date id's
		var pkCurrentDay;
		pkCurrentDay = parseToDoubleDigit(currentDay);
		year = "" + year;  //javascript internal bug; force type to year
		pkYear = year.substring(2,4);
		var pkId = " ";

	  

		  pkId = "pk" + pkMonth  + pkCurrentDay + pkYear;
		  pkJsMOver = " ";
		  pkJsMOut = " ";
		  pkJsOnClick = " ";

			if(vertical == "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){

							pkJsMOver = " onmouseover='wrtPkDayDtls(\"" + label + "\");' ";
							pkJsMOut =  " onmouseout='javascript:hideLayer(\"pkDayDtls\");' ";
							pkJsOnClick = " onclick='javascript:hideLayer(\"pkDayDtls\");' "
							pStyleCode = " pkD "
					}
				}
			}


			checkPkDays(pkId);
		}

		if(month + 1 == tInputMonth && (currentDay == tInputDay)) { sltdDt = "style=\"border:1px solid #9CADBD; background-color:#FFEF9C;\""
	 sltdDtA="style=\"background-color:#FFEF9C;\""
 } 

		var verticalDate = javaDate;

		var nonClickableDayString = "<td " + pkJsMOver + pkJsMOut + pkJsOnClick + " class='nonclickableDays partOfCal " + pStyleCode + "' " + ">" + currentDay + "</td>";

		var clickableDayString = "<td " + pkJsMOver + pkJsMOut + pkJsOnClick + " class='clickableDays partOfCal " +  pStyleCode +  "' " + " id='" + pkId + "' " + sltdDt + "><a href=javascript:returnDate(" + currentDay + ",'" + cal + "'); class='clickableDays partOfCal " + pStyleCode + "' " + " id=' " + pkId   + "' " + 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(vertical != 'pastpurchase') {
		//alert("javamonth = " + javaMonth + " javaYear :" + javaYear + " current day : " + currentDay + " vertical date: " + verticalDate);
		if (month <= javaMonth && year == javaYear) {
			if (month == javaMonth && currentDay >= verticalDate.getDate()) {
				tableOutput += clickableDayString;
			} else {
				tableOutput += nonClickableDayString;
			}
		} else if (year >= javaLimitYear) {
			if ((month > javaLimitMonth) || (month == javaLimitMonth && currentDay >= javaLimitDate) || (year > javaLimitYear)){
				tableOutput += nonClickableDayString;
			} else {
				tableOutput += clickableDayString;
			}
		} else if (year < javaYear) {
			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(vertical == '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(month==javaMonth && year==javaYear) 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(vertical == '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((month==javaMonth-1) && (year==javaYear+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(month,year) + "</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 + "\",\"" + calShim + "\")'><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,calShim);

}


// 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;



/*******************************************
Script used to display current date.
********************************************/
var d=new Date();
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";

function ShowDay(month,date,year) {
	var ryear = year;
	if(ryear < 0)
		ryear= 0;
		
	var rmonth = month - 1;
	var rdate = date;
	
	var rnow = new Date(ryear,rmonth,rdate);
	
	var rday = rnow.getDay();
	
	return(weekday[rday]);
}


function SelectResTime(thisDay){
// ON selection of category this function will work

	var subBtn = document.getElementById('res_submit');
	var mondayAlert = document.getElementById('mondayAlert');
	
	if(thisDay == 'Monday'){
		subBtn.style.display = 'none';
		mondayAlert.style.display = '';
	
	} else {
		subBtn.style.display = '';
		mondayAlert.style.display = 'none';
		
		removeAllOptions(document.r.ResTime);
		if(thisDay == 'Sunday' || thisDay == 'Tuesday' || thisDay == 'Wednesday'){
			addOption(document.r.ResTime,"5:30 PM", "5:30 PM");
			addOption(document.r.ResTime,"6:00 PM", "6:00 PM");
			addOption(document.r.ResTime,"6:30 PM", "6:30 PM");
			addOption(document.r.ResTime,"7:00 PM", "7:00 PM", true);
			addOption(document.r.ResTime,"7:30 PM", "7:30 PM");
			addOption(document.r.ResTime,"8:00 PM", "8:00 PM");
			addOption(document.r.ResTime,"8:30 PM", "8:30 PM");
		} else {
			addOption(document.r.ResTime,"5:30 PM", "5:30 PM");
			addOption(document.r.ResTime,"6:00 PM", "6:00 PM");
			addOption(document.r.ResTime,"6:30 PM", "6:30 PM");
			addOption(document.r.ResTime,"7:00 PM", "7:00 PM", true);
			addOption(document.r.ResTime,"7:30 PM", "7:30 PM");
			addOption(document.r.ResTime,"8:00 PM", "8:00 PM");
			addOption(document.r.ResTime,"8:30 PM", "8:30 PM");
			addOption(document.r.ResTime,"9:00 PM", "9:00 PM");
			addOption(document.r.ResTime,"9:30 PM", "9:30 PM");
		}
	}
	
	

}
////////////////// 

function removeAllOptions(selectbox)
{
	var i;
	for(i=selectbox.options.length-1;i>=0;i--)
	{
		//selectbox.options.remove(i);
		selectbox.remove(i);
	}
}


function addOption(selectbox, value, text, selectIt )
{
	var optn = document.createElement("OPTION");
	optn.text = text;
	optn.value = value;
	if(selectIt) optn.selected = true;

	selectbox.options.add(optn);
}



var sHours;
var sMins;
var sTime;

sHours = today.getHours();

if (sHours >= 12) {
	sTime = " PM";
} else {
	sTime = " AM";
}

if (sHours > 12) {
	sHours -= 12;
}

if (sHours == 0) {
	sHours = 12;
}

sMins = today.getMinutes();

if (sMins < 10) {
	sMins = "0" + sMins;
}

function getCurrentDate(checkTime){
	var dToday = today;
	var finalDay = dToday.getDate();
	
	// same day reservations can only be made until 5pm
	//if(checkTime){
	//	if(sTime == " PM" && sHours >= 5 && parseInt(sMins) > 0){
	//		finalDay = dToday.getDate() + 1;
	//	}
	//}
	
	defaultDate = parseToDoubleDigit(dToday.getMonth()+1) + '/' + parseToDoubleDigit(finalDay) + '/' + javaYear;
	
	return defaultDate;
}

function inputCurrentDate(){
	document.r.startDate.value = getCurrentDate(true);
}

function getStampDate(){
	
	var stampDate = getCurrentDate() + ' ' + sHours + ":" + sMins + sTime;
	
	return stampDate;
}

function inputStampDate(){
	document.r.txtHidServerTime.value = getStampDate();
}


