/*function validMessage(obj) {
   	var errMsg = '';
   
	if (obj.title.selectedIndex == -1) {
		errMsg = errMsg + 'Please select the title.\n';
	}
	if ((obj.elements['name'].value == '') || (obj.elements['name'].value == ' ')) {
		errMsg = errMsg + '\'First Name\' field cannot be left blank.\n';
	}
	if ((obj.elements['surname'].value == '') || (obj.elements['surname'].value == ' ')) {	
		errMsg = errMsg + '\'Surname\' field cannot be left blank.\n';
	}
	if ((obj.elements['company'].value == '') || (obj.elements['company'].value == ' ')) {
		errMsg = errMsg + '\'Company\' field cannot be left blank.\n';
	}
	if ((obj.elements['address1'].value == '') || (obj.elements['address1'].value == ' ')) {	
		errMsg = errMsg + '\'Address1\' field cannot be left blank.\n';
	}
	if ((obj.elements['postcode'].value == '') || (obj.elements['postcode'].value == ' ')) {	
		errMsg = errMsg + '\'Postcode\' field cannot be left blank.\n';
	}
	if ((obj.elements['email'].value == '') || (obj.elements['email'].value == ' ')) {	
		errMsg = errMsg + '\'Email\' field cannot be left blank.\n';
	}
	if ((obj.elements['telephone'].value == '') || (obj.elements['telephone'].value == ' ')) {	
		errMsg = errMsg + '\'Telephone\' field cannot be left blank.\n';
	}
	if ((obj.elements['nature_of_event'].value == '') || (obj.elements['nature_of_event'].value == ' ')) {	
		errMsg = errMsg + '\'Nature of Event\' field cannot be left blank.\n';
	}
	if ((obj.elements['date_of_visit_or_event'].value == '') || (obj.elements['date_of_visit_or_event'].value == ' ')) {	
		errMsg = errMsg + '\'Date of Visit or Event\' field can not be left blank.\n';
	}

   if (errMsg != '') {
		errMsg = '[Form Validation]\n\nThis form could not be submitted because :\n\n' + errMsg;
		alert(errMsg); 
		return false;
   } else {
		return true;	
   }   
}*/



// Requires Extensions.Array
function FormValidator(strForm) {

	this.formObj = document.getElementsByName(strForm)[0];

	this.elementTypes = new Array("input","textarea","select");
	this.validators = new Object();
	this.errors = new Array();
	this.validatorAttribute = "class";
	this.resultHandler = null;
	this.formfields = Array();

	this.debug = "";

	this.validate = function() {

		var strVals;
		var validators;
		var strName;

		// Reset the processing arrays
		var fields = new Array();
		var processed = new Array();
		this.errors = new Array();
		var strVals = "";
		this.debug = "";

		formfields = Array();

		var valid = true;

		for(var types=0;types < this.elementTypes.length;types++) {

			formFields = this.formObj.getElementsByTagName(this.elementTypes[types]);

			for(element in formFields) {

				if(formFields[element].tagName && this.elementTypes.inArray(formFields[element].tagName.toLowerCase())) {

					strName = formFields[element].getAttribute("name");

					strVals = formFields[element].getAttribute(this.validatorAttribute);

					if(strVals == null) {;
						strVals = formFields[element].className;
					}

					if(strVals !== false && strVals != "") {
						validators = strVals.split(" ");

						//if(typeof(validators) != 'array') { continue; }
						for(var i=0;i < validators.length;i++) {

							// Check to see if we have already processed an element with this name.
							// As we may have multiple checkboxes/radio buttons etc with the same name and these shouldn't be checked more than once.
							if(processed.inArray(validators[i] + "|" + formFields[element].name)) {

							} else if(!this.validators[validators[i]]) {

								//document.getElementsByName("errors")[0].innerHTML += "invalid" + formFields[element].name + "\n"

							// Failed validations or unknown validator
							} else if(!this.validators[validators[i]].test(formFields[element])) {

								this.debug += "failed" + formFields[element].name + "\n"

								// Create new Error object
								// This contains the validator type, the element name and its value
								fields[fields.length] = new ValidatedField(false,validators[i],formFields[element])
								valid = false;

							// Passed validation - Do nothing
							} else {

								fields[fields.length] = new ValidatedField(true,validators[i],formFields[element])

							}
							processed[processed.length] = validators[i] + "|" + formFields[element].name;
						}
					}
				}
			}
		}

		// If an result handler is set call it and pass the results
		if(typeof(this.resultHandler) == 'function') {

			this.resultHandler(fields);
			if(valid) {

				return true;
			} else {

				return false;
			}

		}

		if(valid) {
			return true;
		} else {
			return false;
		}

	};

	this.setHandler = function(handler) {

	   if(typeof(handler) == 'function') {
	     	this.resultHandler = handler;
			return true;
	   } else {
	   		return false;
	   }
	};

	//
	this.setValidator = function(strName,objValidator) {

		if(/\s/.test(strName)) {
			return false;
		}

		this.validators[strName] = objValidator;
		return true;

	};

	this.deleteValidator = function(strName) {

		if(this.validators[strName]) {
			delete this.validators[strName];
			return true;
		}
		return false;
	};

}

