// ----------------------------------------------------------------------
// 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 Jun 2005: discovered that reason IE wasn't setting focus was
// due to an IE timing bug. Added 0.1 sec delay to fix.
//
// Update Oct 2005: minor tidy-up: unused parameter removed
//
// Update Jun 2006: minor improvements to variable names and layout
// ----------------------------------------------------------------------

var nbsp = 160;		// non-breaking space char
var node_text = 3;	// DOM text node-type
var emptyString = /^\s*$/ ;
var global_valfield;	// retain valfield for timer thread

var frm; //form variable thats been passed from the html page
// --------------------------------------------
// Trim leading/trailing whitespace off string
// --------------------------------------------
function trim(str) { return str.replace(/^\s+|\s+$/g, ''); }

// --------------------------------------------
//ValidatePresent
// Validate if something has been entered
// Returns 1 if invalid, 0 if valid
// --------------------------------------------

function validatePresent(valfield, required) {   // element to be validated
	
	if ( frm.elements[valfield].value.length <= 0 && required ) { 
		msg (valfield, "error", "Required");
		return 1;
  	}
		msg (valfield, "", "");		
	  	return 0;
}


// --------------------------------------------
// validates any decimal
// Returns 1 if invalid, 0 if valid
// --------------------------------------------
function validateDecimal(valfield, required) {   // element to be validated
	 	if ( frm.elements[valfield].value.length <= 0 && required ) { //required and the field is empty
			msg (valfield, "error", "Required");
			return 1;
  		}
  		
		else  if ( frm.elements[valfield].value.length > 0 ) { // field is not empty so check it

			var tfld = trim(frm.elements[valfield].value);  // value of field with whitespace trimmed off
		  	var telnr = /^-?\d+(\.\d+)?$/  ;
		  	if (!telnr.test(tfld) && tfld != 0) {
		    	msg (valfield, "error", "Not a valid number");
		    	return 1;
		  	}
		  	msg (valfield, "error", "");
		  	return 0;
		}	
		msg (valfield, "error", "");
		return 0;
}

// --------------------------------------------
// validates maximum char length
// Returns 1 if invalid, 0 if valid
// --------------------------------------------
function validateCharlength(valfield, len, required) {   // element to be validated
	 	if ( frm.elements[valfield].value.length <= 0 ) { //required and the field is empty
	 		if (required) {
				msg (valfield, "error", "Required");
				return 1;
	 		}
	 		else {
	 			msg (valfield, "error", "");
				return 0;
	 		}
  		}
  		
		else  if ( frm.elements[valfield].value.length > 0 ) { // field is not empty so check it			
	 
		  	if (frm.elements[valfield].value.length > len) {
		    	msg (valfield, "error", frm.elements[valfield].value.length + " characters (maximum " + len + ")");
		    	return 1;
		  	}
		  	msg (valfield, "error", "");
		  	return 0;
		}	
		//msg (valfield, "error", "");
		//return 0;
}


