/// AjaxSearchBox class - use with very custom search boxes :-)
function AjaxSearchBox(id,submitId) {
    var self = this;
    this.baseUrl = "";
    this.id = id;
    this.applicationPath = arguments.length == 3 ? arguments[2] : "/booking";
    this.searchParameters = {};
    this.formHandlers = {};
    var submit = document.getElementById(submitId);
    if (submit) {
	    submit.onclick = function(e) { if (!e) e = event; self.submitForm(e); return false; };
    }
    this.loadData = function(callback) {
        var parameters = self._querystringToDictionary(window.location.search);
        for (var name in self.searchParameters) {
            if (typeof(parameters[name]) == "undefined") {
                parameters[name] = self.searchParameters[name];
            }
        }
        var querystring = "";
        for (var name in parameters) {
            if (querystring != "") querystring += "&";
            querystring += name + "=" + encodeURI(parameters[name]);
        }
        if (querystring != "") querystring = "?" + querystring;
        doAjaxCall(self.getBaseUrl() + self.applicationPath + "/js/AjaxSearchBox.aspx" + querystring, "", function(responseText) { self.initializeData(responseText, callback); });
    }

    this.initializeData = function(responseText, callback) {
        eval("var data = " + responseText + ";");
        
        // Initialize handlers
        if (!self.formHandlers["DAT"]) self.formHandlers["DAT"] = new SelectBoxDateFormHandler(document.getElementById(self.id));        
        var selectBoxHandlers = ["DUR", "ADU", "CHI", "INF", "PET", "LOC", "OTY", "ITY"];
        for (var i = 0; i < selectBoxHandlers.length; i++) {
            if (!self.formHandlers[selectBoxHandlers[i]]) self.formHandlers[selectBoxHandlers[i]] = new SelectBoxFormHandler(document.getElementById(self.id), selectBoxHandlers[i]);
        }
        
        // Fill data in form
        self.formHandlers["DAT"].initialize(data.months);
        self.formHandlers["DUR"].initialize(data.durations);
        self.formHandlers["ADU"].initialize(data.adults);
        self.formHandlers["CHI"].initialize(data.children);
        self.formHandlers["INF"].initialize(data.infants);
        self.formHandlers["PET"].initialize(data.pets);
        self.formHandlers["LOC"].initialize(data.locations);
        self.formHandlers["OTY"].initialize(data.lodgingTypes);
        self.formHandlers["ITY"].initialize(data.lodgingUnitTypeCategories);
        
        // First set default values from server
        self.formHandlers["DAT"].setValue(data.defaultDate[0]);
        self.formHandlers["DUR"].setValue(data.defaultDuration[0]);
        self.formHandlers["ADU"].setValue(data.defaultAdults[0]);
        self.formHandlers["CHI"].setValue(data.defaultChildren[0]);
        self.formHandlers["INF"].setValue(data.defaultInfants[0]);
        self.formHandlers["PET"].setValue(data.defaultPets[0]);
        self.formHandlers["LOC"].setValue(data.defaultLocation[0]);
        self.formHandlers["OTY"].setValue(data.defaultLodgingType[0]);
        self.formHandlers["ITY"].setValue(data.defaultLodgingUnitTypeCategory[0]);
        
        // Second set search parameter values from client script
        if (self.searchParameters["DAT"]) self.formHandlers["DAT"].setValue(self.searchParameters["DAT"]);
        for (var i = 0; i < selectBoxHandlers.length; i++) {
            if (self.searchParameters[selectBoxHandlers[i]]) {
                self.formHandlers[selectBoxHandlers[i]].setValue(self.searchParameters[selectBoxHandlers[i]]);
            }
        }
        
        // Third set parameter values from querystring
        var requestParameters = self._querystringToDictionary(window.location.search);
        if (requestParameters["DAT"]) self.formHandlers["DAT"].setValue(requestParameters["DAT"]);
        for (var i = 0; i < selectBoxHandlers.length; i++) {
            if (requestParameters[selectBoxHandlers[i]]) {
                self.formHandlers[selectBoxHandlers[i]].setValue(requestParameters[selectBoxHandlers[i]]);
            }
        }

	if (callback) {
	        callback();
	}        
    }
    this.submitForm = function(e) {
        var form = document.getElementById(self.id);
        var parameters = {};
        for (var name in self.formHandlers) {
            var value = self.formHandlers[name].getValue();
            if (value) {
                parameters[name] = value;
            }
        }
        var requestParameters = self._querystringToDictionary(window.location.search);
        for (var name in requestParameters) {
            if (typeof(parameters[name]) == "undefined") {
                parameters[name] = requestParameters[name];
            }
        }
        for (var name in self.searchParameters) {
            // if (typeof(parameters[name]) == "undefined") {
                parameters[name] = self.searchParameters[name];
            // }
        }
        var querystring = "";
        for (var name in parameters) {
            if (querystring != "") querystring += "&";
            querystring += name + "=" + escape(parameters[name]);
        }
        if (self.validateForm(querystring)) {
            window.location.href = self.baseUrl + "/booking/SearchWideStep2.aspx?" + querystring;
        }
    }
    this.validateForm = function(querystring) {
        if (typeof(self.onError) == "function") {
            var parameters = self._querystringToDictionary(querystring);
            var adults = parameters["ADU"] ? parseInt(parameters["ADU"]) : 0;
            var children = parameters["CHI"] ? parseInt(parameters["CHI"]) : 0;
            if ((adults + children) == 0) {
                self.onError();
                return false;
            }
        }
        return true;
    }
    this._querystringToDictionary = function(querystring) {
        var dic = {};
        var parts = [];
        if (/^\?/.test(querystring)) {
            parts = querystring.substring(1).split('&');
        } else {
            parts = querystring.split('&');
        }
        for (var i = 0; i < parts.length; i++) {
            var name = parts[i];
            var value = "";
            if (parts[i].indexOf("=") > -1) {            
                name = parts[i].substring(0, parts[i].indexOf("="));
                value = parts[i].substring(parts[i].indexOf("=")+1);
                if (value.indexOf("%") > -1) value = unescape(value);
            }
            dic[name] = value;
        }
        return dic;
    }
    this.getBaseUrl = function() {
        if (window.location.protocol && window.location.host) {
            return window.location.protocol + "//" + window.location.host;
        } else {
            var index = window.location.href.indexOf("/", "http://".length);
            if (index > -1) {
                return window.location.href.substr(0, index);
            } else {
                return window.location.href;
            }
        }
    }
}

