function validate(){
	this.fields = new Array();
	this.extraCheck = new Array();
	this.extraMatch = new Array();
	this.errorArray = new Array();
	this.formName = "";
	this.validateFrm = validateFrm;
	this.isValidEmail = isValidEmail;
	this.isValidPostCode = isValidPostCode;
	this.isValidPass = isValidPass;
	this.isMatchingPass = isMatchingPass;
	this.showErrMsg = showErrMsg;
	this.initFields = initFields;
	this.customMsg = false;
	this.initF = false;
	this.errBottom = false;
	this.fieldMsg = new Array();
	this.fieldMsg['text'] = "Please enter your";
	this.fieldMsg['select'] = "Please select";
	this.fieldMsg['invalid'] = "Please enter a valid ";
	this.fieldMsg['nomatch'] = "Password not matching ";
}

function validateFrm(){
	var frmObj = eval('document.' + this.formName);
	var frmErr = false;
	for(var fieldName in this.fields){
		var fieldObj = eval('frmObj.' + fieldName);
		var fieldErr = false;
		var fieldType = (fieldObj.length && !fieldObj.type) ? "radio" : fieldObj.type;
		switch(fieldType){
			case "text":
			case "textarea":
			case "password":
				if(fieldObj.value==""){
					fieldErr = true;
					fieldMode = "text";
					frmErr = true;
				}else if(this.extraCheck[fieldName]){
					if(!eval(this.extraCheck[fieldName]+'(\''+ fieldObj.value +'\')')){
						fieldErr = true;
						fieldMode = "invalid";
						frmErr = true;
					}
				}else if(this.extraMatch[fieldName]){
					if(!eval(this.extraMatch[fieldName]+'(\''+ this.formName +'\')')){
						fieldErr = true;
						fieldMode = "nomatch";
						frmErr = true;
					}
				}
			break;
			case 'select-one':
			case 'select':
				if(fieldObj.value=="0" || fieldObj.value==""){
					fieldErr = true;
					fieldMode = "select";
					frmErr = true;
				}
			break;
			case "radio":
			case "checkbox":
				var chk = false;
				for(var x=0;x<fieldObj.length;x++){
					if(fieldObj[x].checked == true){
						chk = true;	
					}
				}
				if(!chk){
					fieldErr = true;
					fieldMode = "select";
					frmErr = true;
				}
			break;
		}
		
		if(fieldErr){
			if(this.customMsg){
// 				this.errorArray[fieldName] = eval('this.'+fieldName);
				this.errorArray[fieldName] = this.fields[fieldName];
			}else{
// 				this.errorArray[fieldName] = this.fields[fieldName] + this.fieldMsg[fieldMode];
				this.errorArray[fieldName] = this.fieldMsg[fieldMode]+" "+this.fields[fieldName];
				
			}
		}
	}
	if(frmErr){
		this.showErrMsg();
		return false;	
	}
	return true;
}

function showErrMsg(){
	var frmObj = eval('document.' + this.formName);
	for(var fieldName in this.errorArray){
		if(!firstField){
			var firstField = fieldName;
		}
		var fieldObj =  eval('frmObj.' + fieldName);
		
		if(this.errBottom==true){
			if(!fieldObj.type && fieldObj.length > 1){
				var fieldCont =  fieldObj[0].parentNode.parentNode.parentNode.parentNode;
			}else{
				var fieldCont = (fieldName!='code') ? fieldObj.parentNode.parentNode.parentNode : fieldObj.parentNode.parentNode.parentNode.parentNode;
			}
		}else{
			if(!fieldObj.type && fieldObj.length > 1){
				var fieldCont =  fieldObj[0].parentNode.parentNode.parentNode;
			}else{
				var fieldCont = (fieldName!='code') ? fieldObj.parentNode.parentNode : fieldObj.parentNode.parentNode.parentNode;
			}
		}
		
		if(fieldCont.className.indexOf('Over') > -1){
			fieldCont.className = fieldCont.className.replace(/formContOverC/g,'formContErrorC');
			fieldCont.className = fieldCont.className.replace(/formContOver/g,'formContError');
		}else{
			fieldCont.className = fieldCont.className.replace(/formContainerC/g,'formContErrorC');
			fieldCont.className = fieldCont.className.replace(/formContainer/g,'formContError');
		}
		
		var errCont = getDivElement(fieldCont,'validateErr');
		var rollOver = getDivElement(fieldCont,'rollOver');
		if(!rollOver){
			rollOver = getDivElement(fieldCont,'rollOverC');
		}
		if(!rollOver){
			rollOver = getDivElement(fieldCont,'rollOverRadio');
		}
		if(errCont){
			errCont.useDiv = true;
			errCont.innerHTML = this.errorArray[fieldName];
			errCont.className = errCont.className.replace(/hiddendiv/,'visiblediv');
			errCont.className = errCont.className.replace(/hideDiv/,'visiblediv');
			
			if(rollOver.className.indexOf('rollOverC') > -1){
				rollOver.className = rollOver.className.replace(/visiblediv/,'hideDiv');
			}else{
				rollOver.className = rollOver.className.replace(/visiblediv/,'hiddendiv');
			}
		}else{
			
		}
	}
	
	if(firstField){
		var fieldObj = eval('frmObj.' + firstField);
		if(!fieldObj.type && fieldObj.length > 1){
			fieldObj[0].focus();
		}else{
			fieldObj.focus();
		}
	}
}

