var myCalendar = {

	holder: $('#cal'),
	
	arr_months: new Array("January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"),
	arr_weekdays: new Array("Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"),

	selected: {},
	
	show: function(d) {
		
		if (d) {
			d = new Date(parseInt(d));
			
			if (!parseInt(d.valueOf())) {
				d = new Date();
			}
		}
		else {
			d = new Date();
		}
		
		this.selected = d;
		
		/*
		 * Previous month
		 */
		var pm = new Date(d);
		pm.setMonth(pm.getMonth() - 1);
		if (pm.getDate() != d.getDate()) pm.setDate(0);
		
		/*
		 * Next month
		 */
		var nm = new Date(d);
		nm.setMonth(nm.getMonth() + 1);
		if (nm.getDate() != d.getDate()) nm.setDate(0);
	
		/*
		 * creating calendar table
		 */
	
		var thead = $('<table>');
		thead.addClass('head');
		
		var tr = $('<tr>');
		
		var td = $('<td>');
		var a = $('<a></a>');
		a.attr({id: pm.valueOf(), href: 'javascript: void(0);'})
		.append('<img src="/gfx/cal-prev.gif" alt="prev" title="previous month" />')
		.click(function(e) {
			myCalendar.show(this.id);
		});
		td.css('text-align','left').append(a).appendTo(tr);
		
		td = $('<td>');
		td.append(this.arr_months[d.getMonth()]+' '+d.getFullYear()).appendTo(tr);

		td = $('<td>');
		a = $('<a></a>');
		a.attr({id: nm.valueOf(), href: 'javascript: void(0);'})
		.append('<img src="/gfx/cal-next.gif" alt="next" title="next month" />')
		.click(function(e) {
			myCalendar.show(this.id);
		});
		td.css('text-align','right').append(a).appendTo(tr);
		
		tr.appendTo(thead);
		
		var tbody = document.createElement('table');
		$(tbody).addClass('body');
		tbody.cellPadding = '3';
		tbody.cellSpacing = '1';
	
		/*
		 * creating weekdays headers
		 */
		var tr = $('<tr>');
		
		for (var i=0; i<7; i++) {
			var td = $('<td>');
			td.addClass('headers');
			td.append(this.arr_weekdays[(1+i)%7]).appendTo(tr);
		}
		tr.appendTo($(tbody));
		 
		/*
		 * First day of a week. Might be one of the last days of a previous month
		 */
		var fd = new Date(d);
		fd.setDate(1);
		fd.setDate(1 - (6 + fd.getDay()) % 7);

		/*
		 * creating calendar
		 */
		var cd = new Date(fd);
		
		while (cd.getMonth() == d.getMonth() || cd.getMonth() == fd.getMonth())
		{
			var tr = $('<tr>');
				
			for (var i=0; i<7; i++)
			{
				var td = $('<td>');
				
				if (cd.getDate() == d.getDate() && cd.getMonth() == d.getMonth()) {
					td.addClass('today');
				}
				else if (cd.getDay() == 0 || cd.getDay() == 6) {
					td.addClass('weekend');
				}
				else {
					td.addClass('weekday');
				}

				var a = $('<a></a>');
				a.append(cd.getDate());
				a.attr({id: cd.valueOf(), href: 'javascript: void(0);'});
				a.click(function(e) {
					myCalendar.setDate(this.id);
				});
				
				if (cd.getMonth() != d.getMonth()) {
					a.addClass('inact');
				}
					
				td.append(a).appendTo(tr);
				cd.setDate(cd.getDate()+1);
			}
				
			tr.appendTo($(tbody));
		}

		var tbl = $('<table>');

		var tr = $('<tr>');
		var td = $('<td>');
		thead.appendTo(td);
		td.appendTo(tr);
		tr.appendTo(tbl);
		
		tr = $('<tr>');
		td = $('<td>');
		$(tbody).appendTo(td);
		td.appendTo(tr);
		tr.appendTo(tbl);

		this.holder.empty().append(tbl);
		
	},
	
	setDate: function(stamp) {
		this.show(stamp);
	},

	getSelectedDate: function() {
		return this.selected.getFullYear()+"-"+(this.selected.getMonth()<9?'0':'')+(this.selected.getMonth()+1)+"-"+(this.selected.getDate() < 10 ? '0' : '') + this.selected.getDate();
	}
}
