var ttForm = new Object();
ttForm.minFltDuration = 2;
ttForm.depCalObj = '';
ttForm.retCalObj = '';

jQuery(document).ready(function() 
{
	var date_selected;
    var $tabs = jQuery("#tt_search").tabs();
    $tabs.tabs('select', '#' + tt_selectedTab);
  
    jQuery.dpText = {
        TEXT_PREV_YEAR      :   'Previous year',
        TEXT_PREV_MONTH     :   'Previous month',
        TEXT_NEXT_YEAR      :   'Next year',
        TEXT_NEXT_MONTH     :   'Next month',
        TEXT_CLOSE          :   'Close',
        TEXT_CHOOSE_DATE    :   'Choose a date',
        TEXT_IMAGE_LOCN     :   '',
        HEADER_FORMAT       :   'mmmm yyyy'
    };
    
    Date.format = "ddmmmyy";
    
    if (typeof(tt_selectedDate) == "undefined")
    	date_selected = tt_todaysDate;
    else
    	date_selected = tt_selectedDate;
    
    if (!tt_cdpStartDate)
    {
        jQuery('.tt_jq_start_date').each(
            function(inIdx){
                this.value = Date.fromString(tt_todaysDate).addDays(tt_offset).asString();
            }
        )
    }
    
    jQuery('.tt_jq_basic_cal').ttDatePicker(
      { 
        startDate: Date.fromString(tt_todaysDate).addDays(tt_offset).asString(),
        endDate: Date.fromString(tt_todaysDate).addYears(1).asString(),

        hoverCallback:function($inTd)
        {
    	    jQuery('#dp-hover-div').html($inTd.data("hoverText"));
        },
        unhoverCallback:function($inTd)
        {
        	jQuery('#dp-hover-div').html("");
        }
      }
    );

    ttForm.depCalObj = jQuery('#tt_byo_departure_date').ttDatePicker(
      { 
        startDate: Date.fromString(tt_todaysDate).addDays(tt_offset).asString(),
        endDate: Date.fromString(tt_todaysDate).addDays(365).asString(),
        hoverCallback:function($inTd)
        {
        	jQuery('#dp-hover-div').html($inTd.data("hoverText"));
        },
        unhoverCallback:function($inTd)
        {
        	jQuery('#dp-hover-div').html("");
        }
      }
    )
    .bind(
        'dpClosed',
        function(e, selectedDates)
        {
            var d = selectedDates[0];
            var retDate;
            if (d) {
            	d = new Date(d);
            	retDate = ttForm.setReturnDate(d);
            	jQuery('#tt_byo_return_date').dpSetStartDate(d.addDays(ttForm.minFltDuration).asString());
            	jQuery('#tt_byo_return_date').dpSetEndDate(d.addDays(99 - ttForm.minFltDuration).asString());
            	jQuery('#tt_byo_return_date').dpSetSelected(retDate.asString());
            }
        }
    );

    ttForm.retCalObj = jQuery('#tt_byo_return_date').ttDatePicker(
      { 
        startDate: Date.fromString(date_selected).addDays(ttForm.minFltDuration).asString(),
        endDate: Date.fromString(date_selected).addDays(99).asString(),
        hoverCallback:function($inTd)
        {
        	jQuery('#dp-hover-div').html($inTd.data("hoverText"));
        },
        unhoverCallback:function($inTd)
        {
        	jQuery('#dp-hover-div').html("");
        }
      }
    );
   jQuery("a.tt_booking_tips").tooltip({ 
         showURL: false, 
         bodyHandler: function() { 
             return $("#" + $(this).attr("id").split('-')[0] + "-div").html(); 
        },
        id: "tt_tooltip",
        container: document.getElementById("tt_tooltip_container_panel")
    });
    ttForm.showTabs();
    if (document.getElementById("tt_search_byo") != null)
    {
    	ttForm.changeFltFromCity();
    	var selectedHtlCity = document.getElementById("tt_htl_city_holder");
    	var hotelSelect =  document.getElementById("tt_byo_destination").options;

    	for (var idx = 0; idx < hotelSelect.length; idx++)
    	{
    		if (hotelSelect[idx].value === selectedHtlCity.value)
    		{
    			hotelSelect[idx].selected = true;
    			break;
    		}
    	}
    	
    	ttForm.changeHtlCity();
    	ttForm.setBYODates();
    }
}); 

