(function($){
    $.fn.calendarLite = function(options) {
        var opts = $.extend({}, $.fn.calendarLite.defaults, options);
        return this.each(function() {
            $this = $(this);
            var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
            $.fn.calendarLite.draw(o);
        });
    };

    $.fn.calendarLite.getHead = function(opts) {
	    var html = [];
	    for (var i = 0; i < opts.days.length; i++) {
	        html.push('<th>' + opts.days[i] + '</th>');
	    }
	    return html.join('');
    };

    $.fn.calendarLite.draw = function(opts) {
        var o = $.extend({}, this.defaults, opts);

        month = parseInt(o.month, 10);
		/*month = 0;*/
        year = parseInt(o.year, 10);

        var today = new Date();
        var srcDate = new Date();
        if (!isNaN(year)) {
            srcDate.setDate(1);
            srcDate.setFullYear(year);
        }
        if (!isNaN(month)) {
            srcDate.setDate(1);
            srcDate.setMonth(month);
        }
        var cc = parseInt(o.currentMonth);
        var curDate = srcDate.getDate();
        var curMonth = srcDate.getMonth() + cc;
        var curYear = srcDate.getFullYear();
		//to next year 
		curYear = curMonth > 11 ? curYear+1 : curYear;
		curMonth = curMonth > 11 ? curMonth-12 : curMonth;		

        var dates = [];
        var dayCount = new Date(curYear, curMonth + 1, 0).getDate();
        for (var i = 1; i <= dayCount; i++) {
            var tmpDate = new Date(curYear, curMonth, i);
            if (tmpDate.getMonth() == curMonth && tmpDate.getFullYear() == curYear) {
                dates.push(tmpDate);
            }
        }

        var table = $('<table cellspacing="1" class="table"></table>');
        var str = '<tbody><tr>' + this.getHead(o) + '</tr>', cl = '';
        var line = [];
        for (var j = 0; j < dates.length; j++) {
            var day = dates[j].getDay();
            var month = dates[j].getMonth();
            var year = dates[j].getFullYear();
            
            var date = dates[j].getDate();
            var rel = _formatLink(o.dateFormat, dates[j]);
            cl = '';
            if (date == today.getDate() && curMonth == today.getMonth() && curYear == today.getFullYear()) {
                cl = ' curr';
            } else if (day == 6 || day == 0) {
                cl = ' weekend';
            }
            var href = '#';
            if (o.linkFormat != null && o.linkFormat != undefined) {
                href = _formatLink(o.linkFormat, dates[j]);
            }
            line.push('<td title="' + rel + '"><span>' + date + '</span></td>');
            if (dates[j].getDay() == 0) {
                if (line.length < 7) {
                    var ln = line.length;
                    var pad = [];
                    for (var k = 0; k < (7 - ln); k++) {
                        pad.push('<td>&nbsp;</td>');
                    }
                    line = pad.concat(line);
                }
                str += '<tr>' + line.join('') + '</tr>';
                line = [];
            } else if (j == (dates.length - 1)) {
                str += '<tr>' + line.join('') + '</tr>';
            }
        }
        str += '</tbody>';
        table.html(str);
        if (typeof o.onSelect == 'function') {
            table.find('a').click(function(){
                return o.onSelect($(this).attr('rel'));
            });
        }
        var y = '';
        if (o.showYear == true) {
            y = ' ' + curYear;
        }
      if (o.months[curMonth]) {
        $this[0].innerHTML = '<span class="state" style="display:none;">' + curMonth + '.' + curYear + '</span><div class="monthName"><a href="' + rel + '">' + o.months[curMonth] + y + '</a></div>';
        $this.append(table)
             .find('.monthName').width($this.find('.table').width());
        this.next($this.find('.next'), o);
        this.prev($this.find('.prev'), o);
      }
    };

    function _formatLink(format, objDate) {
        var date = objDate.getDate();
        var month = objDate.getMonth() + 1;
        var year = objDate.getFullYear();
        if (format.indexOf('{%dd}') != -1) {
            date = _formatNum(date);
        }
        if (format.indexOf('{%mm}') != -1) {
            month = _formatNum(month);
        }
        if (format.indexOf('{%yy}') != -1) {
            year = year.toString().slice(2);
        }
        var link = format.replace(/{%d(d)?}/, date).replace(/{%m(m)?}/, month).replace(/{%yy(yy)?}/, year);
        return link;
    };

    function _formatDate(format, objDate) {
        var date = objDate.getDate();
        var month = objDate.getMonth();
        var year = objDate.getFullYear();
        if (format.indexOf('{%dd}') != -1) {
            date = _formatNum(date);
        }
        if (format.indexOf('{%mm}') != -1) {
            month = _formatNum(month);
        }
        if (format.indexOf('{%yy}') != -1) {
            year = year.toString().slice(2);
        }
        month++;
        var link = format.replace(/{%d(d)?}/, date).replace(/{%m(m)?}/, month).replace(/{%yy(yy)?}/, year);
        return link;
    };

    $.fn.calendarLite.next = function(button, o) {
        this.change(button, 1, o);
    };

    $.fn.calendarLite.prev = function(button, o) {
        this.change(button, -1, o);
    };

    $.fn.calendarLite.change = function(button, monthDelta, o) {
        var opts = $.extend({}, $.fn.calendarLite.defaults, o);
        var _self = this;
        var parent = button.parent('.monthName').parent();
        button.click(function(){
            var state = _self.getState(parent);
            var d = new Date(state[1], state[0] + monthDelta, 1);
            opts.month = d.getMonth();
            opts.year  = d.getFullYear();
            parent.calendarLite(opts);
            return false;
        });
    };


    $.fn.calendarLite.getState = function(div) {
        var st = div.find('.state')[0].innerHTML.split('.');
        return [parseInt(st[0], 10), parseInt(st[1], 10)];
    };

    function _formatNum(num) {
        num = parseInt(num, 10);
        if (num < 10) {
            return '0' + num;
        }
        return num;
    };

    $.fn.calendarLite.defaults = {
        days: ['ÏÍ', 'ÂÒ', 'ÑÐ', '×Ò', 'ÏÒ', 'ÑÁ', 'ÂÑ'],
        months: ['ßíâàðü', 'Ôåâðàëü', 'Ìàðò', 'Àïðåëü', 'Ìàé', 'Èþíü', 'Èþëü', 'Àâãóñò', 'Ñåíòÿáðü', 'Îêòÿáðü', 'Íîÿáðü', 'Äåêàáðü'],
        linkFormat: null,
        dateFormat: '{%dd}.{%mm}.{%yyyy}',
        onSelect: null,
        showYear: true,
        prevArrow: '&laquo;',
        nextArrow: '&raquo;',
        currentMonth: 0
    };
})(jQuery);
