// Author: Bill Simpson
// Company: 220solutions.com
// Email: billy@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() + 1900;
 		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 < 1753) 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 < 10) {
  	y = "20" + y;
  	return y;
	} else if (y >= 10) {
  	y = "19" + y;
   	return y;
	} else
		return false;
}

function fmtTime(fld) {
	var hr = 0, mn = 0;
	var val = fld.value;
	
	if (val.length == 0) return true;
			
	var tt = strChars(val, '0123456789: ');
	
	if (tt.length > 0) {
		tt = tt.toUpperCase();
		if (tt != 'AM' && tt != 'PM') return false;
		
		val = strChars(val, ' ampAMP');
	}
	
	var sepr = val.indexOf(':')
	if (sepr == -1) {
		hr = val;
		mn = 0;
	} else {
		hr = val.substring(0, sepr);
		mn = val.substring(sepr + 1, val.length);		
	}
	if (isNaN(mn)) mn = 0;	
	
	if (!chkChars(hr, '0123456789')) return false;
	if (!chkChars(mn, '0123456789')) return false;
	if (hr < 0 || hr > 23) return false;
	if (mn < 0 || mn > 59) return false;
	
	if (hr > 12) {
		tt = 'PM';
		hr = hr - 12;
	} else if (hr == 0) {
		tt = 'AM';
		hr = 12;
	}
	if (mn.toString().length == 0) mn = 0;
	if (tt.length == 0) {
		if (hr == 12) 
			tt = 'PM';
		else if (hr < 7) 
			tt = 'PM'; 
		else
			tt = 'AM';
	}
	
	str = hr;
	if (mn.toString().length == 1)
		str = str + ':0' + mn;
	else
		str = str + ':' + mn;
	str = str	+ ' ' + tt;
	
	fld.value = str;
	return true;
}

//Function to remove all occurances of chars in charlist
function strChars(val, charlist) {
	var i = 0, pos = 0
	
	while (i < val.length) {
		pos = charlist.indexOf(val.charAt(i));
		if (pos != -1)
			val = val.substring(0,i) + val.substring(i + 1, val.length);
		else
			i++;
	}						
	
	return val;
}

function chkChars(val, charlist) {
	for (var i = 0; i < val.length; i++)
		if (charlist.indexOf(val.charAt(i)) < 0)
			return false;

	return true;
}