ttForm.changeHtlCity = function()
{
    var fltSelect = document.getElementById("tt_byo_destination");
    var selectedFltCity = fltSelect.options[fltSelect.selectedIndex].value;
    var destCities = ttBkgFormCtrlObjects.destinationCities;
    
    if (!fltSelect)
        throw "changeFltToCity: Cannot find fltFromCity";
    
    if (!destCities)
        throw "changeFltToCity: Cannot find destination cities";

    for (var idx = 0; idx < destCities.length; idx++)
    {
        var destCity = destCities[idx];

        if (destCity.id === selectedFltCity)
        {
			if (!destCity.hasModule) {
				document.getElementById("tt_byo_include_tours").disabled = true;
				document.getElementById("tt_byo_include_tours_lbl").className += "tt_disabled";
			}
			else
			{
				document.getElementById("tt_byo_include_tours").disabled = false;
				document.getElementById("tt_byo_include_tours_lbl").className = "";
			}
            
            document.getElementById("tt_byo_include_transfers").disabled = !(destCity.hasTransfer);
            
            document.getElementById("tt_byo_flt_city").value = (destCity.airportCity) ? (destCity.airportCity) : destCity.id;
            break;
        }
    }

    ttForm.setCarrier();
    ttForm.setBYODates();
}

ttForm.setCarrier = function()
{
    var fltFromSelect = document.getElementById("tt_byo_departure").value;
    var fltToSelect = document.getElementById("tt_byo_flt_city").value;
    var flightSchedules = ttBkgFormCtrlObjects.flightSchedules;

    for (var idx = 0; idx < flightSchedules.length; idx++)
    {
        var schedule = flightSchedules[idx];
        
        if (schedule.departureCity === fltFromSelect && schedule.destinationCity === fltToSelect)
        {
            document.getElementById("tt_byo_carrier").value = schedule.carrierCodes;
            break;
        }
    }
    
}

ttForm.changeFltFromCity = function()
{
    var fltSelect = document.getElementById("tt_byo_departure");
    var selectedFltCity = fltSelect.options[fltSelect.selectedIndex].value;
    if (!fltSelect)
        throw "changeFltFromCity: Cannot find fltFromCity";
	var depPoint = ttForm.getDeparturePoint(selectedFltCity);
	if (depPoint != null)
	    ttForm.generateFltToCityList(depPoint);
	else
		ttForm.setDefaultToCity();
    ttForm.setBYODates();
}

ttForm.getDeparturePoint = function(inSelectedFltCity)
{
    var depPoints = ttBkgFormCtrlObjects.departurePoints;
    if (!depPoints)
        throw "ttBkgFormCtrlObjects.departurePoints are missing";
    
    for (var idx = 0; idx < depPoints.length; idx++)
    {   
        var depPoint = ttBkgFormCtrlObjects.departurePoints[idx];    
        
        if (!depPoint)
            throw "Cannot find departure point";

        if (depPoint.departureCity === inSelectedFltCity)
        	return(depPoint);
    }
    return(null);
}

