﻿/*
    new Calendar({
        roomtype: room type id,
        ratecode: rate code id,
        month: month of calendar,
        container: parent tag,
        ajax_load_url: url to load calendar
        ajax_check_url: url to check availability
    
*/



var CalendarContainer = (function($) {

    return function(options) {
        // calendar public members

        this.ratecode = options.ratecode;
        this.roomtype = options.roomtype,
        this.hotelid = options.hotelid;
        this.hotsrc = options.hotsrc;
        this.affcode = options.affcode;
        this.isbed = options.isbed;
        this.persons = options.persons;

        //calendar private members
        {
            var 
                container = options.container,
                parent_room = options.parent_room,
                on_load = options.on_load,
                ajax_load_url = options.ajax_load_url,
                ajax_check_url = options.ajax_check_url,

                arrival_date,
                departure_date,
                left_calendar,
                right_calendar,
                calendar_container = this,
                callback_counter = 0,
                date_empty_text = parent_room.find('#sp_arrival').html(),
                callback_status = 0; // 0 - ok, 1 - loading, 2 - next, 3 - prev
        }

        // CalendarContainer private methods
        {

            function dateToString(date) {
                var month = date.getMonth() + 1;
                var day = date.getDate();
                return '' + date.getFullYear() + (month < 10 ? '0' + month : month) + (day < 10 ? '0' + day : day);
            }

            function colorizeCell(year, month, day) {
                container.find('#' + year + month + day).addClass("calendar-selected");
            }

            function clearCell(year, month, day) {
                container.find('#' + year + month + day).removeClass("calendar-selected");
            }

            function colorizeCellByDate(date) {
                colorizeCell(date.getFullYear(), date.getMonth() + 1, date.getDate());
            }

            function clearCellByDate(date) {
                clearCell(date.getFullYear(), date.getMonth() + 1, date.getDate());
            }

            function colorizeCalendar() {
                var dt = new Date();
                dt.setDate(arrival_date.getDate());
                dt.setTime(arrival_date.getTime());
                while (dt.getTime() <= departure_date.getTime()) {
                    colorizeCellByDate(dt);
                    dt.setDate(dt.getDate() + 1);
                }
            }

            function clearCalendar() {
                if (departure_date == null || arrival_date == null)
                    return;
                var dt = new Date();
                dt.setDate(arrival_date.getDate());
                dt.setTime(arrival_date.getTime());
                while (dt.getTime() <= departure_date.getTime()) {
                    clearCellByDate(dt);
                    dt.setDate(dt.getDate() + 1);
                }
            }

            function updateDateView() {

                if (arrival_date == null) {
                    parent_room.find('#sp_arrival').html(date_empty_text);
                    parent_room.find('#hdn_arrival').val("");
                }
                else {
                    parent_room.find('#sp_arrival').html(arrival_date.toDateString());
                    parent_room.find('#hdn_arrival').val(arrival_date.getTime());
                }
                if (departure_date == null) {
                    parent_room.find('#sp_departure').html(date_empty_text);
                    parent_room.find('#hdn_departure').val("");
                }
                else {
                    parent_room.find('#sp_departure').html(departure_date.toDateString());
                    parent_room.find('#hdn_departure').val(departure_date.getTime());
                }

            }

            this.dateClick = function(cell, year, month, day) {

                if (arrival_date == null) {
                    arrival_date = new Date(year, month - 1, day);
                    parent_room.find('#sp_arrival').html(arrival_date.toDateString());
                    colorizeCell(year, month, day);
                }
                else {
                    curDate = new Date(year, month - 1, day);

                    if (curDate.getTime() == arrival_date.getTime()) {
                        if (departure_date == null)
                            clearCellByDate(arrival_date);
                        else
                            clearCalendar();
                        arrival_date = null;
                        departure_date = null;

                        updateDateView();

                        return;
                    }
                    else {
                        var tmp_arrival, tmp_departure;
                        if (departure_date == null) {
                            if (curDate > arrival_date) {
                                tmp_arrival = arrival_date;
                                tmp_departure = curDate;
                            } else {
                                tmp_arrival = curDate;
                                tmp_departure = arrival_date;
                            }
                        }
                        else {
                            if (curDate < arrival_date) {
                                tmp_arrival = curDate;
                                tmp_departure = departure_date;
                            }
                            if (curDate.getTime() == departure_date.getTime()) {
                                clearCalendar();
                                arrival_date = null;
                                departure_date = null;

                                updateDateView();

                                return;
                            }
                            else {
                                tmp_arrival = arrival_date;
                                tmp_departure = curDate;
                            }
                        }
                        // тут проверка на вшивость. Притворимся, что всё окей.
                        $.post(ajax_check_url,
                            {
                                hid: calendar_container.hotelid,
                                src: calendar_container.hotsrc,
                                ad: dateToString(tmp_arrival),
                                dd: dateToString(tmp_departure),
                                bed: calendar_container.isbed,
                                nm: calendar_container.affcode,
                                rt: calendar_container.roomtype,
                                rc: calendar_container.ratecode,
                                a: calendar_container.persons
                            }, function(data) {
                                id = data.id;
                                if (data.result == 1) {
                                    clearCalendar();
                                    arrival_date = tmp_arrival;
                                    departure_date = tmp_departure;

                                    updateDateView();

                                    colorizeCalendar();
                                }
                                else {
                                    var popupDiv = $('#calendar-popup');
                                    popupDiv.html(data.html.toString());
                                    popupDiv.dialog({
                                        position: 'center',
                                        modal: true,
                                        autoOpen: false,
                                        width: 400
                                    }
                                    );
                                    popupDiv.dialog('open');
                                }

                            }, "json");
                    }
                }
                // если (arrival_date не пуста)
                // {
                //    если ( текущая дата > arrival_date )
                //       сохраняем промежуточное departure_date
                //    иначе
                //       сохраняем arrival_date в промежуточное departure_date, а дату в промежуточное arrival_date
                //    проверяем, можно ли сделать такую резервацию, вызвав функцию сервера.
                //    ответ получаем в виде 1/0 если 0, то html с инфой, почему нельзя
                //    если (ответ 0) {
                //      показываем дулю
                //      расцветка и значения остаются прежними
                //    } иначе {
                //      сохраняем промежуточные arrival и departure в соотв. значения
                //      красим календарь
                //      записываем значения на экране
                //      енаблим кнопку BOOK
                //    }
                // }

            }


        }

        this.load = function() {
            $.when(left_calendar.load(), right_calendar.load()).then(function() {
                left_calendar.show();
                right_calendar.show();
            }, function() { alert("failed to initialize calendar") });
        }

        this.nextMonth = function() {
            $.when(left_calendar.nextMonth(), right_calendar.nextMonth()).then(function() {
                left_calendar.show();
                right_calendar.show();
            }, function() { alert("failed to initialize calendar") });
        }


        this.prevMonth = function() {
            $.when(left_calendar.prevMonth(), right_calendar.prevMonth()).then(function() {
                left_calendar.show();
                right_calendar.show();
            }, function() { alert("failed to initialize calendar") });

        }

        this.setPersons = function(newPersons) {
            this.persons = newPersons;
            return this.load();
        }

        this.gotoBook = function(btn) {
            var parent_div = $(btn).parents('.room-calendar-rate');
            var link = $(btn).attr('link');

            var cell = parent_div.parents(".room-calendar-item");
            // arrival
            if (arrival_date == null || departure_date == null)
                return;

            ar = arrival_date.getTime();
            dp = departure_date.getTime();

            var nights = (dp - ar) / (24 * 60 * 60 * 1000);
            var adults = cell.find('select').val();
            var month = arrival_date.getMonth() + 1;
            var day = arrival_date.getDate();
            location.href = link + '&ad=' + (month < 10 ? '0' + month : month) + (day < 10 ? '0' + day : day) + '&n=' + nights + '&a=' + adults;

        }

        // constructor

        {
            var month = parseInt(options.month, 10), // month of left calendar

            left_calendar =
                new Calendar({
                    calendar_container: this,
                    calendar_div: $(container).children('div:first-child'),
                    ajax_load_url: ajax_load_url,
                    month: month,
                    isleft: true
                });


            right_calendar =
                new Calendar({
                    calendar_container: this,
                    calendar_div: $(container).children('div:last-child'),
                    ajax_load_url: ajax_load_url,
                    month: month + 1 > 12 ? 1 : month + 1,
                    isleft: false
                });


        }

    }

})(jQuery);


