String.prototype.toDate = function(){
	var val	= this.valueOf();
	if(val != ''){
		var s	= val.split('.', 3);
		return new Date(s[2], Number(s[1])-1, s[0]);
	}
	return new Date();
}

function Calendar(date, min, max){
	this.cal	= $('#calendar');
	this.path	= this.cal.attr('keywords');
	this.min_date	= String(min).toDate();
	this.cal_date	= new Date();
	this.c_date		= String(date).toDate();
	this.max_date	= String(max).toDate();
	this.draw();
}

Calendar.prototype = {
	draw : function(){
		var html = this.gen();
		this.cal.html(html);
		this.initEvents();
	},
	daysInMonth : function(month, year){
		var daysInMonthes = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		if (month == 1) {
			return year % 4 ? 28 : 29;
		}
		return daysInMonthes [month];
	},
	initEvents : function(){
		var oThis	= this;
		this.links = this.cal.find('a');
		this.links.bind('click', function(){return oThis.click(this)});
	},
	clearEvents : function(){
		if(this.links) this.links.unbind('click', function(){return oThis.click(this)});
	},
	click : function(obj){
		this.clearEvents();
		var str	= String(obj.href);
		var ps	= str.lastIndexOf('/');
		if(ps > 0){
			str	= str.substr(ps+1, str.length - ps);
		}
		var s	= str.split(',', 3);
		if(s.length == 3){
			s[2]	= (s[2] < 10 ? '0' : '') + s[2];
			s[1]	= (s[1] < 10 ? '0' : '') + s[1];
			this.c_date	= new Date(s[0], s[1]-1, s[2]);
			location.href = (this.path ? this.path : 'index.php') + '?d=' + s[2] + '.' + s[1] + '.' + s[0];
		}else{
			this.c_date.setMonth(this.c_date.getMonth() + Number(s[0]));
		}
		this.draw();
		return false;
	},
	gen : function(){
		var months	= new Array("ßíâàðü","Ôåâðàëü","Ìàðò","Àïðåëü","Ìàé","Èþíü","Èþëü","Àâãóñò","Ñåíòÿáðü","Îêòÿáðü","Íîÿáðü","Äåêàáðü");
		var weeks	= new Array("Ïí","Âò","Ñð","×ò","Ïò","Ñá","Âñ");
		var cYear	= this.c_date.getFullYear();
		var cMonth	= this.c_date.getMonth();
		var txt = '';
		txt += '<table border="0" cellpadding="0" cellspacing="0" width="200" class="calendar_body">';
		txt += '<tr class="years">';
		if( cYear*12+cMonth-12 < this.min_date.getFullYear()*12+this.min_date.getMonth() ){
			txt += '<td width="30" align="right">&nbsp;</td>';
		}else{
			txt += '<td width="30" align="right"><a href="-12">&laquo;</a></td>';
		}
		txt += '<td align="center">';
		txt += cYear;
		txt += '</td>';
		if( cYear*12+cMonth+12 < this.max_date.getFullYear()*12+this.max_date.getMonth() ){
			txt += '<td width="30" align="left"><a href="12">&raquo;</a></td>';
		}else{
			txt += '<td width="30" align="left">&nbsp;</td>';
		}
		txt += '</tr>';
		txt += '<tr class="months">';
		if( cYear*12+cMonth-1 < this.min_date.getFullYear()*12+this.min_date.getMonth() ){
			txt += '<td width="30" align="right">&nbsp;</td>';
		} else {
			txt += '<td width="30" align="right"><a href="-1">&laquo;</a></td>';
		}
		txt += '<td align="center" id="headMonth">'+months[cMonth]+'</td>';
		if(cYear*12+cMonth+1 < this.max_date.getFullYear()*12+this.max_date.getMonth()+1 ){
			txt += '<td width="30" align="left"><a href="1">&raquo;</a></td>';
		}else{
			txt += '<td width="30" align="left">&nbsp;</td>';
		}
		txt += '</tr>';
		txt += '</table>';
		txt += '<table border="0" cellpadding="1" cellspacing="1" width="200" class="calendar_body">';
		txt += '<tr class="days">';
		for (var i = 0; i < weeks.length; i++) {
			txt += '<td>';
			txt += weeks[i];
			txt += '</td>';
		}
		txt += '</tr>';
		var startDay 	= (new Date(cYear, cMonth, 0)).getDay();
		var dayOfMonth	= 0;
		var layerNum	= 0;
		var daysCount	= this.daysInMonth(cMonth, cYear);
		var curr_date	= this.cal_date;
		for (var j = 0; j < 6; j++) {
			if (j == 0 || j == 2 || j == 4) {
				txt += '<tr align="center">';
			} else {
				txt += '<tr align="center">';
			}
			for (var k = 0; k < 7; k++) {
				if ((j == 0 && k < startDay) || (dayOfMonth == daysCount)) {
					txt += '<td id="textDay">&nbsp;';
				} else {
					if ( dayOfMonth==this.c_date.getDate()-1 && cMonth==this.c_date.getMonth() && cYear==this.c_date.getFullYear() ) {
						txt += '<td id="textDaySel">';
					} else if (dayOfMonth == curr_date.getDate()-1 && cMonth == curr_date.getMonth() && cYear == curr_date.getFullYear()) {
						txt += '<td id="textDayOn">';
					} else {
						txt += '<td id="textDay">';
					}
					if ((dayOfMonth < (this.min_date.getDate() - 1)) && (cMonth == this.min_date.getMonth()) && (cYear == this.min_date.getFullYear())) {
						txt += (++dayOfMonth);
					} else {
						if ((dayOfMonth > (this.max_date.getDate() - 1)) && (cMonth == this.max_date.getMonth()) && (cYear == this.max_date.getFullYear())) {
							txt += (++dayOfMonth);
						} else {
							if ((dayOfMonth == (curr_date.getDate() - 1)) && (cMonth == curr_date.getMonth()) && (cYear == curr_date.getFullYear())) {
								txt += '<a id="linkDayOn"';
							} else {
								txt += '<a id="linkDay"';
							}
							txt += ' href="'+cYear + ','+(cMonth + 1)+','+(dayOfMonth+1)+'">';
							txt += (++dayOfMonth);
							txt += '</a>';
						}
					}
					layerNum++;
				}
				txt += '</td>';
			}
			txt += '</tr>';
		}
		txt += '</table>';
		return txt;
	}
}
