YAHOO.namespace("aerlingus.multiPageCalendar");
var SELECTED_DEPARTURE_DAY = "selectedDay_1";
var SELECTED_DEPARTURE_MONTH = "selectedMonth_1";
var SELECTED_RETURN_DAY = "selectedDay_2";
var SELECTED_RETURN_MONTH = "selectedMonth_2";
var DEPARTURE_LABEL = "lblSelectedDay_1";
var RETURN_LABEL = "lblSelectedDay_2";
var RETURN_TYPE = "selectedFlightTypeReturn";
var ONEWAY_TYPE = "selectedFlightTypeOneway";
var DEPARTURE_DATE, RETURN_DATE;
var Dom = YAHOO.util.Dom;
	

/********************************************************************
 * if the flight type is set to oneway on load then we need to 
 * disable the return dates drop downs
 * @method YAHOO.aerlingus.multiPageCalendar.selectFlightType_Load
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.selectFlightType_Load = function(){
	var onewayTypeElement = Dom.get(ONEWAY_TYPE);
	var returnDayElement = Dom.get(SELECTED_RETURN_DAY);
	var returnMonthElement = Dom.get(SELECTED_RETURN_MONTH);
	if(onewayTypeElement.checked == true){
		returnDayElement.disabled = true;
		returnMonthElement.disabled = true;
	}else{
		returnDayElement.disabled = false;
		returnMonthElement.disabled = false;		
	}
}

/********************************************************************
 * if the flight type is set to oneway on radio click then we need to 
 * disable the return dates drop downs
 * @method YAHOO.aerlingus.multiPageCalendar.selectFlightType_Click
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.selectFlightType_Click = function(e){
	var elTarget = YAHOO.util.Event.getTarget(e);
	var returnDayElement = Dom.get(SELECTED_RETURN_DAY);
	var returnMonthElement = Dom.get(SELECTED_RETURN_MONTH);
	if(elTarget.id == ONEWAY_TYPE){
		returnDayElement.disabled = true;
		returnMonthElement.disabled = true;
	}else{
		returnDayElement.disabled = false;
		returnMonthElement.disabled = false;		
	}
		
}

/********************************************************************
 * when the dom is ready we want to set the departure dates on the 
 * calendar to those selected in the departure drop downs
 * @method YAHOO.aerlingus.multiPageCalendar.setCalendarDeparture_Load
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.setCalendarDeparture_Load = function(){
	var departureDay = parseInt(Dom.get(SELECTED_DEPARTURE_DAY).value);
	var departureMonth = parseInt(Dom.get(SELECTED_DEPARTURE_MONTH).value);
	var departureYear = YAHOO.aerlingus.multiPageCalendar.getYear(departureDay, departureMonth);
	YAHOO.aerlingus.multiPageCalendar.setDepartureDate(departureDay, departureMonth, departureYear);
}

/********************************************************************
 * when the dom is ready we want to set the return dates on the 
 * calendar to those selected in the return drop downs
 * @method YAHOO.aerlingus.multiPageCalendar.setCalendarReturn_Load
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.setCalendarReturn_Load = function(){
	var returnDay = parseInt(Dom.get(SELECTED_RETURN_DAY).value);
	var returnMonth = parseInt(Dom.get(SELECTED_RETURN_MONTH).value);
	var returnYear = YAHOO.aerlingus.multiPageCalendar.getYear(returnDay, returnMonth);
	YAHOO.aerlingus.multiPageCalendar.setReturnDate(returnDay, returnMonth, returnYear);
}

/*********************************************************************
 * When user selects the departure date we update the return date if it
 * is set less than the selected depart date
 * @method YAHOO.aerlingus.multiPageCalendar.selectDepartureDay_Change
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.selectDeparture_Change = function(){
	var departureDay = parseInt(Dom.get(SELECTED_DEPARTURE_DAY).value);
	var departureMonth = parseInt(Dom.get(SELECTED_DEPARTURE_MONTH).value);
	var departureMonthIndex = parseInt(Dom.get(SELECTED_DEPARTURE_MONTH).selectedIndex);
	var departureYear = YAHOO.aerlingus.multiPageCalendar.getYear(departureDay, departureMonth);
	var returnDay = Dom.get(SELECTED_RETURN_DAY).value;
	var returnMonth = Dom.get(SELECTED_RETURN_MONTH).value;
	var returnMonthIndex = Dom.get(SELECTED_RETURN_MONTH).selectedIndex;
	var returnYear = YAHOO.aerlingus.multiPageCalendar.getYear(returnDay, returnMonth);
	if ((departureMonth == returnMonth) && (returnDay < departureDay) ){
		YAHOO.aerlingus.multiPageCalendar.updateReturnDates(departureDay, returnMonth);
	}else if(departureMonthIndex > returnMonthIndex){
		YAHOO.aerlingus.multiPageCalendar.selectDepartureMonth_Change();
	}
	YAHOO.aerlingus.multiPageCalendar.updateNumberOfDays(Dom.get(SELECTED_DEPARTURE_MONTH),Dom.get(SELECTED_DEPARTURE_DAY));
	YAHOO.aerlingus.multiPageCalendar.setDepartureDate(departureDay, departureMonth, departureYear);
}

/*********************************************************************
 * When user selects the departure month we update the return date if it
 * is set less than the selected depart day
 * @method YAHOO.aerlingus.multiPageCalendar.selectDepartureMonth_Change
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.selectDepartureMonth_Change = function(){
	var dayCombo = Dom.get(SELECTED_DEPARTURE_DAY);
	var monthCombo = Dom.get(SELECTED_DEPARTURE_MONTH);
	// get the month selected index and the month value
	var depMonthSelectedIndex = monthCombo.selectedIndex;
	var depMonthSelected = monthCombo.value;
	var intMonthSelected = parseInt(depMonthSelected,10);
	var retMonthSelectedIndex = Dom.get(SELECTED_RETURN_MONTH).selectedIndex;
	if (retMonthSelectedIndex < depMonthSelectedIndex){
		YAHOO.aerlingus.multiPageCalendar.updateReturnDates(dayCombo.value, Dom.get(SELECTED_DEPARTURE_MONTH).value);
		YAHOO.aerlingus.multiPageCalendar.updateNumberOfDays(Dom.get(SELECTED_RETURN_MONTH),Dom.get(SELECTED_RETURN_DAY));
	}
	// need to call selectDepartureDay_Change() to alter the return day if it is before the depart day
	YAHOO.aerlingus.multiPageCalendar.selectDeparture_Change();
}

/*********************************************************************
 * When user selects the return date we update the number of days in 
 * the month
 * @method YAHOO.aerlingus.multiPageCalendar.selectReturnMonth_Change
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.selectReturn_Change = function(){
	var returnDay = Dom.get(SELECTED_RETURN_DAY).value;
	var returnMonth = Dom.get(SELECTED_RETURN_MONTH).value;
	var returnYear = YAHOO.aerlingus.multiPageCalendar.getYear(returnDay, returnMonth);
	YAHOO.aerlingus.multiPageCalendar.updateNumberOfDays(Dom.get(SELECTED_RETURN_MONTH),Dom.get(SELECTED_RETURN_DAY));	
	YAHOO.aerlingus.multiPageCalendar.setReturnDate(returnDay, returnMonth, returnYear);
}

/*********************************************************************
 * Update number of days in the month selected
 * @method YAHOO.aerlingus.multiPageCalendar.updateNumberOfDays
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.updateNumberOfDays = function(monElement, dayElement){
	var monthSelected = monElement.value;
	var intMonthSelected = parseInt(monthSelected,10);
	// check to see if the month is for this year or next year,
	// e.g if it's less than todays month it in next year so change the year to the following year
	var currDate = new Date();
	var currMonth = (currDate.getUTCMonth());
	var currYear = currDate.getYear();
	if (intMonthSelected < currMonth) {
		var numOfDays = YAHOO.aerlingus.multiPageCalendar.getLenMonth(currYear + 1, intMonthSelected);
	} else {
		var numOfDays = YAHOO.aerlingus.multiPageCalendar.getLenMonth(currYear, intMonthSelected);
	}	
	// change the days in the corresponding day combo box
	// to equal the number of days for the selected month
	YAHOO.aerlingus.multiPageCalendar.populateDays(numOfDays, dayElement);
}

/*********************************************************************
 * Set selected departure date
 * @method YAHOO.aerlingus.multiPageCalendar.setDepartureDate
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.setDepartureDate = function(departureDay, departureMonth, departureYear){
	var depDate = new Date();
	var monthLen = YAHOO.aerlingus.multiPageCalendar.getLenMonth(departureYear, departureMonth);
	depDate.setMonth(departureMonth);
	//if we select a month from month drop down and the day value goes back to one coz
	//month is shorter than previously selected then we need to update the return date
	//for the calendar to get it right
	if(monthLen < departureDay)
		depDate.setDate(1);
	else
		depDate.setDate(departureDay);
	depDate.setFullYear(departureYear);
	DEPARTURE_DATE = YAHOO.aerlingus.multiPageCalendar.formatDate(depDate);
}

/*********************************************************************
 * Set selected return date
 * @method YAHOO.aerlingus.multiPageCalendar.setReturnDate
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.setReturnDate = function(returnDay, returnMonth, returnYear){
	var retDate = new Date();
	var monthLen = YAHOO.aerlingus.multiPageCalendar.getLenMonth(returnYear, returnMonth);
	retDate.setMonth(returnMonth);
	//if we select a month from month drop down and the day value goes back to one coz
	//month is shorter than previously selected then we need to update the return date
	//for the calendar to get it right
	if(monthLen < returnDay)
		retDate.setDate(1);
	else
		retDate.setDate(returnDay);
	retDate.setFullYear(returnYear);
	RETURN_DATE = YAHOO.aerlingus.multiPageCalendar.formatDate(retDate);
}


/*********************************************************************
 * Helper method to return the year based on the selected day and month
 * @method YAHOO.aerlingus.multiPageCalendar.getYear 
 * @return full year
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.getYear = function(day, month){
	var date = new Date();
	if(month < date.getMonth() || (month == date.getMonth() && day < date.getDate())){
		return date.getFullYear() + 1;
	}else{
		return date.getFullYear();
	}
}

/*********************************************************************
 * Helper method to populate the number of days for the selected month
 * @method YAHOO.aerlingus.multiPageCalendar.populateDays
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.populateDays = function (numOfDays, daySel) {
	var len = daySel.length;
	var selectedDay = daySel.selectedIndex + 1;
	// clear the array
	for (var i = 0; i < len; i++) {
		daySel.options[i] = null;
	}
	daySel.length = numOfDays;
	// populate the array with the days
	for(var i = 0; i < numOfDays; i++) {
		daySel.options[i] = new Option(i+1);
		daySel.options[i].value = (i+1);
		if (i == (selectedDay - 1)) {
			daySel.options[i].selected = true
		}
	}
}

/*********************************************************************
 * Helper method to get the number of days in a month
 * @method YAHOO.aerlingus.multiPageCalendar.getLenMonth
 * @return days of month
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.getLenMonth = function(year, month){
	month++;
	var days;
	if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
		days=31;
	} else if (month==4 || month==6 || month==9 || month==11) {
		days=30;
	}	else if (month==2) {
		if (YAHOO.aerlingus.multiPageCalendar.isLeapYear(year)) {
			days=29;
		}	else {
			days=28;
		}
	}
	return (days);
}

/*********************************************************************
 * Helper method to determine if is leap year
 * @method YAHOO.aerlingus.multiPageCalendar.isLeapYear
 * @return true if leap year and false if not
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.isLeapYear = function(Year) {
	if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
		return (true);
	} else {
		return (false);
	}
}


/*********************************************************************
 * Helper method to update return dates if less than departure dates
 * @method YAHOO.aerlingus.multiPageCalendar.updateReturnDates
 *********************************************************************/
