(function (){
    var yuiDom = YAHOO.util.Dom;

    var yuiEvent = YAHOO.util.Event;

    var SearchFormHandler = (function () {
        var searchForm = null;
        var localeCode = "en_US";
        var searchType = "standard";
        var standardTrigger =  null;
        var standardFormToggler = null;
        var pinYinTrigger = null;
        var pinYinFormToggler = null;
        var dateInputs = null;
        var standardInputs = null;
        var pinYinInputs = null;
        var loadingText = "Loading...";
        var cityText = "City";
        var self = {
            initialize: function(params) {
                localeCode = params.localeCode || localeCode;
                loadingText = params.loadingText || loadingText;
                cityText = params.cityText || cityText;
                searchForm = yuiDom.get("findAndBookForm");
                yuiEvent.addListener("fnb_closeErrorIcon","click",function() {
                    yuiDom.setStyle("findAndBookForm_errorContainer", "display", "none");
                    var shownErrors = yuiDom.getElementsByClassName ( "topError" , "li" , yuiDom.get("fnb_Errors") , function(element){

                    });
                });

                dateInputs = {
                    arrivalDate: yuiDom.get("fnb_arrivalDate"),
                    departureDate: yuiDom.get("fnb_departureDate")
                }

                if(localeCode == "zh_CN" || localeCode == "ja_JP") {
                    standardInputs = {
                        city: yuiDom.get("fnb_citySelect"),
                        state: yuiDom.get("fnb_stateSelect"),
                        country: yuiDom.get("fnb_countrySelect")
                    }
                    searchForm.action = "/westin/search/results/standard.html";
                    yuiEvent.addListener(standardInputs.country,"change",self.checkState, {countrySelect: standardInputs.country, stateSelect: standardInputs.state, citySelect: standardInputs.city});
                    yuiEvent.addListener(standardInputs.state,"change",self.getCities);
                }
            },
            getCities: function () {
                standardInputs.city.disabled = true;
                yuiConnect.asyncRequest("GET", "/dp/en_US/common/search/get_cities.jsp?country="
                    + standardInputs.country.value
                    + "&state="
                    + (standardInputs.state.selectedIndex > 0 ? standardInputs.state.value : ""),
                    {
                        success: self.populateSelect
                    }
                );
                standardInputs.city.options[0].text = loadingText;
            },
            populateSelect: function (xhr) {
                var selectOptions = xhr.responseXML.getElementsByTagName("city");

                standardInputs.city.options.length = 1;
                standardInputs.city.selectedIndex = 0;
                standardInputs.city.options[0].text = cityText;
                if (selectOptions.length > 0) {
                    standardInputs.city.disabled = false;
                    for (var i = 0; i < selectOptions.length; i++) {
                        var selected = false;
                        standardInputs.city.options[standardInputs.city.options.length] = new Option(selectOptions[i].firstChild.nodeValue, selectOptions[i].getAttribute("en"), selected);
                    }
                }
            },
            updateCountry: function () {

            },
            checkState: function(e, params) {
                if(params.countrySelect.value == "US" || params.countrySelect.value == "CA") {
                    params.stateSelect.disabled = false;
                    params.citySelect.disabled = true;
                }
                else {
                    params.stateSelect.selectedIndex = 1;
                    params.stateSelect.value = "";
                    params.stateSelect.disabled = true;
                    self.getCities();
                }
            },
            validateForm: function (e,searchForm) {
//                                    searchForm.resetErrors();
                var errors = false;
                if(searchForm.complexSearchField && (searchForm.complexSearchField.value == "" || searchForm.complexSearchField.value == searchForm.complexSearchField.getAttribute("label"))) {
                    yuiDom.setStyle("fnb_searchCriteriaRequiredError", "display", "block");
                    errors = true;
                }
                else if(localeCode == "ja_JP" || localeCode == "zh_CN") {
                     if((standardInputs.country.value == "")) {
                        yuiDom.setStyle("fnb_searchCriteriaRequiredError", "display", "block");
                        errors = true;
                        }
                }
                if ((dateInputs.arrivalDate.value != "" && dateInputs.departureDate.value != "") && (dateInputs.arrivalDate.value != dateFormatString || dateInputs.departureDate.value != dateFormatString)) {
                    var checkIn = new validDate(dateInputs.arrivalDate);
                    var checkOut = new validDate(dateInputs.departureDate);
                    var datesDelta = checkIn.diffDate(checkOut.d);
                    if (!(checkIn.valid) && (!checkOut.valid)) {
                        yuiDom.setStyle("fnb_ciAnddepartureDatesInvalidError", "display", "block");
                        errors = true;
                    }
                    else if (!checkIn.valid) {
                        yuiDom.setStyle("fnb_arrivalDateInvalidError", "display", "block");
                        errors = true;
                    }
                    else if (!checkOut.valid) {
                        yuiDom.setStyle("fnb_departureDateInvalidError", "display", "block");
                        errors = true;
                    }
                    else if ((checkIn.valid) & (checkOut.valid)) {
                        var datesDelta = checkIn.diffDate(checkOut.d);
                        var nowDelta = checkIn.diffDate(new Date());
                        if (nowDelta > 0) {

                        }
                        else if (nowDelta < -561) {
                            yuiDom.setStyle("fnb_bookToFarInFutureError", "display", "block");
                            errors = true;
                        }
                        else if (datesDelta < 0) {
                            yuiDom.setStyle("fnb_departureBeforeArrivalError", "display", "block");
                            errors = true;
                        }
                        else if (datesDelta > 31) {
                            yuiDom.setStyle("fnb_maximumLengthStayExceededError", "display", "block");
                            errors = true;
                        }
                        else if (datesDelta < 1) {
                            yuiDom.setStyle("fnb_arrivalEqualsDepartureError", "display", "block");
                            errors = true;
                        }
                    }
                }

                if(errors) {
                    yuiDom.setStyle("findAndBookForm_errorContainer", "display", "block");
                    yuiEvent.stopPropagation(e);
                }
                return !errors;
            }
        }

        return self;
    })();
    YAHOO.namespace("SW.local.SearchFormHandler");
    SW.local.SearchFormHandler = SearchFormHandler;
})();