<!-- Dual-Calendar 1.3. -->
<!-- Nicolas Viau June 2005, for Air Canada. -->
//-----------------------------------------------------------
// These variables can be set in the calling HTML page after
// calling the initCalendar function. See the configCalendar
// function for reference.
//-----------------------------------------------------------

var today;
var lang;
if (! lang)
	lang = "en";

// Date range validation
var checkBegin = true;
var checkEnd = true;

// Maximum number of days from today which are allowed for selection.
var daysLimit;

// Vertical offset for calendar from top of date input field.
var inputOffset = 21;

// Arrays of month names by language.
// Ambika - added arrays for DE and IT
var mNames = new Object();
mNames["en"] = new Array("Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
//mNames["fr"] = new Array("Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre");
//mNames["de"] = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
//mNames["it"] = new Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");


//-----------------------------------------------------------
// These variables should not be changed.
//-----------------------------------------------------------

var dateFormat;
var dateTpl;
var shownDate;

var c1cells = new Array(43);
var c2cells = new Array(43);

//Months to num array for use with Flight Search JSP to handle request from Special Offers
var m2n = new Array(12);
m2n["Jan"] = "01";
m2n["Fev"] = "02";
m2n["Mar"] = "03";
m2n["Abr"] = "04";
m2n["Mai"] = "05";
m2n["Jun"] = "06";
m2n["Jul"] = "07";
m2n["Ago"] = "08";
m2n["Set"] = "09";
m2n["Out"] = "10";
m2n["Nov"] = "11";
m2n["Dez"] = "12";

// Associative array of drop-downs select by field name.
var selectList = new Object();
var selectListCount = 0;

var nextFocusList = new Object();

// Associative array of date values.
var dateValue = new Object();

var departureField;
var arrivalField;
var currentDateField = null;
var defaultDateField = null;
var dateSources = new Object();
var dateTargets = new Object();

var overCalendar = false;
var inDateField = false;

var previousClass;

// Flag set if month change buttons should be hidden.
var isEndReached = false;
var isAtBeginning = true;

// Associative array of disabled days.
var disabledDays = new Object();

//
// Initialize calendar.
// If you need to set variables to specific values,
// do it in the calling code just after calling init().
//
//function initCalendar(departureId,arrivalId,optionalLang){
function initCalendar(){
	
	configCalendar();

    var departureId = 'departure1'
    var arrivalId = 'departure2'

	// Cache calendar1 cells for better performance.
	for(var i = 1; i <= 42; i++){
		var elem = document.getElementById("c1c" + i);
		c1cells[i] = elem;
	}
	// Cache calendar2 cells for better performance.
	for(var i = 1; i <= 42; i++){
		var elem = document.getElementById("c2c" + i);
		c2cells[i] = elem;
	}

	setDateAdjustFields(departureId,arrivalId);

	//if(optionalLang != null)
		//lang = optionalLang;
}

//
// Set the arrival and depature fields. Useful if calendar is used
// for more than one calendar field on the page and each calendar
// needs the arrival and departure dates adjusted so the arrival is
// always after depature. Set on date field focus. Set both parameters
// to null to turn off the date adjustment feature.
//
// Integrated PANKAJ's (IBM) fix for reading initial field values.
//
function setDateAdjustFields(sourceFieldId,targetFieldId){
	if(sourceFieldId != null){
		departureField = document.getElementById(sourceFieldId);
		currentDateField = departureField;
		dateChange(departureField);

    // Register parent and child links between fields.
		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;
}

//
// Configure calendar with default values. These values can be overriden
// by the calling HTML page after it has called initCalendar().
//
// This function is called by init(). If you need to set variables to specific
// values, such as lang, do it in the calling code after calling init().
//
function configCalendar(){
	today = new Date();

	// Maximum number of days from today which are allowed for selection.
	daysLimit = 346;

	// Date formats.
	dateFormat = new Object();
	dateFormat["en"] = "DD/MM/AAAA";
	//dateFormat["fr"] = "DD/MM/YYYY";
	//dateFormat["de"] = "DD/MM/YYYY";
	//dateFormat["it"] = "DD/MM/YYYY";

	// Template for empty dates.
	dateTpl = new Object();
    dateTpl["en"] = "DD/MM/AAAA";
    //dateTpl["fr"] = "JJ/MM/AAAA";
    //dateTpl["de"] = "TT/MM/JJJJ";
    //dateTpl["it"] = "GG/MM/AAAA";

	shownDate = new Date(today.getFullYear(),today.getMonth(),1);
}

//
// Must be called when the user clicks or tabs into a date input field (onfocus event).
//
function dateFocus(o,defaultDateFieldId){
	inDateField = true;
	//document.getElementById('ClassOfService').visibility = "hidden";
    //document.getElementById('hideADT').display = "none";
    //document.getElementById('hideBAB').display = "none";
    //document.getElementById('hideCHD').display = "none";
	currentDateField = o;	
    
	// Store default date field if set.
    if(defaultDateFieldId == null)		
		
		defaultDateField = null;
		//defaultDateField = document.getElementById('departure1');	
		
	else
		
		defaultDateField = document.getElementById(defaultDateFieldId);

	if(! overCalendar)
		
		showCalendar(o);   

	o.select();
}

//
// Must be called when the user clicks or tabs out of a date input field (onblur event).
//
function dateBlur(o){
	inDateField = false;
	if(! overCalendar)
		hideCalendar();
}

//
// Must be called when the content of a date input field changes (onchange event).
//
function dateChange(o){
	if(o.value.length == 0)
		o.value = dateTpl[lang];
	o.className = "";

	if(o.value == dateTpl[lang]){
		dateValue[o.id] = null;
		return;
	}

	var theDate = parseDate(o.value);
	if(theDate == null || isDateBeforeToday(theDate) || isDateTooFar(theDate,1)){
		o.className = "invalid";
		dateValue[o.id] = null;
		return;
	}

	o.className = "";
	dateValue[o.id] = theDate;
	o.value = formatDate(theDate,dateFormat[lang]);

    adjustDates(o);
	
}


//
// Must be called when the mouse goes over the calendar (onmouseover event). Will be called
// whenever the mouse changes date cell too.
//
function calendarOver(o){
	overCalendar = true;
}

//
// Must be called when the mouse leaves the calendar (onmouseout event). Will be called
// whenever the mouse changes date cell too.
//
function calendarOut(o){
	overCalendar = false;
}

//
// Changes display class when mouse is over element.
//
function mover(target){
	previousClass = target.className;
	target.className = "over";
}

//
// Restores previous display class when mouse goes off element.
//
function mout(target){
	target.className = previousClass;
}

//
// Changes display class when mouse is over element.
//
function cover(target){
	if(Number(target.innerHTML) > 0 && target.className != "past"
					&& target.className != "weekendpast" && target.className != "disabled"){
		previousClass = target.className;
		target.className = "over";
	}
}

//
// Restores previous display class when mouse goes off element.
//
function cout(target){
	if(Number(target.innerHTML) > 0 && target.className != "past"
					&& target.className != "weekendpast" && target.className != "disabled"){
		target.className = previousClass;
	}
}

//
// Registers a select drop-down field so it is hidden when the calendar for
// the specified date field is displayed. Required only because of a bug with
// Internet Explorer.
//
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;
}

//
// Display the calendar beneath the current field.
//
function showCalendar(dateField){
	var d = dateValue[dateField.id];

	// Determine default month and year to open calendar.
	if(d == null){
		// See if default fields set
		if(defaultDateField != null)
			d = parseDate(document.getElementById('departure1').value);
	}
	if(d == null){
		// Still null, set today's date as default.
		d = today;
	}

    shownDate = new Date(d.getFullYear(),d.getMonth(),1);

	// Position (hidden) calendar underneath field.
	var c = document.getElementById("cal");
	c.style.position = "absolute";
	c.style.left = findPosX(dateField) + "px";
	c.style.top = (findPosY(dateField) + inputOffset) + "px";

	// Loop through array of select elements to hide.
	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";
	}

	// Show calendar.
	document.getElementById("cal").style.display = "block";
	document.getElementById("numberOfChildren").style.display = "none";	
    document.getElementById("numberOfInfants").style.display = "none";
    document.getElementById("numberOfAdults").style.display = "none";
    document.getElementById("classType").style.display = "none";
    //document.getElementById("NumCriancas").style.display = "none";
    if(currentDateField.id == "departure1") {
    document.getElementById("departTime2").style.display = "none";
    //document.getElementById("OFFICE_ID").style.display = "block";
    }
    // if(currentDateField.id == "departure2") {
   // document.getElementById("OFFICE_ID").style.display = "none";
    //}

	// Display dates in calendar.
	displayDates();
}


