//Calendar for use on general booking engines.
//Makes a call to showDayMulti() when hidden to display the days.
//Last modified Oct 14 2010 by Phil

var today;
var lang;

if (! lang){
        if (! Language){var Language = "english";}
	lang = Language;
	if(lang=="french"){lang="fr";}
}
if(lang!="fr" && lang!="it" && lang!="de"){lang = "en";}

var checkBegin = true;
var checkEnd = true;

var daysLimit;

var topOffset = -15;
var leftOffset = 350;

var mNames = new Object();
mNames["en"] = new Array("January","February","March","April","May","June","July","August","September","October","November","December");

var dNames = new Object();
dNames["en"] = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

var dMsg = new Object();
dMsg["en"] = new Object();
dMsg["en"]["invaliddate"] = "invalid date";

var dateFormat;
var dateTpl;
var shownDate;

var c1cells = new Array(43);
var c2cells = new Array(43);

var selectList = new Object();
var selectListCount = 0;

var nextFocusList = new Object();

var dateValue = new Object();
var dateDisplayed = new Object();

var departureField;
var arrivalField;
var currentDateField = null;
var defaultDateField = null;
var dateSources = new Object();
var dateTargets = new Object();
var displayFields = new Object();

var overCalendar = false;
var inDateField = false;

var previousClass;

var isEndReached = false;
var isAtBeginning = true;

var disabledDays = new Object();

var initCalFlag = false;
var initCalFunction;
function registerInitCalendar(initFunction){
	initCalFunction = initFunction;
	initCalFlag = false;
}

function checkInit(){
	if(!calCreated)
		createCalendar();
	if(!initCalFlag)
		initCalFunction();
}
function initCalendar(departureId,arrivalId,optionalLang){
	configCalendar();
	
	for(var i = 1; i <= 42; i++){
		var elem = document.getElementById("c1c" + i);
		c1cells[i] = elem;
	}
	
	for(var i = 1; i <= 42; i++){
		var elem = document.getElementById("c2c" + i);
		c2cells[i] = elem;
	}
	setDateAdjustFields(departureId,arrivalId);

	if(optionalLang != null)
		lang = optionalLang;
	initCalFlag = true;
}

function setDateAdjustFields(sourceFieldId,targetFieldId){
	if(sourceFieldId != null){
		departureField = document.getElementById(sourceFieldId);
		currentDateField = departureField;
		dateChange(departureField);

		if(targetFieldId != null){
			dateSources[targetFieldId] = sourceFieldId;
			dateTargets[sourceFieldId] = targetFieldId;
		}
	}
	else
		departureField = null;

	if(targetFieldId != null){
		arrivalField = document.getElementById(targetFieldId);
		currentDateField = arrivalField;
		dateChange(arrivalField);
	}
	else
		arrivalField = null;

	currentDateField = null;
}

function setDisplayFields(sourceFieldId,targetFieldId){
	displayFields[sourceFieldId] = targetFieldId;
}

function configCalendar(){
	today = getGMTServerDate();
	daysLimit = 365;
	dateFormat = new Object();
	dateFormat["en"] = "MM/DD/YYYY";
	dateTpl = new Object();
	dateTpl["en"] = "MM/DD/YYYY";
	shownDate = new Date(today.getFullYear(),today.getMonth(),1);
}

function dateFocus(o,defaultDateFieldId){
	inDateField = true;
	currentDateField = o;

	if(defaultDateFieldId != null)
		defaultDateField = document.getElementById(defaultDateFieldId);
	else
		defaultDateField = null;

	if(! overCalendar)
		showCalendar(o);

	o.select();
}

function dateBlur(o){
	inDateField = false;
	if(! overCalendar)
		hideCalendar();
}

