﻿
var skiSearch =
{
    details: null,
    searchCriteria:
    {
        Countries: [],
        Resorts: [],
        Airports: [],
        DateRanges: [],
        PropertyTypes: [],
        BoardBasis: [],
        Features: [],
        Regions: [],
        SkiAreas: [],
        Flexibility: 2,
        Duration: 0,
        WholeChalet: false,
        AccommodationOnly: false,
        Passengers: 0,
        PropertyRating: 0,
        Adults: 0,
        Children: 0,
        addCountry: function (countryCode) {
            this.Countries = new Array();
            this.Countries[this.Countries.length] = { 'code': countryCode };
        },
        addSkiArea: function (skiAreaId) {
            this.SkiAreas = new Array();
            this.SkiAreas[this.SkiAreas.length] = { 'id': skiAreaId };
        },
        addRegion: function (regionId) {
            this.Regions = new Array();
            this.Regions[this.Regions.length] = { 'id': regionId };
        },
        clearCountry: function () {
            this.Countries.length = 0;
            this.SkiAreas.length = 0;
        },

        removeCountry: function (countryCode) {
            this.Countries = removeElementFromArray(this.Countries, countryCode);
        },

        addDateRange: function (startDate, endDate) {
            this.DateRanges[this.DateRanges.length] = { 'startDate': startDate, 'endDate': endDate };
        },

        clearDateRange: function () {
            this.DateRanges.length = 0;
        },

        removeDateRange: function (startDate, endDate) {

        },

        addResort: function (resortId) {
            this.Resorts[this.Resorts.length] = { 'id': resortId };
        },

        clearResort: function () {
            this.Resorts.length = 0;
        },
        clearRegions: function () {
            this.Regions.length = 0;
        },
        removeResort: function (resortId) {
            this.Resorts = removeElementFromArray(this.Resorts, resortId);
        },

        addDeparturePort: function (departurePortId) {
            this.Airports[this.Airports.length] = { 'id': departurePortId };
        },

        clearDeparturePort: function () {
            this.Airports.length = 0;
        },

        removeDeparturePort: function (departurePortId) {
            this.Airports = removeElementFromArray(this.Airports, departurePortId);
        },

        setFlexibility: function (flexibility) {
            skiSearch.resetSearchCriteria("f");
            this.Flexibility = flexibility;
        },

        setDuration: function (duration) {
            skiSearch.resetSearchCriteria('d');
            this.Duration = duration;
        },

        toggleBoardBasis: function (boardBasisCode) {

            this.clearBoardBasis();
            if (skiSearch.itemExistsInArray(this.BoardBasis, boardBasisCode))
                this.BoardBasis = skiSearch.removeElementFromArray(this.BoardBasis, boardBasisCode);
            else
                this.BoardBasis[this.BoardBasis.length] = boardBasisCode;
        },

        togglePropertyType: function (propertyTypeCode) {
            if (skiSearch.itemExistsInArray(this.PropertyTypes, propertyTypeCode))
                this.PropertyTypes = skiSearch.removeElementFromArray(this.PropertyTypes, propertyTypeCode);
            else
                this.PropertyTypes[this.PropertyTypes.length] = propertyTypeCode;
        },

        setWholeChalet: function (wholeChalet) {
            this.WholeChalet = wholeChalet;
        },

        setPassengers: function (adults, children) {
            this.Passengers = adults + children;
            this.Adults = adults;
            this.Children = children;
        },

        setRating: function (minRating) {
            this.PropertyRating = minRating;
        },

        setAccommodationOnly: function (accommodationOnly) {
            this.AccommodationOnly = accommodationOnly;
        }
    },

    showGroupChalet: function () {
        // if div is animating then return
        if ($('#divGroupChalet').is(':animated')) { return; }

        // first get the accommodation type and make sure it is a chalet
        var accomType = $('#ddlAccom option:selected').text();
        // get total party
        var totalAdults = parseInt($('#ddlAdults').val());
        var totalKids = parseInt($('#ddlChildren').val());
        // only show sole occupancy checkbox if we have a chalet and a group of 6 or more
        if (accomType == 'Chalet' && totalAdults + totalKids >= 6) {
            $('#divGroupChalet').slideDown(300);
        }
        else {
            // hide
            $('#divGroupChalet').slideUp(300, function () {
                $('#chkGroupChalet').attr('checked', false);
                skiSearch.changeWholeChalet(false);
            });
        }
    },

    BindCriteria: function () {
        var myObject =
        {
            'id': 1,
            'method': 'GetHomepageSearchCriteria',
            'params':
            {
                'topResortOnly': 1
            }
        };

        //Fetch the search crtiera
        $.ajax({
            url: "/Services/JSON/HolidaySearch.ashx",
            data: JSON.stringify(myObject),
            contentType: 'application/json',
            type: "POST",
            dataType: 'json',
            success: function (a) {
                skiSearch.bindToSearch(a);
            },
            dataType: 'json'
        });
    },
    removeElementFromArray: function (array, identifier) {
        var returnArray = [];
        for (var i = 0; i < array.length; i++)
            if ((array[i].id != null && array[i].id.toString() != identifier.toString()) || (array[i].code != null && array[i].code.toString() != identifier.toString()) || array[i] != identifier)
                returnArray[returnArray.length] = array[i];

        return returnArray;
    },

    itemExistsInArray: function (array, identifier) {
        for (var i = 0; i < array.length; i++)
            if ((array[i].id != null && array[i].id.toString() == identifier.toString()) || (array[i].code != null && array[i].code.toString() == identifier.toString()) || array[i] == identifier)
                return true;

        return false;
    },

    bindArrayToSelect: function (destination, input, firstLine) {
        destination.empty();

        if (firstLine)
            destination.append("<option value=\"" + firstLine.code + "\">" + firstLine.name + "</option>");

        for (var i = 0; i < input.length; i++)
            destination.append("<option value=\"" + (input[i].code || input[i].id) + "\">" + input[i].name + "</option>");
    },

    bindArrayToSelect: function (destination, input, firstLine, selectedOption, type) {
        destination.empty();
        if (firstLine)
            destination.append("<option value=\"" + firstLine.code + "\">" + firstLine.name + "</option>");

        for (var i = 0; i < input.length; i++) {
            //check for the previouslyselected options and set the search criteria
            if (selectedOption == (input[i].code || input[i].id)) {

                //populate the criteria
                skiSearch.populateFromSearch(type, (input[i].code || input[i].id));

                destination.append("<option selected=\"selected\" value=\"" + (input[i].code || input[i].id) + "\">" + input[i].name + "</option>");
            }
            else
                destination.append("<option value=\"" + (input[i].code || input[i].id) + "\">" + input[i].name + "</option>");
        }
    },

    bindSelectByGroup: function (destination, input, firstLine, selectedOption, groupName, type) {
        var options = "";
        if (type == "c") {
            options += "<option value=\"" + firstLine.code + "\">" + firstLine.name + "</option>";
            options += "<optgroup label=\"" + groupName + "\">";
        }
        else {
            options = "<optgroup label=\"" + groupName + "\">";
            if (firstLine != null)
                options += "<option value=\"" + firstLine.code + "\">" + firstLine.name + "</option>";

        }
        for (var i = 0; i < input.length; i++) {

            if (selectedOption == (input[i].code || input[i].id)) {

                //populate the criteria
                options += "<option selected = \"selected\" value=\"" + (input[i].code || input[i].id) + "\">" + input[i].name + "</option>";
                skiSearch.populateFromSearch(type, (input[i].code || input[i].id));

                //do the control                
            }
            else
                options += "<option value=\"" + (input[i].code || input[i].id) + "\">" + input[i].name + "</option>";
        }

        destination.append(options + "</optgroup>");

    },

    bindSelect: function (listName, selectedOption, type) {

        if (selectedOption.toLowerCase() == "any")
            return;
        $(listName + ' option').each(function (i) {
            if ($(this).val().toLowerCase() == selectedOption.toLowerCase()) {
                $(this).attr('selected', 'selected');
                skiSearch.populateFromSearch(type, selectedOption);
            }
        });

    },
    bindAccommSelect: function (listName, selectedOption, type) {
        if (selectedOption.toLowerCase() == "any")
            return;

        $(listName + ' option').each(function (i) {
            if ($(this).val().toLowerCase().split(',')[0].toString() == selectedOption.toLowerCase().split(',')[0].toString()) {
                $(this).attr('selected', 'selected');
                skiSearch.populateFromSearch(type, selectedOption);
            }
        });
    },
    /*
    Type Values
    a=airport, ad=adults, c=country, ch=children, d=duration, ac=propertytype, ra=rating f=flex r=resort* mon=month da= day*/
    populateFromSearch: function (type, selectedVal) {
        switch (type) {
            case "a": //airport
                skiSearch.searchCriteria.addDeparturePort(selectedVal);
                break;
            case "se": //skiArea
                skiSearch.searchCriteria.addSkiArea(selectedVal);
                break;
            case "re": //region
                skiSearch.searchCriteria.addRegion(selectedVal);
                break;
            case "r": //resort
                skiSearch.searchCriteria.addResort(selectedVal);
                var resort = this.findItemInArray(this.details.resorts, selectedVal);
                skiSearch.toggleCountryOrSkiAreaBind(resort)
                break;
            case "c": //ccountry
                skiSearch.searchCriteria.addCountry(selectedVal);
                break;
            case "f": //flexibility
                skiSearch.searchCriteria.setFlexibility(selectedVal);
                break;
            case "ac": //propertytype
                skiSearch.setPropertyTypeFromValue(selectedVal);
                break;
            case "ad": //adults
                skiSearch.searchCriteria.Adults = selectedVal;
                skiSearch.searchCriteria.Passengers += parseInt(selectedVal)
                break;
            case "ch": //children
                skiSearch.searchCriteria.Children = selectedVal;
                skiSearch.searchCriteria.Passengers += parseInt(selectedVal);
                break;
            case "d": //duration
                skiSearch.searchCriteria.setDuration(selectedVal);
                break;
            case "ra": //rating
                skiSearch.searchCriteria.setRating(selectedVal);
                break;

        }
    },

    populateDateFromSearch: function (monthValue, dayValue) {
        skiSearch.changeSingleDateRange(monthValue, dayValue);
    },
    clearSelect: function (controlName, defautValue, type) {
        $(controlName).val(defautValue);
        skiSearch.resetSearchCriteria(type);
    },
    resetSearchCriteria: function (type) {

        switch (type) {
            case "a": //airport
                skiSearch.searchCriteria.Airports.length = 0;
                skiSearch.searchCriteria.Regions.length = 0;
                break;
            case "r": //resort
                skiSearch.searchCriteria.Resorts.length = 0;
                break;
            case "c": //country            
                skiSearch.searchCriteria.Countries.length = 0;
                skiSearch.searchCriteria.SkiAreas.length = 0;
                break;
            case "f": //flexibility
                skiSearch.searchCriteria.Flexibility = 0;
                break;
            case "ac": //propertytype
                skiSearch.searchCriteria.PropertyTypes.length = 0;
                break;
            case "ad": //adults
                skiSearch.searchCriteria.Adults = 2;
                break;
            case "ch": //children
                skiSearch.searchCriteria.Children = 0;
                break;
            case "d": //duration
                skiSearch.searchCriteria.Duration = 0;
                break;
            case "ra": //rating
                skiSearch.searchCriteria.PropertyRating = 0;
                break;
            case "bb": //boardbasis
                skiSearch.searchCriteria.BoardBasis.length = 0;
                break;
            case "wholechalet":
                skiSearch.searchCriteria.WholeChalet = false;
                break;
            case "monthyear":
            case "day":
                skiSearch.searchCriteria.DateRanges.length = 0;
                break;
        }

    },
    findItemInArray: function (array, identifier) {
        for (var i = 0; i < array.length; i++)
            if ((array[i].id != null && array[i].id.toString() == identifier.toString()) || (array[i].code != null && array[i].code.toString() == identifier.toString()))
                return array[i];

        return null;
    },

    bindToSearch: function (data) {
        skiSearch.details = data.result;

        //Bind countries and Ski Areas
        skiSearch.bindSelectByGroup($('#ddlCountry'), skiSearch.details.countries, { code: 'Any', name: 'Any Country or Ski Area' }, skiSearch.details.selections.countryCode, "Countries", "c");
        skiSearch.bindSelectByGroup($('#ddlCountry'), skiSearch.details.skiAreas, null, skiSearch.details.selections.skiAreas, "Ski Areas", "se");

        //if A country is selected, then bind the resort
        if (skiSearch.details.selections.countryCode != "Any" && skiSearch.findItemInArray(this.details.countries, skiSearch.details.selections.countryCode) != null)
            skiSearch.bindCountryChildResorts(skiSearch.details.selections.countryCode, skiSearch.details.selections.resortId);
        //if A SkiArea is selected, then bind the resort
        else if (skiSearch.details.selections.skiAreas != "Any" && skiSearch.findItemInArray(skiSearch.details.skiAreas, skiSearch.details.selections.skiAreas) != null)
            skiSearch.bindSkiAreaChildResorts(skiSearch.details.selections.skiAreas, skiSearch.details.selections.resortId);
        else {
            //bind resorts
            skiSearch.bindArrayToSelect($('#ddlResort'), skiSearch.details.resorts, { code: 'Any', name: 'Any Resort' }, skiSearch.details.selections.resortId, "r");
        }

        //now select the resort
        skiSearch.changeSelectedResort(false);

        //toggleResort
        skiSearch.toggleBackGroundColor($('#ddlResort')[0]);
        //toggleCountry
        skiSearch.toggleBackGroundColor($('#ddlCountry')[0]);

        //bind accommodation
        if (skiSearch.details.selections.accomOnly) {
            $("#ddlDepartFrom option[value='AccomOnly']").attr('selected', 'selected');
            skiSearch.searchCriteria.setAccommodationOnly(true);
            //bind regions
            skiSearch.bindSelectByGroup($('#ddlDepartFrom'), skiSearch.details.regions, null, "", "Regions", "re");
            //bind ports
            skiSearch.bindSelectByGroup($('#ddlDepartFrom'), skiSearch.details.airports, null, "", "Airports", "a");
        }
        else {

            //bind regions
            skiSearch.bindSelectByGroup($('#ddlDepartFrom'), skiSearch.details.regions, null, skiSearch.details.selections.regions, "Regions", "re");
            //bind ports
            skiSearch.bindSelectByGroup($('#ddlDepartFrom'), skiSearch.details.airports, null, skiSearch.details.selections.portId, "Airports", "a");
        }
        skiSearch.toggleBackGroundColor($('#ddlDepartFrom')[0]);

        //flex
        skiSearch.bindSelect('#ddlDateFlexibility', skiSearch.details.selections.flex, "f");
        skiSearch.toggleBackGroundColor($('#ddlDateFlexibility')[0]);

        //accomType
        skiSearch.bindAccommSelect('#ddlAccom', skiSearch.details.selections.accomType, "ac");
        skiSearch.toggleBackGroundColor($('#ddlAccom')[0]);

        //adults
        skiSearch.bindSelect('#ddlAdults', skiSearch.details.selections.adults, "ad");
        skiSearch.toggleAdultBackGroundColor($('#ddlAdults')[0]);

        //children
        skiSearch.bindSelect('#ddlChildren', skiSearch.details.selections.children, "ch");
        skiSearch.toggleBackGroundColor($('#ddlChildren')[0]);

        //duration
        skiSearch.bindSelect('#ddlDuration', skiSearch.details.selections.duration, "d");
        skiSearch.toggleBackGroundColor($('#ddlDuration')[0]);

        //rating
        skiSearch.bindSelect('#ddlRating', skiSearch.details.selections.minRating, "ra");
        skiSearch.toggleBackGroundColor($('#ddlRating')[0]);

        //bindate
        var dateRange = skiSearch.details.dateRanges[0];
        var startDate = new Date(dateRange.startDateString[0], parseInt(dateRange.startDateString[1]) - 1, dateRange.startDateString[2]);
        var endDate = new Date(dateRange.endDateString[0], parseInt(dateRange.endDateString[1]) - 1, dateRange.endDateString[2]);
        skiSearch.bindDates(startDate, endDate, $('#ddlDay'), $('#ddlMonthYear'), skiSearch.details.selections.monthYear, skiSearch.details.selections.day);
        skiSearch.toggleBackGroundColor($('#ddlMonthYear')[0]);
        skiSearch.toggleBackGroundColor($('#ddlDay')[0]);

        // group chalet
        if (skiSearch.details.selections.wholeChalet) {
            skiSearch.searchCriteria.setWholeChalet(true);
            $('#divGroupChalet').show();
            $('#chkGroupChalet').attr('checked', 'checked');
        }
        else if (skiSearch.details.selections.accomType == 'CHA,CHH,CLU') {
            var totalParty = tryParseInt(skiSearch.details.selections.adults, 0) + tryParseInt(skiSearch.details.selections.children, 0);
            if (totalParty >= 6) {
                skiSearch.searchCriteria.setWholeChalet(false);
                $('#divGroupChalet').show();
            }
        }
    },

    bindCountryBasedOnResort: function (countryCode) {

        try {
            $('#ddlCountry').val(countryCode);
        }
        catch (ex) {
            setTimeout("$('#ddlCountry').val('" + countryCode + "')", 1);
        }
    },

    bindDates: function (startDate, endDate, controlDay, controlMonthYear, selectedMonth, seletedDay) {
        /*
        Get the start and enddate 
        start a while loop on the date and
        */
        controlMonthYear.empty();
        controlMonthYear.append("<option value=\"Any\">Any Month</option>");
        if (seletedDay == "Any")
            skiSearch.bindDay(controlDay, seletedDay, 31, -1, -1);

        //We only care about Month/Year, set day to first so that feb is included when day is > 28
        startDate = new Date(startDate.getFullYear(), startDate.getMonth(), 1);
        endDate = new Date(endDate.getFullYear(), endDate.getMonth(), 1);

        while (startDate <= endDate) {
            if (startDate.getMonth() <= 3 || startDate.getMonth() == 11) {
                if (selectedMonth == startDate.getMonth() + "/" + startDate.getFullYear()) {
                    controlMonthYear.append("<option selected = \"selected\" value=\"" + (startDate.getMonth()) + "/" + startDate.getFullYear() + "\">" + igluMonths[startDate.getMonth()] + " " + startDate.getFullYear() + "</option>");
                    skiSearch.populateDateFromSearch(selectedMonth, seletedDay);
                    skiSearch.bindDay(controlDay, seletedDay, startDate.getMonthDays(startDate.getMonth()), startDate.getMonth(), startDate.getFullYear());
                }
                else
                    controlMonthYear.append("<option value=\"" + (startDate.getMonth()) + "/" + startDate.getFullYear() + "\">" + igluMonths[startDate.getMonth()] + " " + startDate.getFullYear() + "</option>");
            }

            if (startDate.getMonth() == 11)
                startDate = new Date((startDate.getFullYear() + 1), 0, startDate.getDate());
            else
                startDate = new Date(startDate.getFullYear(), (startDate.getMonth() + 1), startDate.getDate());
        }

    },

    bindDay: function (controlDay, selectedDayOfMonth, daysInMonth, currentMonth, currentYear) {

        //get day for the month
        controlDay.empty();
        controlDay.append("<option value=\"Any\">Any Day</option>");
        for (var i = 0; i < daysInMonth; i++) {

            if (selectedDayOfMonth == (i + 1)) {
                var today = new Date(currentYear, currentMonth, selectedDayOfMonth);
                controlDay.append("<option selected = \"selected\" value=\"" + (i + 1) + "\">" + (i + 1) + ' (' + igluDays[today.getDay()] + ')' + " </option>");
            }
            else {
                if (currentMonth == -1 && currentYear == -1)//any dates
                    controlDay.append("<option value=\"" + (i + 1) + "\"> " + (i + 1) + " </option>");
                else {
                    var today = new Date(currentYear, currentMonth, (i + 1));
                    controlDay.append("<option value=\"" + (i + 1) + "\"> " + (i + 1) + ' (' + igluDays[today.getDay()] + ')' + " </option>");
                }
            }
        }
    },
    reset: function () {
        var myObject =
        {
            'id': 1,
            'method': 'SearchResetAndReturnDefaultResorts',
            'params':
            {
                'TopResorts': true
            }
        };

        //reset the search in session, and get the default resorts back
        $.ajax({
            url: "/Services/JSON/HolidaySearch.ashx",
            data: JSON.stringify(myObject),
            contentType: 'application/json',
            type: 'POST',
            dataType: 'json',
            success: function (a) {
                skiSearch.searchCriteria.clearResort();
                skiSearch.searchCriteria.Resorts = a.result;

                skiSearch.clearSelect('#ddlAccom', 'Any', 'ac');
                skiSearch.clearSelect('#ddlCountry', 'Any', 'c');
                skiSearch.bindArrayToSelect($('#ddlResort'), skiSearch.searchCriteria.Resorts, { code: 'Any', name: 'Any Resort' }, "Any", "r");
                skiSearch.clearSelect('#ddlDepartFrom', 'Any', 'a');
                skiSearch.clearSelect('#ddlDuration', 'Any', 'd');
                skiSearch.clearSelect('#ddlRating', 'Any', 'ra');
                skiSearch.clearSelect('#ddlMonthYear', 'Any', 'monthyear');
                skiSearch.clearSelect('#ddlDay', 'Any', 'day');
                skiSearch.clearSelect('#ddlDateFlexibility', '2', 'f');
                skiSearch.clearSelect('#ddlAdults', '2', 'ad');
                skiSearch.clearSelect('#ddlChildren', '0', 'ch');

                //toggleControl Colors
                skiSearch.toggleBackGroundColor($('#ddlResort')[0]);
                skiSearch.toggleBackGroundColor($('#ddlCountry')[0]);
                skiSearch.toggleBackGroundColor($('#ddlDepartFrom')[0]);
                skiSearch.toggleBackGroundColor($('#ddlDateFlexibility')[0]);
                skiSearch.toggleBackGroundColor($('#ddlChildren')[0]);
                skiSearch.toggleBackGroundColor($('#ddlDuration')[0]);
                skiSearch.toggleBackGroundColor($('#ddlRating')[0]);
                skiSearch.toggleBackGroundColor($('#ddlMonthYear')[0]);
                skiSearch.toggleBackGroundColor($('#ddlDay')[0]);
                skiSearch.toggleBackGroundColor($('#ddlAccom')[0]);
                skiSearch.toggleAdultBackGroundColor($('#ddlAdults')[0]);
            }
        });
    },

    buildSelectedItem: function (type, value, displayText) {
        var item = $('<div class="floatLeft item"></div>');
        var jsRemove = '';

        switch (type) {
            case 'resort':
                jsRemove = "removeSelectedItem('resort', '" + value + "', this);"
                break;
            case 'airport':
                jsRemove = "removeSelectedItem('airport', '" + value + "', this);";
                break;
        }

        item.append('<a href="#" onclick="' + jsRemove + '" class="remove"><img src="/img/icons/red-cross.gif" /></a>');
        item.append(displayText);
        return item;
    },

    removeSelectedItem: function (type, value, control) {
        $(control).parent('div.item').animate({ opacity: '0', width: '0px', paddingRight: '0px' }, 1000, function () {
            $(this).remove();
            //$(control).parent('div.item').animate({ opacity: '1', width: '120px', paddingRight: '18px' }, 1000);
        });
        $(control).hide();

        //Find out what type it is, because we need to remove it from the criteria
        switch (type) {
            case 'country':
                searchCriteria.removeCountry(value);
                if (searchCriteria.Countries.length == 0)
                    $('#ddlCountry').val('Any');
                else
                    alert('multiple countries?');
                break;
            case 'resort':
                searchCriteria.removeResort(value);
                if (searchCriteria.Resorts.length == 0)
                    $('#ddlResort').val('Any');
                else
                    alert('multiple resorts')
                break;
            case 'airport':
                searchCriteria.removeDeparturePort(value);
                if (searchCriteria.Airports.length == 0)
                    $('#ddlDepartFrom').val('Any');
                else
                    alert('multiple airports?');
                break;
        }

        fetchHolidayCount();
    },

    hideShowDefaultMessage: function () {
        var shouldShowDefault = 0;

        if (searchCriteria.Resorts.length > 0)
            shouldShowDefault++;

        if (searchCriteria.Airports.length > 0)
            shouldShowDefault++;

        if (searchCriteria.DateRanges.length > 0)
            shouldShowDefault++;

        if (searchCriteria.PropertyTypes.length > 0)
            shouldShowDefault++;

        if (searchCriteria.Features.length > 0)
            shouldShowDefault++;

        if (shouldShowDefault == 0)
            $('#defaultsContainer').fadeIn(500);
        else
            $('#defaultsContainer').fadeOut(500);
    },

    changeSelectedCountry: function () {
        var selectedCountry = $('#ddlCountry option:selected');
        this.searchCriteria.clearCountry();

        if (selectedCountry.val() != 'Any') {
            if (selectedCountry.parent().attr('label') != "Ski Areas")
                skiSearch.bindCountryChildResorts(selectedCountry.val(), "Any");
            else
                skiSearch.bindSkiAreaChildResorts(selectedCountry.val(), "Any");
        }
        else {
            $('#ddlResort').empty();
            skiSearch.bindArrayToSelect($('#ddlResort'), this.details.resorts, { code: 'Any', name: 'Any Resort' }, skiSearch.details.selections.resortId, "r");
        }
    },
    bindSkiAreaChildResorts: function (value, resortId) {
        var skiArea = this.findItemInArray(this.details.skiAreas, value);
        var ddlResortText;

        if (value == "Any")
            ddlResortText = 'Any Resort';
        else
            ddlResortText = 'Any Resort in ' + skiArea.name;

        var skiAreaResorts = [];
        for (var i = 0; i < this.details.resorts.length; i++)
            if (this.details.resorts[i].skiAreaId == skiArea.id)
                skiAreaResorts[skiAreaResorts.length] = this.details.resorts[i];

        $('#ddlResort').empty();
        skiSearch.bindArrayToSelect($('#ddlResort'), skiAreaResorts, { code: 'Any', name: ddlResortText }, resortId, "r");
        this.searchCriteria.addSkiArea(skiArea.id);
        skiSearch.bindCountryBasedOnResort(skiArea.id);
    },
    bindCountryChildResorts: function (value, resortId) {
        var country = this.findItemInArray(this.details.countries, value);
        var ddlResortText;
        if (value == "Any")
            ddlResortText = 'Any Resort';
        else
            ddlResortText = 'Any Resort in ' + country.name;

        var countryResorts = [];
        for (var i = 0; i < this.details.resorts.length; i++)
            if (this.details.resorts[i].countryCode == country.code)
                countryResorts[countryResorts.length] = this.details.resorts[i];

        $('#ddlResort').empty();
        skiSearch.bindArrayToSelect($('#ddlResort'), countryResorts, { code: 'Any', name: ddlResortText }, resortId, "r");
        this.searchCriteria.addCountry(country.code);
        skiSearch.bindCountryBasedOnResort(country.code);

    },

    changeSelectedResort: function (bindCountryOrSkiArea) {
        var selectedResort = $('#ddlResort option:selected');
        this.searchCriteria.clearResort();
        this.searchCriteria.clearRegions();
        if (selectedResort.val() != 'Any') {
            var resort = this.findItemInArray(this.details.resorts, selectedResort.val());


            this.searchCriteria.addResort(resort.id);
            if (bindCountryOrSkiArea)
                skiSearch.toggleCountryOrSkiAreaBind(resort)
            skiSearch.toggleBackGroundColor($('#ddlCountry')[0]);
        }
        //this.fetchHolidayCount();
    },

    toggleCountryOrSkiAreaBind: function (resort) {
        if ($('#ddlCountry option:selected').val() == "Any") {
            var country = skiSearch.findItemInArray(skiSearch.details.countries, resort.countryCode);
            skiSearch.bindCountryBasedOnResort(resort.countryCode);
        }
    },

    changeAccommodationOnly: function () {
        var input = $('#chkAccommodationOnly');

        searchCriteria.setAccommodationOnly(input.attr('checked'));

        if (input.attr('checked'))
            $('#departFromContainer').fadeOut(500);
        else
            $('#departFromContainer').fadeIn(500);

        //fetchHolidayCount();
    },
    changeSelectedAirport: function () {
        var selectedAirport = $('#ddlDepartFrom option:selected');
        var selectedAirportsBox = $('#selectedAirports');

        selectedAirportsBox.empty();
        this.searchCriteria.clearDeparturePort();
        this.searchCriteria.clearRegions();
        this.searchCriteria.setAccommodationOnly(false);

        if (selectedAirport.val() != 'Any') {
            if (selectedAirport.val() == 'AccomOnly')
                this.searchCriteria.setAccommodationOnly(true);
            else {
                if (selectedAirport.parent().attr('label') != "Regions")
                    this.searchCriteria.addDeparturePort(selectedAirport.val());
                else
                    skiSearch.searchCriteria.addRegion(parseInt(selectedAirport.val()));
            }
        }
    },

    setAirportFromValue: function (value) {
        for (var i = 0; i < value.split(',').length; i++) {

            var airport = this.findItemInArray(this.details.airports, value.split(',')[i]);
            selectedAirportsBox.append(this.buildSelectedItem('airport', value.split(',')[i], airport.name));

            this.searchCriteria.addDeparturePort(value.split(',')[i]);
        }
    },
    changeDateRange: function () {
        //we need to wait for slow-ass ie6 and below to load for a sec
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) {
            setTimeout("skiSearch.changeSingleDateRange($('#ddlMonthYear').val(), $('#ddlDay').val())", 1);
        }
        else
            skiSearch.changeSingleDateRange($('#ddlMonthYear').val(), $('#ddlDay').val());
    },
    changeSingleDateRange: function (monthValue, dayValue) {

        if (monthValue != "Any") {
            var startDateTime;
            var endDateTime;
            if (dayValue != "Any") {
                //start and enddate the same signalling  specific day search
                endDateTime = startDateTime = new Date(parseInt(monthValue.split('/')[1]), parseInt(monthValue.split('/')[0]), dayValue);
            }
            else {
                startDateTime = new Date(parseInt(monthValue.split('/')[1]), parseInt(monthValue.split('/')[0]), 1);
                endDateTime = new Date(parseInt(monthValue.split('/')[1]), parseInt(monthValue.split('/')[0]), startDateTime.getMonthDays(startDateTime.getMonth()));
            }
            this.searchCriteria.DateRanges = new Array();
            this.searchCriteria.DateRanges[this.searchCriteria.DateRanges.length] = { 'startDate': startDateTime, 'endDate': endDateTime };
            skiSearch.bindDay($('#ddlDay'), dayValue, startDateTime.getMonthDays(startDateTime.getMonth()), parseInt(monthValue.split('/')[0]), parseInt(monthValue.split('/')[1]));
        }
        else
            this.searchCriteria.DateRanges = new Array();
    },
    changeFlexibility: function () {
        this.searchCriteria.setFlexibility($('#ddlDateFlexibility').val());
    },

    changeSelectedDuration: function () {
        if ($('#ddlDuration').val().toLowerCase() != "any")
            this.searchCriteria.setDuration($('#ddlDuration').val());
        else
            skiSearch.resetSearchCriteria('d');
    },

    changeBoardBasis: function (boardBasisCode) {
        this.searchCriteria.toggleBoardBasis(boardBasisCode);
    },

    changePropertyType: function (propertyTypeCode) {
        this.searchCriteria.clearPropertyType();
        this.searchCriteria.togglePropertyType(propertyTypeCode);
    },

    changePropertyType: function () {
        this.resetSearchCriteria('ac');
        if ($('#ddlAccom').val() != 'Any') {
            this.setPropertyTypeFromValue($('#ddlAccom').val());
        }
    },

    setPropertyTypeFromValue: function (accomVal) {
        for (var i = 0; i < accomVal.split(",").length; i++) {
            this.searchCriteria.togglePropertyType(accomVal.split(",")[i]);
        }
    },
    changeWholeChalet: function (wholeChalet) {
        this.searchCriteria.setWholeChalet(wholeChalet);
    },

    changedSelectedPassengers: function () {
        this.searchCriteria.setPassengers(parseInt($('#ddlAdults').val()), parseInt($('#ddlChildren').val()));
    },

    changeRating: function () {
        skiSearch.resetSearchCriteria('ra');
        if ($('#ddlRating').val() != 'Any') {
            this.searchCriteria.setRating($('#ddlRating').val());
        }
    },

    fetchHolidayCount: function () {
        var myObject =
    {
        'id': 1,
        'method': 'SearchResultsCount',
        'params':
        {
            'criteria': skiSearch.searchCriteria
        }
    };

        $('#updatingHolidayCount').show();

        $.ajax({
            url: "/Services/JSON/HolidaySearch.ashx",
            data: JSON.stringify(myObject),
            contentType: 'application/json',
            type: 'POST',
            beforeSend: function (a) {
                $('#holidayCount').fadeOut(200, function () { $('#waitingForResponse').fadeIn(200); });
            },
            success: function (a) {
                var f = 0;

                $('#waitingForResponse, #holidayCount').stop();
                $('#waitingForResponse').fadeOut(200, function () {
                    $('#holidayCount').html('<span style="font-size: 2.0em; line-height: 1.3em;">' + addCommas(a.result.toString()) + '</span><br />Holidays Found').fadeIn(200);
                });
            },
            dataType: 'json'
        });
    },

    addCommas: function (nStr) {
        nStr += '';
        x = nStr.split('.');
        x1 = x[0];
        x2 = x.length > 1 ? '.' + x[1] : '';
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
        }
        return x1 + x2;
    },
    toggleBackGroundColor: function (control) {
        if (typeof (control) != 'undefined') {
            if (control.options[control.selectedIndex].value != "Any" && control.options[control.selectedIndex].value != "0")
                control.style.backgroundColor = '#FFFFCC';
            else
                control.style.backgroundColor = '';
        }
    },
    toggleAdultBackGroundColor: function (control) {
        if (typeof (control) != 'undefined') {
            if (control.options[control.selectedIndex].value != "Any" && control.options[control.selectedIndex].value != "1")
                control.style.backgroundColor = '#FFFFCC';
            else
                control.style.backgroundColor = '';
        }
    },

    DoSearch: function () {
        var myObject =
    {
        'id': 1,
        'method': 'PopulateSearchObject',
        'params':
        {
            'criteria': skiSearch.searchCriteria
        }
    };
        $.ajax({
            url: "/Services/JSON/HolidaySearch.ashx",
            data: JSON.stringify(myObject),
            contentType: 'application/json',
            type: 'POST',
            success: function (a) {
                $(location).attr('href', '/searchresults');
            },
            dataType: 'json'
        });
    }
}

// helper methods
function tryParseInt(string, defaultValue) {
    if (string == null || string == '' || isNaN(string)) {
        return defaultValue;
    }

    return parseInt(string);
}

