var ValidatorForm = function(formName) {
	this.name = formName
	this.fields = new Array();
}

var ValidatorField = function(fieldName) {
	this.name = fieldName;
	this.steps = new Array();
}

var Validator = function() {
	this.forms = new Array();
}

Validator.prototype = {
	Validate: function(formName) {
		if (formName == 'all' || formName == '') {
			this.__clear_errors_all();
			return this.__validate_all();
		}
		var form = this.forms.find(this.__isMatch(formName));
		if (!form) {
			return false;
		}
  		this.__clear_errors(form);
		return this.__validate_form(form);
	},

	__isMatch: function(value) {
		return function(ary) { return ary.name == value };
	},

	AddValidationField: function(formName, fieldName, regex, error_div, required, not) {
		if (formName == '' || fieldName == '' || error_div == '') {
			return false;
		}
		if (!document.forms[formName] || !document.forms[formName].elements[fieldName]) {
			return false;
		}

		var form = this.forms.find(this.__isMatch(formName));
		if (!form) {
			form = new ValidatorForm(formName);
			this.forms.push(form);
		}
		var field = form.fields.find(this.__isMatch(fieldName));
		if (!field) {
			field = new ValidatorField(fieldName);
			form.fields.push(field);
		}
		field.steps.push({
			'not': not,
			'regex': regex,
			'error_div': error_div,
			'required': (typeof required == 'undefined') ? true : required,
			'field': document.forms[formName].elements[fieldName]
		});

		return true;
	},

	ClearAll: function(formName) {
		var form = this.forms.find(this.__isMatch(formName));
		if (form) {
			this.__clear_errors(form);
		}
	},

	Clear: function(formName, fieldName) {
		var form = this.forms.find(this.__isMatch(formName));
		if (form) {
			var field = form.fields.find(this.__isMatch(fieldName));
			if (field) {
				this.__clear_error(field);
			}
		}
	},

	__clear_error: function(field) {
		field.steps.each(function(value) {
			var errorDiv = document.getElementById(value.error_div);
			if (errorDiv) {
				errorDiv.style.display = 'none';
			}
		});
	},

	__clear_errors: function(form) {
		form.fields.each(this.__clear_error);
	},

	__validate_all: function() {
		var result = true;
		for (var i=0; i<this.forms.length; i++) {
			if (this.__validate_form(this.forms[i])) {
				result = false;
			}
		}
		return result;
	},

	__validate_form: function(form) {
		var result = true;
		for (var i=0; i<form.fields.length; i++) {
			if (this.__validate_field(form.fields[i])) {
				result = false;
			}
		}
		return result;
	},

	__validate_field: function(field) {
		var result = true;
		for (var i=0; i<field.steps.length; i++) {
			if (this.__validate_step(field.steps[i])) {
				result = false;
			}
		}
		return result;
	},

	__validate_step: function(step) {
		var result;
		switch( step.field.type) {
			case 'checkbox':
				result = step.field.checked;
				break;

			case 'select-multiple':
				var size = step.field.options.length;
				for (var i=0; i<size; ++i){
					if (step.field.options[i].checked) {
						result = true;
						break;
					}
				}
				result = false;
				break;

			default:
				var value = step.field.value;
				if(typeof(value)=="undefined")
				{
					var radioObj = step.field;
					var radioLength = radioObj.length;
					if(radioLength == undefined)
					{
						if(radioObj.checked) value = radioObj.value;
						else value = "";
					}
					else
					{
						value = "";
						for(var i=0; i<radioLength; i++) 
						{
							if(radioObj[i].checked) value = radioObj[i].value;
						}
					}
				}
				var re= new RegExp(step.regex);
				result = (step.not) ? !value.match(re) : value.match(re);
		}
		if (!result) {
			var errorDiv = document.getElementById(step.error_div);
			if (errorDiv) {
				errorDiv.style.display = 'block';
			}
		}
		return result;
	}
};

var validator = new Validator();

function Validate(formName) {
	return validator.Validate(formName);
}

function AddValidationField(formName, fieldName, regex, error_div, required) {
	validator.AddValidationField(formName, fieldName, regex, error_div, required, 0);
}

function AddValidationFieldNot(formName, fieldName, regex, error_div, required) {
	validator.AddValidationField(formName, fieldName, regex, error_div, required, 1);
}

function ClearAll(formName) {
	validator.ClearAll(formName);
}

function Clear(formName,fieldName) {
	validator.Clear(formName,fieldName);
}

function Reset() {
	validator = new Validator();
}