function dateChange(o){
	dateValue[o.id] = null;
	dateDisplayed[o.id] = null;
	displayAsText(o.id,"");
	o.className = "wickEnabled";

	if(o.value.length == 0)
		o.value = dateTpl[lang];
	if(o.value == dateTpl[lang])
		return;

	var theDate = parseDate(o.value);
	if(theDate == null || isDateBeforeToday(theDate) || isDateTooFar(theDate,1)) {
		o.className = "invalid";
		displayAsText(o.id,dMsg[lang]["invaliddate"]);
		return;
	}

	setDate(o,theDate);
	dateDisplayed[o.id] = theDate;

	adjustDates(o);
}

function displayAsText(dateFieldId,text){
	if (displayFields[dateFieldId] != null){
		var e = document.getElementById(displayFields[dateFieldId]);
	  if (e != null){
		  e.innerHTML = "";
		  e.innerHTML = text;
		}
	}
}

function calendarOver(o){
	overCalendar = true;
}

function calendarOut(o){
	overCalendar = false;
}

function mover(target){
	previousClass = target.className;
	target.className = "over";
}

function mout(target){
	target.className = previousClass;
}
function cover(target){
	if(Number(target.innerHTML) > 0 && target.className != "past"
					&& target.className != "weekendpast" && target.className != "disabled"){
		previousClass = target.className;
		target.className = "over";
	}
}

function cout(target){
	if(Number(target.innerHTML) > 0 && target.className != "past"
					&& target.className != "weekendpast" && target.className != "disabled"){
		target.className = previousClass;
	}
}

function registerSelect(dateId,selectId){
	if(selectList[dateId] == null)
		selectList[dateId] = new Array();
	selectList[dateId][selectList[dateId].length] = selectId;
}

function setNextFocusField(fieldId,nextFieldId){
	nextFocusList[fieldId] = nextFieldId;
}
function showCalendar(dateField){
    var d = dateDisplayed[dateField.id];

	if (d == null && dateField != null && arrivalField != null && dateField.id == arrivalField.id)
		d = dateDisplayed[departureField.id];

	if (d == null)
		d = dateValue[dateField.id];

	if(d == null){
		if(defaultDateField != null)
			d = parseDate(defaultDateField.value);
	}
	if(d == null){
		d = today;
	}

	shownDate = new Date(d.getFullYear(),d.getMonth(),1);

	var c = document.getElementById("cal");
	c.style.position = "absolute";
	c.style.left = (findPosY(dateField) + leftOffset) + "px";
	c.style.top = (findPosY(dateField) - topOffset) + "px";
   
	var fields = selectList[dateField.id];
	if(fields) for(var i = 0; i < fields.length; i++){
		if(document.getElementById(fields[i]) != null)
			document.getElementById(fields[i]).style.visibility = "hidden";
    	}
        
	document.getElementById("cal").style.display = "block";

	displayDates();
}

function hideCalendar(){
	document.getElementById("cal").style.display = "none";

	if(currentDateField){
		var fields = selectList[currentDateField.id];
		if(fields) for(var i = 0; i < fields.length; i++){
			if(document.getElementById(fields[i]) != null)
				document.getElementById(fields[i]).style.visibility = "visible";
		}
	}
	overCalendar = false;
	showDayMulti(document.getElementById('DepDate'),"lblDepDay");
	showDayMulti(document.getElementById('ArrDate'),"lblRetDay");
}

function changeMonth(i){
	shownDate.setMonth(shownDate.getMonth() + i);
	displayDates();

	currentDateField.focus();
}

function selectDate(o,monthOffset){
	if(o.className == "past" || o.className == "weekendpast" ||
		 o.className == "disabled" || ! Number(o.innerHTML) > 0){
		currentDateField.focus();
		return;
	}

	var newDate = new Date(shownDate.getFullYear(),shownDate.getMonth() + monthOffset,o.innerHTML);
	setDate(currentDateField,newDate);
	currentDateField.className = "wickEnabled";
	
	dateDisplayed[currentDateField.id] = shownDate;
	adjustDates(currentDateField);

	hideCalendar();
	
	if (currentDateField.id == "DepDate") {
		if (document.getElementById("IBarr").disabled) {
			if (document.getElementById('radioval').value=='O') {
			//document.getElementById("imgGo").focus();
			}
			else {
			//Automatically go to the arrival date when departure date is selected?
			//document.getElementById("ArrDate").focus();
			}
		} else {
			document.getElementById("IBdep").focus();
			document.getElementById("IBdep").select();
		}
	}

	if(nextFocusList[currentDateField.id] != null) {
		var elem = document.getElementById(nextFocusList[currentDateField.id]);
		if(elem != null)
			elem.focus();
	}
}

