/*
	Validation Types
*/
	var vtRequired = 1;
	var vtPattern = 2;
	var vtGroup = 3;
	var vtMatch = 4;
/*
	Validation Patterns
*/
	var vpAlphaNumeric = 1;
	var vpEmail = 2;
	var vpNonZeroInteger = 3;
	var vpPostcodeUK = 4;
	var vpUnSignedFloat = 5;
	var vpDay = 6;
	var vpMonth = 7;
	var vpYear = 8;
/*
	Regular Expressions
*/
	var reAlphaNumeric = /^[\w]+$/;
	var reEmail = /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-\w]*[0-9a-zA-Z])*\.)+[a-zA-Z]{2,9})$/;
	var reNonZeroInteger = /^[1-9]+[0-9]*$/;
	var rePostcodeUK = /^([A-Za-z]{1,2}[0-9]{1,2}|[A-Za-z]{3}|[A-Za-z]{1,2}[0-9][A-Za-z])( |-)[0-9][A-Za-z]{2}/;
	var reUnSignedFloat = /^\d*\.?\d*$/;
	var reDay = /^(0[1-9]|[12][0-9]|3[01])/;
	var reMonth = /^([1-9])|(0[1-9]|1[012])/;
	var reYear = /^(19|20)\d\d/;

	function isRE(aValue,aRegularExpression) {
		return (aRegularExpression.test(aValue));
	}

	function isNewAlphaNumeric(aValue) {
		return isRE(aValue,reAlphaNumeric);
	}

	function isNewEmail(aValue) {
		return isRE(aValue,reEmail);
	}

	function isNonZeroInteger(aValue) {
		return isRE(aValue,reNonZeroInteger);
	}

	function isPostcodeUK(aValue) {
		return isRE(aValue,rePostcodeUK);
	}

	function isUnSignedFloat(aValue) {
		return isRE(aValue,reUnSignedFloat);
	}

	function isDay(aValue) {
		return isRE(aValue,reMonth);
	}

	function isMonth(aValue) {
		return isRE(aValue,reMonth);
	}

	function isYear(aValue) {
		return isRE(aValue,reYear);
	}

	function ValidationRule(aTypeOfValidation,aElementName,aActive,aErrorMessage,aPattern,aEmptyOK,aError){
		this.TypeOfValidation = aTypeOfValidation;
		this.ElementName = aElementName;
		this.Active = aActive;
		this.ErrorMessage = aErrorMessage;
		this.Pattern = aPattern;
		this.EmptyOK = aEmptyOK;
		this.Error = aError;
	}

	function newRule(aRules,aTypeOfValidation,aElementName,aActive,aErrorMessage,aPattern,aEmptyOK,aError) {
		var Rule = new ValidationRule();
		Rule.TypeOfValidation = aTypeOfValidation;
		Rule.ElementName = aElementName;
		Rule.Active = aActive;
		Rule.ErrorMessage = aErrorMessage;
		aRules[aRules.length] = Rule;
		Rule.Pattern = aPattern;
		Rule.EmptyOK = aEmptyOK;
		Rule.Error = aError;
		return (aRules.length - 1);
	}

	function ValidateRules(aForm,aRules){
		var i;
		var intErrorCount = 0;
		var intGroupCount;

		for (var i = 0; i < aRules.length; i++) {
			if (aRules[i].Active) {
				switch (aRules[i].TypeOfValidation) {
					case vtGroup: {
						var arrGroup = aRules[i].ElementName.split(',');
						intGroupCount = 0;
						for (var j = 0; j < arrGroup.length; j++) {
							if (getInputValue(aForm.elements[arrGroup[j]])!=''){
								intGroupCount = intGroupCount + 1;
							};
						}
						aRules[i].Error = (intGroupCount > 0) && (intGroupCount < arrGroup.length);
						break;
					}
					case vtMatch: {
						var arrGroup = aRules[i].ElementName.split(',');
						var ValueToMatch = getInputValue(aForm.elements[arrGroup[0]]);
						for (var j = 0; j < arrGroup.length; j++) {
							aRules[i].Error = (ValueToMatch != getInputValue(aForm.elements[arrGroup[j]]));
						}
						break;
					}
					case vtPattern: {
						if ((aRules[i].EmptyOK)&&(getInputValue(aForm.elements[aRules[i].ElementName]) == '')) {
						} else {
							switch (aRules[i].Pattern) {
								case vpAlphaNumeric: {
									aRules[i].Error = !(isNewAlphaNumeric(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								case vpEmail: {
									aRules[i].Error = !(isNewEmail(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								case vpNonZeroInteger: {
									aRules[i].Error = !(isNonZeroInteger(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								case vpPostcodeUK: {
									aRules[i].Error = !(isPostcodeUK(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								case vpUnSignedFloat: {
									aRules[i].Error = !(isUnSignedFloat(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								case vpDay: {
									aRules[i].Error = !(isDay(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								case vpMonth: {
									aRules[i].Error = !(isMonth(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								case vpYear: {
									aRules[i].Error = !(isYear(getInputValue(aForm.elements[aRules[i].ElementName])));
									break;
								}
								default: alert('validation pattern not found ' + aRules[i].ElementName);
							}
						}
						break;
					}
					case vtRequired: {
						aRules[i].Error = (getInputValue(aForm.elements[aRules[i].ElementName])==''); 
						break;
					}
					default: alert('validation type not Specified ' + aRules[i].ElementName);
				}
				if (aRules[i].Error) {
					intErrorCount = intErrorCount + 1;
				}
			}
		}
		if (intErrorCount > 0) {
			var errorMessage = 'The form was not submitted due to the following problem' + ((intErrorCount > 1) ? 's' : '') + ':\n\n';
			for (var i = 0; i < aRules.length; i++) {
				if (aRules[i].Active && aRules[i].Error) {
					errorMessage += '* ' + aRules[i].ErrorMessage + '\n';
				}
			}
			errorMessage += '\nPlease fix ' + ((intErrorCount > 1) ? 'these' : 'this') + ' problem' + ((intErrorCount > 1) ? 's' : '') + ' and resubmit the form.';
			alert(errorMessage);
		}
		return (intErrorCount == 0)
	}