YAHOO.aerlingus.multiPageCalendar.updateReturnDates = function(departureDay, departureMonth){
	Dom.get(SELECTED_RETURN_DAY).value = departureDay;
	Dom.get(SELECTED_RETURN_MONTH).value = departureMonth;
	var departureYear = YAHOO.aerlingus.multiPageCalendar.getYear(departureDay, departureMonth);
	YAHOO.aerlingus.multiPageCalendar.setReturnDate(departureDay, departureMonth, departureYear);
}

YAHOO.aerlingus.multiPageCalendar.formatDate = function(date){
	var formattedDate = date.getMonth()+1 +"/"+date.getDate()+"/"+date.getFullYear(); // format "07/24/2009"
	return formattedDate;
}

/********************************************************
 * Departure and Return multi page calendar functionality
 ********************************************************/
YAHOO.util.Event.onDOMReady(function(){
	YAHOO.util.Event.addListener(SELECTED_DEPARTURE_DAY, "change", YAHOO.aerlingus.multiPageCalendar.selectDeparture_Change);
	YAHOO.util.Event.addListener(SELECTED_DEPARTURE_MONTH, "change", YAHOO.aerlingus.multiPageCalendar.selectDeparture_Change);
	YAHOO.util.Event.addListener(SELECTED_RETURN_DAY, "change", YAHOO.aerlingus.multiPageCalendar.selectReturn_Change);
	YAHOO.util.Event.addListener(SELECTED_RETURN_MONTH, "change", YAHOO.aerlingus.multiPageCalendar.selectReturn_Change);
	YAHOO.util.Event.addListener(RETURN_TYPE, "click", YAHOO.aerlingus.multiPageCalendar.selectFlightType_Click );
	YAHOO.util.Event.addListener(ONEWAY_TYPE, "click", YAHOO.aerlingus.multiPageCalendar.selectFlightType_Click );
	YAHOO.aerlingus.multiPageCalendar.selectFlightType_Load();
	YAHOO.aerlingus.multiPageCalendar.setCalendarDeparture_Load();
	YAHOO.aerlingus.multiPageCalendar.setCalendarReturn_Load();
    var departureEvent = YAHOO.util.Event;    
    var returnEvent = YAHOO.util.Event;
    var showDepartureBtn = Dom.get("showDeparture");
    var showReturnBtn = Dom.get("showReturn");
    departureEvent.on(showDepartureBtn, "click", function(e) {
    	YAHOO.aerlingus.multiPageCalendar.calendarOpen('depart');
    });
    returnEvent.on(showReturnBtn, "click", function(e) {
    	YAHOO.aerlingus.multiPageCalendar.calendarOpen('return');
    });

});