/// FormHandler base class
function FormHandler(form) {
    var self = this;
    this.form = form;
    this.getFormField = function(name) {
        if (self.form) {
            if (self.form.elements) {
                return self.form.elements[name];
            } else {
                return document.getElementById(name);
            }
        }
        return null;
    }
    this.getFormValue = function(elem) {
        if (elem) {
            if (elem.nodeName == "SELECT") {
                return elem.options[elem.selectedIndex].value;
            } else {
                return elem.value;
            }
        }
        return null;
    }
}

/// FormHandler class for hidden input fields
function HiddenInputFormHandler(form, name) {
    this.base = FormHandler;
    this.base(form);
    var self = this;
    this.name = name;
    this.value = (arguments.length == 3) ? arguments[2] : null;
    // IFormHandler methods
    this.initialize = function(values) {
        var field = self.getFormField(self.name);
        if (field) {
            if (self.value) {
                field.value = self.value;
            } else {
                if (typeof(values)=="object" && values.length) {
                    field.value = values[0];
                } else {
                    field.value = values;
                }
            }
        }
    }
    this.getValue = function() {
        return self.getFormValue(self.getFormField(self.name));
    }
    this.setValue = function(value) {
        var field = self.getFormField(self.name);
        if (field) field.value = value;
    }
}
HiddenInputFormHandler.prototype = new FormHandler;

/// FormHandler class for simple input fields
function SimpleInputFormHandler(form, name) {
    this.base = FormHandler;
    this.base(form);
    var self = this;
    this.name = name;    
    // IFormHandler methods
    this.initialize = function(values) {
        var field = self.getFormField(self.name);
        if (field) {
            if (typeof(values)=="object" && values.length) {
                field.value = values[0];
            } else {
                field.value = values;
            }
        }
    }
    this.getValue = function() {
        return self.getFormValue(self.getFormField(name));
    }
    this.setValue = function(value) {
        var field = self.getFormField(self.name);
        if (field) field.value = value;
    }
}
SimpleInputFormHandler.prototype = new FormHandler;