ttForm.generateFltToCityList = function(inDepPoint)
{
    var fltToCity = document.getElementById("tt_byo_destination");
    var destRegions = inDepPoint.destinationRegions;

    if (!inDepPoint)
        throw "Missing departure point";
    
    if (destRegions.length === 0)
    	ttForm.setDefaultToCity();
    
    destRegions = ttForm.sortArray(destRegions);

    jQuery(fltToCity).html('<option value="">---Please Select---</option>');
    for (var idx = 0; idx < destRegions.length; idx++)
    {
    	var optgroupCreated = false;
    	var optGroup = null;
        var optGroupLabel = destRegions[idx].regionName;
        
        var cities = destRegions[idx].cities;
        var subRegions = destRegions[idx].subDestinationRegions;
        
        if (!cities && !subRegions)
            continue;

        var options = "";
        if (cities)
        {
        	for (var idx1 = 0; idx1 < cities.length; idx1++)
	        {
	            var city = cities[idx1];
	            if (city.hasHotel)
	            {
	            	if (!optgroupCreated)
	            	{
	            		optGroup = jQuery(document.createElement("optgroup")).attr({ "label" : optGroupLabel})
	            		optgroupCreated = true;
	            	}
	            	options += ('<option value="' + city.id + '">' + city.cityName + '</option>');
	            }
	        }
        }
	    if (optgroupCreated)
	    {
	    	jQuery(optGroup).html(options);
	    	jQuery(fltToCity).append(optGroup);
	    }
        if (subRegions)
        {
	        for (var idx1 = 0; idx1 < subRegions.length; idx1++)
	        {
	        	var optSubGroup = null;
	        	var optgroupForSubRegionCreated = false;
	            var optGroupForSubRegionLabel = subRegions[idx1].subRegionName;
	            
	            var subRegionCities = subRegions[idx1].cities;
	            options = "";
	            for (var idx2 = 0; idx2 < subRegionCities.length; idx2++)
	            {
	                var city = subRegionCities[idx2];
	                if (city.hasHotel)
	                {
	                	if (!optgroupForSubRegionCreated)
	                	{
	                		if (!optgroupCreated)
	                    	{
	                    		optGroup = jQuery(document.createElement("optgroup")).attr({ "label" : optGroupLabel});
	                    		jQuery(fltToCity).append(optGroup);
	                    		optgroupCreated = true;
	                    	}
	                		optSubGroup = jQuery(document.createElement("optgroup")).attr({ "label" : "\u00A0\u00A0\u00A0\u00A0\u00A0" + optGroupForSubRegionLabel});
	                		optgroupForSubRegionCreated = true;
	                	}
	                	options += ('<option value="' + city.id + '">' + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + city.cityName + '</option>');
	                }
	            }
	    	    if (optgroupForSubRegionCreated)
	    	    {
	    	    	jQuery(optSubGroup).html(options);
	    	    	jQuery(fltToCity).append(optSubGroup);
	    	    }
	        }
        }
    }
}

ttForm.sortArray = function(inArray)
{
	for (var i=0; i<(inArray.length-1); i++)
        for (var j=i+1; j<inArray.length; j++)
            if (inArray[j].regionName < inArray[i].regionName) {
                var dummy = inArray[i];
                inArray[i] = inArray[j];
                inArray[j] = dummy;
            }
	return(inArray);
}

ttForm.setDefaultToCity = function()
{
	var fltToCity = document.getElementById("tt_byo_destination");
	jQuery(fltToCity).html('<option value="">---Please Select From City---</option>');
}

ttForm.showTabs = function()
{
    jQuery(".tt_jq_bkgform").each(function(){
        this.style.display = "";
    })
}

ttForm.displayChildAgeBoxes = function(numChildFld, divName, totNum)
{
    var numChild = document.getElementById(numChildFld).value;   
    document.getElementById(divName).style.display = numChild > 0 ? "" : "none";

    for (i = 1; i <= numChild; i++)
        document.getElementById(divName + i).style.display = "inline";

    for (; i <= totNum; i++)
        document.getElementById(divName + i).style.display = "none";
}

ttForm.byoOnSubmit = function(inPrefix)
{
    if (!ttForm.checkAdultInfant(inPrefix)) return(false);
    if (!ttForm.checkRequiredFieldsEntered(inPrefix)) return(false);
    if (!ttForm.setRoomMix(inPrefix)) return(false);
    if (!ttForm.setPackage(inPrefix)) return(false);

    return(ttForm.setDuration(inPrefix));
}

ttForm.setDuration = function(inPrefix)
{
	client.clearErrorMsg("tt_date_error");
    var returnValue = document.getElementById("tt_byo_return_date").value;
    var deptValue = document.getElementById("tt_byo_departure_date").value;
    
    if (returnValue == null || returnValue.length == 0 || deptValue == null || deptValue.length == 0)
        return(client.setErrorMsg("tt_date_error", "Must specify both a departure and return date"));

    var returnDate = Date.fromString(returnValue);
    var deptDate = Date.fromString(deptValue);
    
    if (returnDate < deptDate)
        return(client.setErrorMsg("tt_date_error", "Return date must be after the departure date"));

    document.getElementById("tt_byo_duration").value = deptDate.getDaysTo(returnDate);
       
    return(true);        
}

ttForm.setPackage = function(inPrefix)
{
	var transferField = document.getElementById("tt_byo_include_transfers");
    var hasTransfer = !transferField.disabled;

    var moduleField = document.getElementById("tt_byo_include_tours");
    var hasModule = moduleField.checked && !moduleField.disabled;
    var set_package = "ptg_f";
    if (hasTransfer)
     	set_package += "t";
       
    set_package += "h";

    if (hasModule)
    	set_package += "m"; 
        
    document.getElementById("tt_byo_package").value = set_package;
    return(true);
}

