var display_day = new Date();
var target_day;
var target_month;
var target_year;
var target_date;
var t;

function hide_calendar(calendarName)
{
document.getElementById('calendar_widget_' + calendarName).style.display = 'none';
} 


function map(code,list) {
    var result = [];
    for (var i = 0; i < list.length; i++) {
        result.push( code(list[i]));
    };
    return result;
};

function grep(code,list) {
    var result = [];
    for (var i = 0; i < list.length; i++) {
        if (code(list[i])) {
            result.push( list[i]);
        };
    };
    return result;
};

function hideSelectBoxes(calendarName){
	var browser=navigator.appName;
	var b_version=navigator.appVersion;
	var version = b_version.indexOf("MSIE 6");
	
	if (browser=="Microsoft Internet Explorer" && version != -1){
		if(calendarName.substring(calendarName.length - 1, calendarName.length) == 'A'){
			document.getElementById("AirDepartTime").style.display = 'none';
			document.getElementById("outBoundFlexibility").style.display = 'none';
			document.getElementById("AirReturnTime").style.display = 'none';
			document.getElementById("inBoundFlexibility").style.display = 'none';
			document.getElementById("seatClass").style.display = 'none';
			document.getElementById("adultPassengers").style.display = 'none';
			document.getElementById("childPassengers").style.display = 'none';			
		}else{ //leisure IBE
			document.getElementById("AirDepartTime").style.display = 'none';
			document.getElementById("AirReturnTime").style.display = 'none';
			document.getElementById("numRooms").style.display = 'none';
			document.getElementById("numAdultsRoom_1").style.display = 'none';
			document.getElementById("numChildrenRoom_1").style.display = 'none';			
			document.getElementById("numAdultsRoom_2").style.display = 'none';
			document.getElementById("numChildrenRoom_2").style.display = 'none';			
			//document.getElementById("adultPassengers").style.display = 'none';
			//document.getElementById("childPassengers").style.display = 'none';			
			//document.getElementById("roomRating").style.display = 'none';
			//document.getElementById("flightTimes").style.display = 'none';
			//document.getElementById("cabinSelector").style.display = 'none';
			//document.getElementById("airlinePrefSelector").style.display = 'none';			
			//document.getElementById("searchPanel-car-selector-dropOff-datetime-time-value-input").style.display = 'none';
		}
	}
}

function showSelectBoxes(calendarName){
	var browser=navigator.appName;
	var b_version=navigator.appVersion;
	var version = b_version.indexOf("MSIE 6");
	
	if (browser=="Microsoft Internet Explorer" && version != -1){
		if(calendarName.substring(calendarName.length - 1, calendarName.length) == 'A'){
		
			document.getElementById("AirDepartTime").style.display = '';
			document.getElementById("outBoundFlexibility").style.display = '';
			document.getElementById("AirReturnTime").style.display = '';
			document.getElementById("inBoundFlexibility").style.display = '';
			document.getElementById("seatClass").style.display = '';
			document.getElementById("adultPassengers").style.display = '';
			document.getElementById("childPassengers").style.display = '';		
		}else{ //leisure IBE
			
			document.getElementById("AirDepartTime").style.display = '';
			document.getElementById("AirReturnTime").style.display = '';			
			document.getElementById("numRooms").style.display = '';
			document.getElementById("numAdultsRoom_1").style.display = '';
			document.getElementById("numChildrenRoom_1").style.display = '';			
			document.getElementById("numAdultsRoom_2").style.display = '';
			document.getElementById("numChildrenRoom_2").style.display = '';		
			//document.getElementById("adultPassengers").style.display = '';
			//document.getElementById("childPassengers").style.display = '';			
			//document.getElementById("roomRating").style.display = '';
			//document.getElementById("flightTimes").style.display = '';
			//document.getElementById("cabinSelector").style.display = '';
			//document.getElementById("airlinePrefSelector").style.display = '';	
			
			//document.getElementById("searchPanel-car-selector-dropOff-datetime-time-value-input").style.display = '';
		}		
	}
	
}
function same_day(calendarName, d1,d2) {
    return d1.getDate() == d2.getDate() && d1.getMonth() == d2.getMonth() && d1.getFullYear() == d2.getFullYear()
};

/** Identifies whether the date passed in is before today. */
function before_today(calendarName, d1,d2) { 

    if (d1.getFullYear() < d2.getFullYear()) {
        return true;
    }
    if ((d1.getFullYear() == d2.getFullYear() ) &&  (d1.getMonth() < d2.getMonth())) {
        return true;
    }
    if ((d1.getFullYear() == d2.getFullYear()) && (d1.getMonth() == d2.getMonth()) &&  (d1.getDate() < d2.getDate())) {
        return true;
    }

    return false;
}