var Calendar = (function($) {
    return function(options) {
        //calendar private members
        {
            var
                calendar_container = options.calendar_container, // CalendarContainer object
                calendar_div = options.calendar_div,
                ajax_load_url = options.ajax_load_url,
                month = options.month,
                isleft = options.isleft,
                calendar = this,
                preloaded_html = '';
        }

        // calendar public methods


        this.load = function() {
            // обратиться к аяксине с параметрами
            var def = $.Deferred();
            $.post(ajax_load_url,
                            {
                                hid: calendar_container.hotelid,
                                src: calendar_container.hotsrc,
                                m: month,
                                bed: calendar_container.isbed,
                                nm: calendar_container.affcode,
                                rt: calendar_container.roomtype,
                                rc: calendar_container.ratecode,
                                a: calendar_container.persons,
                                left: isleft ? 1 : 0
                            }, function(data) {

                                if (data.result == "1") {
                                    preloaded_html = '' + data.html;
                                    def.resolve();
                                } else {

                                    def.reject();
                                }
                            },
                            "json");
            return def;

        }

        this.show = function() {

            // нарисовать себя в диве
            // инициировать события клика

            $(calendar_div).html(preloaded_html);

            // инициализировать правила                        
            var divs = $(".calendar-info").get();
            for (var i = 0; i < divs.length; i++) {
                $(divs[i]).attr("TITLE",
                                        "header=[Rules] body=[" + $(divs[i]).parent().parent().children('.calendar-info-popup').html() + "] cssbody=[calendar-info-body] cssheader=[calendar-info-header]");
            }
            // инициализировать клики
            calendar_div.find('.div-cl').each(function(index) {
                $(this).bind('click', function() {
                    calendar_container.dateClick(this, $(this).attr("y"), $(this).attr("m"), $(this).attr("d"));
                });
            });
            calendar_div.find('#prev').bind('click', function() {
                calendar_container.prevMonth();
            });

            calendar_div.find('#next').bind('click', function() {
                calendar_container.nextMonth();
            });
        }

        this.nextMonth = function() {
            month = month + 1 > 12 ? 1 : month + 1;
            return this.load();
        }

        this.prevMonth = function() {
            month = month > 1 ? month - 1 : 12
            return this.load();
        }

        // constructor
        {

        }
    }

})(jQuery);


