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

    var yuiEvent = YAHOO.util.Event;

    var SearchFormHandler = (function () {
        var searchForm = null;
        var localeCode = "en_US";
        var dateInputs = null;
        var standardInputs = 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");
                });

                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")
                    };
                    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();
                yuiDom.getElementsByClassName("topError","li","fnb_Errors").forEach(function(errorBlock){
                    yuiDom.setStyle(errorBlock, "display", "none");
                });
                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)) {
                        datesDelta = checkIn.diffDate(checkOut.d);
                        var nowDelta = checkIn.diffDate(new Date());
                        if (nowDelta > 0) {

                        }
                        else if (nowDelta < -548) {
                            yuiDom.setStyle("fnb_bookToFarInFutureError", "display", "block");
                            errors = true;
                        }
                        else if (datesDelta < 0) {
                            yuiDom.setStyle("fnb_departureBeforeArrivalError", "display", "block");
                            errors = true;
                        }
                        else if (datesDelta > 90) {
                            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;
})();


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

    var yuiEvent = YAHOO.util.Event;

    var DEFAULT_CONFIG = {
        arrivalDateInput: null,
        departureDateInput: null,
        calendarIcon: null,
        localeCode: "en_US",
        dateFormatString: "MM/DD/YYYY"
    };

    function CalendarMaker (config) {

        if(!config.calendarId){
            throw("no calendarId supplied");
        }

        if(!config.arrivalDateInput){
            throw("no arrivalDateInput supplied");
        }

        if(!config.departureDateInput){
            throw("no departureDateInput supplied");
        }

        if(!config.calendarIcon){
            throw("no calendarIcon supplied");
        }

        for(var prop in DEFAULT_CONFIG){
            if(!config.hasOwnProperty(prop)){
                config[prop] = DEFAULT_CONFIG[prop];
            }
        }

        var calendar = null;
        var arrivalDateInput = config.arrivalDateInput;
        var departureDateInput = config.departureDateInput;
        var calendarIcon = config.calendarIcon;
        var localeCode = config.localeCode || localeCode;
        localeCode = localeCode.split("_")[0];
        var dateFormatString = config.dateFormatString || dateFormatString;

        function getArrivalDate () {
            return setDateFromString(localeCode, arrivalDateInput.value);
        }

        function getDepartureDate () {
            return setDateFromString(localeCode, departureDateInput.value);
        }

        function setDates (arrivalDate, departureDate, fromContinue) {
            arrivalDateInput.value = getFormatedDate(localeCode, arrivalDate);
            yuiDom.removeClass(arrivalDateInput, "hasDefaultText");
            departureDateInput.value = getFormatedDate(localeCode, departureDate);
            yuiDom.removeClass(departureDateInput, "hasDefaultText");
            if (!fromContinue) {
                closeCalendar();
            }
        }

        function checkArrivalDateFocus () {
            if (arrivalDateInput.value == dateFormatString) {
                arrivalDateInput.value = "";
                return;
            }
            var checkIn = new validDate(arrivalDateInput);
            if (!checkIn.valid) {
                arrivalDateInput.value = "";
            }
        }

        function checkArrivalDateBlur () {
            var checkIn = new validDate(arrivalDateInput);
            if (checkIn.valid) {
                checkIn.setField();
                var isValid = true;
                if (departureDateInput.value == dateFormatString) {
                    isValid = false;
                }
                var checkOut = validDate(departureDateInput);
                var before;
                if (!isValid) {
                    departureDateInput.value = dateFormatString;
                }
                if (checkOut.valid) {
                    before = (checkIn.diffDate(checkOut.d) <= 0);
                }

                if (departureDateInput.value == dateFormatString) {
                    checkOut.valid = false;
                }
                if ((! (checkOut.valid)) || before) {
                    checkOut.setD(checkIn.d);
                    checkOut.nextDay();
                    checkOut.setField();
                    yuiDom.removeClass(departureDateInput, "hasDefaultText");
                }
            } else {
                arrivalDateInput.value = dateFormatString;
            }
        }

        function checkDepartureDateFocus () {
            if (departureDateInput.value == dateFormatString) {
                departureDateInput.value = "";
                return;
            }
            var checkOut = new validDate(departureDateInput);
            if (!checkOut.valid) {
                departureDateInput.value = "";
            }
        }

        function checkDepartureDateBlur () {
            var checkOut = new validDate(departureDateInput);
            if (checkOut.valid) {
                checkOut.setField();
            } else {
                departureDateInput.value = dateFormatString;
            }
        }

        var self = {
            toggleCalendar: function (e, calendarPos) {
                if(!calendarPos) {
                    var coords = yuiDom.getXY(this);
                    calendarPos = (coords[0] - 450) + "," + (coords[1] + 20);
                }
                calendar.show(this, calendarPos);
                var e = e || window.event;
                e.cancelBubble = true;
                if (e.stopPropagation) e.stopPropagation();
            },
            closeCalendar: function () {
                if (calendar) {
                    if (calendar.display == "block") {
                        calendar.toggleDisplay();
                    }
                }
            }
        };

        calendar = new multiDisplayCalendar(config.calendarId,
            getArrivalDate,
            getDepartureDate,
            setDates, null);

        yuiEvent.addListener(calendarIcon, "click", self.toggleCalendar, config.calendarPos);
        yuiEvent.addListener(arrivalDateInput, "focus", checkArrivalDateFocus);
        yuiEvent.addListener(arrivalDateInput, "blur", checkArrivalDateBlur);
        yuiEvent.addListener(departureDateInput, "focus", checkDepartureDateFocus);
        yuiEvent.addListener(departureDateInput, "blur", checkDepartureDateBlur);

        return self;
    }

    SW.local.CalendarMaker = function(config){
        return new CalendarMaker(config);
    };

    YAHOO.namespace("SW.local.CalendarMaker");
})();


