function Calendar(oDate, selectCallback)
{
	this.oDate = oDate;
	this.selectCallback = selectCallback;

	this.draw = function()
	{
		this.oDate.setMonth(this.oDate.getMonth()+1, 0);
		//alert(this.oDate.toString());

		var html;
		var rel;
		var dayOfMonth = this.oDate.getDate();
		var dayOfWeek = this.oDate.getDay();
		
		$('.cal_day').removeClass('cal_today cal_event_day cal_sel').html('');

		oDateToday = new Date();
		var month;
		var year;

		for (var i = (35 + dayOfWeek); dayOfMonth > 0; --i)
		{
			rel = String(year = this.oDate.getFullYear()) + '-' + this.zeroPad((month = this.oDate.getMonth())+1) + '-' + this.zeroPad(dayOfMonth);
			$('#cal' + i).attr('rel', rel).html(dayOfMonth--).click(function()
			{
				$('.cal_day').removeClass('cal_sel');
				$(this).addClass('cal_sel');
				// @@@ hack for now
				oCal.selectCallback.call(undefined, $(this).attr('rel'));
			});
			if ((year == oDateToday.getFullYear()) && (month == oDateToday.getMonth()) && (dayOfMonth == (oDateToday.getDate()-1)))
			{
				$('#cal' + i).addClass('cal_today');
			}
		}

		var str = (this.oDate.getMonth()+1) + '/' + this.oDate.getFullYear();
		$('#cal_title').html(str);
		oGCal.highlightDays(year + this.zeroPad(month+1) + '01');
	}

	this.nextMonth = function()
	{
		this.oDate.setMonth(this.oDate.getMonth()+1, 1);
		this.draw();
	}

	this.prevMonth = function()
	{
		this.oDate.setMonth(this.oDate.getMonth()-1, 1);
		this.draw();
	}

	this.zeroPad = function(n)
	{
		return (n>=10) ? String(n) : '0' + String(n);
	}

	this.draw();
}