// version 0.2 23/10/2008


// *******************************
// *******************************
//
// PWS & MBWEBS 2008
// 
// expects form to have ID of 'pmbws' in lowercase
// uses variable formID to set this
// 
// Looks for form radio set name 'radvalidation' 
// to determine if errors are inLine or as Alerts
// defaults to inLine if radio with ID of 'radalert' not found
//
// form field vet checks are determined by their css class names
// class names used are:
// 
// Required
// requiredNotWhitespace
// positiveInteger
// positiveOrZeroInteger
// numeric
// Email
// Decimal
// telephone
//
// error messages are created into a span tag with 
// class as set in variable 'errorClass'
//
// Expects the form to be structured into paragraphs containing label and field
//	<p><label></label><input> </p> 
// for inline error messages the span is placed before the closing </p>
// thus: <p><label></label><input> <span class="errorMsg">msgText</span></p>
// ===============================


// *******************************
// *******************************
// start declare variables

var formId = 'pmbws';
var errorSpanId = '_error';
var errorMsg = "";

// message output variable specification
var msgTypeField = 'radvalidation'; // field name for radio options
var msgTypeId = 'radalert';  // id of radio option for alerts
var msgTypeDefault = 'radinpage';  // id of radio option for in page messages (not required)

var errorClass = "errorMsg";

var msgText = Array();

msgText['required'] 			=  "Please complete this required field";
msgText['requiredNotWhitespace'] 	=  "Please complete this required field leaving no blank spaces";
msgText['positiveInteger'] 		=  "This field may only contain a positive whole number";
msgText['positiveOrZeroInteger'] 	=  "This field may only contain a non-negative whole number";
msgText['numeric'] 			=  "This field may only contain a whole number";
msgText['decimal'] 			=  "This field may only contain a number";
msgText['email'] 			=  "Please enter a valid email address";
msgText['telephone'] 			=  "Please enter a valid telephone number into this field";



// build array of expressions
valid_exp = Array();
valid_exp['email'] = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/;
valid_exp['numeric'] = /^-?\d+$/;
valid_exp['telephone'] = /^[- ()0-9]+$/;
valid_exp['requiredNotWhitespace'] = /\s/;


// end declare variables
// ===============================



// add listener 
addLoadListener(init);


function init() 
	{
	if(document.forms[formId])
		{
		document.forms[formId].onsubmit = vetForm;
		return true;
		}
	}





function vetForm()
	{
	
	// var needs to be delared here to ensure form is loaded first
	var elements = document.forms[formId].elements;
	clearError();
	
	for (var i = 0; i < elements.length; i++)
		{
		
		// required
		if (/(^| )required( |$)/.test(elements[i].className.toLowerCase()) 
			&& elements[i].value == "" )
			{
			errorMsg = msgText['required'];
			// call err0r display function
			displayError(errorMsg,elements[i]);
			// put cursor in field
			elements[i].focus()
			return false;
			}
		// email
		if (/(^| )email( |$)/.test(elements[i].className.toLowerCase()) 
			&& !valid_exp['email'].test(elements[i].value.toLowerCase()))
			{
			errorMsg = msgText['email'];
			displayError(errorMsg,elements[i]);
			elements[i].focus()
			return false;
			} 
		
		// telephone
		if (/(^| )telephone( |$)/.test(elements[i].className) 
			&& !valid_exp['telephone'].test(elements[i].value))
			{
			errorMsg = msgText['telephone'];
			displayError(errorMsg,elements[i]);
			elements[i].focus()
			return false;
			} 
		// decimal
		if (/(^| )decimal( |$)/.test(elements[i].className.toLowerCase()) 
			&& parseFloat(elements[i].value.toString(),10) != elements[i].value.toString() )
			{
			errorMsg = msgText['decimal'];
			displayError(errorMsg,elements[i]);
			elements[i].focus()
			return false;
			}
		// numeric
		if (/(^| )numeric( |$)/.test(elements[i].className.toLowerCase()) 
			&& !valid_exp['numeric'].test(elements[i].value))
			{
			errorMsg = msgText['numeric'];
			displayError(errorMsg,elements[i]);
			elements[i].focus()
			return false;
			}

		// requiredNotWhitespace
		if (/(^| )requirednotwhitespace( |$)/.test(elements[i].className.toLowerCase()) 
			&& (elements[i].value == ""
			|| (elements[i].value != ""
			&& valid_exp['requiredNotWhitespace'].test(elements[i].value))) )
			{
			errorMsg = msgText['requiredNotWhitespace'];
			displayError(errorMsg,elements[i]);
			elements[i].focus()
			return false;
			}
		// positiveInteger
		if (/(^| )positiveinteger( |$)/.test(elements[i].className.toLowerCase()) 
			&& (elements[i].value == ""
			|| (parseInt(elements[i].value,10).toString() != elements[i].value.toString() 
			|| elements[i].value <= 0)))
			{
			errorMsg = msgText['positiveInteger'];
			displayError(errorMsg,elements[i]);
			elements[i].focus()
			return false;
			}
		// positiveOrZeroInteger
		if (/(^| )positiveorzerointeger( |$)/.test(elements[i].className.toLowerCase()) 
			&& parseInt(elements[i].value,10).toString() != elements[i].value.toString() )
			{
			errorMsg = msgText['positiveOrZeroInteger'];
			displayError(errorMsg,elements[i]);
			elements[i].focus()
			return false;
			}

		} // end for loop
	} // end function


function displayError(errorMsg,element)
{
	// get error type to display
	// read radio buttons looking for Id to match value of variable 'msgTypeId'
	if(document.forms[formId][msgTypeField])
		{
		for(var i=0; i < document.forms[formId][msgTypeField].length; i++)
			{
			if(document.forms[formId][msgTypeField][i].checked == true)
				{
				msgType = document.forms[formId][msgTypeField][i].id;
				}
			}
		}
	else 
		{
		msgType = msgTypeDefault;
		}
		
	// display
	if(msgType.toLowerCase() == msgTypeId)
		{
		// alert messages
		alert(errorMsg);
		}
	else
		{
		// create span and put in as lst child in para
		var msgSpan = document.createElement('span');
		msgSpan.id = formId + errorSpanId;
		msgSpanMsg = document.createTextNode(errorMsg);
		msgSpan.appendChild(msgSpanMsg);
		msgSpan.className = errorClass;
		
		var fieldPara = element.parentNode;
		fieldPara.appendChild(msgSpan);
		//alert(errorMsg);
		}
}

function clearError()
	{
	// delete any existing error messages
	if(document.getElementById(formId + errorSpanId))
		{
		errorSpan = document.getElementById(formId + errorSpanId);
		errorSpanParent = errorSpan.parentNode;
		errorSpanParent.removeChild(errorSpan);
		}
	}

function addLoadListener(fn)
{
  if (typeof window.addEventListener != 'undefined')
  {
    window.addEventListener('load', fn, false);
  }
  else if (typeof document.addEventListener != 'undefined')
  {
    document.addEventListener('load', fn, false);
  }
  else if (typeof window.attachEvent != 'undefined')
  {
    window.attachEvent('onload', fn);
  }
  else
  {
    var oldfn = window.onload;
    if (typeof window.onload != 'function')
    {
      window.onload = fn;
    }
    else
    {
      window.onload = function()
      {
        oldfn();
        fn();
      };
    }
  }
}