var dateAdjustPlugin;
function adjustDates(sourceField){
	var getSource = function(f){
		return dateSources[f] == null ? null : document.getElementById(dateSources[f]);
	};
	var getTarget = function(f){
		return dateTargets[f] == null ? null : document.getElementById(dateTargets[f]);
	};
	adjustField(getSource(sourceField.id),"target",getSource);
	adjustField(sourceField,"source",getTarget);
}

function adjustField(sourceField,type,getNext){
	if(sourceField == null)
		return null;
	var targetName = dateTargets[sourceField.id];
	if(targetName == null)
		return;
	var targetField = document.getElementById(targetName);
	if(targetField == null)
		return;

	dateAdjustPlugin(sourceField,targetField,type);
	adjustField(getNext(sourceField.id),type,getNext);
}

function setDate(f, newDate){
	if(f.id == null || dateValue[f.id] == newDate)
	  return;
	dateValue[f.id] = newDate;
	f.value = formatDate(newDate,dateFormat[lang]);
	displayAsText(f.id,formatTextDate(newDate));
}

function defaultDateAdjustPlugin(sourceField,targetField,type){
	var sourceDate = dateValue[sourceField.id];
	var targetDate = dateValue[targetField.id];
	
	var msecsInADay = 86400000;
	var msecsInAWeek = msecsInADay * 7;
	var addedDate;
	var subtractedDate;
	
	if(sourceDate != null && targetDate != null && sourceDate.getTime() > targetDate.getTime()){
		if(type == "source"){
			// use addedDate to add one day to the date adjustment.
			addedDate = new Date(sourceDate.getTime() + msecsInAWeek);
			// Set the arrival date to at least one day after departure.
			setDate(targetField, addedDate);
			dateDisplayed[targetField.id] = dateDisplayed[sourceField.id];
		} else if(type == "target") {

			subtractedDate = new Date(targetDate.getTime() - msecsInAWeek);
			
			setDate(sourceField, subtractedDate);
			dateDisplayed[sourceField.id] = dateDisplayed[targetField.id];
		}
	}
}

dateAdjustPlugin = defaultDateAdjustPlugin;

function displayDates(){
	var nextMonthDate = new Date(shownDate.getFullYear(),shownDate.getMonth() + 1,1);
	document.getElementById("cal1Title").innerHTML = "";
	document.getElementById("cal1Title").innerHTML = mNames[lang][shownDate.getMonth()] + " " + shownDate.getFullYear();
	document.getElementById("cal2Title").innerHTML = "";
	document.getElementById("cal2Title").innerHTML = mNames[lang][nextMonthDate.getMonth()] + " " + nextMonthDate.getFullYear();

	isEndReached = false;
	isAtBeginning = false;

	displayMonth(c1cells,shownDate,"n");
    displayMonth(c2cells,nextMonthDate,"y");
	
	document.getElementById("calarrowback").style.display = (isAtBeginning) ? "none" : "block";
	document.getElementById("calarrowfwd").style.display = (isEndReached) ? "none" : "block";
}

var msInDay = 24 * 60 * 60 * 1000;

