$(function()
{
    //*************** HOTEL & VACATION INITIALIZATION ***************//
    //populate cities
    var ds = document["SkySales"];
    fillList(ds["hotelCitiesDDL"], '');
    fillList(ds["vacDepartCitiesDDL"], '');
    fillList(ds["vacArrivalCitiesDDL"], '');
    
    //populate date DDLs (month-year and day dropdownlists)
    populateDateDDL();
    
    //set default number of guests
    setGuestDefault();
    
});

function populateDateDDL()
{
    var today = new Date();
    var month = today.getMonth() + 1;
    var year = today.getFullYear();
    var day = today.getDate();
    
    var options = '';
    var selectedItem = year + '-' + month;
    
    for (var i = 0; i < 12; i++)
    {
        options += '<option value="' + year + '-' + month + '">' + getMonthText(month, year) + '</option>';
        if (month == 12)
        {
            month = 1;
            year++;
        }
        else
        {
            month++;
        }
    }
    
    // ************* HOTEL tab *************
    $("#hotelMonthsDDL1").append(options);
    $("#hotelMonthsDDL1").val(selectedItem);   
    
    $("#hotelMonthsDDL2").append(options);
    $("#hotelMonthsDDL2").val(selectedItem);   
    
    $("#hotelDaysDDL1").val(day.toString());
    $("#hotelDaysDDL2").val(day.toString());
    // **************************************
    
    
    // ************ VACATION tab ************
    $("#vacMonthsDDL1").append(options);
    $("#vacMonthsDDL1").val(selectedItem);   
    
    $("#vacMonthsDDL2").append(options);
    $("#vacMonthsDDL2").val(selectedItem);   
    
    $("#vacDaysDDL1").val(day.toString());
    $("#vacDaysDDL2").val(day.toString());  
    // **************************************      
}

function setGuestDefault()
{
    $("#hotelNumGuestsDDL").val(defaultNumberOfGuests);
    $("#vacNumGuestsDDL").val(defaultNumberOfGuests);    
}

function getMonthText(month, year)
{
    var text = "";
    switch (month)
    {
        case 1: text="Jan. "; break;
        case 2: text="Feb. "; break;
        case 3: text="Mar. "; break;
        case 4: text="Apr. "; break;
        case 5: text="May. "; break;
        case 6: text="Jun. "; break;
        case 7: text="Jul. "; break;
        case 8: text="Aug. "; break;
        case 9: text="Sep. "; break;
        case 10: text="Oct. "; break;
        case 11: text="Nov. "; break;
        case 12: text="Dec. "; break;
    }
    return (text + year);
}

function searchHotel()
{
    var canSearch = validateHotelSearch();
    if (canSearch == '')
    {            
        var vacationSearch = "http://res.spiritvacations.com/search/ExternalFormPost.aspx?";
        // Our partner id, DO NOT CHANGE.
        var vendor = "gsVendor=NKT";    
        // H01, DO NOT CHANGE            
        var vacationType = "&gsvacationtype=H01";  
        // Origin is not used for a hotel search 
        var origin = "&gsorigin=XXX";    
        // Airport code of the desintation the user selected.           
        var destination = "&gsdestination=" + $("#hotelCitiesDDL").val();   
        // Total number of travellers selected by the user. 
        var travellers = "&gsnumberoftravelers=" + $("#hotelNumGuestsDDL").val();  
        // Promotion code  
        var promotionCode = "";     
        if ($("#hotelPromotionCode").val() != "")
        {
            promotionCode = "&gsPromotionCode=" + $("#hotelPromotionCode").val();
        }             
        // Age of children selected by the user  
        var chAges = "";                            
        if ($("#hotelChildrenAgeDDL1").val() != "na")
        {
            chAges += "&gsage1=" + $("#hotelChildrenAgeDDL1").val();
        }
        if ($("#hotelChildrenAgeDDL2").val() != "na")
        {
            chAges += "&gsage2=" + $("#hotelChildrenAgeDDL2").val();
        } 
        if ($("#hotelChildrenAgeDDL3").val() != "na")
        {
            chAges += "&gsage3=" + $("#hotelChildrenAgeDDL3").val();
        } 
        if ($("#hotelChildrenAgeDDL4").val() != "na")
        {
            chAges += "&gsage4=" + $("#hotelChildrenAgeDDL4").val();
        }  
        // Departure date in DDMMMYY format, selected by the user
        var departDate = "&gsdeparturedate=" + getDateInFormat($("#hotelDaysDDL1").val(), $("#hotelMonthsDDL1").val());   
        // Length of stay in days
        var lengthOfStay = "&gslengthofstay=" + getLengthOfStay($("#hotelDaysDDL1").val(), $("#hotelMonthsDDL1").val(), $("#hotelDaysDDL2").val(), $("#hotelMonthsDDL2").val());
        // N/A
        var returnDate = "&gsreturndate=";          
        // Action verb, DO NOT CHANGE  
        var theSubmit = "&submit=Submit";           
        
        var theUrl = hotelSearch + vendor + vacationType + origin + destination + travellers + promotionCode + chAges + departDate + lengthOfStay + returnDate + theSubmit;
        
        window.open(theUrl);
    }
    else
    {
        alert(canSearch);
        return false;
    }
}

