/*****global variables*******/
var staticServerPath="";
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 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 convertMonthAbbreviation(inputString){
		var alphaMonth;
		var numericMonth;
		var numericString;
		var re1 = /^[a-zA-Z]*/;
		var re2 = /^[a-zA-Z]{3}/;

		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 testPattern = rDelimRegEx;
		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;
		
		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

			// rely on the index of the month, date, year as established by the backend..
			pInputMonth = dateTokenArray[CONST_MONTH_IDX];
			pInputDay = dateTokenArray[CONST_DATE_IDX];
			pInputYear = dateTokenArray[CONST_YEAR_IDX];				
		}else{
			return;
		}
	}
	
	parseDateMain(dateString);
}

function getDatePart(datePart, dateString) {
	var re1 = "|";
    if (dateString != null) {
		var dateTokenArray = dateString.split(re1);//tokenize input into array

		// rely on the index of the month, date, year as established by the backend..
		if(datePart == 'm')return dateTokenArray[CONST_MONTH_IDX];
		if(datePart == 'd')return dateTokenArray[CONST_DATE_IDX];
		if(datePart == 'y')return dateTokenArray[CONST_YEAR_IDX];
	}else{
		return -1;
	}
	
	return -1;
}

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 isDatePatternCorrect(sString) {
	var normString = sString;
	var testPattern =  rDelimRegEx;
    if (normString.match(testPattern)) {
		// in addition to pattern, check limits on month and date (max, 12 and 31)
		var theMonth = parseInt(getDatePart('m',sString), 10);
		if(theMonth <=0 || theMonth > 12)return false;
				
		var theDate = parseInt(getDatePart('d',sString), 10);
		if(theDate <= 0 || theDate > 31)return false;
	
		return true;
	}
	
	return false;
}

function processMonth(startMonthField,endMonthField) {
	endMonthField.selectedIndex = startMonthField.selectedIndex;
}

function process(num,cal) {
var sDelimitedDate = delimit(dtDefaultDate);
//get default date
var defaultDate = new Date(parseInt(getDatePart('y',sDelimitedDate), 10), 
						   parseInt(getDatePart('m',sDelimitedDate), 10)-1,
						   parseInt(getDatePart('d',sDelimitedDate),10),0,0,0)
	//Move month back
	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 
	today.setMonth(month);
	today.setMonth(month);
	
	//verify if date is past default date. 
    if (today < defaultDate) {
		today = defaultDate;
		javaDate = today;
	}
	writeCalendar(cal);
}

function returnMonth(thismonth,thisYear) {

	monthArray = alphaMonthArray;	
	var theMonthYear = MonthDayOrder.replace("[Month]",monthArray[thismonth]);    	
	theMonthYear = theMonthYear.replace("[Year]",thisYear);
	return theMonthYear;
}

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 getTimePart(sTimePart) {
    // get time value (assume time format is either 24 hours or 12 hours (hh:mm or hh:mm AMPM)
    var currTimePicked = document.getElementById(sTimeFieldID).value;

    // split on space..
    var arrTimeSplit = currTimePicked.split(' ');
    var iHourAdder = 0;
    var bTwentyFourHourClock = false;
    if (arrTimeSplit.length > 1) {
        if (arrTimeSplit[1].toLowerCase() == "pm") {
            iHourAdder = 12;
        }
    }
    else {
        bTwentyFourHourClock = true;
    }

    // assume time separator is always :
    var arrTheTime = arrTimeSplit[0].split(':');

    sTimePart = sTimePart.toLowerCase();
    var theTimePart = 0;
    if (sTimePart == 'h') {
        var iHour = parseInt(arrTheTime[0], 10);

        //if time is 12:00 AM then JS treats the time as 12:00 PM as 12 (hour) is passed back to compute date time.
        //if time is 12:00 PM, set it back to 0 so the time part will be set to 12 using the iHourAdder.
        if ((iHourAdder == 0 || iHourAdder == 12) && iHour == 12 && !bTwentyFourHourClock)
            iHour = 0;

        theTimePart = iHour + iHourAdder;
    }

    if (sTimePart == 'm') theTimePart = arrTheTime[1];

    return theTimePart;
}

function getGMTMS(dtConversion, iOffsetMS) {
	var theMSAtLocation = dtConversion.getTime() + iOffsetMS;
	return theMSAtLocation;	
}

