(function($){
    $.fn.calendarLiteLine = function(options) {
        var opts = $.extend({}, $.fn.calendarLiteLine.defaults, options);
        return this.each(function() {
            $this = $(this);
            var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
            $.fn.calendarLiteLine.draw(o);
            var needDate = $('.state').attr('name');
    		var divDates = $('.alldates div');
    		var $mynext   =  $('.next');
    		var $myprev = $('.prev');
    		if(window.location.pathname == '/big_dates/')
    		{
            $mynext.bind('click',function(){
               	divDates.css('display','none');
            	divDates.each(function(){
					var all = $('.state').attr('name');
					var $this = $(this);
					if($this.attr('name')==all)
					{
						$this.css('display','block');
					}
				});
    		});
            $myprev.bind('click',function(){
            	divDates.css('display','none');
            	divDates.each(function(){
					var all = $('.state').attr('name');
					var $this = $(this);
					if($this.attr('name')==all)
					{
						$this.css('display','block');
					}
				});
    		});
        	
    		}
    		else
    		{
    			$mynext.bind('click',function(){
                	divDates.css('display','none');
        		});
    			 $myprev.bind('click',function(){
    	            	divDates.css('display','none');
    	    		});
    		
        	(function(){
        		

        		var needDate = $('.state').attr('name');
        		var divDates = $('.alldates div');
        		var needDay = $('.dates li');
        		needDay.bind('click',function(){
        			needDay.removeClass('cur')
        			$(this).addClass('cur');
        			divDates.css('display','none')
        			var $thisli = $(this).attr('name');
        				divDates.each(function(){
        					var all = $thisli +'.'+$('.state').attr('name');
        					var $this = $(this);

        					if($this.attr('name')==all)
        					{
        						$this.css('display','block');
        						
        					}
        				});
        		});
        	})();
    		}
            
        });
        
    };
    
    /**
     * Get calendar's header (day names)
     * @param {Object} opts
     */
    $.fn.calendarLiteLine.getHead = function(opts) {
	    var html = [];
	    for (var i = 0; i < opts.days.length; i++) {
	        html.push('<!-- <th>' + opts.days[i] + '</th> -->');
	    }

	    return html.join('');
    };
    
    /**
     * Main function for drawing calendar
     * @param {Object} opts
     */
    $.fn.calendarLiteLine.draw = function(opts) {
        var o = $.extend({}, this.defaults, opts);
        
        month = parseInt(o.month, 10);
        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 curDate = srcDate.getDate();
        var curMonth = srcDate.getMonth();
        var curYear = srcDate.getFullYear();

        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 = $('<div class="dates"></div>');
        var str = /*'<!-- <span>' + this.getHead(o) + '</span> -->'*/'', cl = '';
        var line = [];
        line.push('<ul>');
        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 = ' class="cur"';
            } else if (day == 6 || day == 0) {
                cl = ' class="weekend"';
            }
            var href = '#';
            if (o.linkFormat != null && o.linkFormat != undefined) {
                href = _formatLink(o.linkFormat, dates[j]);
            }
            line.push('<li' + cl + ' name="'+ date +'" >' + date + '</li>');
            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('');
                    }
                    line = pad.concat(line);
                    }

                str += '' + line.join('') + '';
                line = [];
            } else if (j == (dates.length - 1)) {
                str += '' + line.join('') + '';
            }
        }
        line.push('</ul>');
        str += '';
        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 + ' ';
        }
        $this[0].innerHTML = '<div class="month"><span class="state" name="' + (curMonth+1) + '.' + curYear + '" style="display:none;">' + curMonth + '.' + curYear + '</span><a href="#" class="prev" title="Ïðåäûäóùèé">Ïðåäûäóùèé</a><span class="cur">' + o.months[curMonth] + ' ' + y + ' ' + curYear +'</span><a href="#" class="next" title="Ñëåäóþùèé">Ñëåäóþùèé</a></div>';
        $this.append(table)
             .find('.Name').width($this.find('.dates').width());

        this.next($this.find('.next'), o);
        this.prev($this.find('.prev'), o);

        //(function(){
     	 //  $('.table th:gt(4)').addClass("weekend");
        //})();
    };
    
    /**
     * Format link
     * @param {String} format
     * @param {Object} objDate
     */
    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;
    };
    
    /**
     * Format date for link's 'rel' attribute
     * @param {String} format
     * @param {Object} objDate
     */
    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;
    };
    
    /**
     * Show next month
     */
    $.fn.calendarLiteLine.next = function(button, o) {
        this.change(button, 1, o);
    };
    
    /**
     * Show previous month
     * @param {Object} button
     */
    $.fn.calendarLiteLine.prev = function(button, o) {
        this.change(button, -1, o);
    };
    
    /**
     * Switch to another month
     * @param {Object} button
     * @param {Integer} monthDelta
     */
    $.fn.calendarLiteLine.change = function(button, monthDelta, o) {
        var opts = $.extend({}, $.fn.calendarLiteLine.defaults, o);
        var _self = this;
        var parent = button.parent('.month').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.calendarLiteLine(opts);
            return false;
        });
    };
    
    /**
     * Get current calendar's state (month and year)
     */
    $.fn.calendarLiteLine.getState = function(div) {
        var st = div.find('.state')[0].innerHTML.split('.');
        return [parseInt(st[0], 10), parseInt(st[1], 10)];
    };
    
    /**
     * Format number (pad with zero)
     * @param {Integer} num
     */
    function _formatNum(num) {
        num = parseInt(num, 10);
        if (num < 10) {
            return '0' + num;
        }
        return num;
    };
    
    /**
     * Default options
     */
    $.fn.calendarLiteLine.defaults = {
        /**
         * Names of week's days
         */
        days: ['Ïí', 'Âò', 'Ñð', '×ò', 'Ïò', 'Ñá', 'Âñ'],
        
        /**
         * Month names
         */
        months: ['ßíâàðü', 'Ôåâðàëü', 'Ìàðò', 'Àïðåëü', 'Ìàé', 'Èþíü', 'Èþëü', 'Àâãóñò',
                 'Ñåíòÿáðü', 'Îêòÿáðü', 'Íîÿáðü', 'Äåêàáðü'],
        
        /**
         * Link to be assigned for each link in cell:
         *   e.g.: http://snowcore.net/events/{%dd}-{%mm}-{%yyyy}
         * 
         * Possible values:
         *   {%dd} - date with leading zero
         *   {%d}  - date without leading zero
         *   {%mm} - month with leading zero
         *   {%m}  - month without leading zero
         *   {%yy} - yar (two digits)
         *   {%yyyy}  - full year (for digits)
         */
        linkFormat: null,
        
        /**
         * Format for date in 'rel' attribute (onSelect callback function retrieves this value)
         * Formatting options are the same as for 'linkFormat' option
         * Default: mm.dd.yyyy ('{%dd}.{%mm}.{%yyyy}')
         */
        dateFormat: '{%dd}.{%mm}.{%yyyy}',
        
        /**
         * Callback function, fires when user click on the cell
         * Function retrives one parameter - date
         * (in format that has been assigned by 'dateFormat' option):
         */
        onSelect: null,
        
        /**
         * When set to true, full year is displaying in the calendar caption
         */
        showYear: false,
        
        /**
         * Prev/Next arrows (you can also use &larr; and &rarr;)
         */
        prevArrow: '&laquo;',
        nextArrow: '&raquo;'
    };
})($);
