var FORM_NAME;
var FIELD_NAME;
var FIELD;
var LAYER_NAME;

var IS_VISIBLE = new Boolean(false);

/*
 FORM_NAME	- form name which values will be written to when user selects
 FIELD_NAME	- field in 'FORM_NAME' to replace value with
 LAYER_NAME	- name of the layer that holds the calendar
 left		- where to position calendar's left edge (pixels)
 top		- where to position the calendar's top edge (pixels)
 */
function Calendar(form_name, field_name, layer_name)
{
	if (is_nav4) { return; }		// go away foul demon!

	if (toggleCalendar(layer_name) == false) { return; }

	FORM_NAME   = new String(form_name);
	FIELD_NAME  = new String(field_name);
	LAYER_NAME  = layer_name;
	eval("FIELD = document."+FORM_NAME+"."+FIELD_NAME);
	
	button_obj = document.getElementById(field_name + "-btn");

	displayCalendar(new Date().getMonth()+1, new Date().getYear());

	if (is_ie5up||is_nav6up||is_opera5up) {
		document.getElementById(LAYER_NAME).style.visibility='visible';
		document.getElementById(LAYER_NAME).style.left=XPosn(button_obj) + 20;
		document.getElementById(LAYER_NAME).style.top=YPosn(button_obj);

	} else if (is_nav4) {
		document.eval(LAYER_NAME).visibility=true;
		document.eval(LAYER_NAME).left=XPosn(button_obj) + 20;
		document.eval(LAYER_NAME).top=YPosn(button_obj);

	} else {
		eval(LAYER_NAME + ".style.visibility='visible'");
		eval(LAYER_NAME + ".style.left=" + XPosn(button_obj)) + 20;
		eval(LAYER_NAME + ".style.top=" + YPosn(button_obj));
	}
}


function toggleCalendar(layer_name)
{
	var temp = new String("");

	if (IS_VISIBLE == true) {
		IS_VISIBLE = false;
		temp = "hidden";
		showme();
	} else {
		IS_VISIBLE = true;
		temp = "visible";
		hideme();
	}

	if (is_nav4) {
		document.eval(layer_name).visibility=IS_VISIBLE;

	} else if (is_nav6up||is_opera5up||is_ie6up) {
		document.getElementById(layer_name).style.visibility=temp;

	} else {
		eval(layer_name).style.visibility=temp;

	}

	return IS_VISIBLE;

}


function clickDay(date)
{
	FIELD.value = date;
	toggleCalendar(LAYER_NAME);
}


