﻿/********/

var calendar_name = "calendar";
var calendar_table = "calendar_table";

var calendar = null;
var display_field = null;

var horizontal_position = {
	left: 0,
	center: 1,
	right: 2
}// horizontal_position;

var vertical_position = {
	top: 0,
	middle: 1,
	bottom: 2
}// vertical_position;

/********/

function add_handler (object, event, method) {	
	if (object.addEventListener) {
		object.addEventListener (event, method, false);
	} else if (object.attachEvent) {
		object.attachEvent ("on" + event, method);
	}// if;
}// add_handler;

/********/

function absolute_position (object) {
	var current_left = 0;
	var current_top = 0;
	while (object) {
		current_left += object.offsetLeft;
		current_top += object.offsetTop;
		object = object.offsetParent;
	}// while;
	return {
		left: current_left,
		top: current_top
	}// return;
}// absolute_position;
	
/********/

function open_popup_window (window_name) {
	if (!document.getElementById (window_name)) {
		var node = document.createElement ("div");
		node.id = window_name;
		node.style ["visibility"] = "hidden";
		document.body.appendChild (node);
	}// if;
	var window = document.getElementById (window_name);
	window.style ["position"] = "absolute";
	window.style ["zindex"] = 10000;
	window.style ["visibility"] = "visible";
	return window;
}// open_popup_window;

/********/

function caller (sender) {
	if (window.event) sender = window.event; 
	var source_element = sender.srcElement ? sender.srcElement : sender.target;
	if (source_element) return source_element;
	return this;
}// caller;

/********/

function close_popup_window (window_name) {
	document.body.removeChild (calendar);
}// close_popup_window;

/********/

function create_table (parent) {
	var table = document.createElement ("table")
	parent.appendChild (table);
	return table.appendChild (document.createElement ("tbody"));
}// create_table;

/********/

function add_table (window, table_name, class_name) {
	var body = null;
	if (table_name) {
		var table = document.getElementById (table_name);
		if (table) calendar.removeChild (table);
	}// table_name;
	table = document.createElement ("table");
	body = document.createElement ("tbody");
	table.id = table_name;
	if (class_name) table.className = class_name;
	window.appendChild (table);
	table.appendChild (body);
	return body;	
}// add_table;

/********/

function add_table_row (table, class_name) {
	var row = document.createElement ("tr");
	if (class_name) cell.className = class_name;
	table.appendChild (row);
	return row;
}// add_table_row;

/********/

function add_table_cell (row, class_name, style) {
	var cell = document.createElement ("td");
	if (class_name != undefined) cell.className = class_name;
	if (style != undefined) cell.setAttribute ("style", style);
	row.appendChild (cell);
	return cell;
}// add_table_cell;

/********/

function month_name (month) {
	switch (month) {
		case 0: return "January";
		case 1: return "February";
		case 2: return "March";
		case 3: return "April";
		case 4: return "May";
		case 5: return "June";
		case 6: return "July";
		case 7: return "August";
		case 8: return "September";
		case 9: return "October";
		case 10: return "November";
		case 11: return "December";
	}// switch
}// month_name;

/********/

function weekday_name (weekday) {
	switch (weekday) {
		case 0: return "Sun";
		case 1: return "Mon";
		case 2: return "Tue";
		case 3: return "Wed";
		case 4: return "Thu";
		case 5: return "Fri";
		case 6: return "Sat";
	}// switch;
}// weekday_name;

/********/

function get_relative_left (object) {
	var page_left = document.getRootElement ().getAbsoluteLeft ();
	var object_left = object.getAbsoluteLeft ();
	return object_left - page_left;
}// get_relative_left;

/********/

function get_relative_top (object) {
	var page_top = document.getRootElement ().getAbsoluteTop ();
	var object_top = object.getAbsoluteTop ();
	return object_top - page_top;
}// get_relative_top;

/********/

function get_date_string (date) {
	return (date.getMonth () + 1) + "-" + date.getDate () + "-" + date.getFullYear ();
}// get_date_string

/********/