function validateHotelSearch()
{
    if ($("#hotelCitiesDDL").val() == "")
    {
        return localizedTextCityIsMissing;
    }
    if (!validateDates($("#hotelDaysDDL1").val(), $("#hotelMonthsDDL1").val(), $("#hotelDaysDDL2").val(), $("#hotelMonthsDDL2").val()))
    {
        return localizedTextInvalidDates;
    }   
    var numberOfGuests = $("#hotelNumGuestsDDL").val();
    var numberOfChildren = accountForChildren();
    if (numberOfChildren > numberOfGuests)
        return localizedTextInvalidGuests;
        
    return "";   
}

//Date in DDMMMYY format
function getDateInFormat(day, monthYear)
{ 
    var formattedDay = (day >= 10 ? day : "0" + day);
    var formattedMonth = "";
    var formattedYear = monthYear.substring(2, 4);
    
    switch (monthYear.substring(5))
    {
        case "1": formattedMonth = "JAN"; break;
        case "2": formattedMonth = "FEB"; break;
        case "3": formattedMonth = "MAR"; break;
        case "4": formattedMonth = "APR"; break;
        case "5": formattedMonth = "MAY"; break;
        case "6": formattedMonth = "JUN"; break;
        case "7": formattedMonth = "JUL"; break;
        case "8": formattedMonth = "AUG"; break;
        case "9": formattedMonth = "SEP"; break;
        case "10": formattedMonth = "OCT"; break;
        case "11": formattedMonth = "NOV"; break;
        case "12": formattedMonth = "DEC"; break;       
    }
    
    return formattedDay + formattedMonth + formattedYear;
}

function getLengthOfStay(day1, monthYear1, day2, monthYear2)
{  
    //CheckIn/Departure date
    var date1 = new Date(monthYear1.substring(0, 4), monthYear1.substring(5) - 1, day1);
    
    //CheckOut/Return date
    var date2 = new Date(monthYear2.substring(0, 4), monthYear2.substring(5) - 1, day2);        
     
    //Set 1 day in milliseconds (24 hr * 60 mins * 60 secs * 1000 milliseconds)
    var one_day = 1000 * 60 * 60 * 24;

    //compute length of stay in days
    return Math.ceil((date2.getTime() - date1.getTime()) / one_day);
}

//Returns true if date2 is greater than date1
function validateDates(day1, monthYear1, day2, monthYear2)
{  
    //CheckIn/Departure date
    var date1 = new Date(monthYear1.substring(0, 4), monthYear1.substring(5) - 1, day1);
    
    //CheckOut/Return date
    var date2 = new Date(monthYear2.substring(0, 4), monthYear2.substring(5) - 1, day2);        
     
    //True only if date2 is greater that date1
    return (date2.getTime() > date1.getTime());
}

