﻿$("RateCalendar").ready(function() {
    var elements = document.getElementsByTagName("RateCalendar");
    var element;
    var count;

    for (count = 0; count < elements.length; count++) {
        var rateCalendarId = elements[count].attributes.getNamedItem("id").value
        invokeGetCalendar(rateCalendarId);
        bindEvents(rateCalendarId);
        synchroniseCalendarWithControls(rateCalendarId);
    }
});

/* bindEvents */
function bindEvents(context) {
    var rateCalendar = $("#" + context);

    //arriveControl
    if (rateCalendar.attr("arriveControl") != "") {
        var arriveControl = $("#" + rateCalendar.attr("arriveControl"));
        if (arriveControl.size() > 0) {
            arriveControl.bind("change", function() {
                synchroniseCalendarWithControls(context);
            });
        }
    }

    //durationControl
    if (rateCalendar.attr("durationControl") != "") {
        var durationControl = $("#" + rateCalendar.attr("durationControl"));
        if (durationControl.size() > 0) {
            durationControl.bind("change", function() {
                synchroniseCalendarWithControls(context);
            });
        }
    }

    //departControl
    if (rateCalendar.attr("departControl") != "") {
        var departControl = $("#" + rateCalendar.attr("departControl"));
        if (departControl.size() > 0) {
            departControl.bind("change", function() {
                synchroniseCalendarWithControls(context);
            });
        }
    }


    //adults
    if (rateCalendar.attr("adultsControl") != "") {
        var adultsControl = $("#" + rateCalendar.attr("adultsControl"));
        if (adultsControl.size() > 0) {
            adultsControl.bind("change", function() {
                invokeGetCalendar(context);
            });
        }
    }

    //children
    if (rateCalendar.attr("childrenControl") != "") {
        var childrenControl = $("#" + rateCalendar.attr("childrenControl"));
        if (childrenControl.size() > 0) {
            childrenControl.bind("change", function() {
                invokeGetCalendar(context);
            });
        }
    }

    //infants
    if (rateCalendar.attr("infantsControl") != "") {
        var infantsControl = $("#" + rateCalendar.attr("infantsControl"));
        if (infantsControl.size() > 0) {
            infantsControl.bind("change", function() {
                invokeGetCalendar(context);
            });
        }
    }
}

/* GetCalendar */
function invokeGetCalendar(context) {
    try {
        var rateCalendar = $("#" + context);
        var year = rateCalendar.attr("year");
        var month = rateCalendar.attr("month");
        var adults = 1;
        var children = 0;
        var infants = 0;
        var arrive = rateCalendar.attr("arrive");
        var depart = rateCalendar.attr("depart");
        var xslDocument = rateCalendar.attr("xslDocument");
        var currencyPrefix = rateCalendar.attr("currencyprefix");
        var currencyFormat = rateCalendar.attr("currencyFormat");
        var currencySuffix = rateCalendar.attr("currencySuffix");

        if (rateCalendar.attr("adultsControl") != "")
            adults = $("#" + rateCalendar.attr("adultsControl")).attr("value");

        if (rateCalendar.attr("childrenControl") != "")
            children = $("#" + rateCalendar.attr("childrenControl")).attr("value");

        if (rateCalendar.attr("infantsControl") != "")
            infants = $("#" + rateCalendar.attr("infantsControl")).attr("value");

        showLoadingAnimation(context);
        Guestline.RezRooms.Portal.Standard.RezRooms20WebService.GetCalendar(context, year, month, adults, children, infants, arrive, depart, xslDocument, currencyPrefix, currencyFormat, currencySuffix, completeGetCalendar);
    }
    catch (err) {
        alert("Error in invokeGetCalendar");
        alert(err.message);
    }
}

/* showLoadingAnimation */
function showLoadingAnimation(context) {
    $("#" + context + '_Div').html("<div class='loading'><img src='../../img/default/loading.gif'/></div>");
}

/* completeGetCalendar */
function completeGetCalendar(result) {
    var getCalendarResult = eval("(" + result + ")");
    $("#" + getCalendarResult.Context + '_Div').html(getCalendarResult.Calendar);

    updateInstructions(getCalendarResult.Context);
    applyCustomLanguage();
    markSelected(getCalendarResult.Context);
}

/* calendarPrevious */
function calendarPrevious(context) {
    var rateCalendar = $("#" + context);
    var year = rateCalendar.attr("year");
    var month = rateCalendar.attr("month");

    month = parseInt(month) - 1;

    if (month < 1) {
        month = 12;
        year = parseInt(year) - 1;
    }

    rateCalendar.attr("year", year);
    rateCalendar.attr("month", month);

    invokeGetCalendar(context);
}

/* calendarNext */
function calendarNext(context) {
    var rateCalendar = $("#" + context);
    var year = rateCalendar.attr("year");
    var month = rateCalendar.attr("month");

    month = parseInt(month) + 1;

    if (month > 12) {
        month = 1;
        year = parseInt(year) + 1;
    }

    rateCalendar.attr("year", year);
    rateCalendar.attr("month", month);

    invokeGetCalendar(context);
}

