/**
 * jQuery calendarLite plugin
 *
 * Copyright (c) 2009 Snitko Roman
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * @author 	Roman Snitko snowcore.net@gmail.com
 * @link http://snowcore.net/
 * @version 0.1.10
 */
;(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);
        });
    };
    
    /**
     * Get calendar's header (day names)
     * @param {Object} opts
     */
    $.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('');
    };
    
    /**
     * Main function for drawing calendar
     * @param {Object} opts
     */
    $.fn.calendarLite.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 = $('<table class="kalendar-table"></table>');
        var str = '<thead><tr>' + this.getHead(o) + '</tr></thead><tbody>', 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 key=date+'.'+(month+1)+'.'+year;
            var rel = _formatLink(o.dateFormat, dates[j]);
            cl = '';
            if ((date == today.getDate()) && (curMonth == today.getMonth()) && (curYear == today.getFullYear())) {
                cl = ' class="curr"';
            }
	    else if(o.dateColors[key]!=null) {
		cl = ' class="'+o.dateColors[key]+'"';
	    }
	    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('<td' + cl + '><a href="' + href + '" rel="' + rel + '">' + date + '</a></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)) {
		if(line.length < 7) {
		    var ln = line.length;
                    var pad = [];
                    for (var k = 0; k < (7 - ln); k++) {
                        pad.push('<td class="kalendar-end">&nbsp;</td>');
                    }
		    line = line.concat(pad);
		}
                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 + ' ';
        }
        $this[0].innerHTML = '<span class="state" style="display:none;">' + curMonth + '.' + curYear + '</span>';
	$this[0].innerHTML += '<div class="monthName"><span>Mesiac</span><a href="#" class="current">' + o.months[curMonth] + y + '</a><a href="#" class="next" title="Nasledujúci mesiac">' + o.nextArrow + '<span></span></a><a href="#" class="prev" title="Predošlý mesiac">' + o.prevArrow + '<span></span></a> </div>';
        $this.append(table);
	this.current($this.find('.current'), o);
        this.next($this.find('.next'), o);
        this.prev($this.find('.prev'), o);

	table2=$('<table class="kalendar-month-table"></table>');;
	var pom=[]
	for (var k = 0; k < 12; k++) {
	      var p=k-curMonth;
	     pom.push('<td> <a href="#" rel='+k+'>'+(k+1)+'<br />\''+curYear.toString().substring(2,4) +'</a></td>');
	}
	str ='<tr>'+pom.join('')+ '</tr>';
	table2.html(str);
	object=this;
	table2.find('a').click(function(){
	    object.change2($(this),this.rel, o);
	    return false;
	});
	table2.width($this.find('.kalendar-table').width());
	//$this.append(table2);
    };
    
    /**
     * 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 current month
     */
    $.fn.calendarLite.current = function(button, o) {
        this.change(button, 0, o);
    };

    /**
     * Show next month
     */
    $.fn.calendarLite.next = function(button, o) {
        this.change(button, 1, o);
    };
    
    /**
     * Show previous month
     * @param {Object} button
     */
    $.fn.calendarLite.prev = function(button, o) {
        this.change(button, -1, o);
    };
    
     $.fn.calendarLite.change2=function(button, monthDelta, o){
	var opts = $.extend({}, $.fn.calendarLite.defaults, o);
        var _self = this;
        var parent = button.parent().parent().parent().parent().parent();
        //button.click(function(){
            var state = _self.getState(parent);
            var d = new Date(state[1], monthDelta, 1);
            opts.month = d.getMonth();
            opts.year  = d.getFullYear();
	    if (typeof opts.onChange == 'function') {
		opts.onChange(opts.month+1,opts.year,opts);
	    }
	    parent.calendarLite(opts);
            return false;
      //  });
	//return false;
     };
    /**
     * Switch to another month
     * @param {Object} button
     * @param {Integer} monthDelta
     */

    $.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();
	    if (typeof opts.onChange == 'function') {
		opts.onChange(opts.month+1,opts.year,opts);
	    }
	    parent.calendarLite(opts);
            return false;
        });
	return false;
    };
    
    /**
     * Get current calendar's state (month and year)
     */
    $.fn.calendarLite.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.calendarLite.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,

	
        /**
         * Callback function, fires when user click on the change month arow
         * Function retrives two parameters - month and year
         */
        onChange: 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;',
	
	/**
         * Date colors array
         */
	dateColors: ['']
    };
})(jQuery);
