/**********************/ /**********************/
// 2007-05-06: First release
// 2009-02-17: Revision to consolidate versions
/**********************/ /**********************/

// Write the calendar.
with (document) {
	writeln('');
	writeln('<style>');
	writeln('.cpop {');
	writeln('	border-collapse: collapse;');
	writeln('	background:#FFFFFF;');
	writeln('	border: 1px solid #ABABAB;');
	writeln('}');
	writeln('.cpop td {');
	writeln('	text-align: center;');
	writeln('}');
	writeln('.cpop_week {');
	writeln('	background: #ABABAB;');
	writeln('}');
	writeln('.cpop_day {');
	writeln('	background: #C4D3EA;');
	writeln('	width: 18px;');
	writeln('	height: 18px;');
	writeln('	border: 1px solid #ABABAB;');
	writeln('	cursor: pointer;');
	writeln('}');
	writeln('.cpop_day:hover {');
	writeln('	background: #FFCC66;');
	writeln('}');
	writeln('.cpop_unavailable {');
	writeln('	background: #C4D3EA;');
	writeln('	width: 18px;');
	writeln('	height: 18px;');
	writeln('	border: 1px solid #ABABAB;');
	writeln('	text-decoration: line-through;');
	writeln('	color: #ababab;');
	writeln('}');
	writeln('.cpop_null {');
	writeln('	background: #fff;');
	writeln('	width: 18px;');
	writeln('	height: 18px;');
	writeln('	border: 1px solid #ABABAB;');
	writeln('}');
	writeln('.cpop_select {');
	writeln('	background: #FFF799;');
	writeln('	border: 2px solid #6487AE;');
	writeln('}');
	writeln('#cpop_month {');
	writeln('	font-size: 1.25em;');
	writeln('}');
	writeln('</style>');
	writeln('<div id="cpop" style="display:none">');
	writeln('</div>');
}

window.date_now = okDate(new Date());
window.date_origin = okDate(new Date());
window.show_past = true;
window.show_future = true;

/**********************/ /**********************/

// Popup the calendar.
function calendar(element_ID, date_origin, show_past, show_future) {
	window.date_origin = okDate(date_origin);
	window.show_past = show_past;
	window.show_future = show_future;
	window.control = getElement(element_ID);
	button = getElement(element_ID + '_button');

	// Display the calendar.
	getElement('cpop').style.display = 'block';
	getElement('cpop').style.position = 'absolute';
	getElement('cpop').style.top = Top(button) + button.offsetHeight + 'px';
	getElement('cpop').style.left = Left(button) + 'px';
	getElement('cpop').style.zIndex = 101;
	
	// Update calendar data.
	updateCalendar(jDate(window.control.value));
}

