/*
* Slideshow - used by Main Promo and What's New / Next sections
* */
(function() {
    var SlideShowManager = {
        slideShows: [],
        init: function() {
            var slideShows = SlideShowManager.slideShows;

            slideShows.push(new SlideShow({
                id: 'promoImageContainer',
                duration: 7
            }));
            slideShows.push(new SlideShow({
                id: 'whatsNewNext',
                duration: 5
            }));

            slideShows.forEach(function(slideShow) {
                slideShow.init();
                slideShow.start();
            });
        }
    };

    yuiEvent.onDOMReady(function() {
        SlideShowManager.init();
    });

})();


/* Twitter */
(function() {
    var yuiDom = YAHOO.util.Dom,
        yuiEvent = YAHOO.util.Event,
        yuiConnect = YAHOO.util.Connect,
        yuiJson = YAHOO.lang.JSON;
    var Twitter = {
        init: function() {
            var el = yuiDom.get("twitterBlock");
            if( yuiDom.hasClass(el, "noData") ) {
                Twitter.loadData();
            }
        },
        loadData: function() {
            var request = yuiConnect.asyncRequest('GET', '/whotels/ajax/microblogFeed.html', {
                success: function(o) {
                    yuiDom.get("twitterBlock").innerHTML = o.responseText;
                },
                failure: function() {

                }
            });
        }
    };
    yuiEvent.onDOMReady(Twitter.init);

})();

/* Facebook */
(function() {
    var yuiDom = YAHOO.util.Dom,
        yuiEvent = YAHOO.util.Event,
        yuiConnect = YAHOO.util.Connect,
        yuiJson = YAHOO.lang.JSON;
    var Facebook = {
        init: function() {
            var el = yuiDom.get("facebookBlock");
            if( yuiDom.hasClass(el, "noData") ) {
                Facebook.loadData();
            }
        },
        loadData: function() {
            var request = yuiConnect.asyncRequest('GET', '/whotels/ajax/homepage/facebookAlbums.html', {
                success: function(o) {
                    yuiDom.get("facebookBlock").innerHTML = o.responseText;
                },
                failure: function() {

                }
            });
        }
    };
    yuiEvent.onDOMReady(Facebook.init);

})();

(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");
                    //yuiDom.get('fnb_arrivalDate').blur();
                    SW.domWidget.inputLabels.update('searchBox');
                    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")
                    }
                    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)) {
                        var 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;
})();


/**
* Component to initialize calendar to be used on page. (See sample calls below)
*
* @param config {Object} configuration object served as a wrapper for your params.
*           required properties for config:
*               calendarId: id of calendar (should be unique if there should be more than 1 calendar created on page)
*               arrivalInput: reference to arrival date input
*               departureInput: reference to departure date input
*               trigger: reference to a trigger (usually the calendar icon) that is used to toggle display of calendar
*               localeCode: curent user set locale
*               dateFormatString: the date format string that matches the user set locale
*
* Note: The structure of the markup can be arranged to serve your own purpose.
**/

/*

// Sample markup: (label attribute on input elements are only there if you have inputLabels widget turned on)
    <div id="calendarContainer">
        <div id="dateInputContainer">
            <div class="dateContainer" id="arrivalDateContainer">
                <label class="dateLabel" id="arrivalDateLabel">
                    Check In
                </label>
                <input type="text" name="arrivalDate" id="arrivalDate" label="${dateFormatString}" value="${arrivalDate}"/>
                <div class="clearBoth"></div>
            </div>
            <div class="dateContainer" id="departureDateContainer">
                <label class="dateLabel" id="departureDateLabel">
                    Check Out
                </label>
                <input type="text" name="departureDate" id="departureDate" label="${dateFormatString}" value="${departureDate}"/>
                <div class="clearBoth"></div>
            </div>
        </div>
        <div id="calendarIconContainer">
            <img id="calendarIcon" src="/westin/images/calendar/calendarIcon.gif" />
        </div>
    </div>

// Sample call #1:


<script type="text/javascript">

    var dateFormatString = "${dateFormatString}";  // global var required by webForm.js for date checking
    yuiEvent.onDOMReady(function() {
        SW.local.CalendarMaker({
        // Required:
            calendarId: "findReserveCalendar",
            arrivalDateInput: yuiDom.get("arrivalDate"),
            departureDateInput: yuiDom.get("departureDate"),
            calendarIcon: yuiDom.get("calendarIcon"),
            localeCode: "${requestInfo.userLocaleCode}",
            dateFormatString: "${dateFormatString}"
        });
    });
</script>
// Sample call #2:
<script type="text/javascript">

    var myCalendar = SW.local.CalendarMaker({
        // Required:
            calendarId: "findReserveCalendar",
            arrivalDateInput: yuiDom.get("arrivalDate"),
            departureDateInput: yuiDom.get("departureDate"),
            calendarIcon: yuiDom.get("calendarIcon"),
            localeCode: "${requestInfo.userLocaleCode}",
            dateFormatString: "${dateFormatString}"

        // (see DEFAULT_CONFIG)
    });

    myCalendar.toggle();
</script>
*/

(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 = "";
            }
            return;
        }

        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");
})();

/* Omniture */
(function() {
    var yuiDom = YAHOO.util.Dom,
        yuiEvent = YAHOO.util.Event;
    var HomepageTracking = {
        init: function() {
              yuiEvent.addListener("siteContainer","click",HomepageTracking.handleClick)
        },
        handleClick: function(e) {
            var target = yuiEvent.getTarget(e);
            var link_id;
            if(target.nodeName=="A"){
                link_id = target.href;
            }else if(target.parentNode.nodeName=="A"){
                link_id = target.parentNode.href;
            }else{
                return;
            }
          try{
            trackMetrics("home_page_click",{link_id:link_id});
            return;
          }catch(err){
              return;
          }

        }
    };
    yuiEvent.onDOMReady(HomepageTracking.init);

})();