function after_today(calendarName, d1,d2) { 

    if (d1.getFullYear() > d2.getFullYear()) {
        return true;
    }
    if ((d1.getFullYear() == d2.getFullYear() ) &&  (d1.getMonth() > d2.getMonth())) {
        return true;
    }
    if ((d1.getFullYear() == d2.getFullYear()) && (d1.getMonth() == d2.getMonth()) &&  (d1.getDate() > d2.getDate())) {
        return true;
    }

    return false;
}

function calendar_cells(calendarName) {
    var div = document.getElementById('calendarDays_' + calendarName);
    return grep( function(i){ return i.className == 'cell'}, div.getElementsByTagName('span'));
};

function add_days(calendarName, date, delta) {
    // get the calendar date 24h before the current date:
    var result = new Date();
    result.setTime(date.getTime() + delta*(24 * 60 * 60 *1000) );
    if (result.getDate() == date.getDate()) {
      // Ooops - date had more than 24 hours to it (DST!)
      result.setTime( result.getTime() + (delta > 0 ? 1 : -1 ) *60 * 60 * 1000);
    };
 
    // Clamp the time to the original time:
    result.setHours( date.getHours());
 
    return result;
 };

function day_before(calendarName, date) { return add_days(calendarName, date,-1); };
function day_after(calendarName, date) { return add_days(calendarName, date, 1); };
function first_of_month(calendarName, date) { return new Date( date.getFullYear(), date.getMonth(), 1 ); };
function prev_month(calendarName, date) { return day_before(calendarName, first_of_month(calendarName, date )); };
function next_month(calendarName, date) { return add_days(calendarName, first_of_month(calendarName, date ),32 ); };
function prev_year(calendarName, date) { var result = date; result.setYear( date.getFullYear() -1 ); return result; };
function next_year(calendarName, date) { var result = date; result.setYear( date.getFullYear() +1 ); return result; };

function display_month(formName, calendarName, month, widget, additionalScript, enableDaysBefore, enableDaysAfter, range) {
	display_month(formName, calendarName, month, widget, additionalScript, enableDaysBefore, enableDaysAfter, range, false )
}
/** Displays the month name header and the days for the current month. */
function display_month(formName, calendarName, month, widget, additionalScript, enableDaysBefore, enableDaysAfter, range, nextMonth) {

	
	
    if (!document.getElementById) return;

    var first = first_of_month(calendarName, month );

	//determine earliest date that can be picked
	//today for depart cal, depart date fo return cal
   range = range - 0;
    var today;
    var lastDay;
    var returnCal; 
	if(calendarName.substring(0, 6) == 'depart'){
		today = new Date;
		lastDay=new Date;
		lastDay.setDate(today.getDate( ) + range);
		returnCal=false;
	}else{
		today= new Date;	
		lastDay=new Date;
		lastDay.setDate(today.getDate( ) + range);
		var calType = widget.id;						
		var departStr = document.getElementById('depart' + calType.substring(6, calType.length)).getElementsByTagName('input')[0].value;		
		today.setFullYear(departStr.substring(6,10), departStr.substring(3,5) - 1, departStr.substring(0,2));;
		returnCal=true;
	}

    if (! document.getElementById) {
        alert("document.getElementById not supported");
        alert(document);
    };
   
    /** Find the beginning of the calendar */
    var month_year_display = document.getElementById('month_year_display_' + calendarName);
    
    /** Write out the current month and year */
    month_year_display.innerHTML = month_names[month.getMonth()] + " " + month.getFullYear();
 
 	
    /** Fill in the day in the upper left corner */
    var curr = day_before(calendarName, first);
    while (curr.getDay() != 1) curr = day_before(calendarName, curr);
    var cells = calendar_cells(calendarName);
   
    for (var offset = 0; offset < cells.length; offset++) {
        var link = true;
        var span_class = 'calendarDay';
        if (curr.getMonth() != month.getMonth()) { span_class = 'otherMonth' };
        if (same_day(calendarName, curr,today)) { span_class = 'today' };

          if (after_today(calendarName, curr,lastDay)) 
            { //checks if the date is after the valid range
	if(curr.getMonth() == (month.getMonth())) 
	{ 
	            span_class = 'afterToday'; 
	} 
            	link = false; 
            }
           else
           {	
        // Leave the class as other month if it is
        if (before_today(calendarName, curr,today)) { //!enableDaysBefore condition removed, we will never want to display these
            if(curr.getMonth() == (month.getMonth())) { 
                span_class = 'beforeToday'; 
            } 
            link = false; 
        };
 	
        

        if (!enableDaysAfter && !before_today(calendarName, curr,today)) { 
            if(curr.getMonth() == (month.getMonth())) { 
                span_class = 'beforeToday'; 
           
            } 
            link = false; 
        };

		if(!nextMonth && !after_today(calendarName, curr,lastDay)){
			if (same_day(calendarName, curr,month)) {
				span_class = 'currentSelection';
			};
		}
}
 		 		
        if (link) {
            cells[offset].innerHTML = '<div class="'+span_class+'" onclick="javascript:day_select_click('+ '&#39;' + formName + '&#39;' +',&#39;' + calendarName + '&#39;' +','+curr.getFullYear()+','+(curr.getMonth())+','+curr.getDate()+', ' + '&#39;' + widget.id + '&#39;' + '); ' + additionalScript + ';">' + curr.getDate() + '</div>';

        }
        else {
            cells[offset].innerHTML = '<div class="'+span_class+'" onclick="">' + curr.getDate() + '</div>';
        } 

        curr = day_after(calendarName, curr);
    };
    
    display_day = month;
    
    if(returnCal){
    	month_left_Check(calendarName ,display_day, (today.getMonth() == month.getMonth()));
    }else{
    	month_left_Check(calendarName ,display_day, false);
    }
    
};