function displayMonth(cells,monthDate, ismonth2){
	var lastDate = getMonthDays(monthDate);
	var offset = getCalendarOffset(monthDate);
	var cell = null;

	for(var i = 1; i <= offset; i++){
		cell = cells[i];
		cell.innerHTML = "";
		cell.innerHTML = "&nbsp;";
		if(i % 7 <= 1)
			cell.className = "weekend";
		else
			cell.className = "";
	}
	for(var i = offset + lastDate; i <= 42; i++){
		cell = cells[i];
		cell.innerHTML = "";
		cell.innerHTML = "&nbsp;";
		if(i % 7 <= 1)
			cell.className = "weekend";
		else
			cell.className = "";
	}

	var isTodayMonth = isSameMonth(monthDate,today);
	var isSelectedMonth = isSameMonth(monthDate,dateValue[currentDateField.id]);
	var isDate1Month = departureField != null && isSameMonth(monthDate,dateValue[departureField.id]);
	var isDate2Month = arrivalField != null && isSameMonth(monthDate,dateValue[arrivalField.id]);

	for(var i = 1; i <= lastDate; i++){

		cell = cells[i + offset];
		cell.innerHTML = "";
		cell.innerHTML = i;

		if(checkBegin && monthDate.getTime() <= today.getTime()){
			isAtBeginning = true;
		}

		var normalClass = "";
		var pastClass = "past";
		var isWeekEnd = ((i + offset) % 7) <= 1;
		if(isWeekEnd){
			normalClass = "weekend";
			pastClass = "weekendpast";
		}
       
		if(checkBegin && isTodayMonth && today.getDate() > i){

			cell.className = pastClass;
            isAtBeginning = true;
		}
		else if(isSelectedMonth && dateValue[currentDateField.id].getDate() == i){

            cell.className = "current";
		}
		else if(isDate1Month && dateValue[departureField.id].getDate() == i){
			cell.className = "selected";
            
        }
		else if(isDate2Month && dateValue[arrivalField.id].getDate() == i){
			cell.className = "selected";
		}
		else if(checkEnd && isDateTooFar(monthDate,i)){
       
			cell.className = pastClass;
			isEndReached = true;
		}
		else if(disabledDays[(i + offset - 1) % 7] == true){
			cell.className = "disabled";
		}
        
		else{
			cell.className = normalClass;
		}
	}
}

function isDateBeforeToday(theDate){
  today = getGMTServerDate();
	if(theDate.getFullYear() != today.getFullYear())
		return theDate.getFullYear() < today.getFullYear();
	if(theDate.getMonth() != today.getMonth())
		return theDate.getMonth() < today.getMonth();
	return theDate.getDate() < today.getDate();
}

function isDateTooFar(theDate,offset){
  today = getGMTServerDate();
	var days = Math.ceil((theDate.getTime() - today.getTime()) / msInDay) + offset - 1;
	return days > daysLimit;
}

function getMonthDays(theDate){
	var lastDate = new Date(theDate.getFullYear(),theDate.getMonth() + 1,0);
	return lastDate.getDate();
}
function getCalendarOffset(theDate){
	var firstDay = new Date(theDate.getFullYear(),theDate.getMonth(),1);
	return firstDay.getDay();
}
function isSameMonth(firstDate,secondDate){
    if(firstDate == null || secondDate == null)
		return false;
	return firstDate.getFullYear() == secondDate.getFullYear() && firstDate.getMonth() == secondDate.getMonth();
}

function formatDate(theDate,format){
	if(theDate == null) return null;
	var result = format.toLowerCase();
	result = result.replace(/yyyy/,theDate.getFullYear());
	result = result.replace(/mm/,formatToTwoDigits(theDate.getMonth() + 1));
	result = result.replace(/dd/,formatToTwoDigits(theDate.getDate()));
	return result;
}
function formatTextDate(theDate,format){
	var textLang = lang;
	var textMonth = theDate.getMonth();

	if (lang == "fr" && (textMonth == 5 || textMonth == 6))
	    textLang = "en";
	if(theDate == null) return null;
		return "- " + dNames[textLang][theDate.getDay()].substring(0, 3) + " " +
			theDate.getDate() + "-" +
			mNames[textLang][textMonth].substring(0, 3) + ", " +
			theDate.getFullYear();
}

function formatToTwoDigits(n){
	if(n > 0 && n < 10)
		return "0" + n;
	else
		return n;
}