function hideCalendar(){
	// Hide calendar.
	document.getElementById("cal").style.display = "none";
	
	//Teste 
	document.getElementById("numberOfChildren").style.display = "block";
    document.getElementById("numberOfInfants").style.display = "block";
    document.getElementById("numberOfAdults").style.display = "block";
    document.getElementById("classType").style.display = "block";
    //document.getElementById("NumCriancas").style.display = "block";
    if(currentDateField.id == "departure1") {
    document.getElementById("departTime2").style.display = "block";
    }  
    //if(currentDateField.id == "departure2") {
    //document.getElementById("OFFICE_ID").style.display = "block";
    //}

	// Loop through array of previously hidden select elements.
	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";
		}
	}

	// Make sure "over" variable is reset.
	overCalendar = false;
}


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);
	currentDateField.value = formatDate(newDate,dateFormat[lang]);
	dateValue[currentDateField.id] = newDate;
	currentDateField.className = "";

	// Setting the field does not trigger "onchange", so change it manually.
	adjustDates(currentDateField);
	
	//Test
	var d_array = currentDateField.value.split("/")
    
    if(currentDateField.id == "departure2") {
    document.getElementById('departDay2').value = d_array[0];
    document.getElementById('departMonthYear2').value = d_array[2] + d_array[1];
    }
     
    if(currentDateField.id == "departure1") {
    document.getElementById('departDay1').value = d_array[0];
    document.getElementById('departMonthYear1').value = d_array[2] + d_array[1];
    }
    
	hideCalendar();

	// Set focus to next field if set.
	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);

	if(dateValue[sourceField.id] != null)
		sourceField.value = formatDate(dateValue[sourceField.id],dateFormat[lang]);
	if(dateValue[targetField.id] != null)
		targetField.value = formatDate(dateValue[targetField.id],dateFormat[lang]);

	adjustField(getNext(sourceField.id),type,getNext);
}