function day_select_click(formName, calendarName, year, month, day, target_widget_name) {

    target_day.value = day;
    if (target_day.value.length < 2) target_day.value = '0' + target_day.value;
    target_month.value = month + 1;
    if (target_month.value.length < 2) target_month.value = '0' + target_month.value;            
    target_year.value = year;
    //target_date.value = target_year.value + '-' + target_month.value + '-' + target_day.value;
    target_date.value = target_day.value + '/' + target_month.value + '/' + target_year.value;
	
    var selected = new Date(year,month,day);
    update_selection(calendarName, selected, target_widget_name);
    
    if(target_widget_name.substring(0, 6) == 'depart'){
    	var calType = target_widget_name.substring(6, target_widget_name.length);
        //multiCity wont have return calendar
        if(document.getElementById("return" + calType)){
            var returnStr = document.getElementById("return" + calType).getElementsByTagName('input')[0].value;
		
            var returnDate = new Date;
            returnDate.setFullYear(returnStr.substring(6,10), returnStr.substring(3,5) - 1, returnStr.substring(0,2));
			
            //if depart date is greater than return or, if hotel search, depart date < 30 days before, set return equal to depart + 2 days
			
			var updateReturnDate = false;
			if((selected.getDate() == returnDate.getDate() && selected.getMonth() == returnDate.getMonth() && selected.getFullYear() == returnDate.getFullYear()) || selected > returnDate){
				updateReturnDate = true;
			}
			
            if(updateReturnDate || (isHotelSearch() && differenceInDays(selected, returnDate) > maxHotelNights)){
                selected.setDate(selected.getDate()+2);
                update_selection("returnCal" + calType, selected, "return" + calType);
                var selectedDay = new String(selected.getDate());
                if(selectedDay.length == 1){
                    selectedDay = '0' + selectedDay;
                }
                var selectedMonth = new String(selected.getMonth() + 1);
                if(selectedMonth.length == 1){
                    selectedMonth = '0' + selectedMonth;
                }
                document.getElementById("returnDate" + calType).value = selectedDay + '/' + selectedMonth + '/' + selected.getFullYear();
                document.getElementById("returnDay" + calType).value = selectedDay;
                document.getElementById("returnMonth" + calType).value = selectedMonth;
                document.getElementById("returnYear" + calType).value = selected.getFullYear();
            }
        
        }
		
	}

    close_widget(formName, calendarName);
};

function isHotelSearch()
{
    return /*document.getElementById("radio_hotelOnly").checked ||*/ document.getElementById("radio_flightHotel").checked; //|| document.getElementById("radio_flightHotelCar").checked;
}

function differenceInDays(fromDate, toDate)
{
    var fromDateMillis = fromDate.valueOf();
    var toDateMillis = toDate.valueOf();
    var numDays = 0;
    
    var numDaysMillis = toDateMillis - fromDateMillis;
    if (numDaysMillis > 0)
    {
        //bugzilla 2047: num days was calculated wrong for some return dates in March/April and October.....this 
        // was because Javascript Date object seems to be including the clocks going forward (+1 hour) and
        // back (-1 hour), which happens during these months....added a rounding on the num days to fix this
        numDays = Math.round(numDaysMillis / DAY_IN_MILLIS);
    }
    
    return numDays;
}