function parseDate(text){
	var parts = text.split(/[-\/]/);
	var origPartsLength = parts.length;

	if(parts.length < 2 || parts.length > 3)
		return null;

	if(parts.length == 2)
		parts[2] = String(today.getFullYear());
	else if(parts[2].length <= 2)
		parts[2] = String(2000 + Number(parts[2]));

	if(parts[1].length < 1 || parts[1].length > 2 || ! parts[1].match(/[0-9]+/))
		return null;
	if(parts[0].length < 1 || parts[0].length > 2 || ! parts[0].match(/[0-9]+/))
		return null;
	if(parts[2].length == 0 || parts[2].length == 3 ||
		 parts[2].length > 4 || ! parts[2].match(/[0-9]+/))
		return null;

	var newDate = new Date(parts[2],Number(parts[0]) - 1,parts[1]);

	if(origPartsLength == 2 && newDate.getTime() < today.getTime()){
		var dateYearAdjusted = new Date(newDate.getTime());
		dateYearAdjusted.setFullYear(dateYearAdjusted.getFullYear() + 1);
		if(! isDateTooFar(dateYearAdjusted,1))
			newDate = dateYearAdjusted;
	}

	return newDate;
}

function findPosX(obj){
	var curleft = 0;
	if(obj.offsetParent){
		while(obj.offsetParent){
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	}
	else if(obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj){
	var curtop = 0;
	if(obj.offsetParent){
		while(obj.offsetParent){
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if(obj.y)
		curtop += obj.y;
	return curtop;
}

function isDateDefined(f){
	if(f.value == "")
		return false;
	if(! lang)
		return true;

	dateFormat = new Object();
	dateFormat["en"] = "MM/DD/YYYY";


	if(f.value == dateFormat[lang])
		return false;

	var theDate = parseDate(f.value);
	if(theDate == null || isDateBeforeToday(theDate) || isDateTooFar(theDate,1))
		return false;

	return true;
}
if(! typeof Language){
	switch(Language.toLowerCase()){
case "french":	lang = "fr"; break;
		case "english": lang = "en"; break;
		case "de": case "it": case "fr": case "en": lang = Language; break;
		default: lang = "en";
	}
}


var weekdays = new Object();
weekdays["en"] = new Array(8);
weekdays["en"] = ["S", "M", "T", "W", "T", "F", "S"];

var calCreated = false;
function createCalendar(){
	var div = document.getElementById("cal");
	if(div != null){return;}
	div = document.createElement("div");
	div.setAttribute("id","cal");
	div.style.display = "none";
	div.style.position = "absolute";
	document.body.appendChild(div);
   if(document.all){
	   div.attachEvent("onmouseover",calendarOver);
	   div.attachEvent("onmouseout",calendarOut);
	}
	else {
		div.addEventListener("mouseover",calendarOver,true);
		div.addEventListener("mouseout",calendarOut,true);
	}
	var cn = new Array(7);
	for(var cpt=0;cpt<7;cpt++)
		cn[cpt]='';
	cn[0] = ' class="weekend"';
	cn[6] = ' class="weekend"';
	var wd = weekdays[lang];
	var c = "";
	c += '<table cellpadding="0" cellspacing="0" class="calendar">';
	c += '<tr class="mtitle">';
	c += '<td><div id="calarrowback" onmouseout="mout(this)" onmouseover="mover(this)" class="next" onclick="changeMonth(-1)"><img src="images/rewind.gif" alt="-" width="4" height="7" border="0"/></div></td>';
	c += '<td id="cal1Title" colspan="5" class="title" nowrap="nowrap"></td>';
	c += '<td>&nbsp;</td><td rowspan="9" class="spacerA">&nbsp;</td><td rowspan="9" class="spacerB">&nbsp;</td><td>&nbsp;</td>';
	c += '<td id="cal2Title" colspan="5" class="title" nowrap="nowrap"></td>';
	c += '<td><div id="calarrowfwd" onmouseout="mout(this)" onmouseover="mover(this)"  class="next" onclick="changeMonth(1)"><img src="images/forward.gif" alt="+" width="4" height="7" border="0"/></div></td>';
	c += '</tr><tr><td colspan="7" style="font-size: 0px" height="2">&nbsp;</td><td colspan="7" style="font-size: 0px" height="2">&nbsp;</td>';
	c += '</tr><tr class="wtitle">';
	for(var i = 0; i < 2; i++)
		   for(var j = 0; j < 7; j++)
				   c += '<td' + cn[j] + '>' + wd[j] + '</td>';
	c += '</tr>';
	var k = 1;
	while(k <= 42){
		   c += '<tr class="cells">';
		   for(var i = 1; i <= 2; i++){
			   for(var j = 1; j <= 7; j++){
				c += '<td id="c' + i + 'c' + (k++) + '"  onmouseout="cout(this)" onmouseover="cover(this)" onclick="selectDate(this, ' + (i - 1) + ')"' + cn[j] + '>&nbsp;</td>';
			   }
			   if(i == 1)
				k = k-7;
		  }
		  c += '</tr>';
	}
	c += '<tr><td colspan="16" class="link"><a href="javascript:hideCalendar()"><font color="#ffffff" face="Verdana, Arial, Helvetica, sans-serif">Close</font></a></td></tr>';
	c += '</table>';
	div.innerHTML = c;
	calCreated = true; 
}

function initHomeCalendar(){
	var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;
	
	if(Language == "english") {
		lang = "en";
	}
	initCalendar();
	if (IE6) {
		setDateAdjustFields("DepDate","ArrDate");
		registerSelect("DepDate", "FareType");
		registerSelect("ArrDate", "FareType");
		registerSelect("DepDate", "nbinfant");
		registerSelect("ArrDate", "nbinfant");
		registerSelect("DepDate", "nbchilds");
		registerSelect("ArrDate", "nbchilds");
		registerSelect("DepDate", "DepTime");
		registerSelect("DepDate", "ArrTime");
		registerSelect("ArrDate", "ArrTime");
	}
}


var SERVER_DATE;
function getServerTime(ssiDate) {
	
	var dateTime = ssiDate.split(" ");
	var date = dateTime[0].split("-");
	var time = dateTime[1].split(":");
		
	var serverTime = new Date();

	serverTime.setDate(date[0]);
	serverTime.setMonth(parseInt(date[1],10)-1);
	serverTime.setYear(date[2]);
	serverTime.setHours(time[0]);
	serverTime.setMinutes(time[1]);
	serverTime.setSeconds(time[2]);

	SERVER_DATE = new Date();
	SERVER_DATE.setDate(serverTime.getDate());
	SERVER_DATE.setMonth(serverTime.getMonth());
	SERVER_DATE.setYear(serverTime.getFullYear());
	SERVER_DATE.setHours(serverTime.getHours());
	SERVER_DATE.setMinutes(serverTime.getMinutes());
	SERVER_DATE.setSeconds(serverTime.getSeconds());

	LocalDate = new Date();
	
	currentTimeZoneOffsetInMinutes = LocalDate.getTimezoneOffset();
	currentTimeZoneOffsetInHours = parseInt(currentTimeZoneOffsetInMinutes/60, 10);
	currentTimeZoneOffsetInMinutes = currentTimeZoneOffsetInMinutes - currentTimeZoneOffsetInHours*60;
	
	newHours = parseInt(time[0],10)-currentTimeZoneOffsetInHours;
	
	SERVER_DATE.setHours(newHours);
	SERVER_DATE.setMinutes(parseInt(time[1],10)+currentTimeZoneOffsetInMinutes);
	return serverTime;
}

function getGMTServerDate(){

	newDate = new Date();
	if(SERVER_DATE){
		newDate.setDate(SERVER_DATE.getDate());
		newDate.setMonth(SERVER_DATE.getMonth());
		newDate.setYear(SERVER_DATE.getFullYear());
		newDate.setHours(SERVER_DATE.getHours());
		newDate.setMinutes(SERVER_DATE.getMinutes());
		newDate.setSeconds(SERVER_DATE.getSeconds());
	}
	return newDate;
}