ttForm.setRoomMix = function(inPrefix)
{
    document.getElementById(inPrefix + '_room_mix').value = ttForm.getRoomMix(inPrefix);
 
    return(true);
}

ttForm.getRoomMix = function(inPrefix)
{
    var roomMixes = "";
    var adultCount = document.getElementById(inPrefix + "_adults").value;
    var childCount = document.getElementById(inPrefix + "_children").value;
    
    if (adultCount == 0) return roomMixes;
    
    roomMixes = adultCount + "A";
    
    if (childCount > 0)
    {
        roomMixes += childCount + "C";

        for (i=1; i<= childCount; i++)
        {
            roomMixes += "-" + document.getElementById(inPrefix + "_child_age" +  i).value ;
        }
    }

    return(roomMixes);  
}

ttForm.setBYODates = function()
{
	var start_date = Date.fromString(document.getElementById("tt_byo_departure_date").value);
	var end_date = Date.fromString(document.getElementById("tt_byo_return_date").value);
	
	var duration = start_date.getDaysTo(end_date);
	
	if (duration < ttForm.minFltDuration)
	{
		end_date.addDays(ttForm.minFltDuration - duration);
	}

	document.getElementById("tt_byo_departure_date").value = start_date.asString()
	document.getElementById("tt_byo_return_date").value = end_date.asString();
	ttForm.depCalObj.dpSetSelected(start_date.asString());
	ttForm.retCalObj.dpSetSelected(end_date.asString());
}

ttForm.setReturnDate = function(inDate) 
{
	var start_date = inDate;
	var end_date = Date.fromString(document.getElementById("tt_byo_return_date").value);
	
	var duration = start_date.getDaysTo(end_date);
	
	if (duration < ttForm.minFltDuration)
	{
		end_date.addDays(ttForm.minFltDuration - duration);
	}

	document.getElementById("tt_byo_return_date").value = end_date.asString();
	return end_date;
}

ttForm.checkRequiredFieldsEntered = function(inPrefix)
{
    if (inPrefix != 'tt_byo_frm')
        return(true);
    var departureCity = document.getElementById("tt_byo_departure");
    var destinationCity = document.getElementById("tt_byo_destination");

    var errorMessage = "Must Specify:"
    var hasError = false;
    var departureSelected = departureCity.options[departureCity.selectedIndex].value;
    var destinationSelected = destinationCity.options[destinationCity.selectedIndex].value;

    client.clearErrorMsg("tt_city_error");

    if (departureSelected != null && departureSelected.length === 0)
    {
        hasError = true;
        errorMessage += "<br/>- From city";
    }
    if (destinationSelected != null && destinationSelected.length === 0)
    {
        hasError = true;
        errorMessage += "<br/>- To city";
    }
    if (hasError)
        return(client.setErrorMsg("tt_city_error", errorMessage));

    return(true);
}

ttForm.checkAdultInfant = function(inPrefix)
{
	var i, child_age = 0, number_infant = 0;
	if (inPrefix != 'tt_byo_frm')
		return(true);
	
	client.clearErrorMsg("tt_pax_error");
	
	if (!client.checkAdultInfantNo(inPrefix + "_adults", inPrefix + "_children", inPrefix + "_child_age"))
		return(client.setErrorMsg("tt_pax_error", "Number of infants can not be greater than number of adults on flights"));
	return(true);
}

ttForm.hotelOnSubmit = function()
{
	if(!ttForm.checkHotelRequiredFields("tt_search_hotel_location", "hotel_error"))
		return(false);
	ttForm.setRoomMix('tt_htl_frm');
	return(true);
}

ttForm.onHolPkgSubmit = function()
{
	if(!ttForm.checkHotelRequiredFields("tt_search_promotion_location", "pkg_error"))
		return(false);
	ttForm.setRoomMix('tt_packages_frm');
	return(true);
}

ttForm.onModSubmit = function()
{
	if(!ttForm.checkHotelRequiredFields("tt_search_module_location", "mod_error"))
		return(false);
	ttForm.setRoomMix('tt_mod_frm');
	return(true);
}

ttForm.checkHotelRequiredFields = function(inLocId, inErrorDiv)
{
	client.clearErrorMsg(inErrorDiv);
	if (document.getElementById(inLocId).value == "")
	{
		client.setErrorMsg(inErrorDiv, "Must enter hotel city");
		return(false);
	}
	return(true);
}
