
/**
 *
 *  Calendar.init({dateClicked:my_callback_date_changed,container:'element_id'});
 *
 */

var LocaleStrings = {
    month: new Array('января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'),
    umonth: new Array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'),
    dow: new Array('Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'),
    sdow: new Array('вс','пн','вт','ср','чт','пт','сб'),
    year: 'г.',
    week: '#'
};

var Calendar = {
    version: '1.0',
    //container: 'calendar_container',
    container: 'Calen_there',
    dateClickedFn: emptyFunction,
    weekClickedFn: emptyFunction,
    this_month: null,
    selected_day: null,
    last_clicked_day: '#',
    last_clicked_week: '#',
    month_range: Array(31,28,31,30,31,30,31,31,30,31,30,31),
    today: null,
    first_call: true,
    
    init: function(params)
    {

        if(typeof params == 'object')
        {
            //if(typeof params.container != undefined) this.container = params.container;
            if(typeof params.dateClicked == 'function') this.dateClickedFn = params.dateClicked;
            if(typeof params.weekClicked == 'function') this.weekClickedFn = params.weekClicked;
        }
        
        this.today = new Date();
        this.selected_day = new Date();
        this.this_month = new Date(this.today.getFullYear(), this.today.getMonth(), 1);
    },
    
    Draw: function()
    {
        jQuery('#'+this.container).empty();
        
        if(this.this_month.getFullYear() % 4 == 0) this.month_range[1] = 29; else this.month_range[1] = 28;
        
        var str = '<div style="border: #96bfcf solid 1px;background-color: #fff;"><table width="100%" border="0" cellpadding="2" cellspacing="0" class="cal_table">\n';
        str += '<tr><td><a href="#" onclick="return Calendar.PrevMonth();" style="font-size: 16px; font-weight: bold; color: #4E7F93;">←</a></td>\n';
        str += '<td class="cal_header">'+ LocaleStrings.umonth[this.this_month.getMonth()]+', '+ this.this_month.getFullYear() + LocaleStrings.year; '</td>';
        str += '<td><a href="#" onclick="return Calendar.NextMonth();" style="font-size: 16px; font-weight: bold; color: #4E7F93;">→</a></td></tr></table>\n';
        str += '<table width="100%" border="0" cellpadding="2" cellspacing="0" class="cal_table">';
        str += '<tr>';
        str += '<th>'+ LocaleStrings.week +'</th>';
        str += '<th>'+ LocaleStrings.sdow[1] +'</th>'; // понедельник
        str += '<th>'+ LocaleStrings.sdow[2] +'</th>';
        str += '<th>'+ LocaleStrings.sdow[3] +'</th>';
        str += '<th>'+ LocaleStrings.sdow[4] +'</th>';
        str += '<th>'+ LocaleStrings.sdow[5] +'</th>';
        str += '<th>'+ LocaleStrings.sdow[6] +'</th>';
        str += '<th class="cal_weekend">'+ LocaleStrings.sdow[0] +'</th>'; // воскресенье
        str += '</tr>\n';
        
        if(this.this_month.getDay() != 1) { str += '<tr><td>&gt;</td>'; }
        if(this.this_month.getDay() > 1) for(var i=1; i < this.this_month.getDay();i++) str += '<td>&nbsp;</td>';
        else if(this.this_month.getDay() == 0) { str += '<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\n'; }

        
        var offset = 6 + this.this_month.getDay();
        var click_id = 'cal_date_id_' + this.this_month.getFullYear() + '' + this.this_month.getMonth();
        var click_id_week = 'cal_week_id_' + this.this_month.getFullYear() + '' + this.this_month.getMonth();
        
        var dow_counter = 0; // 0 - воскресенье, 6 - суббота
        
        var month_and_year = +'|'+(this.this_month.getMonth()+1)+'|';
        for(var j=1; j <= this.month_range[this.this_month.getMonth()];j++)
        {
            dow_counter++;
            if((offset + j)%7 == 1) str += '\t<tr id="'+click_id_week+j+'"><td><a href="#" class="cal_datepicker" onclick="this.blur(); return Calendar.WeekClicked(\''+(j)+'\');">&gt;</a></td>\n';
            str += '<td';
            if((offset + j)%7 == 0) str += ' class="cal_weekend"'; // воскресенье
            str += '><a id="'+click_id+j+'" href="#" onclick="this.blur(); return Calendar.DateClicked(\''+j+'\')" class="cal_datepicker">'+ j +'</a></td>\n';
            if((offset + j)%7 == 0) { str += '</tr>\n'; dow_counter = 0; }
        }
        
        if(dow_counter != 0)
        {
            for(var i=dow_counter+1, j=1;i <= 7;i++,j++)
            {
                str += '<td class="cal_grey">'+j+'</td>';
            }
            str += '</tr>\n';
        }
        
        str += '</table></div>\n';
        str += '<p id="cal_status_bar"></p>\n';
        jQuery('#'+this.container).html(str);
        this.RenderStatusBar();
        if(this.first_call)
        {
            this.first_call = false;
            this.last_clicked_day = '#cal_date_id_' + this.selected_day.getFullYear() + this.selected_day.getMonth() + this.selected_day.getDate();
            $(this.last_clicked_day).addClass('selected_click');
            this.dateClickedFn(this.selected_day.getFullYear(), this.selected_day.getMonth()+1, this.selected_day.getDate());
        }
    },
    
    DateClicked: function(d)
    {
        this.ClearLastClicks();
        
        this.last_clicked_day = '#cal_date_id_' + this.this_month.getFullYear() + this.this_month.getMonth() + d;
        $(this.last_clicked_day).addClass('selected_click');
        this.selected_day.setFullYear(this.this_month.getFullYear(), this.this_month.getMonth(), d);
        
        this.RenderStatusBar();
        
        this.dateClickedFn(this.this_month.getFullYear(), this.this_month.getMonth()+1, d);
        
        return false;
    },
    
    WeekClicked: function(d) // понедельник недели
    {
        this.ClearLastClicks();
        
        this.last_clicked_week = '#cal_week_id_' + this.this_month.getFullYear() + this.this_month.getMonth() + d;
        $(this.last_clicked_week).addClass('week_selected_click');
        this.selected_day.setFullYear(this.this_month.getFullYear(), this.this_month.getMonth(), d);
        this.RenderStatusBar();
        this.weekClickedFn(this.this_month.getFullYear(),this.this_month.getMonth()+1,d);
        return false;
    },
    
    PrevMonth: function()
    {
        var y = this.this_month.getFullYear();
        var m = this.this_month.getMonth();
        
        this.last_clicked_day = '#';
        this.last_clicked_week = '#';
        
        if(m == 0)
        {
            this.this_month.setFullYear(y-1, 11, 1);
            //this.selected_day.setFullYear(y-1, 11, 1);
        }
        else
        {
            this.this_month.setFullYear(y, m-1, 1);
            //this.selected_day.setFullYear(y, m-1, 1);
        }
        
        this.Draw();
        
        return false;
    },
    
    NextMonth: function()
    {
        var y = this.this_month.getFullYear();
        var m = this.this_month.getMonth();
        
        this.last_clicked_day = '#';
        this.last_clicked_week = '#';
        
        if(m == 11)
        {
            this.this_month.setFullYear(y+1, 0, 1);
            //this.selected_day.setFullYear(y+1, 11, 1);
        }
        else
        {
            this.this_month.setFullYear(y, m+1, 1);
            //this.selected_day.setFullYear(y, m+1, 1);
        }
        
        this.Draw();
        
        return false;
    },
    
    ClearLastClicks: function()
    {
        if(this.last_clicked_day != '#') $(this.last_clicked_day).removeClass('selected_click');
        if(this.last_clicked_week != '#') $(this.last_clicked_week).removeClass('week_selected_click');
    },
    
    RenderStatusBar: function()
    {
        $('#cal_status_bar').html( LocaleStrings.dow[this.selected_day.getDay()]+', '+this.selected_day.getDate()+' '+LocaleStrings.month[this.selected_day.getMonth()]+' '+this.selected_day.getFullYear()+LocaleStrings.year);
    }
};
