// ----------------------------------------------------------------------// Javascript form validation routines.// Author: Stephen Poley//// Simple routines to quickly pick up obvious typos.// All validation routines return true if executed by an older browser:// in this case validation must be left to the server.//// Update Aug 2004: have tested that IE 5.0 and IE 5.5 both support DOM model// sufficiently well, so innerHTML option removed (redundant).//// Update Jun 2005: discovered that reason IE wasn't setting focus was// due to an IE timing bug. Added 0.1 sec delay to fix.// ----------------------------------------------------------------------var nbsp = 160;    // non-breaking space charvar node_text = 3; // DOM text node-typevar emptyString = /^\s*$/var glb_vfld;      // retain vfld for timer thread// -----------------------------------------//                  trim// Trim leading/trailing whitespace off string// -----------------------------------------function trim(str){  return str.replace(/^\s+|\s+$/g, '')};// -----------------------------------------//                  setfocus// Delayed focus setting to get around IE bug// -----------------------------------------function setFocusDelayed(vfld){  glb_vfld.focus()}function setfocus(vfld){  glb_vfld = vfld;  setTimeout( 'setFocusDelayed()', 100 );}// -----------------------------------------//                  msg// Display warn/error message in HTML element// commonCheck routine must have previously been called// -----------------------------------------function msg(fld,		// id of element to display message in             msgtype,	// class to give element ("warn" or "error")             message)	// string to display{  // setting an empty string can give problems if later set to a   // non-empty string, so ensure a space present. (For Mozilla and Opera one could   // simply use a space, but IE demands something more, like a non-breaking space.)  var dispmessage;  if (emptyString.test(message))     dispmessage = String.fromCharCode(nbsp);      else      dispmessage = message;  var elem = document.getElementById(fld);  elem.firstChild.nodeValue = dispmessage;      elem.className = msgtype;   // set the CSS class to adjust appearance of message};// -----------------------------------------//            commonCheck// Common code for all validation routines to:// (a) check for older / less-equipped browsers// (b) check if empty fields are required// Returns true (validation passed), //         false (validation failed) or //         proceed (don't know yet)// -----------------------------------------var proceed = 2;  function commonCheck    (vfld,   // element to be validated                         ifld,   // id of element to receive info/error msg                         reqd)   // true if required{  if (!document.getElementById)     return true;  // not available on this browser - leave validation to the server  var elem = document.getElementById(ifld);  if (!elem.firstChild)    return true;  // not available on this browser   if (elem.firstChild.nodeType != node_text)    return true;  // ifld is wrong type of node    if (emptyString.test(vfld.value)) {    if (reqd) {      msg (ifld, "error", "ERROR: required");        setfocus(vfld);      return false;    }    else {      msg (ifld, "warn", "");   // OK      return true;      }  }  return proceed;}// -----------------------------------------//            validatePresent// Validate if something has been entered// Returns true if so // -----------------------------------------function validatePresent(vfld,   // element to be validated                         ifld )  // id of element to receive info/error msg{  var stat = commonCheck (vfld, ifld, true);  if (stat != proceed) return stat;  msg (ifld, "warn", "");    return true;};function validateLength(vfld,						ifld,						minimum,						maximum){	var stat = commonCheck(vfld,ifld,true);	if(stat != proceed) return stat;		var tfld = trim(vfld.value);	if(tfld.length < minimum) {		msg(ifld,"error","ERROR: Must be at least "+minimum+" characters");		setfocus(vfld);		return false;	}	if(tfld.length > maximum) {		msg(ifld,"error","ERROR: Must be less than "+maximum+" characters");		setfocus(vfld);		return false;	}	else		msg(ifld,"warn","");	return true;}// -----------------------------------------//               validateEmail// Validate if e-mail address// Returns true if so (and also if could not be executed because of old browser)// -----------------------------------------function validateEmail  (vfld,   // element to be validated                         ifld,   // id of element to receive info/error msg                         reqd)   // true if required{  var stat = commonCheck (vfld, ifld, reqd);  if (stat != proceed) return stat;  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  if (!email.test(tfld)) {    msg (ifld, "error", "ERROR: not a valid e-mail address");    setfocus(vfld);    return false;  }  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  if (!email2.test(tfld))     msg (ifld, "warn", "Unusual e-mail address - check if correct");  else    msg (ifld, "warn", "");  return true;};function validateAlphaNumeric (vfld,	//element to be validated							   ifld,	//id of element to receive info/error msg							   reqd)	//true if required{		var stat = commonCheck (vfld, ifld, reqd);		if (stat != proceed) return stat;				var tfld = trim(vfld.value);	//value of field with whitespace trimmed off		var alphanumeric = /^([a-zA-Z0-9_\-\.]){4,}$/		if (!alphanumeric.test(tfld)) {			msg(ifld, "error", "ERROR: see description above");			setfocus(vfld);			return false;		}		else {			msg (ifld,"warn","");			return true;		}};function validateNumeric (vfld,	//element to be validated							   ifld,	//id of element to receive info/error msg							   reqd)	//true if required{		var stat = commonCheck (vfld, ifld, reqd);		if (stat != proceed) return stat;				var tfld = trim(vfld.value);	//value of field with whitespace trimmed off		var numeric = /^([0-9_\-\.]){4,}$/		if (!numeric.test(tfld)) {			msg(ifld, "error", "ERROR: see description above");			setfocus(vfld);			return false;		}		else {			msg (ifld,"warn","");			return true;		}};function validatePhone (vfld,	//element to be validated							   ifld,	//id of element to receive info/error msg							   reqd)	//true if required{		var stat = commonCheck (vfld, ifld, reqd);		if (stat != proceed) return stat;				var tfld = trim(vfld.value);	//value of field with whitespace trimmed off		var banned = /^(555|111|000)|^([0-9]{3}(555|111|000))/		if (!validateNumeric(vfld,ifld,reqd)) {			return false;		}		else if (!validateLength(vfld,ifld,10,10)) {			return false;		}		else if (banned.test(tfld)) {			msg(ifld,"error","ERROR: Not a valid phone number");			setfocus(vfld);			return false;		}		else {			msg (ifld,"warn","");			return true;		}};function validatePass(vfld1,				   vfld2,				   ifld1,				   ifld2){	var tfld1 = trim(vfld1.value);	var tfld2 = trim(vfld2.value);	if (tfld1 != tfld2)	{		msg(ifld1, "error", "ERROR: do not match");		msg(ifld2, "error", "ERROR: do not match");		return false;	}	else	{		var errs = 0;		if(commonCheck(vfld1,ifld1,true) != proceed) errs += 1;		if(commonCheck(vfld2,ifld2,true) != proceed) errs += 1;		if(errs > 0) return false;	}	msg(ifld1, "warn", "");	msg(ifld2, "warn", "");	return true;};
