
function FormValidation(formId)
{
	this.formId = formId;
	this.errorMessages = new Array();
	this.errorClass = 'error';
	this.fields = new Object;
}

FormValidation.prototype.addField = function(name, required)
{
	this.fields[name] = new Object;
	this.fields[name].name = name;
	this.fields[name].required = required;
	this.fields[name].errorMessage = '';
}

FormValidation.prototype.isNotRequired = function(field)
{
	try 
	{
		var form = $(this.formId);
		return $(form[field]).hasClassName('notRequired');
	} 
	catch (e) 
	{
	}
	return false;
}

FormValidation.prototype.getValue = function(field)
{
	var fieldValue = "";
	var fieldName = field;
	var form = $(this.formId);

	if (!form[fieldName])
	{
		alert("The following field is defined in validation but is not present in the form.\n\nForm: " + this.formId +"\nField: " + field);
	}
	var fieldObj = form[fieldName];
	
	if (fieldObj.type == null)
	{
		for (i = 0; i < fieldObj.length; ++i)
			if (fieldObj[i].checked)
			{
				fieldValue = fieldObj[i].value;
				break;
			}
	}
	else if (fieldObj.type == "select-one")
	{
		if (fieldObj.selectedIndex == -1)
			fieldValue = "";
		else
		{
			fieldValue = fieldObj.options[fieldObj.selectedIndex].value;
		}
	}
	else if (fieldObj.type == "checkbox")
	{
		if (fieldObj.checked)
			fieldValue = fieldObj.value;
	}
	else
	{
		fieldValue = fieldObj.value;
	}

	fieldValue = fieldValue.replace(/^\s+/, "");
	fieldValue = fieldValue.replace(/\s+$/, "");

	return fieldValue;
}

FormValidation.prototype.addErrorMessage = function(msg, field)
{
	if (this.fields[field].errorMessage.length == 0) 
	{
		this.errorMessages.push(msg);
		var form = $(this.formId);
		if (field && this.errorClass) 
		{
			try
			{
				$(form[field]).addClassName(this.errorClass);
			}
			catch(e)
			{
				//ignore
			}
			this.fields[field].errorMessage = msg;
		}
	}
}

FormValidation.prototype.addErrorMessages = function(msg, fields)
{
	this.errorMessages.push(msg);
	var form = $(this.formId);
	for (var i = 0; i < fields.length; ++i)
	{
		var field = fields[i];
		if (field && this.errorClass) 
		{
			try
			{
				$(form[field]).addClassName(this.errorClass);
			}
			catch(e)
			{
				//ignore
			}
			this.fields[field].errorMessage = msg;
		}
	}
}

FormValidation.prototype.onValidationComplete = function()
{
	if (this.errorMessages.length)
	{
		var output = 'The following problems were found:\n';
		this.errorMessages.each(function(item)
		{
			output += '\n' + item;
		});
		alert(output);
		return false;
	}
	return true;
}

FormValidation.prototype.clearErrorMessages = function()
{
	this.errorMessages.length = 0;
	var form = $(this.formId);
	for (var field in this.fields) 
	{
		try
		{
			$(form[field]).removeClassName(this.errorClass);
		}
		catch(e)
		{
			//ignore
		}
		this.fields[field].errorMessage = '';
	}
}

FormValidation.prototype.fieldHasErrors = function(field)
{
	return (this.fields[field].errorMessage.length > 0); 
}

FormValidation.prototype.getFieldError = function(field)
{
	return this.fields[field].errorMessage; 
}

FormValidation.prototype.setFieldRequired = function(field)
{
	this.fields[field].required = 1; 
}

FormValidation.prototype.clearFieldRequired = function(field)
{
	this.fields[field].required = 0; 
}

FormValidation.prototype.setFieldErrorClass = function(errorClass)
{
	this.errorClass = errorClass;
}

var validationForms = new Object;

function validateForm(form)
{
	if (validationForms[form.id]) 
	{
		return validationForms[form.id].validate();
	}
	return true;
}

function validateRequired(form,field,errorMsg){if(!form.isNotRequired(field)&&form.getValue(field)=='')form.addErrorMessage(errorMsg,field);}
function validateMaxLength(form,field,maxLength,errorMsg){if(form.getValue(field).length>maxLength)form.addErrorMessage(errorMsg,field);}
function validateMinLength(form,field,minLength,errorMsg){var length=form.getValue(field).length;if(length>0&&length<minLength)form.addErrorMessage(errorMsg,field);}
function validateText(form,field,errorMsg){if(form.getValue(field).search(/[<>]/)>=0)form.addErrorMessage(errorMsg,field);}
function validateNumeric(form,field,errorMsg){var value=form.getValue(field);if(value.search(/[^0-9.]/)>=0||value.search(/\..*\./)>=0)form.addErrorMessage(errorMsg,field);}
function validateEmail(form,field,errorMsg){var value=form.getValue(field);if(!value.length)return;var tmpVar=value.split('@');if((tmpVar.length!=2)||(tmpVar[0].search(/^[-#-'\/-9A-Z^-{!*+?}~]$|^[-#-'\/-9A-Z^-{!*+?}~][-#-'\/-9A-Z^-{!*+.?}~]*[-#-'\/-9A-Z^-{!*+?}~]$/)!=0)||(tmpVar[1].search(/^[a-zA-Z0-9]([a-zA-Z0-9\.\_\-]*[a-zA-Z0-9])?\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/)!= 0)||(tmpVar[1].search(/\.{2}/)!=-1||tmpVar[1].search(/\_{2}/)!=-1||tmpVar[1].search(/\-{2}/)!=-1))form.addErrorMessage(errorMsg,field);}