function ValidatedField(boolPass,strValidator,theField) {

	this.passed = boolPass
	this.validator = strValidator;
	this.name = theField.name;
	this.field = theField;

}

// Base validator
// To pass the element value must not be blank
function RequiredValidator() {

	var re = /\w+/;

	this.test = function(theElement) {

		var values = new Array();
		values = this.getValues(theElement);

		// Check all values
		for(var i=0;i < values.length;i++){

			if(re.test(values[i])) {

				return true;
			}
		}
		return false;
	};

	this.getValues = function(theElement) {

		var values = new Array();

		if(theElement.tagName.toLowerCase() == "input") {

			// Handle each type of input
			switch(theElement.type.toLowerCase()) {

				case "text":
				case "hidden":
				case "image":
				case "password":
					values[0] = theElement.value;
					break;

				case "radio":
				case "checkbox":

					// These can have multiple instances so check them all
					var elems = document.getElementsByName(theElement.name);

					for(var i=0;i < elems.length;i++){

						if(elems[i].checked && re.test(elems[i].value)) {
							values[values.length] = elems[i].value;
						}

					}

					break;

				default:
					//
					values[0] = "";

			}
		} else if(theElement.tagName.toLowerCase() == "select") {
			values[0] = theElement.options[theElement.selectedIndex].value;
		} else if(theElement.tagName.toLowerCase() == "textarea") {
			values[0] = theElement.value;
		// Unknown type
		} else {

		}

		return values;

	}

}

// Validates element value against a set regular expression
function RegExpValidator(regExp) {

  this.inheritFrom = RequiredValidator;
  this.inheritFrom();

	var re = regExp;

	this.test = function(theElement) {

		var values = new Array();
		values = this.getValues(theElement);

		// Check all values
		for(var i=0;i < values.length;i++){
			if(re.test(values[i])) {
				return true;
			}
		}
		return false;
	};
}

// Validates element value against a set regular expression
// To pass the element value must be in a valid format
function EmailValidator() {

  this.inheritFrom = RequiredValidator;
  this.inheritFrom();

	var re = /^[A-z\d\_-]+(\.[A-z\d\_-]+)*\@[A-z\d\_-]{2,}(\.[A-z\d\_-]{2,})+$/;

	this.test = function(theElement) {

		var values = new Array();
		values = this.getValues(theElement);

		// Check all values
		for(var i=0;i < values.length;i++){
			if(re.test(values[i])) {
				return true;
			}
		}
		return false;
	};

}

// Validates element value
function NumericRangeValidator(numLow,numHigh) {

  this.inheritFrom = RequiredValidator;
  this.inheritFrom();

	this.test = function(theElement) {

		var values = new Array();
		values = this.getValues(theElement);

		// Check all values
		for(var i=0;i < values.length;i++){
			if(values[i] >= numLow && values[i] <= numHigh) {
				return true;
			}
		}
		return false;
	};

}

function LengthValidator(maxLength) {

  this.inheritFrom = RequiredValidator;
  this.inheritFrom();

	this.test = function(theElement) {

		var values = new Array();
		values = this.getValues(theElement);

		// Check all values
		for(var i=0;i < values.length;i++){
			if(values[i]  > maxLength) {
				return true;
			}
		}
		return false;
	};
}

function LengthRangeValidator(minLength,maxLength) {

  this.inheritFrom = RequiredValidator;
  this.inheritFrom();

	this.test = function(theElement) {

		var values = new Array();
		values = this.getValues(theElement);

		// Check all values
		for(var i=0;i < values.length;i++){
			if(values[i].length >= minLength && values[i].length <= maxLength) {
				return true;
			}
		}
		return false;
	};

}
