function formValidator(szFormID, szSubmitOverride)
{
	this.szForm = szFormID;
	this.oDetails = null;		
	this.szSubmitOverride = null;
	this.arrValidations = new Array();	
	
	var oFormValidator = this;	
	YAHOO.util.Event.on(this.szForm, 'submit', this.formSubmitHandler, oFormValidator);
		
	if (szSubmitOverride != 'undefined' && szSubmitOverride != null)
	{
		this.szSubmitOverride = szSubmitOverride;
	}
}

formValidator.prototype.addValidation = function(oValidationRules)
{
	this.arrValidations.push(oValidationRules);	
}

//factory method 
formValidator.prototype.getValidationObject = function(szType)
{
	//szReturnMe = 'Could not retreive validator for field: ' + oValidationData.id;
	//var oField = YAHOO.util.Dom.get(oValidationData.id);
	var oValidator = null;
	switch(szType)
	{
		case 'not_empty':			
			oValidator = new notEmptyValidator();
			break;
		case 'min_length':
			oValidator = new minLengthValidator();
			break;
		case 'max_length':
			oValidator = new maxLengthValidator();
			break;
		case 'file_type':
			oValidator = new fileTypeValidator();			
			break;
		default:
			break;
	}	
	return oValidator;
}

formValidator.prototype.formSubmitHandler = function(event, oFormValidator)
{		
	
	var iValidatorCount = oFormValidator.arrValidations.length;	
	var arrErrors = new Array();
	for (var i = 0; i < iValidatorCount; i++)
	{		
		var oVO = oFormValidator.getValidationObject(oFormValidator.arrValidations[i].type);
		if (oVO != null)
		{			
			oVO.initialize(oFormValidator.arrValidations[i]);
			if (!oVO.validate() )
			{
				arrErrors.push(oFormValidator.arrValidations[i].errorMessage); 
			}
		}
		else
		{						
			arrErrors.push('Could not find form validator object for ' + oFormValidator.arrValidations[i].id); 
		}		
	}	
	
	
	var iErrorLength = arrErrors.length;
	if (iErrorLength)
	{
		var szError = "The form could not be submitted due to the following errors: \n";
		for (var i = 0; i < iErrorLength; i++)
		{
			szError += arrErrors[i] + "\n";
		}
		alert(szError);
		YAHOO.util.Event.preventDefault(event);
	}
	else
	{
		if (oFormValidator.szSubmitOverride)
		{
			YAHOO.util.Event.preventDefault(event);
			eval(oFormValidator.szSubmitOverride +'()');
		}
	}
}

function baseValidationObject()
{	
}

baseValidationObject.prototype.initialize = function(oValidationDetails)
{	
	this.oFormObj = YAHOO.util.Dom.get(oValidationDetails.id);
	this.oDetails = oValidationDetails;
	/*
	if (oValidationDetails.rule != 'undefined' && oValidationDetails.rule != null)
	{
		
		this.szRule = oValidationDetails.rule;		
	}
	
	if (oValidationDetails.required != 'undefined' && oValidationDetails.required != null && oValidationDetails.required)
	{
		this.szRequired = true;
	}
	*/
}

/*Not empty validator */
function notEmptyValidator()
{	
}
notEmptyValidator.prototype = new baseValidationObject();
notEmptyValidator.prototype.validate = function()
{
	bReturnMe = false;	
	var szValue = this.oFormObj.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	if (szValue.length)
	{
		bReturnMe = true;
	}
	return bReturnMe;
}

function maxLengthValidator()
{
}
maxLengthValidator.prototype = new baseValidationObject();
maxLengthValidator.prototype.validate = function()
{	
	var bReturnMe = false;	
	if (this.oFormObj.value.length <= this.oDetails.rules)
	{
		bReturnMe = true;
	}
	return bReturnMe;
}


function minLengthValidator()
{
}
minLengthValidator.prototype = new baseValidationObject();
minLengthValidator.prototype.validate = function()
{		
	bReturnMe = false;		
	if (this.oFormObj.value.length >= this.oDetails.rules)
	{
		bReturnMe = true;
	}
	return bReturnMe;
}

function fileTypeValidator()
{
}
fileTypeValidator.prototype = new baseValidationObject();
fileTypeValidator.prototype.validate = function()
{		
	bReturnMe = false;
	var szValue = this.oFormObj.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	
	if (szValue.length)
	{		
		var szExtension = szValue.substr(szValue.length - 3, 3);
		for (var i = 0; i < this.oDetails.rules.length; i++)
		{
			if (szExtension.toLowerCase() == this.oDetails.rules[i].toLowerCase())
			{				
				bReturnMe = true;
				break;
			}
		}
	}
	else
	{
		if (!this.oDetails.required)
		{
			bReturnMe = true;
		}
	}	
	return bReturnMe;
}