function searchVacation()
{
    var canSearch = validateVacationSearch();
    if (canSearch == '')
    {
        var vacationSearch = "http://res.spiritvacations.com/search/ExternalFormPost.aspx?";
        // Our partner id, DO NOT CHANGE
        var vacationType = "gsVacationType=AH01";   
        // Airport code of the orign
        var origin = "&gsOrigin=" + $("#vacDepartCitiesDDL").val(); 
        // Aiport code of the destination                
        var destination = "&gsDestination=" + $("#vacArrivalCitiesDDL").val();  
        // Departure date (URL encoded)
        var departDate = "&gsDepartureDate=" + urlEncode(getDateInFormat_Slash($("#vacDaysDDL1").val(), $("#vacMonthsDDL1").val()));   
        // Return date (URL encoded)
        var returnDate = "&gsReturnDate=" + urlEncode(getDateInFormat_Slash($("#vacDaysDDL2").val(), $("#vacMonthsDDL2").val()));     
        // Total number of travellers selected by the user
        var travellers = "&gsnumberoftravelers=" + $("#vacNumGuestsDDL").val();  
        // Age of children selected by the user  
        var chAges = "";                            
        if ($("#vacChildrenAgeDDL1").val() != "na")
        {
            chAges += "&gsage1=" + $("#vacChildrenAgeDDL1").val();
        }
        if ($("#vacChildrenAgeDDL2").val() != "na")
        {
            chAges += "&gsage2=" + $("#vacChildrenAgeDDL2").val();
        } 
        if ($("#vacChildrenAgeDDL3").val() != "na")
        {
            chAges += "&gsage3=" + $("#vacChildrenAgeDDL3").val();
        } 
        if ($("#vacChildrenAgeDDL4").val() != "na")
        {
            chAges += "&gsage4=" + $("#vacChildrenAgeDDL4").val();
        }     
        // Promotion code  
        var promotionCode = "";     
        if ($("#vacPromotionCode").val() != "")
        {
            promotionCode = "&gsPromotionCode=" + $("#vacPromotionCode").val();
        }
        // Our vendor, DO NOT CHANGE
        var vendor = "&gsVendor=NKD";  // Used to be NKT 
        // Length of stay in days
        var lengthOfStay = "&gslengthofstay=" + getLengthOfStay($("#vacDaysDDL1").val(), $("#vacMonthsDDL1").val(), $("#vacDaysDDL2").val(), $("#vacMonthsDDL2").val());

        var theUrl = vacationType + origin + destination + departDate + returnDate + travellers + chAges + promotionCode + vendor + lengthOfStay;
        window.open(vacationSearch + SanitizeInput(theUrl));
    }
    else
    {
        alert(canSearch);
        return false;    
    }
}

function validateVacationSearch()
{
    if ($("#vacDepartCitiesDDL").val() == localizedWhichCity)
    {
        return localizedTextDepartCityIsMissing;
    }
    if ($("#vacArrivalCitiesDDL").val() == localizedWhichCity)
    {
        return localizedTextArrivalCityIsMissing;
    }    
    if (!validateDates($("#vacDaysDDL1").val(), $("#vacMonthsDDL1").val(), $("#vacDaysDDL2").val(), $("#vacMonthsDDL2").val()))
    {
        return localizedTextInvalidDates;
    } 
    return "";   
}

//Date in MM/DD/YY format
function getDateInFormat_Slash(day, monthYear)
{
    var formattedDay = (day >= 10 ? day : "0" + day);
    var formattedMonth = (parseInt(monthYear.substring(5), 10) > 10 ? monthYear.substring(5) : "0" + monthYear.substring(5));
    var formattedYear = monthYear.substring(2, 4);
        
    return formattedMonth + "/" + formattedDay + "/" + formattedYear;
}

