/**
 * jquery eventCalendar (ru)
 * zvepr
 */


function eventCalendar( node, o )
{
    this.imageDir      = '/template/image/';
    
    if( typeof( o.months ) === 'undefined' ) o.months = [ 'январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь' ];
    if( typeof( o.weekdays ) === 'undefined' ) o.weekdays = ['пн', 'вт', 'ср','чт','пт', 'сб', 'вс' ];
    if( typeof( o.yearSelected ) === 'undefined' ) o.yearSelected = this.getCurrentYear();
    if( typeof( o.monthSelected ) === 'undefined' ) o.monthSelected = this.getCurrentMonth();
    if( typeof( o.dateSelected ) === 'undefined' ) o.dateSelected = null;
    if( typeof( o.onclick ) === 'undefined' ) o.onclick = this._defaultOnclick;
    if( typeof( o.beforeDrawMonth ) === 'undefined' ) o.beforeDrawMonth = function(){};
    if( typeof( o.afterDrawMonth ) === 'undefined' ) o.afterDrawMonth = function(){};
    
    this.months        = o.months;
    this.weekdays      = o.weekdays;
    this.yearSelected  = o.yearSelected;
    this.monthSelected = o.monthSelected;
    this.dateSelected  = o.dateSelected;
    this.onclick       = o.onclick;
    this.beforeDrawMonth = o.beforeDrawMonth;
    this.afterDrawMonth  = o.afterDrawMonth;
    
    this.node = node;
    
    this.createTable();
    this.drawMonth();
    
    if( this.dateSelected )
        this.select( o.dateSelected );
}
            
            
eventCalendar.prototype.createTable = function()
{
    var table = $( '<table class="eventCalendar" cellpadding="0" cellspacing="0"><thead><tr><td></td></tr></thead><tbody><tr><td></td></tr></tbody></table>');
    table.find( ' > thead td' ).append('<table width="100%" class="eventCalendar-head" cellpadding="0" cellspacing="10"><tr><td align="left" class="head-l"><a href="#"><img src="' + this.imageDir + 'eventCalendar-left.gif" width="22" height="19" alt="" /></a></td><td class="head-c title" align="center">&nbsp;</td><td class="head-r" align="right"><a href="#"><img src="' + this.imageDir + 'eventCalendar-right.gif" width="22" height="19" alt="" /></a></td></tr></table>');
    table.find( ' > tbody td' ).append('<table width="100%" cellpadding="0" cellspacing="0" class="eventCalendar-dates"><thead><tr class="weekdays"></tr></thead><tbody></tbody></table>');
    table.find( '.head-r a' ).get( 0 ).calendar = this;
    table.find( '.head-l a' ).get( 0 ).calendar = this;
    table.find( '.head-r a' ).click( function(){ this.calendar.nextMonth(); return false;} );
    table.find( '.head-l a' ).click( function() { this.calendar.prevMonth(); return false; } );
    
    
    
    for( var i = 1; i <= 7; i++ )
        table.find( '.weekdays' ).append( '<td>' + this.weekdays[i - 1] + '</td>' );
        
    this.tableNode = table.get( 0 );
    table.get( 0 ).calendar = this;
    
    $( this.node ).append( table );
    $( this.node ).addClass( 'eventCalendar-node' );
}


eventCalendar.prototype.dateArr = function( date )
{
    if( typeof( date ) === 'object' )
        return date;
    
    var re = new RegExp( '^([0-9]+)-([0-9]+)-([0-9]+)$' );
    var res = date.match( re );
    
    if( !res )
        return;
        
    return [ res[1], res[2], res[3] ];
}


eventCalendar.prototype.drawMonth = function ()
{
    this.beforeDrawMonth();
    
    $( this.tableNode ).find( '.eventCalendar-dates tbody' ).html( '' );
    
    var _date = [ this.yearSelected, this.monthSelected ];
    
    var firstDateDay    = this.getDay( [_date[0], _date[1], 1] );
    var monthDays       = this.getMonthDays( [_date[0], _date[1]] );
    
    var i = 1;
    var $trs = new Array();
    
    while( i <= monthDays )
    {
        var index = $trs.length;
        $trs[ index ] = $( '<tr></tr>' );
        
        for( var j = 1; j <= 7; j++ )
        {
            var $td  = $( '<td></td>' );
            $td.mouseover( this.dateNodeMouseOver );
            $td.mouseout( this.dateNodeMouseOut );
            $td.get( 0 ).calendar = this;
            
            if( (i == 1 && j < firstDateDay) || (i > monthDays) )
            {
                $td.html( '&nbsp;' );
            }
            else
            {
                $td.addClass( 'date-cell' );
                $td.addClass( 'date-' + i );
                $td.get( 0 ).date = i;
                $td.html( i );
                i++;
            }
            
            $trs[ index ].append( $td )
            
            
        }
    }       
    for( var i = 0; i < $trs.length; i++ )
    {
        $( this.tableNode ).find( '.eventCalendar-dates tbody' ).append( $trs[ i ] );
    }
    
    $( this.tableNode ).find( '.eventCalendar-head .title' ).html( this.months[ _date[1] - 1 ] + ' ' + _date[0] );
    
    this.afterDrawMonth();
}


