// ----------------------------------------------------------------------
// Javascript form validation routines.
// Author: Stephen Poley
// Alterations: Chrobis
//
// 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 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

// trim(): Trim leading/trailing whitespace off string
// --------------------------------------------
function trim(string)
{
   return string.replace(/^\s+|\s+$/g, '');
}


// setFocusDelayed(): Delayed focus setting to get around IE bug
// --------------------------------------------
function setFocusDelayed()
{
   global_valfield.focus();
}

function setfocus(valfield)
{
   // save valfield in global variable so value retained when routine exits
   global_valfield = valfield;
   setTimeout( 'setFocusDelayed()', 100 );
}


// --------------------------------------------
//                  showError
// Display warn/error message in HTML element.
// commonCheck routine must have previously been called
// --------------------------------------------

function showError(field, fieldCSS, infoField, infoCSS, 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 displayMessage;

   //window.alert($('field').id + " signalled");
   //document.write($('field').id + " signalled");

   if (emptyString.test(message))
   { 
      displaymessage = "";
   }
   else
   {
      displayMessage = message;
   }

   document.getElementById($(infoField).id).innerHTML = displayMessage;
   document.getElementById($(infoField).id).className = infoCSS;
   field.className = fieldCSS;
}

// --------------------------------------------
//            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 (field, infoField, required)
{
   if (!document.getElementById)
   {
      return true;  // not available on this browser - leave validation to the server
   }
   var elem = document.getElementById(infoField);

   if (!elem.firstChild) return true;  // not available on this browser 
   if (elem.firstChild.nodeType != node_text) return true;  // infofield is wrong type of node  
   
   if (emptyString.test(field.value)) {
      if (required) {
         //window.alert($(infoField).id + " signalling " + field.name);
         showError (field, "invalid", infoField, "formError", "*");
         setfocus(field);
         return false;
      }
      else {
         showError (field, "checked", infoField, "warn", "wee");   // OK
         return true;  
      }
   }
   return proceed;
}

// --------------------------------------------
//            validatePresent
// Validate if something has been entered
// Returns true if so 
// --------------------------------------------

function validatePresent(field,   // element to be validated
                         infoField ) // id of element to receive info/error message
{
   //window.alert("#");
	var stat = commonCheck (field, infoField, true);
	if (stat != proceed) return stat;
	
	showError (field, "checked", infoField, "warn", "&nbsp;");
	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 (field, infoField, required)
{
   var stat = commonCheck (field, infoField, required);
   if (stat != proceed) 
   {
      return stat;
   }

   var trimmedField = trim(field.value);
   var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
   if (!email.test(trimmedField)) {
      showError (field, "invalid", infoField, "fieldError", "*");
      setfocus(field);
      return false;
   }

   var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
   if (!email2.test(trimmedField)) 
      showError (field, "checked", infoField, "warn", "Unusual e-mail address - check if correct");
   else
      showError (field, "checked", infoField, "warn", "*");
   return true;
}

// Only script specific to this form goes here.
// General-purpose routines are in a separate file.
function validateOnSubmit() {
   var elem;
   var errs=0;
   errorMessages = new Array();
   
   if (!validatePresent(document.forms.gcsContact.forname, 'infoName'))
   {
      errs += 1;
      errorMessages.push("Please can you tell us your name.");
   }
   
   if (!validatePresent(document.forms.gcsContact.email, 'infoEmail') &&
      !validatePresent(document.forms.gcsContact.phone, 'infoPhone'))        
   {
      errs += 1; 
      errorMessages.push("We need to know either your telephone number or your e-mail address so that we can get back in touch with you.");
   }
   
   // execute all element validations in reverse order, so focus gets set to the first one in error.
   if (validatePresent(document.forms.gcsContact.email, 'infoEmail') && !validateEmail(document.forms.gcsContact.email, 'infoEmail', true)) 
   {  
      errs += 1;
      errorMessages.push("The email address you have supplied appears to be invalid; please check it and try again.");
   }
   
   if (errs > 1)
   {
      var messages = " ";
      
      for (i = 0; i < errorMessages.length; i++)
      {
         messages += errorMessages[i] + '\n';
      }
      
      alert(messages);
   }

   if (errs==1)
   {
      alert(errorMessages.pop());
   }

   return (errs==0);
}
