
function Validator(bSetClass, alertClass, nonAlertClass, form) {
	this.arElements = new Array();
	this.arValidationType = new Array();
	this.arSelectCheck = new Array();
	this.arCompare = new Array();
	this.arParams = new Array();
	this.alertClass = alertClass;
	this.nonAlertClass = nonAlertClass;
	this.form = form;
	this.setClass = false;
	this.debug = false;
	this.CustomValidate = null;
}

Validator.prototype.addField = validatorAddField;
Validator.prototype.addCompare = validatorAddCompare;
Validator.prototype.validate = validatorValidate;
Validator.prototype.validateLength = validatorLength;
Validator.prototype.compare = validatorCompare;
Validator.prototype.clear = validatorClear;

function validatorClear() {
	for (var x=0; x<this.arElements.length; x++) {
		var elem = null;
		
		switch (this.arValidationType[x]) {
			case "notnull":
				elem = document.getElementById(this.arElements[x]+'_notnull');
				break;
				
			case "email":
				elem = document.getElementById(this.arElements[x]+'_email');
				break;
				
			case "compare":
				elem = document.getElementById(this.arElements[x]+'_compare');
				break;

			case "postcode":
				elem = document.getElementById(this.arElements[x]+'_postcode');
				break;

			case "select":
				elem = document.getElementById(this.arElements[x]+'_select');
				break;

			case "checkbox":
				elem = document.getElementById(this.arElements[x]+'_checkbox');
				break;
				
			case "minlength":
				elem = document.getElementById(this.arElements[x]+'_minlength');
				break;
				
			case "number":
				elem = document.getElementById(this.arElements[x]+'_number');
				break;
		}
		
		if (elem != null)
			elem.style.display = 'none';
	}
	
	this.arElements = new Array();
	this.arValidationType = new Array();
	this.arSelectCheck = new Array();
	this.arCompare = new Array();
	this.arParams = new Array();
}

function validatorAddField(fieldName, type, selectCheck, params) {
	this.arElements[this.arElements.length] = fieldName;
	this.arValidationType[this.arValidationType.length] = type;
	this.arSelectCheck[this.arSelectCheck.length] = selectCheck;
	this.arParams[this.arParams.length] = params;
}

function validatorAddCompare(fieldName1, fieldName2) {
	this.arElements[this.arElements.length] = fieldName1;
	this.arElements[this.arElements.length] = fieldName2;
	this.arValidationType[this.arValidationType.length] = 'compare';
	this.arValidationType[this.arValidationType.length] = 'compare';
}