function displayCalendar(month, year)
{	
	month = parseInt(month - 1);
	year = parseInt(year);

	if (year < 1000) { year += 1900; }
	var prev_month = new Number(month);
	var prev_year = new Number(year);
	if (prev_month < 1) { prev_month = 12; prev_year--; }

	var next_month = new Number(month + 2);
	var next_year = new Number(year);
	if (next_month > 12) { next_month = 1; next_year++; }


	var field_value = new Date(FIELD.value);


	var months = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	var days = new Number(getDaysInMonth(month + 1, year));
	var first_of_month = new Date (year, month, 1);
	var startingPos = new Number(first_of_month.getDay());
	days += startingPos;

	// do some tests now to save time during the loop
	var today = new Date();
	var today_date = new Number(today.getDate());
	var today_month = new Boolean(today.getMonth() == month);
	var today_year = new Boolean(today.getFullYear() == year);
	var is_today = new Boolean();
	var is_weekend = new Boolean();

	// highlight the selected day in the form fields
	var selected_day = new Number(field_value.getDate());
	var selected_month = new Boolean(field_value.getMonth() == month);
	var selected_year = new Boolean(field_value.getFullYear() == year);
	var is_selected = new Boolean();


	var i = new Number(0);

	var div_html = new String('<table border="0" cellpadding="0" cellspacing="0" width="210">');

	div_html += '<tr><td class="jsCalArrows" title="Previous month" onmouseover="this.className=' +"'jsCalActiveArrows'"+ '" onmouseout="this.className=' +"'jsCalArrows'"+ '" onclick="displayCalendar('+prev_month+','+prev_year+')">&lt;&lt;</td>';

	div_html += '<td class="jsCalMonth">&nbsp;</td>';
	div_html += '<td colspan="3" class="jsCalMonth">&nbsp;'+months[month]+'&nbsp;'+year+' </td>';
	div_html += '<td class="jsCalX" title="Close" onmouseover="this.className=' +"'jsCalActiveX'"+ '" onmouseout="this.className=' +"'jsCalX'"+ '" onclick="toggleCalendar(LAYER_NAME);">X</td>';
	div_html += '<td class="jsCalArrows" title="Next month" onmouseover="this.className=' +"'jsCalActiveArrows'"+ '" onmouseout="this.className=' +"'jsCalArrows'"+ '" onclick="displayCalendar('+next_month+','+next_year+')">&gt;&gt;</td></tr><tr>';

	div_html += '<td width="30" class="jsCalWeekday">Su</td><td width="30" class="jsCalWeekday">Mo</td><td width="30" class="jsCalWeekday">Tu</td><td width="30" class="jsCalWeekday">We</td><td width="30" class="jsCalWeekday">Th</td><td width="30" class="jsCalWeekday">Fr</td><td width="30" class="jsCalWeekday">Sa</td>';

	for (i = 0; i < startingPos; i++) { if (i%7==0) { div_html+='</tr></table><table border="0" cellpadding="0" cellspacing="0" width="210"><tr>'} div_html+='<td width="30" class="jsCalDeadCell">&nbsp;</td>' }
	for (i = startingPos; i < days; i++) {
		if (i%7==0) { div_html+='</tr></table><table border="0" cellpadding="0" cellspacing="0" width="210"><tr>' }
		div_html += '<td width="30" class="';

		// show a different style if the cell is today or a weekend or is selected
		is_today = ( ((i-startingPos+1) == today_date) && (today_month == true) && (today_year == true) );
		is_weekend = ((i%7==0) || (i%7==6));
		is_selected = (((i-startingPos+1) == selected_day) && (selected_month == true) && (selected_year == true));

		// normal css class
		if (is_selected) {	div_html += 'jsCalSel'; }
		else if (is_today) {	div_html += 'jsCalToday'; }
		else if (is_weekend) {	div_html += 'jsCalWeekend'; }
		else {			div_html += 'jsCalDay'; }

		// onmouseover css class switch
		div_html += '" onmouseover=this.className="';
		if (is_selected) {	div_html += 'jsCalActiveSel'; }
		else if (is_today) {	div_html += 'jsCalActiveToday'; }
		else if (is_weekend) {	div_html += 'jsCalActiveWeekend'; }
		else {			div_html += 'jsCalActiveDay'; }

		// onmouseout css class switch back
		div_html += '" onmouseout=this.className="';
		if (is_selected) {	div_html += 'jsCalSel'; }
		else if (is_today) {	div_html += 'jsCalToday'; }
		else if (is_weekend) {	div_html += 'jsCalWeekend'; }
		else {			div_html += 'jsCalDay'; }

		div_html += '"';

		// title (tooltip)
		if (is_selected) {
			if (is_today) {	div_html += ' title="Selected (Today)" '; }
			else {	div_html += ' title="Selected" '; }
		} else if (is_today) {	div_html += ' title="Today" '; }

		div_html += ' onclick="clickDay(\''+(i-startingPos+1)+' '+months[month]+' '+year+'\')">'+ (i-startingPos+1) +'</td>';
		//div_html += "></td>";
	}
	for (i=days; i<42; i++) { if (i%7==0) { break; } div_html += '<td width="30" class="jsCalDeadCell">&nbsp;</td>'; }

	div_html += '</tr></table>&nbsp;';

	if (is_nav6up||is_ie6up||is_opera5up) {
		document.getElementById(LAYER_NAME).innerHTML = div_html;
	} else {
		eval(LAYER_NAME).innerHTML = div_html;
	}

}


function getDaysInMonth(month, year)
{
	var days;
	if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)  days=31;
	else if (month==4 || month==6 || month==9 || month==11) days=30;
	else if (month==2) { if (isLeapYear(year)) { days=29; } else { days=28; } }
	return (days);
}


function isLeapYear(Year)
{
	if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
		return (true);
	} else {
		return (false);
	}
}


// for the date editing icons...

function fiddleDate(form_name, field_name, value)
{
	// 0 is a magical code to mean "Today"
	if (value == 0) {
		document.forms[form_name].elements[field_name].value = formatDate(new Date());
		return;
	}
	var date;

	if (document.forms[form_name].elements[field_name].value == "") {
		date = new Date();
	} else {
		date = new Date(document.forms[form_name].elements[field_name].value);
	}

	date.setDate(date.getDate() + value);
	document.forms[form_name].elements[field_name].value = formatDate(date);
}


function formatDate(date)
{
	var month = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	return date.getDate() + " " + month[date.getMonth()] + " " + date.getFullYear();
}

function hideme() {
	if (is_ie5up) {
		var selNodes = document.getElementsByTagName('select')
		var i=0;
		
		if (!selNodes.item(0))
			{
			return false;
		} else {
			do{selNodes.item(i).style.visibility = 'hidden';}
			while(++i < selNodes.length);
		}
		
	}
}

function showme() {
	if (is_ie5up) {
		var selNodes = document.getElementsByTagName('select')
		var i=0;
		
		if (!selNodes.item(0)) {
			return false;
		} else {
			do{selNodes.item(i).style.visibility = 'visible';}
			while(++i < selNodes.length);
		}
		
	}
}

function XPosn(obj){
var curleft = 0;
	if(document.getElementById||document.all){while(obj.offsetParent){curleft+=obj.offsetLeft;obj=obj.offsetParent;}}
	else if(document.layers){curleft+=obj.x;}
	return curleft;
}

function YPosn(obj){
var curtop = 0;
	if(document.getElementById||document.all){while(obj.offsetParent){curtop+=obj.offsetTop;obj=obj.offsetParent;}}
	else if(document.layers){curtop+=obj.x;}
	return curtop;
}