/* calendarClick */
function calendarClick(context, date) {

    var rateCalendar = $("#" + context);
    var arrive = rateCalendar.attr("arrive");
    var depart = rateCalendar.attr("depart");


    if ((dateFromString(date) - getCurrentDate()) < 0) {
        alert(language.value.CanNotSelectPastDates);
        return;
    }

    clearSelected(context);

    if (arrive == "" || (arrive != "" && depart != arrive)) {
        rateCalendar.attr("arrive", date);
        rateCalendar.attr("depart", date);
        markSelected(context);
    }
    else if (arrive != "" && depart == arrive) {
        if (dateFromString(arrive) > dateFromString(date)) {
            rateCalendar.attr("arrive", date);
            rateCalendar.attr("depart", date);
            markSelected(context);
        }
        else {
            rateCalendar.attr("depart", date);
            markSelected(context);
        }
    }

    updateInstructions(context);
    synchroniseControlsWithCalendar(context);
}

/* clearSelected */
function clearSelected(context) {
    $("#" + context + "_Div .selected").each(function() {
        $(this).removeClass("selected");
    });
}

/* markSelected */
function markSelected(context) {
    var rateCalendar = $("#" + context);
    $("#" + context + "_Div .day").each(function() {
        if (dateFromString(rateCalendar.attr("arrive")) <= dateFromString($(this).attr("date")) &&
            dateFromString(rateCalendar.attr("depart")) >= dateFromString($(this).attr("date"))) {
            $(this).addClass("selected");
        }
    });
}

function synchroniseCalendarWithControls(context) {
    var rateCalendar = $("#" + context);
    var rateCalendarMonth = rateCalendar.attr("month");
    var rateCalendarYear = rateCalendar.attr("year");
    var arriveControl;
    var arriveControlDate;
    var departControl;
    var departControlDate;
    var durationControl;
    var durationControlDays;

    if (rateCalendar.attr("arriveControl") != "") {
        arriveControl = $("#" + rateCalendar.attr("arriveControl"));
        if (arriveControl.size() > 0) {
            arriveControlDate = dateFromString(arriveControl.attr("value"));
            rateCalendar.attr("arrive", dateToString(arriveControlDate));
        }
    }

    if (rateCalendar.attr("departControl") != "") {
        departControl = $("#" + rateCalendar.attr("departControl"));
        if (departControl.size() > 0) {
            departControlDate = dateFromString(departControl.attr("value"));
            rateCalendar.attr("depart", dateToString(departControlDate));
        }
    }

    if (rateCalendar.attr("durationControl") != "") {
        durationControl = $("#" + rateCalendar.attr("durationControl"));
        if (durationControl.size() > 0) {
            durationControlDays = durationControl.attr("value");
            var date = new Date(arriveControlDate);
            date.setHours(date.getHours() + (durationControlDays * 24));
            rateCalendar.attr("depart", dateToString(date));
        }
    }

    clearSelected(context);
    markSelected(context);

    //Shift the calendar to the arrival month if necessary                    
    if (rateCalendarMonth + "/" + rateCalendarYear != (arriveControlDate.getMonth() + 1) + "/" + arriveControlDate.getFullYear()) {
        rateCalendar.attr("month", arriveControlDate.getMonth() + 1);
        rateCalendar.attr("year", arriveControlDate.getFullYear());
        invokeGetCalendar(context);
    }
}

/* synchroniseControlsWithCalendar */
function synchroniseControlsWithCalendar(context) {
    var rateCalendar = $("#" + context);
    var arriveDate = dateFromString(rateCalendar.attr("arrive"));
    var departDate = dateFromString(rateCalendar.attr("depart"));

    if (arriveDate.valueOf() == departDate.valueOf()) {
        departDate.setDate(departDate.getDate() + 1);
    }

    if (rateCalendar.attr("arriveControl") != "") $("#" + rateCalendar.attr("arriveControl")).attr("value", dateToString(arriveDate));
    if (rateCalendar.attr("departControl") != "") $("#" + rateCalendar.attr("departControl")).attr("value", dateToString(departDate));
    if (rateCalendar.attr("durationcontrol") != "") $("#" + rateCalendar.attr("durationControl")).attr("value", dateDifferenceInDays(arriveDate, departDate));
}


function updateInstructions(context) {
    //Set the instruction appropriately
    var rateCalendar = $("#" + context);
    var arrive = rateCalendar.attr("arrive");
    var depart = rateCalendar.attr("depart");
    
    if (arrive == "" || (arrive != "" && depart != arrive))
        setInstructions(context, language.values.SelectArrivalDate);
    else if (arrive != "" && (depart == "" || arrive == depart))
        setInstructions(context, language.values.SelectDepartureDate);
    else if (arrive != "" && depart != "")
        setInstructions(context, language.values.ContinueOrSelectArrivalDate);
    else
        setInstructions(context, language.values.SelectArrivalDate);
}

/* setInstructions */
function setInstructions(context, text) {
    $("#" + context + "_Div span.instructions").text(text);
}


