// ----------------------------------------------------------------------
// 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).
// ----------------------------------------------------------------------

// non-breaking space char
var nbsp = 160;
// DOM text node-type
var node_text = 3;
emptyString = /^\s*$/

// -----------------------------------------
//                  trim
// Trim leading/trailing whitespace off string
// -----------------------------------------
function trim(str) {
  return str.replace(/^\s+|\s+$/g, '')
};

// -----------------------------------------
//                  msg
// Display warn/error message in HTML element
// commonCheck routine must have previously been called
// -----------------------------------------
// id of element to display message in
// class to give element ("warn" or "error")
// string to display
function msg(fld, msgtype, message) {
  	// 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;
};

// -----------------------------------------
//            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;  
// element to be validated
// id of element to receive info/error msg
// true if required
function commonCheck (vfld, ifld, reqd) {
	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", "required field!");  
      		vfld.focus();
      		return false;
    	} else {
      		msg (ifld, "warn", "");   // OK
      		return true;  
    	}
  	}
  	return proceed;
}

// -----------------------------------------
//            validatePresent
// Validate if something has been entered
// Returns true if so 
// -----------------------------------------
// element to be validated
// id of element to receive info/error msg
function validatePresent(vfld, ifld) {
  	var stat = commonCheck (vfld, ifld, true);
  	if (stat != proceed) return stat;
  	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)
// -----------------------------------------
// element to be validated
// id of element to receive info/error msg
// true if required
function validateEmail  (vfld, ifld, reqd) {
  	var stat = commonCheck (vfld, ifld, reqd);
  	if (stat != proceed) return stat;
	// value of field with whitespace trimmed off
  	var tfld = trim(vfld.value);
  	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  	if (!email.test(tfld)) { 
    	msg (ifld, "error", "invalid e-mail address!");
    	vfld.focus();
    	return false;
  	}
  	msg (ifld, "warn", "");
  	return true;
};

// -----------------------------------------
//            validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// -----------------------------------------
// element to be validated
// id of element to receive info/error msg
// true if required
function validateTelnr  (vfld, ifld, reqd) {
  	var stat = commonCheck (vfld, ifld, reqd);
  	if (stat != proceed) return stat;

  	var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  	var telnr = /^\+?[0-9 ()-]+[0-9]$/
  	if (!telnr.test(tfld)) {
    	msg (ifld, "error", "invalid telephone number!");
    	vfld.focus();
    	return false;
  	}
 	var numdigits = 0;
	for (var j=0; j<tfld.length; j++)
    	if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  	if (numdigits<10) {
    	msg (ifld, "error", "invalid telephone number!");
    	vfld.focus();
    	return false;
  	}
  	msg (ifld, "warn", "");
  	return true;
};

// -----------------------------------------
//             validateAge
// Validate person's age
// Returns true if OK 
// -----------------------------------------
// element to be validated
// id of element to receive info/error msg
// true if required
function validateAge    (vfld, ifld, reqd) {
  	var stat = commonCheck (vfld, ifld, reqd);
  	if (stat != proceed) return stat;

  	var tfld = trim(vfld.value);
  	var ageRE = /^[0-9]{1,3}$/
  	if (!ageRE.test(tfld)) {
    	msg (ifld, "error", "ERROR: not a valid age");
    	vfld.focus();
    	return false;
  	}

  	if (tfld>=200) {
    	msg (ifld, "error", "ERROR: not a valid age");
    	vfld.focus();
    	return false;
  	}

  	if (tfld>110) msg (ifld, "warn", "Older than 110: check correct");
  	else {
    	if (tfld<7) msg (ifld, "warn", "Bit young for this, aren't you?");
    	else        msg (ifld, "warn", "");
  	}
  	return true;
};


//validate if an email address is in the right format.
function validateEmail(emailElement) {
  var tfld = trim(emailElement.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  if (!email.test(tfld)) {
    alert("Please enter a valid Email Address.");
    emailElement.focus();
    return false;
  }
  return true;
}

function validateEmailFormat(vfld, ifld, reqd) {
  	//var stat = commonCheck (vfld, ifld, reqd);
  	//if (stat != proceed) return stat;
	// value of field with whitespace trimmed off
  	var tfld = trim(vfld.value);
  	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  	if (!email.test(tfld)) { 
    	msg (ifld, "error", "invalid e-mail address!");
    	vfld.focus();
    	return false;
  	}
  	msg (ifld, "warn", "");
  	return true;
};


function markError (id, errorClass){
	if (document.getElementById) {
		document.getElementById(id).className = errorClass;
	}
}
		
function markClean (id, cleanClass){
	if (document.getElementById) {
		document.getElementById(id).className = cleanClass;
	}		
}
		
function validateField (field1, labelId,cleanClass,errorClass){
	field1.value = trim(field1.value);
	if (field1.value == ''){
		markError(labelId,errorClass);
		return false;
	}
			
	else {
		markClean(labelId, cleanClass);
		return true;
	}
}

function validateZipCode (field1, labelId,cleanClass,errorClass){
	field1.value = trim(field1.value);
	
	var numdigits = 0;
	for (var j=0; j<field1.value.length; j++)
    	if (field1.value.charAt(j)>='0' && field1.value.charAt(j)<='9') numdigits++;


	if (numdigits == 5){
		markClean(labelId, cleanClass);
		return true;
	}
			
	else {
		markError(labelId,errorClass);
		return false;
	}
}
		
function validateEmailField (field1, labelId,cleanClass,errorClass){
	field1.value = trim(field1.value);
  	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  	
  	if (!email.test(field1.value)) { 
		markError(labelId,errorClass);
		return false;
	}
	else {
		markClean(labelId,cleanClass);
		return true;
	}
}
		
function validatePasswords (pass1, label1, pass2, label2,cleanClass,errorClass){
	pass1.value = trim(pass1.value);
	pass2.value = trim(pass2.value);
		
	if (pass1.value == ''){
		markError(label1,errorClass);
		return false;
	}
			
	if (pass1.value != pass2.value){
		markError(label1,errorClass);
		markError(label2,errorClass);
		alert('Passwords do not match');
		return  false;
	}

	markClean(label1,cleanClass);
	markClean(label2,cleanClass);
	return true;
}
