function CPCalendar()
{
	this.onclick_before = '';
	this.onclick_after = '';
	this.onclose_before = '';
	this.onclose_after = '';
	this.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	this.view_year = 0;
	this.view_month = 0;
	this.sel_year = 0;
	this.sel_month = 0;
	this.sel_mday = 0;
	this.sel_cell = null;
}

CPCalendar.prototype.load = function(dt_obj)
{
	for (var week = 1; week <= 6; week++) for (var day = 1; day <= 7; day++) {
		var cell = document.getElementById('dt_' + week + day);
		cell.innerHTML = '.';
		cell.onclick = function() { dt_obj.onclick(this); }
	}
}

CPCalendar.prototype.onclick = function(obj)
{
	if (this.onclick_before != '') var def = eval(this.onclick_before);

	if (typeof def == 'undefined' || def) {
		var mday = parseInt(obj.innerHTML);
		if (isNaN(mday)) return;
		if (this.sel_cell) this.sel_cell.className = 'dt_normal';

		obj.className = 'dt_selected';
		this.sel_year = this.view_year;
		this.sel_month = this.view_month;
		this.sel_mday = mday;
		this.sel_cell = obj;
	}

	if (this.onclick_after != '') eval(this.onclick_after);
}

CPCalendar.prototype.onclose = function(dt_id)
{
	if (this.onclose_before != '') var def = eval(this.onclose_before);

	if (typeof def == 'undefined' || def) {
		document.getElementById(dt_id).style.display = 'none';
	}

	if (this.onclose_after != '') eval(this.onclose_after);
}

CPCalendar.prototype.init = function(init_str)
{
	var dt = new Date(init_str);
	if (isNaN(dt.getFullYear())) {
		var m;
		if (m = init_str.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})/)) dt = new Date(m[1], m[2] - 1, m[3]);
		else dt = new Date();
	}

	dt.setHours(0, 0, 0, 0);
	this.sel_year = dt.getFullYear();
	this.sel_month = dt.getMonth();
	this.sel_mday = dt.getDate();
	this.print(dt);
}

CPCalendar.prototype.set_month = function(diff)
{
	dt = new Date(this.view_year, this.view_month + diff, 1);
	this.print(dt);
}

CPCalendar.prototype.set_year = function(diff)
{
	dt = new Date(this.view_year + diff, this.view_month, 1);
	this.print(dt);
}

CPCalendar.prototype.print = function(dt)
{
	dt.setHours(0, 0, 0, 0);
	dt2 = new Date(dt.getFullYear(), dt.getMonth() + 1, 0);
	var days_in_month = dt2.getDate();

	this.view_year = dt.getFullYear();
	this.view_month = dt.getMonth();
	this.sel_cell = null;

	document.getElementById('dt_month').innerHTML = this.months[this.view_month];
	document.getElementById('dt_year').innerHTML = this.view_year;	

	dt.setDate(1);
	var mday = dt.getDay() == 0 ? -6 : -dt.getDay() + 1;

	for (var week = 1; week <= 6; week++) {
		for (var day = 1; day <= 7; day++) {
			mday++;
			cell = document.getElementById('dt_' + week + day);
			if (mday < 1 || mday > days_in_month) {
				cell.className = 'dt_empty';
				cell.innerHTML = '&nbsp;';
			}
			else {
				var sel = this.view_year == this.sel_year && this.view_month == this.sel_month && mday == this.sel_mday;

				cell.className = sel ? 'dt_selected' : 'dt_normal';
				cell.innerHTML = mday;

				if (sel) this.sel_cell = cell;
			}
		}
	}
}
