(function($, $M) {

    var log, cache, Host, PartnerIdentifier, InjectorLocalResults, InjectorTarget, IFrameResults;

    $M.Searchform = function(options) {
        $.extend(true, this, options);
        log = $.logger('ADT.Models.Searchform');
        cache = {};
    };

    $.extend($M.Searchform.prototype, {

        init: function() {
            Host = $("#ADT-Host").val() || "";
            PartnerIdentifier = $("#ADT-PartnerIdentifier").val() || "";
            if (PartnerIdentifier.length > 0) PartnerIdentifier = "/" + PartnerIdentifier;
            InjectorLocalResults = $("#ADT-Search-InjectorLocalResults").val() || "";
            InjectorTarget = $("#ADT-Search-InjectorTarget").val() || "";
            IFrameResults = $("#ADT-Search-IFrameResults").val() || "";
        },

        getCountries: function(departureairport, directonly, callback) {
            var cacheKey = "getCountries_" + departureairport + "_" + directonly;
			if (directonly == "") directonly = "false";
            if (!cache[cacheKey]) {
                var countries = null;
                if (ADTUtil.isNull(departureairport)) {
                    log.debug('getting all countries');
                    $.getJSON(Host + PartnerIdentifier + "/search/getcountries/-/" + directonly + "?callback=?", function(countries) {
                        cache[cacheKey] = countries;
                        callback(countries);
                    });
                }
                else {
                    log.debug('getting countries for %s', departureairport);
                    $.getJSON(Host + PartnerIdentifier + "/search/getcountries/" + departureairport + "/" + directonly + "?callback=?", function(countries) {
                        cache[cacheKey] = countries;
                        callback(countries);
                    });
                }

            } else {
                if (callback && $.isFunction(callback)) {
                    callback(cache[cacheKey]);
                }
            }
            return this;
        },


        getAirports: function(departureairport, country, directonly, callback) {

            var cacheKey = "getAirports_" + departureairport + "_" + country + "_" + directonly;
            if (!cache[cacheKey]) {
                var airports = null;
                if (country != "") {
                    if (ADTUtil.isNull(departureairport)) {
                        log.debug('getting all airports');
                        $.getJSON(Host + PartnerIdentifier + "/search/getairports/-/" + country + "/" + directonly + "?callback=?", function(airports) {
                            cache[cacheKey] = airports;
                            callback(airports);
                        });
                    }
                    else {
                        log.debug('getting Airports for %s', country);
                        $.getJSON(Host + PartnerIdentifier + "/search/getairports/" + departureairport + "/" + country + "/" + directonly + "?callback=?", function(airports) {
                            cache[cacheKey] = airports;
                            callback(airports);
                        });
                    }

                }
            } else {
                if (callback && $.isFunction(callback)) {
                    callback(cache[cacheKey]);
                }
            }
            return this;
        },

        getResorts: function(departureairport, country, directonly, callback) {
            log.debug('getting Resorts for %s', country);
            var cacheKey = "getResorts_" + departureairport + "_" + country + "_" + directonly;
            if (!cache[cacheKey]) {
                var resorts = null;
                if (country != "") {
                    var url = "/search/getresorts/" + departureairport + "/" + country + "/" + directonly + "?callback=?";
                    if (ADTUtil.isNull(departureairport) || departureairport=="undefined") {
                        url = "/search/getresorts/" + country + "?callback=?";
                    }
                    $.getJSON(Host + PartnerIdentifier + url, function(resorts) {
                        cache[cacheKey] = resorts;
                        callback(resorts);
                    });
                }
            } else {
                if (callback && $.isFunction(callback)) {
                    callback(cache[cacheKey]);
                }
            }
            return this;
        },

        ValidatePax: function(pax) {
            // pax =  {adults:[1,2,3], children:[1,2,3] ,infants:[1,2,3] }
            pax.totaladults = 0;
            pax.totalchildren = 0;
            pax.totalinfants = 0;

            $.each(pax.adults, function(i, n) { pax.totaladults = pax.totaladults + n; });
            $.each(pax.children, function(i, n) { pax.totalchildren = pax.totalchildren + n; });
            $.each(pax.infants, function(i, n) { pax.totalinfants = pax.totalinfants + n; });

            //rule 1  max 6 children total
            if (pax.totalchildren > 6) return "Please call 0871 282 0990 if there are more than 6 children in your party";
            //rule 2  max 4 infants total
            if (pax.totalinfants > 4) return "Please call 0871 282 0990 if there are more than 4 infants in your party";
            //rule 3  max 9 pax total
            if (pax.totaladults + pax.totalchildren + pax.totalinfants > 9) return "Please call 0871 282 0990 for parties of 10 or more";

            //rule 4 at least one adult in each room 
            if ($.grep(pax.adults, function(i, n) { return i > 0; }).length != pax.adults.length) return "Please make sure there is at least one adult in each room";

            // rule 5 at least one adult per infant
            if (pax.totalinfants > pax.totaladults) return "Please make sure there is at least one adult per infant in your party";
            // rule 6 at leat one adult per 2 children
            if ((pax.totalinfants + pax.totalchildren) / 2 > pax.totaladults) return "Please make sure there is at least one adult for every 2 children (or infants) in your party";

            // others?


            return "ok";

        },

        doSearch: function(query) {
            if (IFrameResults == "ResultsInIFrame") {
                var framehost = (typeof (ADT_HostUrl) == "undefined") ? "" : ("&host=" + ADT_HostUrl);
                document.location = Host + PartnerIdentifier + "/whitelabel/search?q=" + query + framehost;
            } else if (InjectorLocalResults == "local") {
                var newWin = window.open(InjectorTarget + "?q=" + query, '_blank');
                newWin.focus();
            } else if (InjectorLocalResults != "" || IFrameResults == "ResultsInNewWindow") {
                var newWin = window.open(Host + PartnerIdentifier + "/search?q=" + query, '_blank');
                newWin.focus();
            } else {
                window.top.location = Host + PartnerIdentifier + "/search?q=" + query;
            }
        }

    });

})(jQuery, ADT.Models);

