$(function() {


    jQuery.query = function(s) {
        var r = {};
        VH.UTIL.log(s)
        jQuery.each(s.split('&'), function() {
            var splitted = this.split('=');
            var key = splitted[0];
            var val = splitted[1];
            // convert floats
            if (/^[0-9.]+$/.test(val)) val = parseFloat(val);
            // ignore empty values
            if (typeof val == 'number' || val.length > 0) r[key] = val;
        });

        return r;
    };





    if (typeof window.VH == "undefined" || !window.VH) {
        window.VH = {};
    }

    if (typeof VH.AJAX == "undefined" || !VH.AJAX) {
        VH.AJAX = {};
    }

    /**
    * Object that controls the loading of the forms on the homepage
    * and subsequent data loaded into booking form elements.
    * 
    * requires;
    * - vh.util.js
    * - vh.gui.js
    * - vh.cal.js
    */

    VH.AJAX = function() {

        /** PROPERTIES **/
        var _selectedForm = "complete";

        var _geogForm = function() {
            var val = "";
            if ($("#VHF_GEOGSEARCH_FORM").length && $("#VHF_GEOGSEARCH_FORM").val().length > 0) {
                val = $("#VHF_GEOGSEARCH_FORM").val();
            }
            return val;
        };



        // object refs
        var util = null;
        var gui = null;
        var cal = null;

        /** 
        *  DROPDOWNS
        */

        var fillDropDown = function(data, dropdown) {
            var optionElems = "";
            for (var i = 0; i < data.length; i++) {
                var groupName = data[i].Group;
                var items = data[i].Items;
                if (groupName.length) {
                    optionElems += '<optgroup label="' + groupName + '">';
                }
                for (var j = 0; j < items.length; j++) {
                    optionElems += '<option value="' + items[j].Value + '">' + items[j].Text + '</option>';
                }
                if (groupName.length) {
                    optionElems += '</optgroup>';
                }
            }
            util.enableDropdown(dropdown, optionElems);
        };




        /** 
        *  INIT FORM
        */

        var Init = function() {



            util = VH.UTIL;
            gui = VH.GUI;
            cal = VH.CAL;

            if (!util.isUndefinedOrNull(_geogForm())) {
                _selectedForm = _geogForm();
            }

            util.log("init AJAX");

            gui.SearchForm.AllCtrls.attr("disabled", false);

            // Set calendar if it exists
            if (gui.Page.Calendar.length) {
                InitCalendar();
            }

            InitControls();

            ApplyFormCookie();



        };

        /** 
        *  INIT CALENDAR
        */

        var InitCalendar = function() {

            if (_selectedForm !== null) {

                switch (_selectedForm.toLowerCase()) {
                    case "complete":
                        GetCalendarData("", "", gui.SearchForm.Resort.val());
                        break;

                    case "flydrive":
                        GetCalendarData(gui.SearchForm.Program.val(), "", "");
                        break;

                    case "accomonly":
                        GetCalendarData("", gui.SearchForm.Region.val(), "");
                        break;

                    case "multicentre":
                        GetCalendarData(gui.SearchForm.Program.val(), "", "");
                        break;

                    case "ski":
                        GetCalendarData("", "", gui.SearchForm.Resort.val());
                        break;

                    default:
                        if (_selectedForm.toLowerCase().length > 0) {
                            GetCalendarData("", "", gui.SearchForm.Resort.val());
                        }
                        break;
                }
            } else {
                cal.Init(null);
            }
        };

        /** 
        *  INIT CONTROLS
        */

        var UpdateFormCookie = function() {

            var cookieName = "";
            var cookieValue = "";

            if (_selectedForm !== null) {

                cookieName = "cookie_" + _selectedForm;

                switch (_selectedForm.toLowerCase()) {

                    case "complete":

                        cookieValue = "Region=" + gui.SearchForm.Region.val();
                        cookieValue += "&Resort=" + gui.SearchForm.Resort.val();


                        break;

                    case "flydrive":

                        cookieValue = "Program=" + gui.SearchForm.Program.val();

                        break;

                    case "accomonly":

                        cookieValue = "Region=" + gui.SearchForm.Region.val();
                        cookieValue += "&Resort=" + gui.SearchForm.Resort.val();

                        break;

                    case "multicentre":

                        cookieValue = "Program=" + gui.SearchForm.Program.val();
                        cookieValue += "&Region=" + gui.SearchForm.Region.val();
                        cookieValue += "&Resort=" + gui.SearchForm.Resort.val();

                        break;

                    case "ski":

                        cookieValue = "Region=" + gui.SearchForm.Region.val();
                        cookieValue += "&Resort=" + gui.SearchForm.Resort.val();

                        break;

                    default:

                        break;
                }

                $.cookie(cookieName, cookieValue, { path: '/' });

            }


        }

        var ApplyFormCookie = function() {

            var cookieName = "";
            var cookieValue = "";

            if (_selectedForm !== null) {

                cookieName = "cookie_" + _selectedForm;

                cookieValue = $.cookie(cookieName);

                if (util.isUndefinedOrNull(cookieValue)) {
                    return;
                }

                cookieQuery = $.query(cookieValue);

                switch (_selectedForm.toLowerCase()) {

                    case "complete":

                        gui.SearchForm.Region.val(cookieQuery.Region);
                        gui.SearchForm.Resort.val(cookieQuery.Resort);

                        break;

                    case "flydrive":

                        gui.SearchForm.Program.val(cookieQuery.Program);

                        break;

                    case "accomonly":

                        gui.SearchForm.Region.val(cookieQuery.Region);
                        gui.SearchForm.Resort.val(cookieQuery.Resort);

                        break;

                    case "multicentre":

                        gui.SearchForm.Program.val(cookieQuery.Program);
                        gui.SearchForm.Region.val(cookieQuery.Region);
                        gui.SearchForm.Resort.val(cookieQuery.Resort);

                        break;

                    case "ski":

                        gui.SearchForm.Region.val(cookieQuery.Region);
                        gui.SearchForm.Resort.val(cookieQuery.Resort);

                        break;

                    default:

                        break;
                }


            }


        }


        var BuildQueryString = function() {

            var cookieName = "";
            var cookieValue = "";
            var queryString = "";

            if (_selectedForm !== null) {

                cookieName = "cookie_" + _selectedForm;

                cookieValue = $.cookie(cookieName);

                if (util.isUndefinedOrNull(cookieValue)) {
                    return "";
                }


                cookieQuery = $.query(cookieValue);

                switch (_selectedForm.toLowerCase()) {

                    case "complete":

                        queryString = "region=" + cookieQuery.Region;


                        break;

                    case "flydrive":

                        break;

                    case "accomonly":

                        queryString = "region=" + cookieQuery.Region;


                        break;

                    case "multicentre":


                        queryString = "program=" + cookieQuery.Program;
                        queryString += "&outroute=" + cookieQuery.Region;


                        break;

                    case "ski":

                        queryString = "region=" + cookieQuery.Region;

                        break;

                    default:

                        break;
                }


            }

            if (queryString != "") {
                return "?" + queryString;
            }

            return "";


        }




        var InitControls = function() {

            // Program
            gui.SearchForm.Program.change(function() {

                // Outbound airports
                if (_selectedForm == "multicentre") {
                    PopulateResorts($(this).val(), "", "", gui.SearchForm.Region);
                }
                if (_selectedForm != "multicentre") {
                    InitCalendar();
                }
                if (_selectedForm == "flydrive") {
                    var program = $(this).val();
                    PopulateRoute(program, "", "");
                }

                // hide calendar
                VH.CAL.OnHideCalendar();



            });

            // Region
            gui.SearchForm.Region.change(function() {

                //resorts for main, accomonly, ski forms and Return airports for multicentre
                var program = gui.SearchForm.Program.length > 0 ? gui.SearchForm.Program.val() : "";
                var region = $(this).val();
                var resort = "";

                if (_selectedForm === null) {
                    _selectedForm = "complete";
                }

                PopulateResorts(program, region, resort, gui.SearchForm.Resort);

                // hide calendar
                VH.CAL.OnHideCalendar();



            });

            // Resort
            gui.SearchForm.Resort.change(function() {

                if (_selectedForm === null) {
                    _selectedForm = "complete";
                }

                var form = _selectedForm.toLowerCase();
                if (form != "accomonly" && form != "multicentre") {
                    InitCalendar();
                }


                //resorts for main, accomonly, ski forms and Return airports for multicentre
                var program = gui.SearchForm.Program.length > 0 ? gui.SearchForm.Program.val() : "";
                var region = gui.SearchForm.Region.length > 0 ? gui.SearchForm.Region.val() : "";
                var resort = $(this).val();
                PopulateRoute(program, region, resort);

                // hide calendar
                VH.CAL.OnHideCalendar();

                UpdateFormCookie();

            });

            // Submit button
            gui.SearchForm.Submit.click(function(event) {

                event.preventDefault();

                if (gui.SearchForm.Airport.val() !== "-") {
                    DoSearch(_selectedForm);
                }
                else {
                    gui.SearchForm.NoAirport.text("Please select a departure airport.");
                }

            });

        };

        /**
        * 	AJAX CALLS
        */

        var LoadForm = function(whichForm) {

            if (util.isUndefinedOrNull(whichForm)) {
                whichForm = "complete";
            }
            _selectedForm = whichForm;

            // update classes on tabs
            $("#SearchSelect").find("div").removeClass();
            $("#SearchSelect :radio").attr("checked", false);
            $("#Search" + whichForm).addClass("SearchTabOn");
            $("#Search" + whichForm + " :radio").attr("checked", true);

            // clear html
            $("#bookingForm").empty();

            // show loading
            $('#bookingForm').html($("#loadingForm").html());
            $("#bookingForm p span").html('<img src="/_assets/images/icons/ajax_loader.gif" alt="Loading, please wait"/>');


            var queryString = BuildQueryString();


            // ajax call
            $.ajax({

                url: "/homepagesearch/" + whichForm + "form.aspx" + queryString,
                type: "GET",
                datatype: "html",
                error: function(XMLHttpRequest, textStatus, errorThrown) {

                },
                success: function(data, textStatus) {

                    // swap html	  
                    $('#SearchPanel').html('');
                    $('#SearchPanel').html($(data).find("#SearchPanel").html());

                    // adjust size
                    if (whichForm.toLowerCase() == "multicentre") {
                        $("#bookingForm").css({ "min-height": "375px" });
                        $("#bookingForm").addClass("multicentre");
                    } else {
                        $("#bookingForm").css({ "min-height": "325px" });
                        $("#bookingForm").removeClass("multicentre");
                    }

                    // rebind references
                    gui.Init();
                    Init();


                }

            });




        };

        var PopulateResorts = function(program, region, resort, dropdown) {

            util.disableDropdown(dropdown, true);
            util.disableDropdown(gui.SearchForm.Airport, true);

            if (_selectedForm === "multicentre" && region === "") {
                util.disableDropdown(gui.SearchForm.Resort, true);
            }

            // ajax call
            $.ajax({
                url: "/ajax/ajax_request.aspx?form=" + _selectedForm + "&program=" + program + "&region=" + region + "&resort=" + resort,
                datatype: "json",
                error: function(XMLHttpRequest, textStatus, errorThrown) {

                },
                success: function(data, textStatus) {

                    var r = eval('[' + data + ']');
                    fillDropDown(r[0].Resorts, dropdown);

                    // fill default return airports on multictre form.
                    if (_selectedForm === "multicentre" && region === "") {

                        fillDropDown(r[0].DefaultItems, gui.SearchForm.Resort);

                        if (program !== "" && region !== "") {
                            cal.Init(r[0].DefaultRoute);
                        }

                    }

                    if (_selectedForm.toLowerCase() != "multicentre") {
                        cal.Init(r[0].DefaultRoute);
                    }

                    UpdateFormCookie();
                }
            });
        };

        var PopulateRoute = function(program, region, resort) {

            util.disableDropdown(gui.SearchForm.Airport, true);

            // ajax call
            $.ajax({
                url: "/ajax/ajax_request.aspx?form=" + _selectedForm + "&program=" + program + "&region=" + region + "&resort=" + resort,
                datatype: "json",
                error: function(XMLHttpRequest, textStatus, errorThrown) {

                },
                success: function(data, textStatus) {

                    var r = eval('[' + data + ']');
                    // fill default return airports on multictre form.
                    if (_selectedForm === "multicentre" && region === "") {

                        if (program !== "" && region !== "") {
                            cal.Init(r[0]);
                        }

                    }

                    if (_selectedForm.toLowerCase() != "multicentre") {
                        cal.Init(r[0]);
                    }

                    ///UpdateFormCookie();
                }
            });
        };

        var InitCalendarRouteData = function(data) {

            cal.Init(data[0]);
            return;


        }

        var GetCalendarData = function(program, region, resort) {

            if (!util.isUndefinedOrNull(CALENDAR_DATA)) {
                InitCalendarRouteData(CALENDAR_DATA)
            } else {
                $.ajax({

                    url: "/ajax/ajax_request.aspx?form=" + _selectedForm + "&program=" + program + "&region=" + region + "&resort=" + resort,

                    datatype: "json",

                    error: function(XMLHttpRequest, textStatus, errorThrown) {

                    },

                    success: function(data, textStatus) {
                        InitCalendarRouteData(eval('[' + data + ']'))
                    }
                });

            }


        };

        var GetSearchObject = function() {

            var _searchObject = {
                "SearchType": "Complete",       //default search
                "Program": $("#" + $("#VHF_Program").val()).val(),
                "Region": $("#" + $("#VHF_Region").val()).val(),
                "Resort": $("#" + $("#VHF_Resort").val()).val(),
                "DepartureAirport": $("#" + $("#VHF_DepartureAirport").val()).val(),
                "Duration": $("#" + $("#VHF_Duration").val()).val(),
                "DepartureDate": $("#" + $("#VHF_DepartureDate").val()).val(),
                "Adults": $("#" + $("#VHF_Pax_Adult").val()).val(),
                "Childs": $("#" + $("#VHF_Pax_Child").val()).val(),
                "Infants": $("#" + $("#VHF_Pax_Infant").val()).val(),
                "ChildAge1": $("#" + $("#VHF_Pax_Child_Age1").val()).val(),
                "ChildAge2": $("#" + $("#VHF_Pax_Child_Age2").val()).val(),
                "ChildAge3": $("#" + $("#VHF_Pax_Child_Age3").val()).val(),
                "ChildAge4": $("#" + $("#VHF_Pax_Child_Age4").val()).val(),
                "ChildAge5": $("#" + $("#VHF_Pax_Child_Age5").val()).val(),
                "ChildAge6": $("#" + $("#VHF_Pax_Child_Age6").val()).val(),
                "ChildAge7": $("#" + $("#VHF_Pax_Child_Age7").val()).val(),
                "ChildAge8": $("#" + $("#VHF_Pax_Child_Age8").val()).val(),
                "Stops": $("#" + $("#VHF_Stops").val()).val()
            };

            return _searchObject;
        };

        var DoSearch = function(ST) {

            var SQ = GetSearchObject();


            var maxPax = parseInt(SQ.Adults, 10) + parseInt(SQ.Childs, 10) + parseInt(SQ.Infants, 10)
            if (maxPax > 8) {

                $("#paxerror").show();

            } else {

                $("#paxerror").hide();
                SQ.SearchType = ST;
                window.location.href = "/ajax/SubmitForm.aspx?SQ=" + escape(JSON.stringify(SQ));
            }
        };

        var SetSelectedForm = function(theForm) {
            _selectedForm = theForm;
            gui.Init();
            InitControls();
        };

        return {
            Init: Init,
            PopulateResorts: PopulateResorts,
            PopulateRoute: PopulateRoute,
            InitCalendar: InitCalendar,
            GetCalendarData: GetCalendarData,
            DoSearch: DoSearch,
            LoadForm: LoadForm,
            GetSearchObject: GetSearchObject,
            ApplyFormCookie: ApplyFormCookie,
            SetSelectedForm: SetSelectedForm
        };

    } ();


});

 
