cal_days_labels = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
cal_months_labels = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
cal_days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
cal_current_date = new Date();

function Calendar(month, year) {
    this.month = (isNaN(month) || month == null) ? cal_current_date.getMonth() : month;
    this.year  = (isNaN(year) || year == null) ? cal_current_date.getFullYear() : year;
    this.html = '';
}

function trim(string) {
	return string.replace(/(^\s+)|(\s+$)/g, "")
}


Calendar.prototype.generateHTML = function(){

    // get first day of month
    var firstDay = new Date(this.year, this.month, 1);
    if ( firstDay.getDay() == 0 )
        startingDay = 6
    else
        startingDay = firstDay.getDay()-1;
    // find number of days in month
    
    if ( this.month > 0 )
        prevMonth = this.month - 1;
    else if ( this.month == 0 )
         prevMonth = 11;
	if ( this.month >= 0 && this.month < 11 )
		nextMonth = this.month*1 + 1;
	else if ( this.month == 11 )
		nextMonth = 0;
	  
    var monthLength = cal_days_in_month[this.month];
    monthLength1 = cal_days_in_month[prevMonth];
    // compensate for leap year
    if (this.month == 1 ) { // February only!
        if((this.year % 4 == 0 && this.year % 100 != 0) || this.year % 400 == 0){
            monthLength = 29
        }
    }
    if ( prevMonth == 1) { // February only!
        if((this.year % 4 == 0 && this.year % 100 != 0) || this.year % 400 == 0){
            monthLength1 = 29
        }
    }
    daysPrevMonth = monthLength1 - startingDay + 1;
    
    ostatok = monthLength - 28;
    weekQ = ostatok + startingDay;
    if ( weekQ > 7 )
        cols = 6;
    else if ( weekQ <= 7 && weekQ > 0)
        cols = 5;
    else
        cols = 4;
    
	currDate = document.getElementById('current-date').innerHTML;
	currDate = currDate.split(' ');
	
	currGetDate = document.getElementById('current-get-date').innerHTML;
	currGetDate = currGetDate.split(' ');
		
	minDate = document.getElementById('min-date').innerHTML;
	minDate = minDate.split(' ');
	
	if( this.year == currDate[2] || ( this.month > currDate[1] && this.year == currDate[2]*1 - 1 ) ){
		addHtml = '<span>';
		addHtml2 = '</span>'
	}
	else{
		addHtml = '<a href="#" class="yearnext">';
		addHtml2 = '</a>'
	}
	
	if( this.year > 2009 ){
		addHtml_prev = '<a href="#" class="yearprev">';
		addHtml_prev2 = '</a>'
	}
	else if( ( this.year == minDate[2] ) || (this.month < minDate[1] && this.year == minDate[2]*1 + 1 ) ){
		addHtml_prev = '<span>';
		addHtml_prev2 = '</span>'
	}
	else{
		addHtml_prev = '<a href="#" class="yearprev">';
		addHtml_prev2 = '</a>'
	}
	
	dateList = dateList2 = trim(document.getElementById('date-list').innerHTML);
	dateList = dateList.split('*');
	
	my_url = document.getElementById('url').innerHTML;
  // do the header
    var monthName = cal_months_labels[this.month];
	var html = '<div class="title"><div class="left">' + monthName +'<b class="currMonth">' + this.month + '</b></div><div class="right">' + addHtml_prev + '<' + addHtml_prev2 + ' <span class="currYear">' + this.year + '</span> ' + addHtml + '>' + addHtml2 + '</div></div>';
	html += '<table>';
     
    // fill in the days
    var day = 1;
    day2 = day;
    
    day1 = 8 - startingDay;    
    firstDayWeek1 = day1;
    
    for (var i = 0; i < startingDay; i++) {
        html += '<th>' + cal_days_labels[i] + '</th>';
        if (day <= monthLength) {
            
			for (var j = 0; j < cols; j++) {
				
				currDate2 = day1 + ' ' + this.month + ' ' + this.year;
				addHtml ='';
				addHtml2 ='';
				if( ( day1 == currGetDate[0] ) && ( this.month == currGetDate[1] ) && ( this.year == currGetDate[2] ) )
					my_class = ' class="act"';
				else
					my_class ='';
				for ( k = 0; k <= dateList.length; k++ ){
					if( dateList[k] == currDate2 ){
						addHtml = '<a' + my_class + ' href="' + my_url + '?year=' + this.year + '&month=' + (this.month*1 + 1) + '&day=' + day1 + '">';
						addHtml2 = '</a>'
					}
				}				
				if ( j == 0 )
					html += '<td class="gray">' + daysPrevMonth + '</td>';
                else {
                    if ( day1 <= monthLength ){
						if ( day1 < 10 )
							html += '<td>' + addHtml + '0' + day1 + addHtml2 + '</td>';
						else
							html += '<td>' + addHtml + day1 + addHtml2 + '</td>';
                        day1 += 7;
                    }
                    else {
                        day1 = day1 - monthLength;
						if ( day1 < 10 )
							html += '<td class="gray">0' + day1 + '</td>';
						else
							html += '<td class="gray">' + day1 + '</td>'
                    }
                }                
            }
        }
        html += '</tr><tr>';
        day1 = firstDayWeek1 + 1;
        firstDayWeek1 ++;
        daysPrevMonth ++;
    }
	my_class ='';
    
    for (var i = startingDay; i < 7; i++) {
        html += '<th>' + cal_days_labels[i] + '</th>';
        for (var j = 0; j < cols; j++) {
			
			currDate2 = day + ' ' + this.month + ' ' + this.year;
			addHtml ='';
			addHtml2 ='';
			if( ( day == currGetDate[0] ) && ( this.month == currGetDate[1] ) && ( this.year == currGetDate[2] ) )
					my_class = ' class="act"';
			for ( k = 0; k <= dateList.length; k++ ){
				if( dateList[k] == currDate2 ){
					addHtml = '<a' + my_class + ' href="' + my_url + '?year=' + this.year + '&month=' + (this.month*1 + 1) + '&day=' + day + '">';
					addHtml2 = '</a>'
				}
			}
			if (day <= monthLength) {
				if ( day == currDate[0] && this.month == currDate[1] && this.year == currDate[2] )
					my_class = ' class="act"';
				else
					my_class = '';
				if ( day < 10 )
					html += '<td' + my_class + '>' + addHtml + '0' + day + addHtml2 + '</td>';
				else
					html += '<td' + my_class + '>' + addHtml +  day + addHtml2 + '</td>';
				day += 7;
			}
			else{
				day = day - monthLength;
				if ( day < 10 )
					html += '<td class="gray">0' + day + '</td>';
				else
					html += '<td class="gray">' + day + '</td>'
			}            
        }
        html += '</tr><tr>';
        day = day2 + 1;        
        day2 ++;
    }
    html += '</tr></table>';
	if ( this.month == currDate[1] && this.year == currDate[2] ){
		addHtml = '<span>';
		addHtml2 = '</span>';
	}
	else {
		addHtml = '<a href="#" class="monthNext">';
		addHtml2 = '</a>';
	}
	if( (this.month == minDate[1] && this.year == minDate[2]) ){
		addHtml_prev = '<span>';
		addHtml_prev2 = '</span>';
	}
	else{
		addHtml_prev = '<a href="#" class="monthPrev">';
		addHtml_prev2 = '</a>';
	}
	
	html += '<div class="title bot-title"><div class="left">' + addHtml_prev + '< ' + cal_months_labels[prevMonth] + addHtml_prev2 + '</div><div class="right">' + addHtml + cal_months_labels[nextMonth] + ' >' + addHtml2 + '</div></div>';
	
    this.html = html
}

Calendar.prototype.getHTML = function() {
  return this.html;
}