// Author: Bill Simpson
// Company: 220solutions.com
// Email: bill@cfarley.com
// Date Created: 02-09-2001
//
// Verifies and converts date strings to a valid format
//
// Valid input dates =
//		mdyy, mmdyy, mmddyy, mmmddyy, mmddyyyy, mmmddyyyy,
//		m/d/yy, m/dd/yy, mm/d/yy, mm/dd/yy, mmm/d/yy, mmm/dd/yy,
//		m/d/yyyy, m/dd/yyyy, mm/d/yyyy, mm/dd/yyyy, mmm/d/yyyy, mmm/dd/yyyy
//	Valid date seperators = '-./:_, '
//
// Notes: Please feel free to use/edit this script.
//		If you do please keep comments and header
//
// Code based on functions from
//   Author: Simon Kneafsey
//   Email: simonkneafsey@hotmail.com
//   WebSite: www.simonkneafsey.co.uk


// Function to convert supplied date string 'fld'
// fld: field containing date string
// sep: seperator to use e.g. '-' or '/'
// returns false if date string is invalid
function fmtDate(fld,sep) {
	var len = fld.value.length;
	var seps = new Array('-','.','/',':','_',',',' ');  // Array of seperators.
	var d = '', m = '', y = ''; // date part holders
	//var div = ''; // divider holder
	//var outdate1 = null; // formatted date to send back to calling field holder
	var sepholder = new Array('0','0','0'); // array to hold positions of dividers in dates
	var s = String(fld.value);
	var outdate = '';

	if (len == 0 ) return true;

	// Accept 'today' or 'now'
	if (fld.value.toUpperCase() == 'NOW' || fld.value.toUpperCase() == 'TODAY' ) {
		var newDate = new Date();
		var myDay = newDate1.getDate();
		var myMonth = newDate.getMonth() + 1;
 		if (navigator.appName == 'Netscape')
			var myYear = newDate.getYear() + 2000;
 		else
  		var myYear = newDate.getYear();

		fld.value = myDay + "-" + myMonth + "-" + myYear1;
		// update string info
		len = fld.value.length;
		s = String(fld.value);
	}

	// Check the date is a valid length
	if (len < 4 || len > 11) return false;

	// Find positions of divider in the date
	var cnt = 0;
	for (var i = 0; i < 3; i++) {
		for (var j = 0; j < seps.length; j++) {
			if (s.indexOf(seps[j],cnt) != -1) {
				div = seps[j];
				sepholder[i] = s.indexOf(seps[j],cnt);
				cnt = sepholder[i] + 1;
				break;
			}
	 	}
	 }

	// If element 2 is not 0 then more than 2 dividers have been found so date is invalid.
	if (sepholder[2] != 0) return false;
	
	// if no dividers are found strip out date parts
	if (sepholder[0] == 0 && sepholder[1] == 0) {
		switch (len) {
		case 4: // mdyy
     	m = '0' + s.substring(0,1);
   		d = '0' + s.substring(1,2);
  		y = s.substring(2,4);
  		if ((y = chkYear(y)) == false) return false;
			break;
		case 5: // mmdyy
     	m = s.substring(0,2);
   		d = '0' + s.substring(2,3);
  		y = s.substring(3,5);
  		if ((y = chkYear(y)) == false) return false;
			break;
		case 6: // mmddyy
     	m = s.substring(0,2);
   		d = s.substring(2,4);
  		y = s.substring(4,6);
  		if ((y = chkYear(y)) == false) return false;
			break;
		case 7: //mmmddyy
   		m = s.substring(0,3);
  		d = s.substring(3,5);
  		y = s.substring(5,7);
  		if ((m = chkMonth(m)) == false) return false;
 			if ((y = chkYear(y)) == false) return false;
			break;
		case 8: //mmddyyyy
   		m = s.substring(0,2);
  		d = s.substring(2,4);
  		y = s.substring(4,8);
			break;
		case 9: //mmmddyyyy
   		m = s.substring(0,3);
  		d = s.substring(3,5);
  		y = s.substring(5,9);
  		if ((m = chkMonth(m)) == false) return false;
			break;
		default:
			return false;
		}
		
		if ((outdate = chkDate(m,d,y,sep)) == false) return false;

		// valid date
		fld.value = outdate;
		return true;
	} else if (sepholder[0] != 0 && sepholder[1] != 0) {
		// process with dividers
  	m = s.substring(0, sepholder[0]);
  	d = s.substring(sepholder[0] + 1, sepholder[1]);
  	y = s.substring(sepholder[1] + 1, s.length);
	} else
		// Only one divider
		return false;

	// Check day and year are numeric
	if (isNaN(d) && isNaN(y)) return false;

	// Make d day dd
	if (d.length == 1) d = '0' + d;
	// Make m month mm
	if (m.length == 1) m = '0' + m;
	// Make yy year yyyy
	if (y.length == 2)
  	if ((y = chkYear(y)) == false ) return false;

	// Make mmm month mm
	if (m.length == 3 || m.length == 4) {
  	if ((m = chkMonth(m)) == false) return false;
	}

	// Date components are OK
	if (d.length != 2 || m.length != 2 || y.length != 4) return false;

	// Validate the date
	if ((outdate = chkDate(m,d,y,sep)) == false) return false;

	// Valid date
	fld.value = outdate;
	return true;
}


// checks for a valid date
// m: month part (2 digit)
// d: day part (2 digit)
// y: year part (4 digit)
// returns:  date string formatted if valid, false if invalid
function chkDate(m, d, y, sep) {
	var dayArray = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var dstr = m + d + y;
	var filter=/^[0-9]{2}[0-9]{2}[0-9]{4}$/;
	
	// Check mmddyyyy date supplied
	if (!filter.test(dstr)) return false;
	
	// Check valid month
	filter=/01|02|03|04|05|06|07|08|09|10|11|12/;
	if (!filter.test(m)) return false;
	
	// Check year
	if (y < 1900 || y > 2078) return false;
	
	// Check for leap year
	var n = Number(y);
	if (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0)) dayArray[1] = 29;
	
	// Check for valid days for month
	var mnum = Number(m);
	if (d > dayArray[mnum - 1] || d <= 0) return false;
	
	// Valid date
	return m + sep + d + sep + y;
}


// Checks for valid month
// m: month part (3 or 4 digit)
// returns: 2 digit month if valid, false is invalid
function chkMonth(m) {
	var months = new Array('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC');

	m = m.toUpperCase();
	if (m.length == 3) {
		for (var i = 0; i < 12; i++) {
	   	if (m == months[i]) {
				m = i + 1;
				if (i < 10)
	   			m = '0' + m;
				return m;
			}
		}
	} else if (m.length == 4 && m == 'SEPT') {
	  m = '09';
   	return m;
	} else
		return false;
}


// Check for a valid year
// y: year part (2 digit)
// returns: 4 digit year if valid, false if invalid
function chkYear(y) {
	if (y < 75) {
  	y = "20" + y;
  	return y;
	} else if (y >= 75) {
  	y = "19" + y;
   	return y;
	} else
		return false;
}

