﻿function createCalendar(element, monthChangeCallback, dateClickCallback) {
    var _element = element;
    var _selectedDates = [];
    var _currentMonth = new Date().getMonth();
    var _currentYear = new Date().getFullYear();

    var _initContainer = function() {
        var html = "<table cellspacing='0' class='RadCalendar RadCalendar_Sunset'><tr class='rcTitlebar'><th><a class='rcPrev' title='<'></a></th><th colspan='6'>{0} {1}</th><th><a class='rcNext' title='>'></a></th></tr>".format(Globals.monthNames()[_currentMonth].capitalize(), _currentYear);
        html += "<tr class='rcWeek'><th>&nbsp;</th><th>M</th><th>T</th><th>O</th><th>T</th><th>F</th><th>L</th><th>S</th></tr></table>";
        var $container = $(html);
        $container.find("a:first").click(function() { _obj.movePrevious(); });
        $container.find("a:last").click(function() { _obj.moveNext(); });
        return $container;
    };
    var _isSelectedDate = function(date) {
        var found = false;
        for (var i = 0; i < _selectedDates.length; i++) {
            if (date.getFullYear() == _selectedDates[i][0] && date.getMonth() == _selectedDates[i][1] && date.getDate() == _selectedDates[i][2])
                found = true;
        }
        return found;
    };
    var _getWeight = function(date) {
        var weight = 0;
        for (var i = 0; i < _selectedDates.length; i++) {
            if (date.getFullYear() == _selectedDates[i][0] && date.getMonth() == _selectedDates[i][1] && date.getDate() == _selectedDates[i][2])
                weight = _selectedDates[i][3];
        }
        return weight;
    }

    var _render = function() {
        $container = _initContainer();
        var $tbody = $container.find("tbody");

        var startOfMonth = new Date(_currentYear, _currentMonth, 1);
        var $tr = $("<tr class='rcRow'></tr>");
        $tr.append("<th>{0}</th>".format(startOfMonth.getWeek()));

        var dayNr = (startOfMonth.getDay() + 6) % 7;
        if (dayNr > 0)
            $tr.append("<td colspan='{0}'>&nbsp;</td>".format(dayNr));

        for (var d = startOfMonth; d.getMonth() == _currentMonth; d = d.addDays(1)) {
            if (d.getDay() == 1 && d.getDate() != 1)
                $tr.append("<th>{0}</th>".format(d.getWeek()));
            var $td = $("<td>{0}</td>".format(d.getDate()));

            if (_isSelectedDate(d)) {
                if (_getWeight(d) > 1)
                    $td.addClass("rcSelectedExt");
                else
                    $td.addClass("rcSelected");

                $td.attr("data", d.getTime());
                if (dateClickCallback)
                    $td.click(function() {
                        $("td").removeClass("rcActive");
                        $(this).addClass("rcActive");
                        dateClickCallback($(this).attr("data"));
                    });
            }
            if (d.isToday())
                $td.css("border", "solid 2px #B94505");
            $tr.append($td);
            if (d.getDay() == 0) {
                $tbody.append($tr);
                $tr = $("<tr class='rcRow'></tr>");
            }
        }
        if ($tr.html())
            $tbody.append($tr);

        $(_element).empty();
        $(_element).append($container);
    };

    var _raiseMonthChagedAndClickOnFirst = function() {
        if (monthChangeCallback)
            monthChangeCallback(_currentYear, _currentMonth);
        var firstDay = new Date(_currentYear, _currentMonth, 1);
        if (firstDay.isPast())
            firstDay.setDate(new Date().getDate());
        if (dateClickCallback)
            dateClickCallback(firstDay.getTime());
    };

    var _obj = {
        addDate: function(date, count) {
            _selectedDates.push([date.getFullYear(), date.getMonth(), date.getDate(), count || 1]);
        },
        refresh: function() {
            _render();
        },
        clearSelected: function() {
            _selectedDates = [];
        },
        setMonth: function(month, year) {
            _currentMonth = month;
            _currentYear = year || new Date().getFullYear();
            _raiseMonthChagedAndClickOnFirst();
            _render();
        },
        moveNext: function() {
            if (_currentMonth > 10) {
                _currentYear++;
                _currentMonth = 0;
            }
            else
                _currentMonth++;
            _raiseMonthChagedAndClickOnFirst();
            _render();
        },
        movePrevious: function() {
            if (_currentMonth < 1) {
                _currentYear--;
                _currentMonth = 11;
            }
            else
                _currentMonth--;
            _raiseMonthChagedAndClickOnFirst();
            _render();
        }
    };
    return _obj;
}