/** The user has chosen a date so update the input field. */
function update_selection(calendarName, date, target_widget_name) {
    document.getElementById(target_widget_name).getElementsByTagName('input')[0].value = formatDate(date, dateFormat);
};


/** Script needed to display the div in the correct place. */
function findPos(obj) {
    var pos = new Object;
    pos.left = 0;
    pos.top = 0;
    if (obj.offsetParent) {
    	   var positionStyle =  Element.getStyle(obj, 'position');    	 
	       while (obj.offsetParent != null &&  positionStyle!= 'fixed' && positionStyle !='absolute') {       	 	 	 	       		
           		pos.left += obj.offsetLeft;
           		pos.top  += obj.offsetTop;
		   		obj = obj.offsetParent;
		   		positionStyle =  Element.getStyle(obj, 'position');		   		
		}        		
	}
	else if (obj.x) {		
        pos.left = obj.x;
        pos.top = obj.y;
	}
	return pos;
};

//  If callOnChooseEvent is true we call a method called onCalendarChoose();
// which should be defined in the calling page if needed.
//  This allows us to pop-up the return date calendar if necessary

function set_dayField(calendarName, dayField) { target_day = dayField;};
function set_monthField(calendarName, monthField) { target_month = monthField;};
function set_yearField(calendarName, yearField) { target_year = yearField;};
function set_dateField(calendarName, dateField) { target_date = dateField;};


/**
* Displays the calendar widget
* @param widget a reference to the span that this action is being performed on.  This span should contain an input which will be updated with the date that the user selects
* @param dayField a reference to the input field that you want to be populated with the day part of the chosen date as a number
* @param monthField a reference to the input field that you want to be populated with the month part of the chosen date as a number
* @param yearField a reference to the input field that you want to be populated with the year part of the chosen date as a number
* @param callOnChooseEvent set to 'true' if you want the script to call onCalendarChoose when the user has clicked on a date, 'false' otherwise.  
* @param range, this sets the range of dates in days, from current date. so if range = 365 then dates are displayed for 1 year ahead
* If this parameter is true function onCalendarChoose( theElement ) must be defined in the calling document
*/
function show_calendar_widget(formName, calendarName, widget, dateField, dayField, monthField, yearField, callOnChooseEvent, additionalScript, enableDaysBefore, enableDaysAfter, alignment, range) {
    hideAllRows();
    var current_day = new Date(2003,9,15); 
            
    current_day.setDate(dayField.value);
    current_day.setMonth(monthField.value - 1);
    current_day.setYear(yearField.value);
    
   //  var commonForm = OJ('#plan_trip_common'); 
    var commonForm = OJ(formName);
    commonForm.find('#cabinBlock').css('display', 'none');

    if (! document.getElementsByTagName) { 
        alert("getElementsByTagName() is not supported!");
        return;
    };
    
    // find edit widget
    var edits = widget.getElementsByTagName('input');
  
    /** When we open the calendar we must hide the row           */
    /** underneath that contained select boxes. This is a fix    */
    /** for the internet explorer bug that sets the z index of   */
    /** a select box to always be the highest and is             */
    /** irreversible. Choices to fix it are to use iframe for    */
    /** calendar (not allowed for Aeroplan) or hide the          */
    /** underlying row as done here.                             */
    /** document.getElementById('typeRow').style.display= 'none';*/
  
  
    if (edits.length > 1) {
        alert("More than one date edit field found within the enclosing element");
        return 0;
    }
    else if (edits.length == 0) {
        alert("No date edit field found within the enclosing element");
        return 0;
    };

    var date_edit = edits[0];

    // load date from edit widget
    var date = date_edit.value;

    // find/create calendar widget
    var calendar_widget = document.getElementById('calendar_widget_' + calendarName);

    // find lower edge of edit widget:
    pos = findPos(date_edit);

    if (date_edit.offsetHeight) {
         pos.top += date_edit.offsetHeight;
    }
    else {
        pos.top += date_edit.clientHeight;
    };

    // move calendar widget
    if (document.all) {
        // IE
        calendar_widget.style.position = 'absolute';
        calendar_widget.style.posTop = (pos.top + 2);
        if(alignment == 'left'){
			calendar_widget.style.posLeft = pos.left;
		}else{ //align right
			calendar_widget.style.posLeft = (pos.left - 35);
        }
        calendar_widget.style.display = "block";
        hideSelectBoxes(calendarName);
    } else {
        // Mozilla
        if(formName.indexOf("multiCitySearch") == -1){
            calendar_widget.style.position = 'absolute';
            calendar_widget.style.top = (pos.top + 2) + "px";
           
             if(alignment == 'left'){
                calendar_widget.style.left = pos.left + "px";
            }else{ //align right
                calendar_widget.style.left = (pos.left - 35) + "px";
            }        
        }    
          
        calendar_widget.style.display = "inherit";
    };

	display_month(formName, calendarName, current_day, widget, additionalScript, enableDaysBefore, enableDaysAfter, range);

    // Now connect the current edit to the div:
    set_dayField(calendarName, dayField);
    set_monthField(calendarName, monthField);
    set_dateField(calendarName, dateField);
    set_yearField(calendarName, yearField);

    if (callOnChooseEvent == null) {
        callOnChooseEvent = false;
    }
    
};