// Draw the calendar data.
function updateCalendar(date_this){
	day_this = date_this.getDate();
	month_this = date_this.getMonth();
	year_this = date_this.getFullYear();
	
	date_first = new Date(year_this, month_this, 1);
	day_first = date_first.getDay();
	
	month_names = new Array('Jan','Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
	days_of_week = new Array('S', 'M', 'T', 'W', 'T', 'F', 'S');
	days_in_month = new Array(31, ((year_this % 4 == 0 && year_this % 100 != 0) || year_this % 400 == 0 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	
	update_calendar = '<table class="cpop" cellpadding="2">\n';
	update_calendar += '	<tr>\n';
	if (!window.show_past && (date_this <= window.date_now)){
		update_calendar += '<td><img src="media/a_double_left.png"></td>\n';
	} else {
		update_calendar += '<td style="cursor:pointer" onclick="calendarChange(' + (year_this - 1) + ',' + month_this + ',' + day_this + ')"><img src="media/a_double_left.png"></td>\n';
	}
	if (!window.show_past && (date_this <= window.date_now)){
		update_calendar += '<td><img src="media/a_left.png"></td>\n';
	} else {
		update_calendar += '<td style="cursor:pointer" onclick="calendarChange(' + year_this + ',' + (month_this - 1) + ',' + day_this + ')"><img src="media/a_left.png"></td>\n';
	}
	update_calendar += '<td colspan="3" id="cpop_month">' + month_names[month_this] + ' ' + year_this + '</td>\n';
	if (!window.show_future && (date_this >= window.date_now)){
		update_calendar += '<td><img src="media/a_right.png"></td>\n';
	} else {
		update_calendar += '<td style="cursor:pointer" onclick="calendarChange(' + year_this + ',' + (month_this - (-1)) + ',' + day_this + ')"><img src="media/a_right.png"></td>\n';
	}
	if (!window.show_future && (date_this >= window.date_now)){
		update_calendar += '<td><img src="media/a_double_right.png"></td>\n';
	} else {
		update_calendar += '<td style="cursor:pointer" onclick="calendarChange(' + (year_this - (-1)) + ',' + month_this + ',' + day_this + ')"><img src="media/a_double_right.png"></td>\n';
	}
	update_calendar += '	</tr>\n';
	update_calendar += '	<tr>\n';
	for (day in days_of_week) {
		update_calendar += '<td class="cpop_week">' + days_of_week[day] + '</td>\n';
	}
	update_calendar += '	</tr>\n';
		
	update_calendar += '	<tr>\n';
	column_no = 1;
	for (preceeding_blanks = 0; preceeding_blanks < day_first; preceeding_blanks ++){
		update_calendar += '<td class="cpop_null">&nbsp;</td>\n';
		column_no ++;
	}
	for (day_num = 1; day_num <= (days_in_month[month_this]); day_num ++){
		day_num_date = new Date(year_this, month_this, day_num);
		if ((!window.show_past && (day_num_date < window.date_now)) || (!window.show_future && (day_num_date > window.date_now))){
			update_calendar += '<td id="day_' + day_num + '" class="cpop_unavailable">' + day_num + '</td>\n';
		} else {
			update_calendar += '<td id="day_' + day_num + '" class="cpop_day' + (Date.parse(day_num_date) == Date.parse(date_this) ? ' cpop_select' : '') + '" onclick="cpopSelect(\'' + day_num + '/' + (month_this - (-1)) + '/' + year_this + '\')">' + day_num + '</td>\n';
		}
		column_no ++;
		if (column_no == 8) {
			if (day_num < (days_in_month[month_this])) {
				update_calendar += '	</tr>\n';
				update_calendar += '	<tr>\n';
			}
			column_no = 1;
		}
	}
	if (column_no != 1){
		for (following_blanks = 1; following_blanks < (8 - ((days_in_month[month_this] + day_first) % 7)); following_blanks++){
			update_calendar += '<td class="cpop_null">&nbsp;</td>\n';
		}
	}
	update_calendar += '	</tr>\n';
	update_calendar += '	<tr>\n';
	update_calendar += '<td colspan="7"><span style="cursor:pointer" onclick="cpopSelect(\'' + ukDate(window.date_now) + '\');">Today</span>&nbsp;|&nbsp;<span style="cursor:pointer" onclick="cpopClose();">Close</span></td>\n';
	update_calendar += '	</tr>\n';
	update_calendar += '</table>\n';
	// Calendar data.
	getElement('cpop').innerHTML = update_calendar;
}

// Close the calendar.
function cpopClose(){
	getElement('cpop').style.display = 'none';
}

// Move forward or backward.
function calendarChange(year_this, month_this, day_this){
	date_this = new Date(year_this, month_this, day_this);
	if ((!window.show_past && (date_this < window.date_now)) || (!window.show_future && (date_this > window.date_now))) {
		date_this = window.date_now;
	}
	updateCalendar(date_this)
}

// Select a date.
function cpopSelect(date_selected){
	window.control.value = date_selected;
	cpopClose();
}

// Universal get element reference function.
function getElement(element_ID) {
    if (document.getElementById) {
		return document.getElementById(element_ID);
	} else if (document.all) {
		return document.all[element_ID];
	} else if (document.layers) {
		return document.layers[element_ID];
	}
}

// Get the x-coordinate.
function Left(obj){
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

// Get the y-coordinate.
function Top(obj){
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

// Reset time on a javascript date.
function okDate(date_old) {
	date_new = new Date(Date.parse(date_old));
	year_new = date_new.getFullYear();
	month_new = date_new.getMonth();
	day_new = date_new.getDate();
	date_new = new Date(year_new, month_new, day_new);
	return date_new;
}

// Convert date to javascript date.
function jDate(date_old){
	new_date = date_old.split('/');
	is_date = true;
	for(var date_part = 0; date_part < new_date.length; date_part ++) {
		if (isNaN(new_date[date_part]))
			is_date = false;
	}
	if (is_date & (new_date.length == 3)) {
		new_date = new Date(new_date[2], new_date[1]-1, new_date[0]);
		return new_date;
	} else {
		alert("Warning - supplied date is invalid: " + date_old);
		return false;
	}
}

// Convert a javascript date to a UK date.
function ukDate(date_old) {
	date_new = new Date(Date.parse(date_old));
	year_new = date_new.getFullYear();
	month_new = date_new.getMonth();
	day_new = date_new.getDate();
	date_new = day_new + '/' + (month_new - (-1)) + '/' + year_new;
	return date_new;
}

/**********************/ /**********************/
