//**********************************************************************
// This script is used to manipulate and validate the search elements
// found on the mini promo search widget.
//**********************************************************************

var wa_hotelList = null;
var wa_maxPassengers = 7;



$(function() {
	
	$("#promosearch").attr("action", "https:" + "//" + location.host + "/aev/initEngine.action");
	
	
	//Configure tracking
	if ($("#trackOrgination").val() == null || $("#trackOrgination").val() == "null" || $("#trackOrgination").val() == "") {
		$("#trackOrgination").val(document.referrer);
	}
	
	if ($("#search_URL").val() == null || $("#search_URL").val() == "null" || $("#search_URL").val() == "") {
		$("#search_URL").val(document.URL);
	}	
	
	//Load hotels
	wa_hotelList = new Hotel();
	
	//Populate default widget values
	loadDefaults();
		
	//Initialize Type Ahead
	initDeptAirportSuggest(1, $("#gatewayDisplay")[0], $("#gateway")[0], $("#ssGatewaySuggestDiv")[0], $("#suggestFrame")[0]);
	initDestAirportSuggest(1, $("#destCity1Display")[0], $("#destCity1")[0], $("#ssDest1SuggestDiv")[0], $("#suggestFrame")[0]);
	
	
	
	//Type Ahead Events
	$("#gatewayDisplay").focus(function(event){checkDeptDefaultText(1);});
	$("#gatewayDisplay").keyup(function(event){suggestDeptAirports(1);});
	$("#gatewayDisplay").keydown(function(event){checkDeptAirportScroll(event, 1);});
	$("#gatewayDisplay").blur(function(event){checkDeptAirportSelection(1);});
	$("#deptFullList").click(function(event){toggleDeptAirportList(1, this);});
	
	$("#destCity1Display").focus(function(event){checkDestDefaultText(1);});
	$("#destCity1Display").keyup(function(event){suggestDestAirports(1);});
	$("#destCity1Display").keydown(function(event){checkDestAirportScroll(event, 1);});
	$("#destCity1Display").blur(function(event){checkDestAirportSelection(1);});
	$("#destFullList").click(function(event){toggleDestAirportList(1, this);});
	
	
	
	$("#destCity1Display").change(
        function(event){        	
        	clearError("destCity1Error");
        	
        	if ($("#specificHotelsOpt").is(":checked")) {
        		$("#allHotelsOpt").attr("checked", true);
        		$("#hotelListDiv").hide();
        		$("#hotelList0").empty();
        	}
    });
	
	
		
	$("#tripType").change(
        function(event){        	
            $("#flightOptionsRow").toggle();
    });
	
	
	
	$("#startDate").blur(
        function(event){
        	var errorMsg = getDateInputErrors($(this)[0], true);
        	if (errorMsg == null) {
        		clearError("startDateError");
        	}
        	else {
        		displayError(errorMsg, "startDateError");
        	}
    });
	
	
	
	$("#startDate").change(
        function(event){        	
        	if (! $("#startDateError").is(":visible")) {
        		var departDate = parseDateMMDDYYYY($(this).val());
        		var returnDate = getDateFromSeed(departDate, 7);
        		$("#depDate1").val(dateToMMDDYYYYString(returnDate));
        	}
    });
	
	
	
	$("#depDate1").blur(
        function(event){
        	var errorMsg = getDateInputErrors($(this)[0], true);
        	if (errorMsg == null) {
        		clearError("depDate1Error");
        	}
        	else {
        		displayError(errorMsg, "depDate1Error");
        	}        	
    });
	
	
	
	$("#deptCalendar").click(
        function(event){
        	getDepartCalendars($("#calendarDiv")[0], $("#calendarFrame")[0], $("#startDate")[0], $("#depDate1")[0], $("#clientType").val(), aw_promoDateRanges);       
    });
	
	
	
	$("#destCalendar").click(
        function(event){
        	getReturnCalendars($("#calendarDiv")[0], $("#calendarFrame")[0], $("#startDate")[0], $("#depDate1")[0], $("#depDate1")[0], $("#clientType").val(), aw_promoDateRanges);       	       
    });
	
	
	
	$("#allHotelsOpt").click(
        function(event){
        	clearError("hotelList0Error");
        	$("#hotelListDiv").hide();
    		$("#hotelList0").empty();
    });
	
	
	
	$("#specificHotelsOpt").click(
        function(event){
        	if ($("#destCity1").val() == null || $("#destCity1").val() == "") {        		
        		$("#allHotelsOpt").attr("checked", true);
        		displayError("Please select a destination city to see hotels", "destCity1Error");
        	}
        	else {
        		if (wa_hotelList.loadTo($("#destCity1").val(), $("#hotelList0")[0])) {
        			$("#hotelListDiv").show();
        		}
        		else{        			
            		$("#allHotelsOpt").attr("checked", true);
        		}        		
        	}
    });
	
	
		
	$("#roomCount").change(
        function(event){
        	switch ($(this).val()) {                
            	case "1":
            		$("#r2Pax").hide();            		
            		updatePassengers($("#room2Adults"), "1");
            		updatePassengers($("#room2Child"), "0");            		
                    toggleChildAges(2, "0");
                    break;
                    
                case "2":                    
                	if (parseInt($("#room1Adults").val()) + parseInt($("#room1Child").val()) == wa_maxPassengers) {                    	
                    	$(this).val("1");
                		displayError("Total number of passengers cannot exceed the maximum of " + wa_maxPassengers, "paxCountError");                    	
                    }
                    else {
                    	clearError("paxCountError");
                    	$("#r2Pax").show();
                    }
                    break;            
            }
    });
    
    
    
    $("#room1Adults").change(
        function(event){            
        	var paxMsg = validatePassengers();
        	if (paxMsg == null) {
        		clearError("paxCountError");
        		updatePassengers($("#room1Adults"), $(this).val());
        	}        	
        	else {        		
        		updatePassengers($("#room1Adults"), $(this).data("oldVal"));        		
        		displayError(paxMsg, "paxCountError");
        	}        	
    });
    
        
   
    $("#room1Child").change(
        function(event){            
        	var paxMsg = validatePassengers();
        	if (paxMsg == null) {        		
        		clearError("paxCountError");
        		updatePassengers($("#room1Child"), $(this).val());
        		toggleChildAges(1, $(this).val());
        	}
        	else {
        		updatePassengers($("#room1Child"), $(this).data("oldVal"));        		
        		displayError(paxMsg, "paxCountError");
        	}
    });
    
    
    
    $("#room2Adults").change(
        function(event){            
        	var paxMsg = validatePassengers();
        	if (paxMsg == null) {
        		clearError("paxCountError");
        		updatePassengers($("#room2Adults"), $(this).val());
        	}
        	else {        		
        		updatePassengers($("#room2Adults"), $(this).data("oldVal"));        		
        		displayError(paxMsg, "paxCountError");
        	}
    });
    
    
       
    $("#room2Child").change(
        function(event){            
        	var paxMsg = validatePassengers();
        	if (paxMsg == null) {
        		clearError("paxCountError");
        		updatePassengers($("#room2Child"), $(this).val());
        		toggleChildAges(2, $(this).val());
        	}
        	else {
        		updatePassengers($("#room2Child"), $(this).data("oldVal"));        		
        		displayError(paxMsg, "paxCountError");
        	}
    });
    	
	
	
	$("#searchBtn").click(
        function(event){
        	if (validateFormInput()) {
        		$("#promosearch").submit();
        	}        	
    });
})