//URL encode
function urlEncode(plaintext)
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var encoded = "";
	
	for (var i = 0; i < plaintext.length; i++ ) 
	{
		var ch = plaintext.charAt(i);
	    if (ch == " ") 
	    {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} 
		else if (SAFECHARS.indexOf(ch) != -1) 
		{
		    encoded += ch;
		} 
		else 
		{
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) 
			{
			    alert( "Unicode Character '" 
                        + ch 
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} 
			else 
			{
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
}

//URL decode
function URLDecode(encoded)
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef"; 
   var plaintext = "";
   var i = 0;
   
   while (i < encoded.length) 
   {
       var ch = encoded.charAt(i);
	   if (ch == "+") 
	   {
	       plaintext += " ";
		   i++;
	   } 
	   else if (ch == "%") 
	   {
			if (i < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) 
			{
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} 
			else 
			{
				alert( 'Bad escape combination near ...' + encoded.substr(i));
				plaintext += "%[ERROR]";
				i++;
			}
		} 
		else 
		{
		   plaintext += ch;
		   i++;
		}
	} // while
	
   return plaintext;
}

function setHotelWidgetCitySearch()
{
    //debugger;
    var selectedIndex = $("#hotelCitiesDDL")[0].selectedIndex;
    var cityCode = $("#hotelCitiesDDL").val();  
    var cityText =  $("#hotelCitiesDDL")[0].options[selectedIndex].text;   
    if (cityText.indexOf(',') < 0)
    {
        setCSC(cityText, cityCode, 'US');
    }
    else
    {
        cityCountry = cityText.split(',');
        if (cityCountry[1].indexOf('(') > 0)
        {
            var country = trim(cityCountry[1].substring(0, cityCountry[1].indexOf('(')));
            if (country.length == 0) country = cityCountry[0];
            setCSC(cityCountry[0], cityCode, country);
        }
        else
        {
            setCSC(cityCountry[0], cityCode, cityCountry[1]);
        }
    }
    
}

function setCSC(city, state, country) 
{
    if (city != "") 
    {                
        $("#city").val(urlEncode(city));
        $("#stateProvince").val(urlEncode(state));
        $("#country").val(urlEncode(country));
    }
}

function trim(text)
{
    return text.replace(/^\s+|\s+$/g,"");
}

function SanitizeInput(text) {
    return text.replace(/(>|$|;|:|<|\(|\)|\/)/g, " ");
    //return text.replace(/(>|$|;|:|<|\/)/g, " "); // allow parenthesis
}

function submitHotSearch()
{
    //debugger;
    var canSearch = validateHotelSearch();
    if (canSearch == '')
    {
        setHotelWidgetCitySearch();
        setNumberOfAdults();
        setNumberOfChildren();
        setAgeOfChildren();
        
        var url = "http://travel.ian.com/index.jsp?";
        var querystring = "pageName=" + $("#pageName").val() + "&";
        querystring += "cid=" + $("#cid").val() + "&";
        querystring += "fc=" + $("#fc").val() + "&";
        querystring += "locale=" + $("#locale").val() + "&";
        querystring += "city=" + $("#city").val() + "&";
        querystring += "country=" + $("#country").val() + "&";
        querystring += "stateProvince=" + $("#stateProvince").val() + "&";
        querystring += "submitted=" + $("#submitted").val() + "&";
        querystring += "validateCity=" + $("#validateCity").val() + "&";
        querystring += "passThrough=" + $("#passThrough").val() + "&";
        querystring += "showHotels=" + $("#showHotels").val() + "&";
        querystring += "showCondos=" + $("#showCondos").val() + "&";
        querystring += "showPopUp=" + $("#showPopUp").val() + "&";
        querystring += "mode=" + $("#mode").val() + "&";
        querystring += "numberOfRooms=" + $("#numberOfRooms").val() + "&";   
        querystring += "room-0-adult-total=" + $("#room-0-adult-total").val() + "&";
        querystring += "room-0-child-total=" + $("#room-0-child-total").val() + "&";
        
        if ($("#room-0-child-0-age").val() != "")
            querystring += "room-0-child-0-age=" + $("#room-0-child-0-age").val() + "&";
            
        if ($("#room-0-child-1-age").val() != "")
            querystring += "room-0-child-1-age=" + $("#room-0-child-1-age").val() + "&";

        if ($("#room-0-child-2-age").val() != "")
            querystring += "room-0-child-2-age=" + $("#room-0-child-2-age").val() + "&";
            
         if ($("#room-0-child-3-age").val() != "")
            querystring += "room-0-child-3-age=" + $("#room-0-child-3-age").val() + "&";
           
        querystring += "arrivalDay=" + $("#hotelDaysDDL1").val() + "&";
        var month = document.getElementById('hotelMonthsDDL1').selectedIndex;
        querystring += "arrivalMonth=" + decodeMonth(month) + "&";
        
        querystring += "departureDay=" + $("#hotelDaysDDL2").val() + "&";
        month = document.getElementById('hotelMonthsDDL2').selectedIndex;
        querystring += "departureMonth=" + decodeMonth(month) + "&";

        window.open(url + SanitizeInput(querystring));	
    }
    else
    {
        alert(canSearch);
        return false;
    }    
}

function accountForChildren()
{
    var numberOfChildren = 0;
    if ($("#hotelChildrenAgeDDL1").val() != 'na')
        numberOfChildren++;
    if ($("#hotelChildrenAgeDDL2").val() != 'na')
        numberOfChildren++;
    if ($("#hotelChildrenAgeDDL3").val() != 'na')
        numberOfChildren++;
    if ($("#hotelChildrenAgeDDL4").val() != 'na')
        numberOfChildren++;        
    return numberOfChildren;
}

function setNumberOfAdults()
{
    var numberOfGuests = $("#hotelNumGuestsDDL").val();
    var numberOfChildren = accountForChildren();
    $("#room-0-adult-total").val(numberOfGuests - numberOfChildren);
}

function setNumberOfChildren()
{
    var numberOfChildren = accountForChildren();
    $("#room-0-child-total").val(numberOfChildren);
}

function setAgeOfChildren()
{
    if (accountForChildren() > 0)
    {    
        if ($("#hotelChildrenAgeDDL1").val() != 'na')
            $("#room-0-child-0-age").val($("#hotelChildrenAgeDDL1").val());
            
        if ($("#hotelChildrenAgeDDL2").val() != 'na')
            $("#room-0-child-1-age").val($("#hotelChildrenAgeDDL2").val());
            
        if ($("#hotelChildrenAgeDDL3").val() != 'na')
            $("#room-0-child-2-age").val($("#hotelChildrenAgeDDL3").val());
            
        if ($("#hotelChildrenAgeDDL4").val() != 'na')
            $("#room-0-child-3-age").val($("#hotelChildrenAgeDDL4").val());        
    }
}