function get_string_date (date_string, delimiter) {
	var i = 0;
	var date_array = date_string.split (delimiter);
	if (date_array.length < 3) return null;
	for (i = 0; i < 3; i++) {
		if (isNaN (date_array [i])) return null;
	}// for;
	if ((date_array [2].length != 2) && (date_array [2].length != 4)) return null;
	if (date_array [2] < 100) date_array [2] = parseInt (date_array [2], 10) + 2000;
	var date = new Date (date_array [2], (date_array [0] - 1), date_array [1]);
	return date;
}// get_string_date;

/********/

function get_field_date (date_string) {
	var date = get_string_date (date_string, "-");
	if (date == null) date = get_string_date (date_string, "/");
	if (date == null) return null;
	return date;
}// get_field_date;

/********/

function get_valid_date (date_string) {
	var date = get_field_date (date_string);
	if (date == null) return new Date ();
	return date;
}// get_valid_date;

/********/

function relative_date (old_date, offset, period) {
	var date = new Date (old_date.getFullYear (), old_date.getMonth (), old_date.getDate ());
	switch (period) {
		case "y": date.setYear (date.getFullYear () + offset); break;
		default: date.setMonth (date.getMonth () + offset); break;
	}// switch;
	return date;
}// get_relative_date;

/********/

function change_month (sender) {
	var new_date = new Date (caller (sender).getAttribute ("date").toString ());
	refresh_calendar (new_date.getFullYear (), new_date.getMonth (), new_date.getDate ());
}// change_month;

/********/

function add_navigation_button (cell, date, label) {
	var button = document.createElement ("input");
	button.type = "button";
	button.className = "navigation_button";
	button.setAttribute ("value", label);
	button.setAttribute ("date", date);
	add_handler (button, "click", change_month);
	cell.appendChild (button);
	cell.className = "header_cell";
	return button;
}// add_navigation_button;

/********/

function add_navigation_panel (parent_cell, date, offset) {
	var table = create_table (parent_cell);
	if (offset < 0) {
		add_navigation_button (add_table_cell (add_table_row (table), "header_cell"), relative_date (date, offset, "m"), "<");
		add_navigation_button (add_table_cell (add_table_row (table), "header_cell"), relative_date (date, offset, "y"), "<<");
	} else {
		add_navigation_button (add_table_cell (add_table_row (table), "header_cell"), relative_date (date, offset, "m"), ">");
		add_navigation_button (add_table_cell (add_table_row (table), "header_cell"), relative_date (date, offset, "y"), ">>");
	}// if;
}// add_navigation_panel

/********/

function add_calendar_header (table, date) {	
	var row = add_table_row (table);
	var cell = add_table_cell (row, "header_cell");
	add_navigation_panel (cell, date, -1)
	cell.style ["text-align"] = "left";
	cell = add_table_cell (row, "header_cell");
	cell.colSpan = 5;
	cell.innerHTML = month_name (date.getMonth ()) + " " + date.getFullYear ();
	cell = add_table_cell (row, "header_cell");
	add_navigation_panel (cell, date, 1)
	cell.style ["text-align"] = "right";
}// add_calendar_header;

/********/

function add_weekday_header (table) {
	var row = add_table_row (table);
	var i = 0;
	for (i = 0; i < 7; i++) {
		var cell = add_table_cell (row, "weekday_cell");
		cell.innerHTML = weekday_name (i);
	}// for;
}// add_weekday_header;

/********/

function add_leading_blanks (table, date) {
	var row = add_table_row (table);
	for (i = 0; i < date.getDay (); i++) {
		var cell = add_table_cell (row, "empty_cell");
	}// for;
	return row;
}// add_leading_blanks;

/********/

function cell_mouseover (sender) {
	caller (sender).style ["cursor"] = "pointer";
	caller (sender).className = "calendar_hover";
}// cell_mouseover;

/********/

function cell_mouseout (sender) {
	caller (sender).style ["cursor"] = "default";
	set_cell_class (caller (sender));
}// cell_mouseout;

/********/

function cell_click (sender) {
	display_field.value = get_date_string (caller (sender).date);
	close_calendar ();
}// cell_click;

/********/