//Set defaults for widget elements after page has loaded to prevent
//previously entered data from being displayed, and thus ensure that
//all JS functions will work properly.  Also, store passenger data
//for use with error handling later.
function loadDefaults() {	
	$("#tripType").val("FLHL");
	$("#gateway").val("");	
	if (aw_destCode != undefined && aw_destCode != null && aw_destCode != "") {
		$("#destCity1").val(aw_destCode);
	}
	$("#flightClassC").attr("checked", true);
		
	loadDateDefaults();
	
	$("#roomCount").val("1");
	updatePassengers($("#room1Adults"), "2");
	updatePassengers($("#room1Child"), "0");
	updatePassengers($("#room2Adults"), "1");
	updatePassengers($("#room2Child"), "0");
	for (var i=1; i<7; i++) {
        setAges($("#room1ChildAge" + i)[0]);        
    }
	for (var i=1; i<6; i++) {                  
        setAges($("#room2ChildAge" + i)[0]);        
    }
		
	if (aw_destCode != undefined && aw_destCode != null && aw_destCode != "") {
		if (wa_hotelList.loadTo($("#destCity1").val(), $("#hotelList0")[0])) {
			$("#specificHotelsOpt").attr("checked", true);
			$("#hotelList0").val(aw_hotelCode);		
			$("#hotelList0 option:selected").focus();
			$("#hotelListDiv").show();
		}
		else {		
			$("#allHotelsOpt").attr("checked", true);
		}
	}
	else {
		$("#allHotelsOpt").attr("checked", true);
	}
}



