var month = new Array ("January", "February", "March", "April", "May", "June",
				"July", "August", "September", "October", "November", "December");

var monthabbrevs = new Array ("ja", "fe", "mar", "ap", "may", "jun", "jul", "au", "se", "oc", "no", "de");

var maxDays = new Array (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var reformatedDate;
var changedItem = 0;
var assocItem = 0;
var intervalID;

/*********************************************************************
	setDateItem

		on a date item gaining focus sets the global current date item
*/
function setDateItem (item, assoc)
	{
	changedItem = item;
	if (navigator.appName == "Microsoft Internet Explorer")
		assocItem = document.getElementById (assoc);	

	intervalID = setInterval ("validateDate()", 100);
	return true;
	}

/*********************************************************************
	shared variables for validateDate and helper functions
*/

var m;
var d;
var y;

var friendlyDate;

/*********************************************************************
	filterKeys

		filters for the T key and reformats as today's date
*/
function filterKeys (e)		// clues in Netscape to update value field
	{
	var retval = true;
	var charcode;

	if (document.all)
		{
		e = window.event;
		charcode = e.keyCode;
		}
	else
		charcode = e.which;

	var selectionLen = 0;
	
	if (document.selection)
		selectionLen = document.selection.createRange().text.length;

	if (changedItem.value.length == selectionLen && (charcode == 84 || charcode == 116) )		// T or t
		{
		var now = new Date;
		changedItem.value = "" + (now.getMonth()+1) + "-" + now.getDate() + "-" + now.getFullYear();
		changedItem.select();
		retval = false;
		}

	if (charcode == 91 || charcode == 93 )		// [ or ]
		{
		stringToMDY (changedItem.value);
		buildFriendlyDates();

		var dt = new Date(y,m-1,d);

		// Add 25 hours to make sure we work when we cross the daylight savings time boundary
		// or subtract 2 hours when going backwards

		if (charcode == 93)
			dt.setTime (dt.getTime() + (1000*60*60*25));
		else
			dt.setTime (dt.getTime() - (1000*60*60*23));

		changedItem.value = "" + (dt.getMonth()+1) + "-" + dt.getDate() + "-" + dt.getFullYear();
		changedItem.select();
		retval = false;
		}

	if (document.all)
		{
		e.returnValue = retval;
		return charcode;
		}

	return retval;
	}

/*********************************************************************
	validateDate

		creates and displays a user-friendly version of the currently
		typed-in date string
*/
function validateDate (textname)
	{
	friendlyDate   = "MM-DD-YYYY      ";
	reformatedDate = "";

	if (changedItem != 0 && changedItem.value != "")
		{
		stringToMDY (changedItem.value);
		buildFriendlyDates ();
		}

	if (navigator.appName == "Netscape")
		status = friendlyDate;
	else if (assocItem)
		{
		if (assocItem.innerText != friendlyDate)
			{
			assocItem.innerText = friendlyDate;
			}
		}
	}

/*********************************************************************
	buildFriendlyDates

		helper function for validateDate
		builds friendlyDate and reformatedDate from m,d,y
*/
function buildFriendlyDates ()
	{
	var ms = "MM";
	var msr = "MM";
	var ds = "DD";
	var dsr = "DD";

	// Month
	if (! isNaN(m))
		{
		if (m < 1)	m = 1;
		if (m > 12)	m = 12;

		ms = month[m-1].substring(0,3);
		if (m < 10)
			msr = "0" + m;
		else
			msr = m;
		}
	
	// Year
	if (isNaN(y))
		{
		var now = new Date;
		y = now.getFullYear();
		}
	else if (y < 30)
		y += 2000;
	else if (y < 100)
		y += 1900;

	// Day
	if (!isNaN(d))
		{
		if (d < 1) d = 1;
		else if (!isNaN(m) && d > maxDays[m-1])
				d = maxDays[m-1];	
		ds = d;
		if (d < 10)
			dsr = "0" + d;
		else
			dsr = d;
		}

	reformatedDate = msr + "-" + dsr + "-"  + y;
	friendlyDate   = ms  + " " + ds  + ", " + y;

	// add spaces to maintain constant width

	while (friendlyDate.length < 16)
		friendlyDate += " "

	}

/*********************************************************************
	monthNameToMonth

*/
function monthNameToMonth (s)
	{
	var n;
	var subs;
	var	len;

	for (n=0; n<12; n++)
		{
		len = monthabbrevs[n].length;
		subs = s.substr (0, len).toLowerCase();

		if (subs == monthabbrevs[n])
			{
			return n+1;
			}
		}
	
	return 0;		// we need to return something
	}

/*********************************************************************
	stringToMDY

		helper function for validateDate
*/
function stringToMDY (s)
	{
	m = Number.NaN;
	d = Number.NaN;
	y = Number.NaN;

	var toks = s.match (/\w+/g);

	if (toks)
		{
		if (toks.length == 1)
			{
 			m = parseInt (s.substring(0,2), 10);

			if (isNaN(m))		// check if it might be an alphabetic month
				{
				m = monthNameToMonth (s);
				}
			else
				{
				d = parseInt (s.substring(2,4), 10);
				y = parseInt (s.substring(4,6), 10);
				}
			}

		if (toks.length > 1)
			{
 			m = parseInt (toks[0], 10);
			if (isNaN(m))		// check if it might be an alphabetic month
				{
				m = monthNameToMonth (toks[0]);
				}

			d = parseInt (toks[1], 10);
			y = parseInt (toks[2], 10);
			}
		}
	}

/*********************************************************************
	reformatDate

		on blurring reformats the date to be acceptable to form handler
*/
function reformatDate (text)
	{
	clearInterval (intervalID);
	validateDate();
	text.value = reformatedDate; 
	status = "";
	}

/*********************************************************************
	CheckForOther

		Handles the Other selection from a SELECT object
*/
function CheckForOther (item, origlen)
	{
	var sitem = item.options[item.selectedIndex]

	if (sitem.value == "other")
		{
		var val = prompt ("ADD A NEW CHOICE:", "")

		if (val == null)
			item.selectedIndex = 0
		else	
			{
			var slen = item.length

			if (slen == origlen+1)
				item.options[slen] = new Option (sitem.text, sitem.value)
			
			item.options[item.length-2].text = val
			item.options[item.length-2].value = val
			item.selectedIndex = item.length-2
			}
		}
	}