/********************************************************************
 * Lazy loading of the calendar js and css files
 * @method YAHOO.aerlingus.multiPageCalendar.calendarOpen
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.calendarOpen = function(direction){
	var loader = new YAHOO.util.YUILoader({
		require: ['container','calendar'], // what components? 
		base: '/js/yui_2.7.0/build/',//where do they live?
		onSuccess: function() {
			if(direction == 'depart')
				YAHOO.aerlingus.multiPageCalendar.loadDepartureCalendar();
			else
				YAHOO.aerlingus.multiPageCalendar.loadReturnCalendar();
		}

	}); 
    // WE CAN ALSO ADD DEPENDENCY FILES AS SHOWN BELOW
	/*
    loader.addModule({
        name: "ei-container",
        type: "css",
        fullpath: "/css/container.css" 
    });
	loader.addModule({
        name: "ei-calendar",
        type: "css",
        fullpath: "/css/calendar.css" 
    });
    */
    loader.insert();
}

/********************************************************************
 * Lazy loading of the departure calendar when calendar icon clicked
 * @method YAHOO.aerlingus.multiPageCalendar.calendarOpen
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.loadDepartureCalendar = function(){
    var showDepartureBtn = Dom.get("showDeparture");
	YAHOO.aerlingus.multiPageCalendar.loadCalendar(SELECTED_DEPARTURE_DAY, DEPARTURE_LABEL, "dContainer", SELECTED_DEPARTURE_MONTH, DEPARTURE_DATE,showDepartureBtn);
}

/********************************************************************
 * Lazy loading of the return calendar when calendar icon clicked
 * @method YAHOO.aerlingus.multiPageCalendar.calendarOpen
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.loadReturnCalendar = function(){
    var showReturnBtn = Dom.get("showReturn");
	YAHOO.aerlingus.multiPageCalendar.loadCalendar(SELECTED_RETURN_DAY, RETURN_LABEL, "rContainer", SELECTED_RETURN_MONTH, RETURN_DATE,showReturnBtn);
}

/********************************************************************
 * Lazy loading of the depart or return calendar when calendar icon
 * clicked
 * @method YAHOO.aerlingus.multiPageCalendar.calendarOpen
 ********************************************************************/
