/*
	Calendar.js
	
	DrawCalendar(parentElemID, theFormElementID, theDate)
	
	
	parentElemID = ID of an existing element that will be used to position the calendar on the screen (ie: an image icon).
	theFormElementID = the form input field that the calenar will pass a value back to.
	theDate = [optional] The default date to start with. Any js date format will work.
	
	usage:
	
	<input type="text" name="myDate" id="myDate"/>
	<img id="parentElem" src... onclick="DrawCalendar('parentElem', 'myDate', '1/1/2004'); return false;"/>
	
	
*/

var active_calendar_id = '';

function DrawCalendar(parentElemID, theFormElementID, theDate)
{
	
	/* -- configuration options -- */
	
	var css_Container = 'HelpCalendar';
	var css_Table = 'HelpCalendar_table_default';
	var css_TableHeader = 'HelpCalendar_table_default_td_header';
	var css_WeekDayCell = 'HelpCalendar_table_default_td_weekdays';
	var css_DayCell = 'HelpCalendar_table_default_td_days';
	var css_TodayCell = 'HelpCalendar_table_default_td_today';
	var css_Footer = 'HelpCalendar_table_default_td_footer';
	
	/*  -------------------------  */
	
	KillCalendar(active_calendar_id);
	
	var field;
	if(field = document.getElementById(theFormElementID))
	{
		
		var target = document.createElement('div');
		target.setAttribute('class', css_Container);
		target.setAttribute('id', GenGUID());
		
		var holder = document.createElement('div');
		
		if((!theDate) && (field.value))
			theDate = field.value;
		
		var today = new Date();
		today = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0,0,0,0);
		
		var newDate = new Date(theDate);
		
		if(isNaN(newDate))
		{
			newDate = new Date();
		}
				
		var MonthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		var month_name = new Array ("January", "February", "March",	"April", "May", "June", "July", "August", "September", "October", "November", "December");

		if((newDate.getFullYear() % 4) == 0) MonthDays[1] = 29; // Leap year
		
		var day_offset = (new Number((new Date(newDate.getFullYear(), newDate.getMonth(), 1, 0, 0, 0, 0)).getDay()));
		var total_days = day_offset + MonthDays[newDate.getMonth()];
		var filler_cells = (total_days % 7) ? (7 - (total_days % 7)) : 0;
		total_days = total_days + filler_cells;
						
		var table = document.createElement('table');
		table.className = css_Table;
		table.setAttribute('cellpadding', '0');
		table.setAttribute('cellspacing', '0');
		table.setAttribute('border', '0');
		
		var header_row = document.createElement("tr");
		var header_cell = document.createElement("td");
		header_cell.setAttribute('class', css_TableHeader);
		header_cell.setAttribute('colspan', '7');
		
		var header_text = document.createTextNode(month_name[newDate.getMonth()] + " " + newDate.getFullYear());
		header_cell.appendChild(header_text);
		header_row.appendChild(header_cell);
		table.appendChild(header_row);
		
		var week_row = document.createElement("tr");
		var week_days = Array('S', 'M', 'T', 'W', 'T', 'F', 'S');
		for(days in week_days)
		{
			var weekday_cell = document.createElement("td");
			weekday_cell.setAttribute('class', css_WeekDayCell);
			var weekday_text = document.createTextNode(week_days[days]);
			weekday_cell.appendChild(weekday_text);
			week_row.appendChild(weekday_cell);
		}
		table.appendChild(week_row);
		
		var pos_day = 0;
		
		for(var pos_step = 0; pos_step < total_days; pos_step++)
		{
			if((pos_step % 7) == 0)
			{
				var row = document.createElement("tr");
			}
			
			var cell = document.createElement("td");
			cell.setAttribute('class', css_DayCell);
			
			if(pos_step >= day_offset && pos_day < MonthDays[newDate.getMonth()])
			{
				pos_day++;
				
				var current = new Date(newDate.getFullYear(), newDate.getMonth(), pos_day, 0,0,0,0);
				if((current.getFullYear() == today.getFullYear()) && (current.getMonth() == today.getMonth()) && (current.getDate() == today.getDate()))
				{
					cell.setAttribute('class', css_TodayCell);
				}
				
				var anch = document.createElement("a");
				anch.setAttribute('href', '#');
				anch.setAttribute('onclick', 'document.getElementById("' + theFormElementID + '").value="' + (newDate.getMonth() + 1) + "/" + pos_day + "/" + newDate.getFullYear() + '"; KillCalendar("' + target.id + '"); return false;');
				
				var anch_text = document.createTextNode(pos_day);
				
				anch.appendChild(anch_text);
				cell.appendChild(anch);
			}
			else
			{
				var filler_text = document.createTextNode(" ");
				cell.appendChild(filler_text);
			}
			
			row.appendChild(cell);
			
			if((pos_step % 7) == 0)
			{
				table.appendChild(row);
			}
		}
		
		var footer_row = document.createElement('tr');
		
		var prev_date = MonthAdd(newDate, -1);
		var footer_left = document.createElement('td');
		footer_left.setAttribute('class', css_Footer);
		footer_left.setAttribute('align', 'left');
		footer_left.setAttribute('colspan', '2');
		var footer_left_text = document.createTextNode('<');
		var footer_left_anchor = document.createElement('a');
		footer_left_anchor.setAttribute('href', '#');
		footer_left_anchor.setAttribute('onclick', 'DrawCalendar("' + parentElemID + '", "' + theFormElementID + '", "' + prev_date + '"); return false;');
		footer_left_anchor.appendChild(footer_left_text);
		footer_left.appendChild(footer_left_anchor);
		footer_row.appendChild(footer_left);
		
		var footer_center = document.createElement('td');
		footer_center.setAttribute('class', css_Footer);
		footer_center.setAttribute('align', 'center');
		footer_center.setAttribute('colspan', '3');
		var footer_center_text = document.createTextNode('close');
		var footer_center_anchor = document.createElement('a');
		footer_center_anchor.setAttribute('href', '#');
		footer_center_anchor.setAttribute('onclick', 'KillCalendar("' + target.id + '"); return false;');
		footer_center_anchor.appendChild(footer_center_text);
		footer_center.appendChild(footer_center_anchor);
		footer_row.appendChild(footer_center);
		
		var next_date = MonthAdd(newDate, 1);
		var footer_right = document.createElement('td');
		footer_right.setAttribute('class', css_Footer);
		footer_right.setAttribute('align', 'right');
		footer_right.setAttribute('colspan', '2');
		var footer_right_text = document.createTextNode('>');
		var footer_right_anchor = document.createElement('a');
		footer_right_anchor.setAttribute('href', '#');
		footer_right_anchor.setAttribute('onclick', 'DrawCalendar("' + parentElemID + '", "' + theFormElementID + '", "' + next_date + '"); return false;');
		footer_right_anchor.appendChild(footer_right_text);
		footer_right.appendChild(footer_right_anchor);
		footer_row.appendChild(footer_right);
		
		table.appendChild(footer_row);
		
		holder.appendChild(table);		
		document.getElementsByTagName('body')[0].appendChild(target);
		target.innerHTML = holder.innerHTML; //IE hack. IE isn't displaying the calendar correctly simply by appending children, so do an HTML dump instead.
		active_calendar_id = target.id;
		
		toggleSelects();
		
		// -- Positioning -- //
		var parent;
		if(parent = document.getElementById(parentElemID))
		{
			var positionTop = 0;
			var positionLeft = 0;
			
			var newObj = parent;
			while(newObj.tagName && newObj.tagName.toLowerCase() != "body")
			{
				positionLeft += newObj.offsetLeft;
				positionTop += newObj.offsetTop;
				if(newObj.offsetParent)
					newObj = newObj.offsetParent;
				else
					newObj = newObj.parentNode;
			}
			target.style.position = "absolute";
			target.style.left = (positionLeft + parent.offsetWidth) + "px";
			target.style.top = positionTop + "px";
		}
		setTimeout('KillCalendar("' + target.id + '");', 5000);
		return true;
	}
	else
		return false;
}