eventCalendar.prototype.getDateNode = function( date )
{
    return $( this.tableNode ).find( '.date-' + parseInt( date) ).get( 0 );
}


eventCalendar.prototype.activate = function( date, func )
{
    var dateNode = this.getDateNode( date );
    if( $( dateNode ).find( 'a' ).size() )
        return;
    
    var $a = $('<a href="#"></a>');
    $a.get( 0 ).calendar = dateNode.calendar;
    $a.get( 0 ).date = dateNode.date;
    $a.click( typeof( func ) === 'function' ? func : this.onclick );
    $a.html( $( dateNode ).html() );
    
    $( dateNode ).addClass( 'active' );
    $( dateNode ).html( '' );
    $( dateNode ).append( $a );
}



eventCalendar.prototype.select = function( date )
{
    var dateNode = this.getDateNode( date );
    if( $( dateNode ).find( 'a' ).size() )
        return;
    
    $( dateNode ).addClass( 'selected' );
}



eventCalendar.prototype.deselect = function( date )
{
    var dateNode = this.getDateNode( date );
    if( $( dateNode ).find( 'a' ).size() )
        return;
    
    $( dateNode ).removeClass( 'selected' );
}

            
            
eventCalendar.prototype.getMonthDays = function( date )
{
    var _date = this.dateArr( date );
    var year  = parseInt( _date[0] );
    var month = parseInt( _date[1] );
    
    switch( month )
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12: return 31;
        
        case 4:
        case 6:
        case 9:
        case 11: return 30;
        
        case 2: 
            return 28 + ( year % 4 === 0 ? 1 : 0 );
            
        
        default: return false;
    }
}
            
            
eventCalendar.prototype.getDay = function( date )
{
    var _date = this.dateArr( date );
    
    var d = new Date();
    
    d.setYear( _date[0] );
    d.setMonth( _date[1] - 1 );
    d.setDate( _date[2] );
    
    var day = d.getDay();
    
    return day === 0 ? 7 : day;
}
            
     
            


eventCalendar.prototype.prevMonth = function(){
    this.monthSelected--;
    
    if( this.monthSelected == 0 )
    {
        this.monthSelected = 12;
        this.yearSelected--;
    }
    
    this.drawMonth();
};



eventCalendar.prototype.nextMonth = function(){
    this.monthSelected++;
    
    if( this.monthSelected > 12 )
    {
        this.monthSelected = 1;
        this.yearSelected++;
    }
    
    this.drawMonth();
};


eventCalendar.prototype.getCurrentMonth = function()
{
    var d = new Date();
    return d.getMonth() + 1;

}



eventCalendar.prototype.getCurrentYear = function()
{
    var d = new Date();
    return d.getFullYear();
}


eventCalendar.prototype.dateNodeMouseOver = function()
{
    if( $( this ).hasClass( 'active' ) )
        $( this ).addClass( 'hover' );
}

eventCalendar.prototype.dateNodeMouseOut = function()
{
    if( $( this ).hasClass( 'active' ) )
        $( this ).removeClass( 'hover' );
}


eventCalendar.prototype.defaultOnclick = function()
{ 
    alert( this.calendar.yearSelected + '-' + this.calendar.monthSelected + '-' + this.date );
    return false; 
}
if(jQuery) 

(function($){
	
	$.extend($.fn, {
		eventCalendar: function(o) {
		    
            if( typeof( o ) !== 'object' )
                o  = {};            
            
            $( this ).each( handleNode );
            
            
            
            
            function handleNode()
            {
                this.calendar = new eventCalendar( this, o );
            }
		}
	});
	
})(jQuery);