YAHOO.aerlingus.multiPageCalendar.loadCalendar = function(selectedDirectionDay, directionLabel, container, selectedDirectionMonth, directionDate, showBtn){
    var dialog,calendar;
	var minDate = new Date();
	var maxDate = new Date();
	maxDate.setMonth(maxDate.getMonth() + 11);
	var monthLen = YAHOO.aerlingus.multiPageCalendar.getLenMonth(maxDate.getYear(), maxDate.getMonth());
	maxDate.setDate(monthLen); 
    var MIN_DATE = YAHOO.aerlingus.multiPageCalendar.formatDate(minDate);
    var MAX_DATE = YAHOO.aerlingus.multiPageCalendar.formatDate(maxDate);
    if (!dialog) {
        //we want to set the context of which of the elements the popup calendar will appear under
        var daySelectElement = Dom.get(selectedDirectionDay);
        dialog = new YAHOO.widget.Dialog(container, {
            visible:false, 
            context:[daySelectElement, "tl", "bl"], 
            draggable:false,
            close:true
        });
        // Hide Calendar if we click anywhere in the document other than the calendar
        YAHOO.util.Event.on(document, "click", function(e) {
            var el =  YAHOO.util.Event.getTarget(e);
            var dialogEl = dialog.element;
            if (el != dialogEl && !Dom.isAncestor(dialogEl, el) && el != showBtn && !Dom.isAncestor(showBtn, el)) {
                dialog.hide();
            }
        });
        var lblValue = Dom.get(directionLabel).innerHTML;
        dialog.setHeader(lblValue);
        dialog.setBody('<div id="cal"></div>');
        dialog.render(document.body);

        dialog.showEvent.subscribe(function() {
            if (YAHOO.env.ua.ie) {
                // Since we're hiding the table using yui-overlay-hidden, we 
                // want to let the departureDialog know that the content size has changed, when
                // shown
                dialog.fireEvent("changeContent");
            }
        });
    }	
    // Lazy Calendar Creation - Wait to create the Calendar until the first time the button is clicked.
    if (!calendar) {  
        calendar = new YAHOO.widget.CalendarGroup("cal1",container,{PAGES:2, LOCALE_WEEKDAYS:"medium", LOCALE_MONTHS:"long"});
        //calendar = new YAHOO.widget.Calendar("cal",{iframe:false,hide_blank_weeks:true});
        calendar.cfg.setProperty("WEEKDAYS_MEDIUM",WEEKDAYS_MEDIUM);
        calendar.cfg.setProperty("MONTHS_LONG",MONTHS_LONG); 
        calendar.cfg.setProperty("MINDATE", MIN_DATE);
        calendar.cfg.setProperty("MAXDATE", MAX_DATE);
        calendar.render();

        calendar.selectEvent.subscribe(function() {
            if (calendar.getSelectedDates().length > 0) {
                var selDate = calendar.getSelectedDates()[0];
            } else {
                //set today's date
                var selDate=new Date();
            }
            // Pretty Date Output, using Calendar's Locale values: Fri, 8 Feb 2008
            var wStr = calendar.cfg.getProperty("WEEKDAYS_MEDIUM")[selDate.getDay()];
            var dStr = selDate.getDate();
            var mStr = calendar.cfg.getProperty("MONTHS_SHORT")[selDate.getMonth()];
            var yStr = selDate.getFullYear();
            Dom.get(selectedDirectionDay).value = dStr;
            Dom.get(selectedDirectionMonth).value = selDate.getMonth();
            dialog.hide();
            if(container == "dContainer")
            	YAHOO.aerlingus.multiPageCalendar.selectDeparture_Change(Dom.get(selectedDirectionMonth));
            else if(container == "rContainer")
            	YAHOO.aerlingus.multiPageCalendar.selectReturn_Change(Dom.get(selectedDirectionMonth));
        });
        calendar.renderEvent.subscribe(function() {
            // Tell departureDialog it's contents have changed, which allows 
            // container to redraw the underlay (for IE6/Safari2)
            dialog.fireEvent("changeContent");
        });
    }
    calendar.cfg.setProperty("SELECTED", directionDate);
    var selDate = calendar.getSelectedDates();
    if (selDate.length > 0) {
        // Set the pagedate to show the selected date if it exists
        calendar.cfg.setProperty("pagedate", selDate[0]);
        calendar.render();
    }
    dialog.show(); 
}