/// FormHandler class for select box fields
function SelectBoxFormHandler(form, name) {
    this.base = FormHandler;
    this.base(form);
    var self = this;
    this.name = name;
    // IFormHandler methods
    this.initialize = function(values) {
        var select = self.getFormField(self.name);
        if (select) {
            var i = 0;
            while (i < values.length) {
                var option = new Option(values[i+1], values[i]);
                select.options[select.options.length] = option;
                i = i + 2;
            }
        }
    }
    this.getValue = function() {
        return self._getSelectValue(self.name);
    }
    this.setValue = function(value) {
        var field = self.getFormField(self.name);
        if (field) {
            for (var i = 0; i < field.options.length; i++) {
                field.options[i].selected = (field.options[i].value==value);
            }
        }
    }
    // Handler specific methods
    this._getSelectValue = function(name) {
        var select = self.getFormField(name);
        if (select && select.options.selectedIndex > -1) {
            return select.options[select.options.selectedIndex].value;
        }
        return null;
    }   
}
SelectBoxFormHandler.prototype = new FormHandler;

/// Specific form handler class for dates in select box
function SelectBoxDateFormHandler(form) {
    this.base = SelectBoxFormHandler;
    this.base(form);
    var self = this;
    // IFormHandler methods
    this.initialize = function(months) {
        var select = self.getFormField("DAT1");
        if (select) {
            var i = 0;
            while (i < months.length) {
                var option = new Option(months[i+1], months[i]);
                select.options[select.options.length] = option;
                i = i + 2;
            }
        }
        self.updateDays(self.getFormField("DAT1"), self.getFormField("DAT2"));
        self.getFormField("DAT1").onchange = function(e) { if (!e) e = event; self.updateDays(self.getFormField("DAT1"),self.getFormField("DAT2")); }
    }
    this.getValue = function() {
        var day = self.getFormValue(self.getFormField("DAT2"));
        if (day.length == 1) day = "0" + day;
        var month = self.getFormValue(self.getFormField("DAT1")).substring(0, 2);
        var year = self.getFormValue(self.getFormField("DAT1")).substring(3);
        return month + "/" + day + "/" + year;
    }
    this.setValue = function(value) {
        var parts = (value.indexOf("-") > -1) ? value.split('-') : value.split('/');
        var date = { "day": parts[1], "month": parts[0], "year": parts[2] };
        var months = self.getFormField("DAT1");
        var days = self.getFormField("DAT2");
        for (var i = 0; i < months.options.length; i++) {
            if (months.options[i].value == (date.month + "-" + date.year)) {
                months.options[i].selected = true;
                self.updateDays();
            } else {
                months.options[i].selected = false;
            }
        }
        for (var i = 0; i < days.options.length; i++) {
            days.options[i].selected = (days.options[i].value == date.day);
        }
    }
    // Handler specific methods    
    this.updateDays = function() {
	    var month = self.getMonth();
	    var year = self.getYear();
	    var date = new Date(year, month, 1);
	    var daySelect = self.getFormField("DAT2");
	    var selectedDay = self._getSelectValue("DAT2");
	    daySelect.options.length = 0;
	    while (date.getMonth()==month) {
	        var dayValue = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
		    var dayOption = new Option(dayValue, dayValue);
		    dayOption.className = 'DayColor' + date.getDay();
		    daySelect.options[daySelect.options.length] = dayOption;		
		    date = new Date(date.getFullYear(), date.getMonth(), date.getDate()+1 );
	    }
        // Re-set the remembered selected day
        if (selectedDay) {
	        for (var i = 0; i < daySelect.options.length; i++) {
		        if (daySelect.options[i].value==selectedDay) {
			        daySelect.options[i].selected = true;
			        break;
		        }
	        }
	    }
    }
    this.getMonth = function() {
        var value = self._getSelectValue("DAT1");
        if (value) return parseInt(value.split("-")[0], 10)-1;
        return null;
    }
    this.getYear = function() {
        var value = self._getSelectValue("DAT1");
        if (value) return parseInt(value.split("-")[1], 10);
        return null;
    }
}
SelectBoxDateFormHandler.prototype = new SelectBoxFormHandler;

