var iCal = {
	fill: function( cmonth, cyear ) {
		var row = 0;
		var col = 0;

		if ( !cmonth || !cyear ) {
			var cd = iCal.getCurDate();
			cmonth = cd.month;
			cyear = cd.year;
		}

		iCal.smonth = cmonth;
		iCal.syear = cyear;

		to = document.getElementById( "calendar" );

		if ( !to ) {
			to = document.getElementById( "calPlace" );

			if ( !to ) return;
			to.innerHTML = '<table cellspacing="0" cellpadding="0" border="0" id="calendar"><tr valign="middle" class="cnt"><td colspan="2" align="center"><a href="#">&lt;</a></td><td colspan="3">2009</td><td colspan="2" align="center"><a href="#">&gt;</a></td></tr><tr valign="middle" class="hdr"><td>ïí</td><td>âò</td><td>ñð</td><td>÷ò</td><td>ïò</td><td class="holiday">ñá</td><td class="holiday norb">âñ</td></tr><tr valign="middle"><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td></tr><tr valign="middle"><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td></tr><tr valign="middle"><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td></tr><tr valign="middle"><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td></tr><tr valign="middle"><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td></tr><tr valign="middle"><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td><td>&#160;</td></tr></table>';
			to = document.getElementById( "calendar" );

			var as = to.rows[0].getElementsByTagName( "a" );
			as[0].onclick = function() { iCal.prev(); return false; };
			as[1].onclick = function() { iCal.next(); return false; };

			if ( !to ) return;
		}
		to = to.getElementsByTagName( "tbody" )[0];

		to.rows[0].cells[1].innerHTML = iCal.monthNames[ cmonth - 1 ] + "." + cyear;


		var row = 0;
		var col = 0;
		var month, year, day, count = 0;
		var cmwd = iCal.getWeekDay( 1, cmonth, cyear );
		var cd = iCal.getCurDate();

		while ( true ) {
			count++;

			var cmd = iCal.getMonthDays( cmonth, cyear );
			var cn = "";
			if ( count <= cmwd ) {
				if ( cmonth == 1 ) {
					month = 12;
					year = cyear - 1;
				}
				else {
					month = cmonth - 1;
					year = cyear;
				}
				cn += " prevORnext";
				day = iCal.getMonthDays( month, year ) - cmwd + count;
			}
			else if ( count > cmwd + cmd ) {
				if ( cmonth == 12 ) {
					month = 1;
					year = cyear + 1;
				}
				else {
					month = cmonth + 1;
					year = cyear;
				}
				cn += " prevORnext";
				day = count - cmwd - cmd;
			}
			else {
				month = cmonth;
				year = cyear;
				day = count - cmwd;
			}

			var ti = to.rows[row + 2].cells[col];
			ti.onmouseover = function() { this.className = this.className.replace( / sel$/i, "" ) + " sel"; };
			ti.onmouseout = function() { this.className = this.className.replace( / sel$/i, "" ); };
			ti.innerHTML = day;
			ti.year = year;
			ti.month = month;
			ti.day = day;

			if ( col >= 5 ) cn += " holiday"
			if ( day == cd.day && month == cd.month && year == cd.year ) cn += " curr";

			var dayTitle = iCal.isMarked( day, month, year );

			if ( ti.titleCloud ) {
				ti.titleCloud = null;
				$(ti.titleCloud).remove();
			}

			if ( dayTitle != null ) {
				cn += " marked";
				ti.title = dayTitle;
				$( ti ).showTitle();
			}
			else ti.title = "";

			if ( col == 6 ) cn += " norb";
			if ( row == 5 ) cn += " nobb";
			ti.className = cn;
			ti.onclick = function() { iCal.dayClick( this ); };

			col++;
			if ( col > 6 ) {
				col = 0;
				row++;
				if ( row >= 6 ) break;
			}
		}
	},

	prev: function() {
		if ( !iCal.smonth || !iCal.syear ) return;

		iCal.smonth--;
		if ( iCal.smonth == 0 ) {
			iCal.smonth = 12;
			iCal.syear--;
		}

		iCal.fill( iCal.smonth, iCal.syear );
	},

	next: function() {
		if ( !iCal.smonth || !iCal.syear ) return;

		iCal.smonth++;
		if ( iCal.smonth == 13 ) {
			iCal.smonth = 1;
			iCal.syear++;
		}

		iCal.fill( iCal.smonth, iCal.syear );
	},

	dayClick: function( o ) {
		if ( o.className.indexOf( "marked" ) >= 0 ) {
			showScheduler( o.day + "." + o.month + "." + o.year );
		}
	},

	getMonthDays: function( month, year) {
		var c = iCal.monthDays[month - 1];
		if ( month == 2 ) {
			if ( ( year % 400 ) == 0 ) c++;
			if ( ( year % 4 ) == 0 && ( year % 100 ) != 0 ) c++;
		}

		return c;
	},

	monthDays:	[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
	monthNames:     ["ßíâ","Ôåâ","Ìàð","Àïð","Ìàé","Èþí","Èþë","Àâã","Ñåí","Îêò","Íîÿ","Äåê"],

	getWeekDay: function( day, month, year ) {
		var a = Math.floor( ( 14 - month ) / 12 );
		var y = year - a;
		var m = month + 12 * a - 2;
		var d = ( day + y + Math.floor( y / 4 ) - Math.floor( y / 100 ) + Math.floor( y / 400 ) + Math.floor( ( 31 * m ) / 12 ) ) % 7;
		//d = 0-6 Su,Mo...
		if ( d == 0 ) d = 6; else d--; //Mo,Tu
		return d;
	},

	getCurDate: function() {
		var cd = new Date();
		return { "day": cd.getDate(),  "month": cd.getMonth() + 1, "year": cd.getFullYear() };
	},

	isMarked: function( day, month, year ) {
		var date = ( day < 10 ? "0" : "" ) + day + "." + ( month < 10 ? "0" : "" ) + month + "." + year;
		var retd = null;
		for( var i = 0; i < iCal.markedDays.length; i++ ) {
			if ( iCal.markedDays[i].date == date ) {
				if ( retd == null ) retd = "";
				retd += "<li>" + iCal.markedDays[i].title + "</li>";
			}
		}

		return retd ? "<ul>" + retd + "</ul>" : null;
	},

	markedDays: [ /*{ "date": "20.11.2010", "id": 1, "title": "" }*/ ]
};

