month_names = ['Январь','Февраль','Март','Апрель','Май','Июнь', 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'];
HI = []
LOADED_DATA = Array();
MAX_YEARS = 3;
ANIMATION_TIME = 300;
CALENDAR_ANIMATION_HIDE = 100;
CALENDAR_ANIMATION_SHOW = 350;
SCRIPT_PATH = '/media/js/dyn/'
function GetMonth(year, month){
	/* last day in month */
	cur_month = new Date(year, month+1, 1);
	last = new Date(cur_month-1);
	return last;
}
function calendar(_year, _month){
    // year - год
    // month - месяц (0-январь, 11 - декабрь)
	if(_year!=0){
		var today = new Date(_year, _month, 1);
	}else{
		var today = new Date();
	}
	month = today.getMonth();
	year = today.getFullYear();
    _year_p = year;
    _year_n = year;
    _month_p = _month-1;
    _month_n = _month+1;
	if (_month==0){
        _year_p = _year-1;
        _month_p = 11;
    }else if(_month==11){
        _month_n = 0;
        _year_n = _year+1;
    }
    var load_year = 0;
    if(_year_n!=year){
        load_year = _year_n;
    }else if(_year_p!=year){
        load_year = _year_p;
    }
    if(load_year!=0){
        $.getScript(SCRIPT_PATH+"holidays-"+load_year+".js", function(){
                        LOADED_DATA['y'+load_year] = HI;
        });
    }

	calend  = ''
	calend += ('<table>')
	calend += ('<tr class="ctop"><td class="pointer"><b><a onclick="javascipt:upd_calendar('+_year_p+','+(_month_p)+');">&laquo;</a></b></td>');
    calend += ('<td colspan="5" class="cmonth">'+month_names[month]+' '+year);
    calend += ('</td><td class="pointer");"><b><a onclick="javascipt:upd_calendar('+_year_n+','+(_month_n)+');">&raquo;</a></b></td></tr>');
	calend += ('<tr>');
	days = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', '<b>вс</b>']
	for(d in days) calend += ('<td class="days">'+days[d]+'</td>');
	calend += ('</tr>');
	prev_month = GetMonth(year, month-1);
	cur_month = GetMonth(year, month);
	day_of_week = prev_month.getDay()
	if(day_of_week==0){day_of_week=7;}
	cday = -day_of_week%7;
	last_day = cur_month.getDate();
	while(cday< last_day){
		var s = "";
		s = "<tr>"
		for(i=0;i<7;i++){
			if(cday>=0&&cday<last_day){s += "<td class='day' id='d"+(cday+1)+"'>"+(cday+1)+"</td>";}
			else{s += "<td></td>";}
			cday += 1;
		}
		s += "</tr>"
		calend += (s);
	}
	calend += ('</table>');
	return (calend);
}


function bind_hint(year, month, type){
    //today
    if(type=='today'&&HI['today']){
        if(month==today.getMonth() && year==today.getFullYear()){
            $('#id_cal #d'+today.getDate()).addClass('today');
        }
    }
    // weekly
    if(type=='weekly'){
        if(HI['weekly']){
                var days = set(HI['weekly']);
                var prev_month = GetMonth(year, month-1);
                var day_of_week = prev_month.getDay()
                $("#id_cal .day").filter(function (index) {
                      return (index + day_of_week)%7 in days
                    })
                .removeClass().addClass('weekly');
                $("#id_cal .days").filter(function (index) {
                      return index in days
                    })
                .removeClass().addClass('weekly');
        }
    }
    // days data
    if(!HI['m'+month]) return;
    if(!HI['m'+month][type]) return;
    var data = HI['m'+month][type]
    for(elem in data)
    {   // elem - описание происходящего
        elem=data[elem]
        for(var x=elem['s']; x<=elem['e']; x++)
        {   // даты
            $("#id_cal #d"+x).removeClass().addClass('day').addClass(type)
            .attr('title', elem['n'])
            .unbind('click').click(
                function(e){
                    hint = $("#id_cal_hint");
                    // если подсказка уже показана
                    if((!hint.is(":hidden")) && hint.html()!=$(e.target).attr('title')){
                            hint.animate({opacity: 0}, ANIMATION_TIME, function() {
                                hint.removeClass()
                                    .addClass('calendar_hint')
                                    .html($(e.target).attr('title'))
                                    .addClass(type)
                                    .animate({opacity: 1}, ANIMATION_TIME, function() {})
                            });
                    }
                    // подсказка скрыта
                    else if (hint.is(":hidden")) {
                                    hint.html($(e.target).attr('title'));
                                    hint.removeClass()
                                    .addClass('calendar_hint')
                                    .addClass(type);
                                    hint.slideDown("fast");
                    }
                    // скрыть подсказку
                    else {
                                    hint.slideUp("fast");
                    }
                }
            );
        }
    }
}

function calendar_highlight(year, month, today)
{
    for(t in HI['priority']){
        bind_hint(year, month, HI['priority'][t])
    }
}
function upd_calendar(year, month, no_effect){
	today = new Date();
	// holidays
	if(year==0){
        month = today.getMonth();
        year = today.getFullYear();
	}
    calhtml = calendar(year,month);
    var op = 0;
    if(no_effect){
        var CALENDAR_ANIMATION_HIDE = 1;
        var CALENDAR_ANIMATION_SHOW = 0;
        op = 1;
    }
	$("#id_cal_hint").html('').slideUp("fast", function(){
        cal = $('#id_cal');
        cal.animate(
            {opacity: op}, CALENDAR_ANIMATION_HIDE,
            function() {
                cal.html(calhtml);
                if(!LOADED_DATA['y'+year]){
                    $.getScript(SCRIPT_PATH+"holidays-"+year+".js", function(){
                        LOADED_DATA['y'+year] = HI;
                        calendar_highlight(year,month,today);
                        cal.animate({ opacity: 1}, CALENDAR_ANIMATION_SHOW, function() {  });
                    });
                    //
                    //if(LOADED_DATA.length>MAX_YEARS){
                    //    LOADED_DATA.shift();
                    //}
                }else{
                    HI = LOADED_DATA['y'+year];
                    calendar_highlight(year,month,today);
                    cal.animate({ opacity: 1}, CALENDAR_ANIMATION_SHOW, function() {  });
                }
            }
        );
        return;
    });
}
function set (list){
    var result = {};
    for (var i = 0; i < list.length; i++)
        result[list[i]] = true;
    return result;
}
$(document).ready(function(){
    $.ajaxSettings.cache = true;
	upd_calendar(0,0,true);
	dready = true;
});