/** Check whether to display the calendar left arrow on load. */
function month_left_Check(calendarName, current_day, returnCheck) { 
    var today = new Date;
    // check whether the left and right month arrows should be displayed for this month
   if ((current_day.getFullYear() == today.getFullYear()) && (current_day.getMonth() <= today.getMonth())) {
      document.getElementById("leftArrow" + calendarName).style.display='none';
   }
   else if(returnCheck){
   	document.getElementById("leftArrow" + calendarName).style.display='none';
   }
   else {
       document.getElementById("leftArrow" + calendarName).style.display='inline';
   }
};


/** Script to close the calendar. */
function close_calendar(calendarName) {
   document.getElementById('calendar_widget_' + calendarName).style.display = 'none';
   //code to check if the cabintype box should be displayed. 
   var commonForm = OJ('#plan_trip_common');
   if(commonForm.find('#searchType')[0] && document.getElementById('moreOptions').value == 'true'){
       var searchType = commonForm.find('#searchType')[0].value;
       if(searchType == 'F' || searchType == 'HF' || searchType == 'HFV' || searchType == 'VF' )
       {
        document.getElementById('cabinBlock').style.display = 'block';
       }
   }
  
   if (document.all) {
   	// IE
   	showSelectBoxes(calendarName);
   } 
};	  

/** Script to close the calendar. */
function close_widget(formName, calendarName, onCalendarChooseEvent) {
    /** When we close the calendar we must reshow the row underneath */
    /** that contained select boxes. This is a fix for the internet  */
    /** explorer bug that sets the z index of a select box to always */
    /** be the highest and is irreversible. Choices to fix it are to */
    /** use iframe for calendar or hide   */
    /** the underlying row as done here.                             */
    
   document.getElementById('calendar_widget_' + calendarName).style.display = 'none';
   
   //var commonForm = OJ('#plan_trip_common');
    var commonForm = OJ(formName);
   
    var searchType = "";    
    if(commonForm.find('#searchType')[0] && document.getElementById('moreOptions').value == 'true')
        searchType =  commonForm.find('#searchType')[0].value;
   
   if(searchType == 'F' || searchType == 'HF' || searchType == 'HFV' || searchType == 'VF' )
   {
    document.getElementById('cabinBlock').style.display = 'block';
   }
//   if (onCalendarChooseEvent) {
//        onCalendarChoose( span_widget_<xsl:value-of select="$calendarName" /> );
//    }
    
    hideAllRows();
    if (document.all) {
	   	// IE
	   	showSelectBoxes(calendarName);
   } 
};

function hideRows(calendarName) {
 	var element = document.getElementById(calendarName + 'blankRow');
  	element.style.cssText='display : none;';
}

function hideAllRows() {
 	var elements = document.getElementsByTagName("tr");
// alert(elements.length);
 	for ( var i = 0; i < elements.length; i++ ) {
  		var current = elements[i].id;
  		if (current.match('blankRow')) {
  				elements[i].style.cssText='display : none;';
  		}
	}
}


/** Go back to the previous month. */
function month_left_click(formName, calendarName, widget, additionalScript, enableDaysBefore, enableDaysAfter, range) { 
    display_month(formName, calendarName, prev_month(calendarName, display_day ) , widget, additionalScript, enableDaysBefore, enableDaysAfter, range); 
    var today = new Date;
};

/** Go on to the next month. */
function month_right_click(formName, calendarName, widget, additionalScript, enableDaysBefore, enableDaysAfter, range) {
    document.getElementById('leftArrow'+calendarName).style.display='inline';
    display_month(formName, calendarName, next_month(calendarName, display_day ), widget, additionalScript, enableDaysBefore, enableDaysAfter, range, true);
};



var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// ------------------------------------------------------------------
function formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMMM"]=MONTH_NAMES[M-1];
	value["MMM"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EEEE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
}

<!-- Stylesheet edited using Stylus Studio - (c)1998-2004. Sonic Software Corporation. All rights reserved. -->