/**
 * datemask.js
 *
 * @author toma@etree.org
 * @revision 1.0
 *
 * db.etree.org
 * Copyright 1999-2002 (c) Tom Anderson
 *
 * You are permitted and encouraged to use this code in your own
 * programs for fun or for profit as you see fit. A simple comment
 * in the code giving credit would be courteous but is not required.
 *
 * useage:
 *
 *  On any date field, add this code:
 *	onKeyUp="Javascript: dateMask(this, 'next_field_in_form');
 *
 *  To force a good date you can try playing with
 *  onBlur="Javascript: checkDate(this.value);");
 *
 */

// Check for valid mm/dd/yyyy date format
function checkDate(as_date) {
	var reg = new RegExp("([0-9?]{1,2})[/]([0-9?]{1,2})[/]([0-9?]{4})");
	var regArray = reg.exec(as_date);
	var index = -1;
	var lastIndex = -1;

	if (navigator.userAgent.toLowerCase().indexOf("msie") != -1) {
		index = RegExp.index;
		lastIndex = RegExp.lastIndex;
	} else {
		index = 0;
		lastIndex = as_date.length;
	}

	// Check for mm/dd/yyyy
	if (!regArray || index != 0 || lastIndex != as_date.length) {
		return false ;
	} else {
		var check_date = new Date(Number(regArray[3]), Number(regArray[1]) - 1, Number(regArray[2]));
		// If any part of the date is a '?' assume good
		if (regArray[3] == '????' || regArray[1] == '??' || regArray[2] == '??') {
			return true;
		}
		// check for month or day out of range
		if (check_date.getMonth() != Number(regArray[1]) - 1 || check_date.getDate() != Number(regArray[2])) {
			return false;
		}
	}

	// Date checks passed
	return true
}

// Mask the passed field to mm/dd/yyyy
function dateMask(f, event, nextfield) {

	var cursorKeys ="16;17;8;46;37;38;39;40;33;34;35;36;45;";
	if (cursorKeys.indexOf(event.which+";") != -1) return;

	var m0 = /(^\?$)/;
	var m1 = /(^[2-9]$)|(^1\/$)/;
	var m2 = /^[1-2][3-9]$/;
	var m3 = /(^[0-1][0-9]$)|(^[1-9]\/$)/;
	var m4 = /(^[0-1][0-9]\/[4-9]$)|(^[0-1][0-9]\/[1-9]\/$)/;
	var m5 = /^[0-1?][0-9?]\/[4-9][0-9]$/;
	var m6 = /^[0-1?][0-9?]\/[3-9][2-9]$/;
	var m7 = /^[0-1?][0-9?]\/[0-3][0-9]$/;
	var m8 = /^[0-1?][0-9?]\/[0-3?][0-9?]\/[5-9][0-9]$/;
	var m9 = /^[0-1?][0-9?]\/[0-3?][0-9?]\/[03-5][0-9]$/;
	var m10 = /(^[0-1][0-9]\/\?$)|(^\?\?\/\?$)/;
	var m11 = /^[0-1?][0-9?]\/[0-9?][0-9?]\/\?$/;
	

	if (m0.test(f.value)) {
		// Check for unknown
		f.value = "?" + f.value.substring(0,1) + "/";
	} else if (m1.test(f.value)) {
		// Check for Mar-Dec date
		f.value = "0" + f.value.substring(0,1) + "/";
	} else if (m2.test(f.value)) {
		// Check for invalid month
		f.value = "1";
	} else if (m3.test(f.value)) {
		// If valid month, advance
		f.value += "/";
	} else if (m4.test(f.value)) {
		// Check for day < 10
		f.value = f.value.substring(0,3) + "0" + f.value.substring(3) + "/";
	} else if (m5.test(f.value)) {
		// Check for invalid day
		f.value = f.value.substring(0,3);
	} else if (m6.test(f.value)) {
		// Verify date < 32
		f.value = f.value.substring(0,4);
	} else if (m7.test(f.value)) {
		f.value += "/";
	} else if (m8.test(f.value)) {
		// Check for post 50-99
		f.value = f.value.substring(0,6) + "19" + f.value.substring(6);
	} else if (m9.test(f.value)) {
		// Check for post 50-99
		f.value = f.value.substring(0,6) + "20" + f.value.substring(6);
	} else if (m10.test(f.value)) {
		// Check for unknown day
		f.value = f.value.substring(0,3) + '??/';
	} else if (m11.test(f.value)) {
		// Check for unknown year
		f.value = f.value.substring(0,6) + '????';
	}


	// Check for a valid date
	if ((f.value.length + 1 ) >= 11) {
		if (!checkDate(f.value)) {
				window.alert("Invalid Date.  Enter dates in mm/dd/yyyy format");
				f.focus();
				return false;
		} else if (nextfield){
			f.form.elements[nextfield].focus();
		}
	}

	if (f.value.substring(f.value.length - 2) == '//') {
		f.value = f.value.substring(0, f.value.length - 1);
	}

	return true;
}