function loadDateDefaults() {
    var today = new Date();
    var departDate;
    var returnDate;    
    
    if (aw_promoDateRanges == null) {        
        //Departure date should default to 21 days in the future
        departDate = getDateFromSeed(today, 21);
		        
        //Return date should default to 7 days after departure date
        returnDate = getDateFromSeed(departDate, 7);		
    }
    else {    	
    	var earliestBookableDate = getDateFromSeed(today, 4);
    	var earliestPromoDate = null;
        var dateRangeIndex = null;
      
        for (var i=0; i<aw_promoDateRanges.length; i++) {
            if (earliestBookableDate <= aw_promoDateRanges[i].beginDate) {
            	if (earliestPromoDate == null || earliestPromoDate > aw_promoDateRanges[i].beginDate) {
                    earliestPromoDate = aw_promoDateRanges[i].beginDate;
                    dateRangeIndex = i;
                }
            }
            else {
            	if (earliestBookableDate < aw_promoDateRanges[i].endDate) {
            		if (earliestPromoDate == null || earliestPromoDate > earliestBookableDate) {
                        earliestPromoDate = earliestBookableDate;
                        dateRangeIndex = i;
                    }
            	}
            }
        }
        
        if (earliestPromoDate == null) {
        	earliestPromoDate = earliestBookableDate;
        }
        
                
        //Departure date should default to first valid promo date
        departDate = getDateFromSeed(earliestPromoDate, 0);		
        
        //Return date should default to 7 days after departure date or the last
        //day of the selected promo date range, whichever is earlier        
        returnDate = getDateFromSeed(departDate, 7);
        if (dateRangeIndex != null && returnDate > aw_promoDateRanges[dateRangeIndex].endDate) {
            returnDate.setTime(aw_promoDateRanges[dateRangeIndex].endDate.getTime());
        }
    }
    
    $("#startDate").val(dateToMMDDYYYYString(departDate));
    $("#depDate1").val(dateToMMDDYYYYString(returnDate));
}



function clearErrors() {
	$(".widgetError").empty();
	$(".widgetErrorRow").hide();
}



function clearError(errorDivID) {	
	$("#" + errorDivID).closest(".widgetError").empty();
	$("#" + errorDivID).hide();
}



function displayError(message, errorDivID) {
	$("#" + errorDivID).find(".widgetError").html(message);
	$("#" + errorDivID).show();
}



function updatePassengers(field, newVal) {	
	$(field).val(newVal);
	$(field).data("oldVal", newVal);
}



function toggleChildAges(roomNum, numChildren) {       
	var divName = "#room" + roomNum + "ChildAges";
	
	if (numChildren != "0") {    	
    	$(divName).show();
    	
    	switch (numChildren) {
            case "1":
                enableChildAges(roomNum, 1, 1);
                disableChildAges(roomNum, 2, 6)
                break;
                
            case "2":
                enableChildAges(roomNum, 1, 2);
                disableChildAges(roomNum, 3, 6)
                break;
            
            case "3":
                enableChildAges(roomNum, 1, 3);
                disableChildAges(roomNum, 4, 6)
                break;
            
            case "4":
                enableChildAges(roomNum, 1, 4);
                disableChildAges(roomNum, 5, 6)
                break;
            
            case "5":
                enableChildAges(roomNum, 1, 5);
                disableChildAges(roomNum, 6, 6)
                break;
            
            case "6":
                enableChildAges(roomNum, 1, 6);                
                break;          
        }
    }
    else {
    	$(divName).hide();
    	disableChildAges(roomNum, 1, 6);
    }
}



function enableChildAges(roomNum, beginNr, endNr) {
    var fieldName = null;
    
    for (var i=beginNr; i<endNr+1; i++) {
        fieldName = "#room" + roomNum + "ChildAge" + i;            
        $(fieldName).show();
    }
}



function disableChildAges(roomNum, beginNr, endNr) {
    var fieldName = null;
    
    for (var i=beginNr; i<endNr+1; i++) {
        fieldName = "#room" + roomNum + "ChildAge" + i;  
        $(fieldName).val("?");
        $(fieldName).hide();
    }
}



function validatePassengers() {
	var totalAdults = parseInt($("#room1Adults").val());
	var totalChildren = parseInt($("#room1Child").val());
	
	if ($("#r2Pax").is(":visible")) {
		totalAdults += parseInt($("#room2Adults").val());
		totalChildren += parseInt($("#room2Child").val());
	}
		
	if (totalAdults + totalChildren > wa_maxPassengers) {
		return "Total number of passengers exceeds the maximum of " + wa_maxPassengers;
	}
	else {
		return null;
	}
}