function defaultDateAdjustPlugin(sourceField,targetField,type){
	var sourceDate = dateValue[sourceField.id];
	var targetDate = dateValue[targetField.id];
	if(sourceDate != null && targetDate != null && sourceDate.getTime() > targetDate.getTime()){
		if(type == "source")
			dateValue[targetField.id] = sourceDate;
		else if(type = "target")
			dateValue[sourceField.id] = targetDate;
	}
}
// Set this plugin as the default behavior.
dateAdjustPlugin = defaultDateAdjustPlugin;

function displayDates(){
	var nextMonthDate = new Date(shownDate.getFullYear(),shownDate.getMonth() + 1,1);

	// Display calendar titles.
	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);
	displayMonth(c2cells,nextMonthDate);

	// Hide month navigation as appropriate.
	document.getElementById("calarrowback").style.display = (isAtBeginning) ? "none" : "block";
	document.getElementById("calarrowfwd").style.display = (isEndReached) ? "none" : "block";
}

// Constant containing the number of milliseconds in one day, used for date arithmetics.
var msInDay = 24 * 60 * 60 * 1000;

function displayMonth(cells,monthDate){
	var lastDate = getMonthDays(monthDate);
	var offset = getCalendarOffset(monthDate);
	var cell = null;

	// Wipe first and last rows.
	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 = "";
	}

	// Display dates.
	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++){
		// Display day of month.
		cell = cells[i + offset];
		cell.innerHTML = "";
		// First set to empty string, required for IE 5 Mac
		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";
		}


		// Select display class.
		if(checkBegin && isTodayMonth && today.getDate() > i){
			cell.className = pastClass;
			isAtBeginning = true;
		}
		else if(isSelectedMonth && dateValue[currentDateField.id].getDate() == i){
			// This is the currently selected date.
			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)){
			// This date is too far in the future.
			cell.className = pastClass;
			isEndReached = true;
		}
		else if(disabledDays[(i + offset - 1) % 7] == true){
			cell.className = "disabled";
		}
		else{
			cell.className = normalClass;
		}
	}
}

function isDateBeforeToday(theDate){
	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){
	// Calculate the maximum number of days from today.
	var days = Math.ceil((theDate.getTime() - today.getTime()) / msInDay) + offset - 1;
	return days > daysLimit;
}

//
// Returns the number of days in the month.
//
function getMonthDays(theDate){
	// Return the last day of the current month. Using 0 as a date substract
	// 1 days from the next month, which is what we need.
	var lastDate = new Date(theDate.getFullYear(),theDate.getMonth() + 1,0);
	return lastDate.getDate();
}


//
// Returns the weekday offset of the first day of the month.
//
function getCalendarOffset(theDate){
	var firstDay = new Date(theDate.getFullYear(),theDate.getMonth(),1);
	return firstDay.getDay();
}

//
// Returns true is the two dates have the same year and month.
//
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(/aaaa/i,theDate.getFullYear());
	result = result.replace(/mm/i,formatToTwoDigits(theDate.getMonth() + 1));
	result = result.replace(/dd/i,formatToTwoDigits(theDate.getDate()));
	return result;
}

function formatToTwoDigits(n){
	if(n > 0 && n < 10)
		return "0" + n;
	else
		return n;
}

//
// Parse a text date in dd/mm/yyyy or dd/mm/yy format and a return a date object.
// The separator can be a dash '-' instead and the year can be left out.
//
function parseDate(text){
	var parts = text.split(/[-\/]/);
	var origPartsLength = parts.length;

	// Validate.
	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[0].length < 1 || parts[0].length > 2 || ! parts[0].match(/[0-9]+/))
		return null;
	if(parts[1].length < 1 || parts[1].length > 2 || ! parts[1].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[1]) - 1,parts[0]);

	// Adjust year if date is past and same date next year is not too far.
	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;
}

//
// Two positionning functions from site http://www.quirksmode.org/js/findpos.html.
//
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;
}

//===
//=== End of calendar.Code following this line is for calendar implementations.
//===

function parseMonthYear(myear){
	if(myear != null && myear != "" && myear.length == 7){
		return m2n[myear.substring(0,3)] + "/" + myear.substring(3,7);
	} else
		return formatToTwoDigits(today.getMonth() + 1);
}

function isDateDefined(f){
	if(f.value == "")
		return false;

	if(! lang)
		return true;

	if(f.value == dateFormat[lang])
		return false;

	var theDate = parseDate(f.value);
	if(theDate == null || isDateBeforeToday(theDate) || isDateTooFar(theDate,1))
		return false;

	return true;
}


// Automatic language configuration. This code is run before the calendar is initialized, so the language
// can still easily be overridden in the calendar initalization code.
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";
	}
}

