/**
* 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] + 20) + "," + (coords[1] - 10);
                }
                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");
})();