function isValidEmail(emailAddr) {
	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (!filter.test(emailAddr)) {
		return false;
	}
	return true;
}

function isValidPass(password){
	if(password.length < 8){
		return false;
	}else{
		numberExist = false;
		for(var i=0;i<password.length;i++){
			var char = password.charAt(i);
			if(!isNaN(char)){
				numberExist = true;
			}
		}
		if(!numberExist){
			return false;
		}
	}
	return true;
}

function isMatchingPass(formName){
	var formObj = eval('document.' + formName);
	var passVal = formObj.password.value;
	var confPassVal = formObj.confirm_password.value;
	if(passVal != confPassVal){
		return false;
	}
	return true;
}

function removeErrorContainer(fieldObj){
	if(!fieldObj.type && fieldObj.length > 1){
		var contObj = fieldObj[0].parentNode.parentNode.parentNode;
	}else{
		if(fieldObj.parentNode.parentNode.className.indexOf("cntFrmValCl")>-1){
			var contObj = (fieldObj.name!='code') ?  fieldObj.parentNode.parentNode.parentNode : fieldObj.parentNode.parentNode.parentNode.parentNode;
		}else if(fieldObj.type=="radio"){
			var contObj = fieldObj.parentNode.parentNode.parentNode;
		}else{
			var contObj = (fieldObj.name!='code') ?  fieldObj.parentNode.parentNode : fieldObj.parentNode.parentNode.parentNode;
		}
// 		var contObj = (fieldObj.name!='code') ?  fieldObj.parentNode.parentNode : fieldObj.parentNode.parentNode.parentNode;
	}
	contObj.className = contObj.className.replace(/formContErrorC/g,'formContainerC');
	contObj.className = contObj.className.replace(/formContError/g,'formContainer');
	var errCont = getDivElement(contObj,'validateErr');
	
	if(errCont){
		errCont.useDiv = false;
		contObj.oldClass = "";
		errCont.className = errCont.className.replace(/visiblediv/,'hiddendiv');
		errCont.innerHTML = "";
	}
}

function initFields(){
	if(!this.initF){
		for(var fieldName in this.fields){
			var fieldObj = eval('document.'+ this.formName + '.' + fieldName);
			var fieldType = (fieldObj.length && !fieldObj.type) ? "radio" : fieldObj.type;
			switch(fieldType){
				case "text":
				case "textarea":
				case "password":
				case 'select-one':
				case 'select':
					fieldObj.onchange = function(e){
						removeErrorContainer(this);
					}
				break;
				case "radio":
					for(var i=0;i<fieldObj.length;i++){
						if(fieldObj[i].onclick && !fieldObj[i].oldOnclick){
							fieldObj[i].oldOnclick = fieldObj[i].onclick;
						}
						fieldObj[i].onclick = function(e){
							if(this.oldOnclick){
								this.oldOnclick();
							}
							removeErrorContainer(this);
						}
// 						if(fieldName=="primary_contact"){
// 							alert(fieldObj[i].name);
// 							alert(fieldObj[i].onclick);	
// 						}
					}
				break;
				case "checkbox":
				break;
			}
		}
		this.initF = true;
	}
}




function isValidPostCode (toCheck) {
	
	toCheck = rtrim(ltrim(toCheck));
	var valid = true;
	if(toCheck.indexOf(' ')>-1){
	  // Assume we're not going to find a valid postcode
 	  var valid = false;
	 
	  // Permitted letters depend upon their position in the postcode.
	  var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Character 1
	  var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Character 2
	  var alpha3 = "[abcdefghjkstuw]";                                // Character 3
	  var alpha4 = "[abehmnprvwxy]";                                  // Character 4
	  var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Character 5
	  
	  // Array holds the regular expressions for the valid postcodes
	  var pcexp = new Array ();
	
	  // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
	  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
	  
	  // Expression for postcodes: ANA NAA
	  pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
	
	  // Expression for postcodes: AANA  NAA
	  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
	  
	  // Exception for the special postcode GIR 0AA
	  pcexp.push (/^(GIR)(\s*)(0AA)$/i);
	  
	  // Standard BFPO numbers
	  pcexp.push (/^(bfpo)(\s*)([0-9]{1,4})$/i);
	  
	  // c/o BFPO numbers
	  pcexp.push (/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);
	  
	  // Overseas Territories
	  pcexp.push (/^([A-Z]{4})(\s*)(1ZZ)$/i);
	
	  // Load up the string to check
	  var postCode = toCheck;
	
	  
	  // Check the string against the types of post codes
	  for ( var i=0; i<pcexp.length; i++) {
	    if (pcexp[i].test(postCode)) {
	      // The post code is valid - split the post code into component parts
	      pcexp[i].exec(postCode);
	      
	      // Copy it back into the original string, converting it to uppercase and
	      // inserting a space between the inward and outward codes
	      postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
	      
	      // If it is a BFPO c/o type postcode, tidy up the "c/o" part
	      postCode = postCode.replace (/C\/O\s*/,"c/o ");
	      
	      // Load new postcode back into the form element
	      valid = true;
	      
	      // Remember that we have found that the code is valid and break from loop
	      break;
	    }
	  }
  }
  
  // Return with either the reformatted valid postcode or the original invalid 
  // postcode
  return valid;
}