//**********************************************************************
//Name			: validateTravelDates
//Description	: Validates the travel date fields.
//Output		: True if the travel date values are valid or false if
//				  errors are found.
//**********************************************************************
function validateTravelDates() {
	var departDate = null;
	var returnDate = null;
	var today = null;
	var firstSelectableDate = null;
	var lastSelectableDatePkg = null;
	var valid = true;
	var errorMsg = null;

	//Dates must be valid and in correct format
	errorMsg = getDateInputErrors($("#startDate")[0], false);
	if (errorMsg == null) {
		departDate = parseDateMMDDYYYY($("#startDate").val());		
	}
	else {
		valid = false;
		displayError(errorMsg, "startDateError");
	}
	
	errorMsg = getDateInputErrors($("#depDate1")[0], false);
	if (errorMsg == null) {
		returnDate = parseDateMMDDYYYY($("#depDate1").val());		
	}
	else {
		valid = false;
		displayError(errorMsg, "depDate1Error");		
	}
		
	if (departDate != null) {		 
		 today = new Date();    
		 firstSelectableDate = getDateFromSeed(today, 4);
		 lastSelectableDatePkg = getDateFromSeed(today, 331);
		 
		 //Earliest selectable date should be 4 days after current date
		 if (departDate < firstSelectableDate) {
			 valid = false;
			 displayError("Departure date must be at least 4 days in the future", "startDateError");
		 }
		 
		 //Air + hotel packages can only be made up to 331 days in advance    
		 if ($("#tripType").val() == "FLHL" && departDate > lastSelectableDatePkg) {
			 valid = false;
			 displayError("Flight &amp; Hotel Packages can only be booked up to 331 days in advance; to book a later date, please select the Hotel Packages option", "startDateError");			 	 
		 }
		
		 if (returnDate != null) {
			 //Dates cannot be the same
			 if (departDate.getTime() == returnDate.getTime()) {				 
				 valid = false;
				 displayError("Departure date and return date cannot be the same", "depDate1Error");
			 }			 
			 
			 //Departure date must be earlier than return date
			 if (departDate > returnDate) {				 
				 valid = false;
				 displayError("Return date cannot be earlier than departure date", "depDate1Error");				 
			 }
			 
			 //Ensure that travel dates fall within a valid promo date range, if applicable
			 /*if (aw_promoDateRanges != null) {
			     var validDates = false;
			     
			     for (var v=0; v<aw_promoDateRanges.length; v++) {        
			         if (departDate >= aw_promoDateRanges[v].beginDate && returnDate <= aw_promoDateRanges[v].endDate) {
			             validDates = true;
			             break;
			         }
			     }
			     
			     if (! validDates) {
			    	 errorMsgs[errorMsgs.length] = "Selected travel dates are not eligible for this promotion";
					 errorFlags[errorFlags.length] = "deptDateLabel";
					 errorFlags[errorFlags.length] = "returnDateLabel";			    	   
			     }
			 }*/
		 } //end end valid return date
	} //end valid departure date

	return valid;
}



function validateFormInput() {	
	var errorFound = false;
	var errorMsg = null;
		
	if ($("#gateway").val().length == 0) {
		errorFound = true;
		displayError("Select a departure city", "gatewayError");
	}
	if ($("#destCity1").val().length == 0) {		
		errorFound = true;
		displayError("Select a destination city", "destCity1Error");
	}
	if ($("#gateway").val().length > 0 && $("#destCity1").val().length > 0 &&
			$("#gateway").val() ==  $("#destCity1").val()) {
		errorFound = true;
		displayError("Departure and destination city cannot be the same", "destCity1Error");
	}
		
	if (! validateTravelDates()) {
		errorFound = true;
	}
	
	if ($("#specificHotelsOpt").attr("checked") == true && $("#hotelList0 option:selected").length < 1) {
		errorFound = true;
		displayError("Select a hotel", "hotelList0Error");
	}
		
	errorMsg = validatePassengers();
	if (errorMsg != null) {		
		errorFound = true;
		displayError(errorMsg, "paxCountError");
	}
	
	for (var i=1; i<7; i++) {
		if ($("#room1ChildAge" + i).is(":visible") && $("#room1ChildAge" + i).val() == "?") {
			errorFound = true;
			displayError("Select Room 1 child age(s)", "room1ChildAgesError");
			break;
		}
    }
	for (var i=1; i<6; i++) {                  
		if ($("#room2ChildAge" + i).is(":visible") && $("#room2ChildAge" + i).val() == "?") {
			errorFound = true;
			displayError("Select Room 2 child age(s)", "room2ChildAgesError");
			break;
		}
    }
		
	if (errorFound) {		
		return false;
	}
	else {
		return true;
	}	
}