function set_cell_class (cell) {
	var today = new Date ();
	var istoday = true;
	if (cell.date.getFullYear () != today.getFullYear ()) istoday = false;
	if (cell.date.getMonth () != today.getMonth ()) istoday = false;
	if (cell.date.getDate () != today.getDate ()) istoday = false;
	switch (istoday) {
		case true: cell.className = "today_cell"; break;
		case false: cell.className = "calendar_cell";
	}// switch;
}// set_cell_class;

/********/

function add_month_days (row, date, current_day) {
	var cell = null;
	var active_day = 0;
	do {
		active_day = date.getDate ();
		if (row.childNodes.length == 7) {
			var table = row.parentNode;
			row = add_table_row (row.parentNode);
		}// if;
		cell = add_table_cell (row);
		cell.innerHTML = date.getDate ();
		cell.date = new Date (date.getFullYear (), date.getMonth (), date.getDate ());
		set_cell_class (cell);
		add_handler (cell, "mouseover", cell_mouseover);
		add_handler (cell, "mouseout", cell_mouseout);
		add_handler (cell, "click", cell_click);
		date.setDate (date.getDate () + 1);
	} while (date.getDate () != 1);
	return row;
}// add_month_days;

/********/

function add_trailing_blanks (row) {
	while (row.childNodes.length != 7) {
		var cell = add_table_cell (row, "empty_cell");
	}// while;
}// add_trailing_blanks;

/********/

function add_close_button (table) {
	var row = add_table_row (table);
	var cell = add_table_cell (row);
	var button = document.createElement ("input");
	button.type = "button";
	button.className = "close_button";
	button.value = "Close";
	add_handler (button, "click", close_calendar);
	cell.colSpan = 7;
	cell.style ["textAlign"] = "center";
	cell.appendChild (button);
}// add_close_button;

/********/

function refresh_calendar (year, month, day) {
	var date = new Date (year, month, day);
	var table = add_table (calendar, calendar_table, "calendar_table");
	table.style ["width"] = "197px";
	date.setDate (1);
	add_calendar_header (table, date);
	add_weekday_header (table);
	row = add_leading_blanks (table, date);
	row = add_month_days (row, date, day);
	add_trailing_blanks (row);
	add_close_button (table);
}// refresh_calendar;

/********/

function draw_calendar () {
	var date = get_valid_date (display_field.value);
	calendar = open_popup_window (calendar_name);
	refresh_calendar (date.getFullYear (), date.getMonth(), date.getDate ());
}// draw_calendar;

/********/

function set_position (display_object, xposition, yposition) {
	var x = 0, y = 0;
	var position = absolute_position (display_object);
	switch (xposition) {
		case horizontal_position.left: x = position.left - (calendar.clientWidth + 5); break;
		case horizontal_position.center: x = position.left - (calendar.clientWidth / 2); break;
		case horizontal_position.right: x = position.left + display_object.clientWidth + 5;
	}// switch;
	switch (yposition) {
		case vertical_position.top: y = position.top - (calendar.clientHeight); break;
		case vertical_position.middle: y = position.top - (calendar.clientHeight / 2); break;
		case vertical_position.bottom: y = position.top;
	}// switch;
	calendar.style ["left"] = x + "px";
	calendar.style ["top"] = y + "px";
}// set_position;

/********/

function show_calendar (display_object, display_field_name, xposition, yposition) {
	display_field = document.getElementById (display_field_name);
	draw_calendar ();
	set_position (display_object, xposition, yposition);
	return false;
}// show_calendar;

/********/

function close_calendar () {
	close_popup_window (calendar);
	validate_date (display_field);
}// close_calendar;

/********/

function validate_date (date_field) {
	var date = get_field_date (date_field.value);
	if (!date) {
		date_field.title = "Dates must be in the format: mm-dd-yyyy or mm-dd-yy";
		date_field.style.color = "red";
		return false;
	}// if;
	date_field.title = blank;
	date_field.style.color = blank;
	return true;
}// validate_date;

/********/

function reformat_date (date_field) {
	if (!validate_date (date_field)) {
		alert ("Dates must be in the format: mm-dd-yyyy or mm-dd-yy");
		date_field.focus ();
		return false;
	}// if;
	date_field.value = get_date_string (get_field_date (date_field.value));
	return true;
}// reformat_date;

/********/