function isTimeInPast(sDelimitedDate) {
	
    // get current time at locale - use offset mins provided...
	var dtTheClientDate = new Date();
	
	var iYear = 1900;
	
	if(getDatePart('y',sDelimitedDate).length < 4)
	    iYear = parseInt(getDatePart('y',sDelimitedDate), 10) + 2000 //convert double digit year(07) to YYYY(2007)
	else
	    iYear = parseInt(getDatePart('y',sDelimitedDate), 10)
	
	var dtPickedDate = new Date(iYear, 
		parseInt(getDatePart('m',sDelimitedDate), 10)-1, 
		getDatePart('d',sDelimitedDate),
		getTimePart('h'),getTimePart('m'),0,0);

	// get current time at locale - use offset mins provided...
	var dtTheClientDate = new Date();
	
	//alert('client date is ' + dtTheClientDate);
	// number will be positive if you are behind UTC (e.g., Pacific Daylight Time), 
	// and negative if you are ahead of UTC (e.g., Japan). 
	var iDiffFromGMTMS = dtTheClientDate.getTimezoneOffset() * 60 * 1000;	
	var iGMTClientMS = dtTheClientDate.getTime() + iDiffFromGMTMS; // get current time at GMT in MS..
	var theLocationLocalTimeMS = iGMTClientMS + (iGMTOffsetMins * 1000 * 60); // add offset of actual location to current local time at required locale..	
	
	// picked time, translated to local time
	var iPickedDateMS = dtPickedDate.getTime();
	
	//alert('picked date ' + dtPickedDate);
	//alert('Current local time ' + theLocationLocalTimeMS);
	//alert('Picked time ' + iPickedDateMS);
	
	// if location time is AFTER time picked, its a problem..
    if (theLocationLocalTimeMS > iPickedDateMS) {
		return true;
	}
	
	return false;
}

function setField(userDateField, userSiblingDate, userDate, userVertical) {
	// First off, lets kill all calendars if any.
	killAllCalendars();
	inputDateField = userDateField;
	inputDate = userDate;
	vertical = userVertical;

	var dToday = today;
	//defaultDate = dToday.getMonth()+ 1 + '/' + dToday.getDate() + '/' + javaYear;
	defaultDate = dtDefaultDate;
	
	// check if user date is in correct format..
	var sDelimDate = delimit(inputDate);
    if (isDatePatternCorrect(sDelimDate) == false) {
		// override input with default..
		inputDate = dtDefaultDate;
		userDateField.value = dtDefaultDate;
		alert(sDefaultFormatErrMsg);
	}
	
	// check if date time picked is in the past..
	/* TODO: This method is not working correctly*/
    if (isTimeInPast(sDelimDate) == true) {
		// override input with default..
		inputDate = dtDefaultDate;
		userDateField.value = dtDefaultDate;
		alert(sTimeInPastMessage);
	} 
	//*/
	
	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);
		inputDate = 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 splitToLength(sNumericVal, iLength, isYear) {
	iLength = parseInt(iLength,10);
	var theRet = sNumericVal;
	
	// no date element can be higher than 4, neither can it be 3.
	if(iLength > 4 || iLength == 3)return sNumericVal;

    if (iLength == 1 && isYear == false) {
		theRet = parseToSingleDigit(sNumericVal);
		return theRet;
	}
	
    if (iLength == 2 && isYear == false) {
		theRet = parseToDoubleDigit(sNumericVal);
		return theRet;
	}
	
	// if its a year field and length is 4, dont do anything..
    if (isYear == true && iLength == 4) {
		return sNumericVal;
	}
	
	// year will always be either 2 or 4 wide, at this point, its 2 wide,
	// which means, return the last two elements..
	theRet = sNumericVal.substr(2);
	
	return theRet;
}