function MonthAdd(date, amount)
{
	var w = new Date(date);
	var year = w.getFullYear();
	var month = w.getMonth() + amount;
	
	if(month < 0)
	{
		year--;
		month = 12 + month;
	}
	
	if(month > 11)
	{
		year++;
		month = Math.abs(12 - month);
	}

	var output = new Date(year, month, w.getDate(), 0, 0, 0, 0);
	return output;
}

function GenGUID()
{
	var guid = "";
	while(guid.length < 8)
	{
		guid += String.fromCharCode(Math.floor(65 + (Math.random() * 25)));
	}
	return guid;
}

function KillCalendar(theFormElementID)
{
	var o;
	if(o = document.getElementById(theFormElementID))
	{
		o.parentNode.removeChild(o);
		if(active_calendar_id == theFormElementID) active_calendar_id = null;
		toggleSelects();
		return true;
	}
	else
		return false;
}

function toggleSelects()
{
	var s = document.getElementsByTagName('select');
	for(var i = 0; i < s.length; i++)
	{
		var obj = s[i];
		if((new String(obj.tagName)).toLowerCase() == 'select')
		{
			obj.style.visibility = ((new String(obj.style.visibility)).toLowerCase() == 'hidden') ? 'visible' : 'hidden';
		}
	}
}
