//******************************************************************************
// Form Validation Script.  Version 2.0
// Initially created by Matthew O'Riordan.  Modified by Munsifali Rashid
//******************************************************************************

// ** Configuration Constants **************************************************
var frm_TEXT				=	1; 
var frm_SELECT				=	2;
var frm_EMAIL				=	4;
var frm_NUMERIC				=	8;	
var frm_PASSWORD			=	16;
var frm_RADIO				=	32;
var frm_NUMERIC_required	=	"0123456789.-";
var frm_EMAIL_required		=	"@.";
var frm_EMAIL_disallowed	=	"'%£$\"!^*";

var sBadFields				=	"";
var frmMessage				=	"Please note that we need all the fields \nmarked with an asterisk (*) to be completed \ncorrectly before you can proceed\n\nCheck the following fields\nBADFIELDS";
var frmObject				=	"";

function formValidate(objName)
{
	this.frmCheckArray	=	new Array();
	this.objName		=	objName;
	this.frmName		=	"";
	this.setFrmName		=	function (frmName) { this.frmName = frmName; }
	this.addHandler		=	addHandler;
	this.addItem		=	addItem;
	this.validate		=	validate;
	return this;
}
function addItem (name, type, extra, desc)
{
	this.frmCheckArray[this.frmCheckArray.length]			=	new Object();
	this.frmCheckArray[this.frmCheckArray.length-1].name	=	name;
	this.frmCheckArray[this.frmCheckArray.length-1].type	=	type;
	this.frmCheckArray[this.frmCheckArray.length-1].extra	=	extra;
	this.frmCheckArray[this.frmCheckArray.length-1].desc	=	desc;
}
function validate()
{
	var sBadFields	= "";
	var frmObject	= eval("document." + this.frmName);
	for (fieldI in this.frmCheckArray) {
		field = this.frmCheckArray[fieldI];
		if (!frmObject[field.name]) {
			alert ('On inital search, the form element ' + field.name + ' was not found');
			return false;
		}
		frmElement = frmObject[field.name];
		if (field.type == frm_TEXT) {
			if (String(frmElement.value).length == 0) {
				sBadFields	+=	field.desc + "\n";
			}
		}
		else if (field.type == frm_SELECT) {
			if ( (!frmElement.options)||(frmElement.options.length == 0) ) {
				alert ('The form element ' + field.name + ' does not appear to be a select list or is empty');
				return (false);
			}
			else if (frmElement.selectedIndex < 0 || frmElement.options[frmElement.selectedIndex].value.length == 0) {
				sBadFields	+=	getFieldDescription(field, frmElement) + "\n";
			}
		}
		else if (field.type == frm_RADIO) {
			//alert(field.name + "is a radio element");
		}
		else if (field.type == frm_EMAIL) {
			if (String(frmElement.value).length == 0) {
				sBadFields	+=	field.desc + "\n";
			}
			else if (!stringContains (frmElement.value, frm_EMAIL_required, true)) {
				sBadFields	+=	field.desc + "\n";
			}
			else if (stringContains (frmElement.value, frm_EMAIL_disallowed, false)) {
				sBadFields	+=	field.desc + "\n";
			}				
		}
		else if (field.type == frm_NUMERIC) {
			if (String(frmElement.value).length == 0) {
				sBadFields	+=	getFieldDescription(field, frmElement) + "\n";
			}
			else if (!stringContains (frmElement.value, frm_NUMERIC_required, false, true)) {
				sBadFields	+=	getFieldDescription(field, frmElement) + "\n";
			}
		}
		else if (field.type == frm_PASSWORD) {
			if (String(frmElement.value).length == 0) {
				sBadFields	+=	getFieldDescription(field, frmElement) + "\n";
			}
			else if (field.extra) {
				if (!frmObject[field.extra]) {
					alert ('The password form element to compare against is missing !');
					return false;
				}
				if (String(frmElement.value) != String(frmObject[field.extra].value)) {
					alert ('The passwords that have been entered are not the same!');
					return false;
				}
			}
		}
		else {
			alert ('The form element ' + field + ' does not have a type');
		}
	}
	if (sBadFields)
	{
		alert(frmMessage.replace("BADFIELDS", "-------------------------------------\n" + sBadFields));
		return false;
	}
	return true;
}
function stringContains(s, chars, all, only)
{
	var matches = 0;
	if (only) {
		for (var i=0; i<s.length; i++) { if (chars.indexOf(s.charAt(i)) == -1) return false; }
		return true;
	}
	else {
		for (var i=0; i<chars.length; i++) { if (s.indexOf(chars.charAt(i)) != -1) matches++; }
		if (all && matches==chars.length) return true;
		if (!all && matches) return true;
	}
	return false;
}
function getFieldDescription(objField, frmField)
{
	if (objField.desc) { return objField.desc; }
	else if (frmField.title) { return frmField.title; }
	else if (frmField.name) { return frmField.name; }
	else { return "Unknown"; }
}	
function addHandler()
{
	var frmName	= this.frmName;
	var objName	= this.objName;
	if (document.forms[frmName]) { document.forms[frmName].onsubmit = function() { return eval(objName +".validate();") }  }
	else { window.onload	= function() { if (!document.forms[frmName]) { alert("Warning!\n\nThe form named \"" + frmName + "\" could not be found,\nand the handler has not been added.\n\nTHIS FORM WILL NOT BE VALIDATED"); } else { document.forms[frmName].onsubmit = function() { return eval(objName + ".validate();") } } } }
}


//***************************************************************************
//	EXAMPLE OF USAGE														*
//																			*
//	var frm1 		=	new formValidate("frm1");		// Initialise		*
//	frm1.frmName	=	"myForm";					// Form to validate		*
//	frm1.addHandler()								// Add onSubmit handler	*
//***************************************************************************
//						Field Name			Field Type		Extra			Description
//--------------------------------------------------------------------------
//	frm1.addItem		("sFullname",		frm_TEXT,		"",				"your name");
//	frm1.addItem		("sEmailAddress",	frm_EMAIL,		"",				"email address");
//	frm1.addItem		("sPassword",		frm_PASSWORD,	"passconf",		"password");
//**************************************************************************