function returnDate(inDay,cal) {
    var thisDay = inDay;
	var thisMonth = month + 1;
	var thisYear = year;
	var thisYearString = '' + thisYear;
	
	// split date format..
	var arrFormat = defaultDateString.split(sDateDelim);

	// use the indices to determine position..
	var arrLocalizedDate = new Array(3);
	arrLocalizedDate[CONST_MONTH_IDX] = splitToLength(thisMonth,arrFormat[CONST_MONTH_IDX].length,false);// parseToDoubleDigit(thisMonth);
	arrLocalizedDate[CONST_DATE_IDX] = splitToLength(thisDay,arrFormat[CONST_DATE_IDX].length,false); // parseToDoubleDigit(thisDay);
	arrLocalizedDate[CONST_YEAR_IDX] = splitToLength(thisYear,arrFormat[CONST_YEAR_IDX].length,true);// thisYear;
	
	// use / as the default separator, this might change later and we will need to stream this too.
	inputDateField.value = "";
    for (iDateItr = 0; iDateItr < arrLocalizedDate.length; iDateItr++) {
		if(inputDateField.value.length > 0)inputDateField.value += sDateDelim;
		inputDateField.value += arrLocalizedDate[iDateItr];		
	}
	
	// set hidden field..
	var theField = document.getElementById(hidVarName);
	theField.value = inputDateField.value;
	
    // TODO: Fix this hack and remove the hard coded ID
    var theField2 = document.getElementById("RestaurantProfile_RestaurantProfileRRTabCtrl_RestSearchBox_OTDateSearch_hidDtVal");
    if (theField2 != null) {
        theField2.value = inputDateField.value;
    }
   // alert(hidVarName);

	//Verify if Date is valid or not. 
	ValidateDateTime();

	//close calendar
	closeCalendar(cal, calShim);
	
}

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>";
	
	// build table from starting day of week onwards..
	var theFirstDayOfWeek = iFirstDayOfWeek;
    for (iDOWIndex = 0; iDOWIndex < arrDayOfWeekName.length; iDOWIndex++) {
		// stream header...
		tableOutput += "<td class='weekdays partOfCal'>";
		
		// stream day of week..
		tableOutput += arrDayOfWeekName[theFirstDayOfWeek % arrDayOfWeekName.length];		
		
		// move ahead to next day of week
		theFirstDayOfWeek++;
		
		// terminate td
		tableOutput += "</td>";
	}
	
	// terminate outer tr
	tableOutput += "</tr><tr align='right'>";

 	var days = getAllDaysInMonth(month);
	var firstOfMonth = new Date (year, month, 1);
	var startingPos  = firstOfMonth.getDay();
	
	//var positionOffset = 7-parseInt(iFirstDayOfWeek);
	
	startingPos -= parseInt(iFirstDayOfWeek);	

	if (startingPos < 0) {
		startingPos = 7+startingPos;
	}

	//startingPos += positionOffset;
	
	days += startingPos;
	
	//alert(startingPos + ":" + days + ":" + firstOfMonth.getDay());

	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 = ComputeLocalTime(javaDate);

		var nonClickableDayString = "<td " + pkJsMOver + pkJsMOut + pkJsOnClick + " class='nonclickableDays partOfCal " + pStyleCode + "' " + ">" + currentDay + "</td>";
		//if it is favorites page then change the way date links are populated.
		if(bIsFavPage == 1)
            var clickableDayString = "<td " + pkJsMOver + pkJsMOut + pkJsOnClick + " class='clickableDays partOfCal " + pStyleCode + "' " + " id='" + pkId + "' " + sltdDt + "><a href='#' onclick=javascript:returnDate(" + currentDay + ",'" + cal + "');returnDate(" + currentDay + ",'cal1'); class='clickableDays partOfCal " + pStyleCode + "' " + " id=' " + pkId + "' " + sltdDtA + ">" + currentDay + "</a></td>"
		else
            var clickableDayString = "<td " + pkJsMOver + pkJsMOut + pkJsOnClick + " class='clickableDays partOfCal " + pStyleCode + "' " + " id='" + pkId + "' " + sltdDt + "><a href=javascript:returnDate(" + currentDay + ",'" + cal + "');returnDate(" + currentDay + ",'cal1'); 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<34; i++)  {
		tableOutput += blankColumn;
		columnCount++;

		if (columnCount % 7 == 0) {
			tableOutput += "</tr>";
			if (i<33) {
				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>";

//if it is favorites page then change the way date links are populated.
if(bIsFavPage == 1)
	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= '#' onclick='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>";
else
	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
	var oCtlChk = new RegExp("theOTDate", "ig");
	var arrCtlMatch = new Array();	
    if (myObj.name != null) {
		arrCtlMatch = myObj.name.match(oCtlChk);
	}
	
	if(arrCtlMatch == null)arrCtlMatch = new Array();

	if (myObj.className.indexOf("partOfCal") == -1 
		&& arrCtlMatch.length == 0 
		&& myObj.name != 'endDate' 
		&& myObj.name != 'travelStartDate') {
		killAllCalendars();
	}
}

function ValidateDateTime() {
	var bValid = true;
	var ctlUserDateField = document.getElementById(sDateFieldID)
	var dtDate = ctlUserDateField.value
	var dtTimeDD = document.getElementById(sTimeFieldID);
	var defTime = document.getElementById(sDefaultTimeValID);
	
	inputDate = dtDate;
	var dToday = today;
	defaultDate = dtDefaultDate;
	
	// check if user date is in correct format..
	var sDelimDate = delimit(inputDate);
    if (isDatePatternCorrect(sDelimDate) == false) {
		// override input with default..
		inputDate = dtDefaultDate;
		ctlUserDateField.value = dtDefaultDate;
		alert(sDefaultFormatErrMsg);
		bValid = false;
	}
	
	// check if date time picked is in the past..
    if (isTimeInPast(sDelimDate) == true) {
		// override input with default..
		inputDate = dtDefaultDate;
		ctlUserDateField.value = dtDefaultDate;
		alert(sTimeInPastMessage);
		
		//reset to default value
		dtTimeDD.value = defTime.value;
		
		bValid = false;
	} 
	return bValid;
}

//Compute current local time based on GMT offset.
function ComputeLocalTime(dtBrowserTime) {
	var dtCurrentLocalTime = new Date();
	try{
		var iDiffFromGMTMS = dtBrowserTime.getTimezoneOffset() * 60 * 1000;	
		var iGMTClientMS = dtBrowserTime.getTime() + iDiffFromGMTMS; // get current time at GMT in MS..
		var theLocationLocalTimeMS = iGMTClientMS + (iGMTOffsetMins * 1000 * 60);
		
		//convert milliseconds to date.
		dtCurrentLocalTime = new Date(theLocationLocalTimeMS);
	}
	catch(e){}
	return dtCurrentLocalTime;
}
document.onclick=exteriorCloseCal;