function validatorValidate(bNoCustom) {
	if (bNoCustom == null)
		bNoCustom = false;
		
	if (this.CustomValidate != null && !bNoCustom)
		return eval(this.CustomValidate + '();');
	
	var bError = false;
	var bFocussed = false;
	var bGotMessageElement = false;
	
	for (var x=0; x<this.arElements.length; x++) {
		//check the validation element exists
		var elem = null;
		var bGotMessageElement = true;
		
		switch (this.arValidationType[x]) {
			
			case "notnull":
				//get the message element
				elem = document.getElementById(this.arElements[x]+'_notnull');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_notnull';
				}
					
				if (trim(this.form.elements[this.arElements[x]].value) == '') {
					bError = true;
					if (bGotMessageElement)
						elem.style.display = 'block';
					if (this.setClass)
						elem.className = this.alertClass;
					if (!bFocussed) {
						this.form.elements[this.arElements[x]].focus();
						bFocussed = true;
					}
				} else {
					if (bGotMessageElement)
						elem.style.display = 'none';				
					if (this.setClass)
						elem.className = this.nonAlertClass;
				}
				break;
				
			case "compare":
				//alert('0:'+x);
				elem = document.getElementById(this.arElements[x]+'_compare');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_compare';
				}
			
				if (!this.compare(this.form.elements[this.arElements[x]], this.form.elements[this.arElements[x+1]])) {
					bError = true;
					if (bGotMessageElement)
						elem.style.display = 'block';		
					if (this.setClass) {
						elem.className = this.alertClass;
						if (document.getElementById(this.arElements[x+1]))
							document.getElementById(this.arElements[x+1]).className = this.alertClass;
					}					
					if (!bFocussed) {
						this.form.elements[this.arElements[x+1]].value = '';
						this.form.elements[this.arElements[x+1]].focus();
						bFocussed = true;
					}
				
				}
				else {
					if (bGotMessageElement)
						elem.style.display = 'none';

					if (this.setClass) {
						elem.className = this.nonAlertClass;
						if (document.getElementById(this.arElements[x+1]))
							document.getElementById(this.arElements[x+1]).className = this.nonAlertClass;
					}
				}
				
				//need to increment x as the comparator is stored sequentially after the current position
				x++;
				//alert('0:'+x);
				break;
				
			case "email":
				elem = document.getElementById(this.arElements[x]+'_email');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_email';
				}
							
				if (trim(this.form.elements[this.arElements[x]].value) != '') {
					result = this.form.elements[this.arElements[x]].value.match(/^[^@]+@[^@]+\.[^@]+$/);
					if (bGotMessageElement)
						elem.style.display = 'block';			
					if (result!=this.form.elements[this.arElements[x]].value) {
						bError = true;
						if (this.setClass)
							elem.className = this.alertClass;
						if (!bFocussed) {
							this.form.elements[this.arElements[x]].focus();
							bFocussed = true;
						}						
					} else {
					if (bGotMessageElement)
						elem.style.display = 'none';
						if (this.setClass)
							elem.className = this.nonAlertClass;
					}
				}
				break;
				
			case "number":
				elem = document.getElementById(this.arElements[x]+'_number');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_number';
				}
							
				if (trim(this.form.elements[this.arElements[x]].value) != '') {
					result = this.form.elements[this.arElements[x]].value.match(/^[0-9]+$/);
					if (bGotMessageElement)
						elem.style.display = 'block';			
					if (result!=this.form.elements[this.arElements[x]].value) {
						bError = true;
						if (this.setClass)
							elem.className = this.alertClass;
						if (!bFocussed) {
							this.form.elements[this.arElements[x]].focus();
							bFocussed = true;
						}						
					} else {
					if (bGotMessageElement)
						elem.style.display = 'none';
						if (this.setClass)
							elem.className = this.nonAlertClass;
					}
				}			
				break;
				
			case "select":
				elem = document.getElementById(this.arElements[x]+'_select');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_select';
				}
							
				//get the drop down
				var dd = this.form.elements[this.arElements[x]];
				if (dd[dd.selectedIndex].value == this.arSelectCheck[x]) {
					bError = true;
					if (bGotMessageElement)
						elem.style.display = 'block';			
					if (this.setClass)
						elem.className = this.alertClass;
					if (!bFocussed) {
						this.form.elements[this.arElements[x]].focus();
						bFocussed = true;
					}						
				} else {
					if (bGotMessageElement)
						elem.style.display = 'none';				
					if (this.setClass)
						elem.className = this.nonAlertClass;
				}
				break;
				
			case "minlength":
				elem = document.getElementById(this.arElements[x]+'_minlength');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_select';
				}
				
				var sValue = trim(this.form.elements[this.arElements[x]].value);
				if (sValue.length < this.arParams[x]) {
					bError = true;
					if (bGotMessageElement)
						elem.style.display = 'block';
					if (this.setClass)
						elem.className = this.alertClass;
					if (!bFocussed) {
						this.form.elements[this.arElements[x]].focus();
						bFocussed = true;
					}						
				} else {
					if (bGotMessageElement)
						elem.style.display = 'none';				
					if (this.setClass)
						elem.className = this.nonAlertClass;
				}				
				break;
				
			case "postcode":
				elem = document.getElementById(this.arElements[x]+'_postcode');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_postcode';
				}
							
				if (trim(this.form.elements[this.arElements[x]].value) != '') {
					result = this.form.elements[this.arElements[x]].value.match(/[A-Z|a-z]{1,2}[0-9R][0-9A-Z|0-9a-z]?[\s]?[0-9][A-Z|a-z]{2}/);
					if (result!=this.form.elements[this.arElements[x]].value) {
						bError = true;
						if (bGotMessageElement)
							elem.style.display = 'inline';
						if (this.setClass)
							elem.className = this.alertClass;
						if (!bFocussed) {
							this.form.elements[this.arElements[x]].focus();
							bFocussed = true;
						}						
					} else {
						if (bGotMessageElement)
							elem.style.display = 'none';					
						if (this.setClass)
							elem.className = this.nonAlertClass;
					}
				}
				break;
				
			case "checkbox":
				elem = document.getElementById(this.arElements[x]+'_checkbox');
				if (elem == null) {
					bGotMessageElement = false;
					elem = this.arElements[x]+'_checkbox';
				}
							
				//get the checkbox
				var chk = this.form.elements[this.arElements[x]];
				if (!chk.checked) {
					bError = true;
					if (bGotMessageElement)
						elem.style.display = 'block';			
					if (this.setClass)
						elem.className = this.alertClass;
				} else {
					if (bGotMessageElement)
						elem.style.display = 'none';				
					if (this.setClass)
						elem.className = this.nonAlertClass;
				}			
				break;
		}
		
		if (!bGotMessageElement && this.debug)
			alert('VALIDATION DEBUG: Could not find ' + elem);
	}
	
	//alert(bError);
	if (!bError) {
		return true;	
	} else {
		return false;
	}
}

function validatorLength(fieldPassword, fieldConfirm, msg) {
	if (fieldPassword.value.length < 6) {
		fieldPassword.className = this.alertClass;
		fieldConfirm.className = this.alertClass;
		fieldPassword.focus();
		this.msgElement.innerHTML = msg;
		return false;
	} else {
		return true;
	}
}

function validatorCompare(field1, field2) {
	if (field1.value != field2.value)
		return false;
	else
		return true;
}

function trim(value) {
   var temp = value;
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
   var obj = /  /g;
   while (temp.match(obj)) { temp = temp.replace(obj, " "); }
   if(temp==' ')
      return ''
   else
      return temp;
}

var o = this;
o.hover = function(a)
{
	var d = a.getElementsByTagName("div")[0];
	d.style.visibility = "visible";
};
o.unhover = function(a)
{
	a.getElementsByTagName("div")[0].style.visibility = "hidden";
};

function crossBrowserLinkClick(element) {
	if (element.click) {
		element.click();
	} else {
		var href = element.href;
		//strip off the leading 'javascript:'
		var func;
		
		if (href.indexOf('javascript:') > -1) {
			func = href.substr(11);
		} else
			func = href;
			
		//strip the space off (encoded as %20)		
		if (func.substr(0, 3) == '%20')
			func = func.substr(3);	

		//run the function
		eval(func);
	}
}