// --------------------------------------------
// validates alpha chars only
// Returns 1 if invalid, 0 if valid
// --------------------------------------------
function validateAlpha(valfield, required) {   // element to be validated
	 	if ( frm.elements[valfield].value.length <= 0 ) { //required and the field is empty
	 		if (required) {
				msg (valfield, "error", "Required");
				return 1;
	 		}
	 		else {
	 			msg (valfield, "error", "");
				return 0;
	 		}
  		}
  		
		else  if ( frm.elements[valfield].value.length > 0 ) { // field is not empty so check it
	 
			var tfld = trim(frm.elements[valfield].value);  // value of field with whitespace trimmed off

		  	var telnr = /^[a-zA-Z\-\s\']*$/  ; //		  	var telnr = /^[a-zA-Z]*$/  ;
		  	if (!telnr.test(tfld) && tfld != 0) {
		    	msg (valfield, "error", "Alphabetic characters only");
		    	return 1;
		  	}
		  	msg (valfield, "error", "");
		  	return 0;
		}
}

// --------------------------------------------
// validates any integer value , including negative
// Returns 1 if invalid, 0 if valid
// --------------------------------------------
function validateInteger(valfield, required) {   // element to be validated
	 	if ( frm.elements[valfield].value.length <= 0 && required ) { //required and the field is empty
			msg (valfield, "error", "ERROR: required");
			return 1;
  		}
  		
		else  if ( frm.elements[valfield].value.length > 0 ) { // field is not empty so check it

			var tfld = trim(frm.elements[valfield].value);  // value of field with whitespace trimmed off
		  	var telnr = /^[-,0-9]*$/  ;
		  	if (!telnr.test(tfld) && tfld != 0) {
		    	msg (valfield, "error", "ERROR: not a valid integer");
		    	return 1;
		  	}
		  	msg (valfield, "error", "");
		  	return 0;
		}	
		msg (valfield, "error", "");
		return 0;
	
}



// --------------------------------------------
// validates 2 password fields
// Returns 1 if invalid, 0 if valid
// --------------------------------------------
function validatePass(valfield1, valfield2, len, required) {   // element to be validated
	 	if ( frm.elements[valfield1].value.length <= 0 && frm.elements[valfield2].value.length <= 0 ) { //both empty
			if (required) {
				msg (valfield1, "error", "Required");
				msg (valfield2, "error", "Required");
				return 1;
			}
			else {
				msg (valfield2, "error", "");
				msg (valfield1, "error", "");
				return 0;
			}
  		}
  		
		else  { // one is not empty
			//check length
			if (frm.elements[valfield1].value.length < len) {
					msg (valfield1, "error", "Password is too short, minimum is "+len+" characters");
			    	msg (valfield2, "error", "");
			    	return 1;
			}
			else {
				if ( frm.elements[valfield1].value == frm.elements[valfield2].value ) {
			    	msg (valfield2, "error", "");
					msg (valfield1, "error", "");
			  		return 0;
			  	}
			  	else {
			  		msg (valfield2, "error", "Entered passwords do not match");
			    	msg (valfield1, "error", "");
			    	return 1;
			  	}
			}

		}	
		

	
}

// --------------------------------------------
//               validateEmail
// Validate if e-mail address
// Returns 1 if invalid, 0 if valid
// --------------------------------------------

function validateEmail  (valfield,   // element to be validated
                         required)   // true if required
{

		if ( frm.elements[valfield].value.length <= 0 && required ) { //required and the field is empty
			msg (valfield, "error", "Required");
			return 1;
  		}
  		
		if ( frm.elements[valfield].value.length > 0 ) { // field is not empty so check it
	  		var tfld = trim(frm.elements[valfield].value);  // value of field with whitespace trimmed off
	  		var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
	  		if (!email.test(tfld)) {
	    		msg (valfield, "error", "Not a valid e-mail address");
	    		return 1;
	  		}
	  		msg (valfield, "error", "");
			return 0; 
		}
		
}

// --------------------------------------------
//            validateTelnr
// Validate telephone number
// Permits spaces, hyphens, brackets and leading +
// --------------------------------------------

function validateTelnr  (valfield,   // element to be validated
                         required)   // true if required
{
	 	if ( frm.elements[valfield].value.length <= 0 && required ) { //required and the field is empty
			msg (valfield, "error", "Required");
			return 1;
  		}
  		
		else  if ( frm.elements[valfield].value.length > 0 ) { // field is not empty so check it

			var tfld = trim(frm.elements[valfield].value);  // value of field with whitespace trimmed off
		  	var telnr = /^\+?[0-9 ()-]+[0-9]$/  ;
		  	if (!telnr.test(tfld)) {
		    	msg (valfield, "error", "Not a valid telephone number. Characters permitted are digits, space ()- and leading +");
		    	return 1;
		  	}
		  	
	
		  var numdigits = 0;
		  for (var j=0; j<tfld.length; j++)
		    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;
		
		  if (numdigits<5) {
		    msg (valfield, "error", "" + numdigits + " digits - too short");
		    return 1;
		  }
			msg (valfield, "", "");		 
		  	return 0;
		}

}

// --------------------------------------------
//             validateAge
// Validate person's age
// Returns true if OK 
// --------------------------------------------

function validateAge(valfield,   // element to be validated
                         required)  { // true if required
  		
 		if ( frm.elements[valfield].value.length <= 0 && required ) { //required and the field is empty
			msg (valfield, "error", "Required");
			return 1;
  		}
  		
		else  if ( !required ) { //not required, 
			if (frm.elements[valfield].value.length > 0 ) {//field is not empty so check it
				var ageRE = /^[0-9]{1,3}$/
				if (!ageRE.test(trim(frm.elements[valfield].value))) {
			    	msg (valfield, "error", "Not a valid age");
			    	return 1;
			  	}
			  	if (frm.elements[valfield].value >= 120 || frm.elements[valfield].value <= 0) {
			  		msg (valfield, "error", "Not a valid age");
			    	return 1;
			  	}
			  	msg (valfield, "", "");
			  	return 0;
			}
			else { msg (valfield, "", "");	return 0; } //not required , empty
  		}
  		
}

// --------------------------------------------
//                  msg
// Display warn/error message in DIV element.
// --------------------------------------------

function msg(fld,     //element name that has the wrong input
             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("error_" + fld);

  document.getElementById("error_" + fld).innerHTML = dispmessage;
  
  elem.className = msgtype;   // set the CSS class to adjust appearance of message
}


function validateForm(frm_in) { //save the form element from HTML page
	frm = frm_in;
}
function validateForm2(frm_in) { //save the form element from HTML page
	frm = frm_in;
}
