function Validator(errorPreamble, errorPrefix, errorPostfix, errorPostamble, msgElement, alertClass, nonAlertClass, form, bLineBreaks) {
	this.arElements = new Array();
	this.arMessages = new Array();
	this.arValidationType = new Array();
	this.arSelectCheck = new Array();
	this.errorPreamble = errorPreamble;
	this.errorPrefix = errorPrefix;
	this.errorPostfix = errorPostfix;
	this.errorPostamble = errorPostamble;
	this.msgElement = msgElement;
	if (this.msgElement==null)
		alert('Developer error: Could not find the message element...');
		
	this.alertClass = alertClass;
	this.nonAlertClass = nonAlertClass;
	this.form = form;
	this.bLineBreaks = bLineBreaks;
}

Validator.prototype.addField = validatorAddField;
Validator.prototype.validate = validatorValidate;
Validator.prototype.validateLength = validatorLength;
Validator.prototype.compare = validatorCompare;

function validatorAddField(fieldName, message, type, selectCheck) {
	if (this.form.elements[fieldName]==null)
		alert('Validator error: '+this.form.elements[fieldName]+' does not exist...');

	this.arElements[this.arElements.length] = fieldName;
	this.arMessages[this.arMessages.length] = message;
	this.arValidationType[this.arValidationType.length] = type;
	this.arSelectCheck[this.arSelectCheck.length] = selectCheck;
}

function validatorValidate() {
	var sErrors = '';
	var bFocussed = false;
	if (this.bLineBreaks == null)
		this.bLineBreaks = true;
	
	for (var x=0; x<this.arElements.length; x++) {
		switch (this.arValidationType[x]) {
			case "not null":
				if (trim(this.form.elements[this.arElements[x]].value) == '') {
					sErrors += ((this.bLineBreaks) ? '<br/>' : '') + this.errorPrefix + this.arMessages[x] + this.errorPostfix;
					document.getElementById(this.arElements[x]).className = this.alertClass;
					if (!bFocussed) {
						this.form.elements[this.arElements[x]].focus();
						bFocussed = true;
					}
				} else {
					document.getElementById(this.arElements[x]).className = this.nonAlertClass;
				}
				break;
				
			case "email":
				if (trim(this.form.elements[this.arElements[x]].value) != '') {
					result = this.form.elements[this.arElements[x]].value.match(/^[^@]+@[^@]+\.[^@]+$/);
					if (result!=this.form.elements[this.arElements[x]].value) {
						sErrors += ((this.bLineBreaks) ? '<br/>' : '') + this.errorPrefix + this.arMessages[x] + this.errorPostfix;
						document.getElementById(this.arElements[x]).className = this.alertClass;
						if (!bFocussed) {
							this.form.elements[this.arElements[x]].focus();
							bFocussed = true;
						}						
					} else {
						document.getElementById(this.arElements[x]).className = this.nonAlertClass;
					}
				}
				break;
				
			case "select":
				//get the drop down
				var dd = this.form.elements[this.arElements[x]];
				if (dd[dd.selectedIndex].value == this.arSelectCheck[x]) {
					sErrors += ((this.bLineBreaks) ? '<br/>' : '') + this.errorPrefix + this.arMessages[x] + this.errorPostfix;
					document.getElementById(this.arElements[x]).className = this.alertClass;
					if (!bFocussed) {
						this.form.elements[this.arElements[x]].focus();
						bFocussed = true;
					}						
				} else {
					document.getElementById(this.arElements[x]).className = this.nonAlertClass;
				}
				break;
				
			case "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) {
						sErrors += ((this.bLineBreaks) ? '<br/>' : '') + this.errorPrefix + this.arMessages[x] + this.errorPostfix;
						document.getElementById(this.arElements[x]).className = this.alertClass;
						if (!bFocussed) {
							this.form.elements[this.arElements[x]].focus();
							bFocussed = true;
						}						
					} else {
						document.getElementById(this.arElements[x]).className = this.nonAlertClass;
					}
				}
				break;
		}
	}
	
	if (sErrors == '') {
		this.msgElement.innerHTML = '';
		return true;	
	} else {
		if (this.errorPrefix.length > 0)
			sErrors = sErrors.substr(this.errorPrefix.length);

		if (this.bLineBreaks)
			sErrors = sErrors.substr(5);
			
		if (this.errorPostfix.length > 0)
			sErrors = sErrors.substr(0, sErrors.length - this.errorPostfix.length);
			
		this.msgElement.innerHTML = this.errorPreamble + sErrors + this.errorPostamble;
		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, message) {
	if (field1.value != field2.value) {
		field1.className = this.alertClass;
		field2.className = this.alertClass;
		field1.focus();
		this.msgElement.innerHTML = message;
		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;
}