


// a generic, configurable form validator. Each field listed in the validationConfig gets tested 
// against any number of validation functions, defined in Validator. Additional functions can be added to the Validator class, 
// or attached to an instance after creation
var Validator = function(validationConfigArg){

	var form;
	var validationConfig = validationConfigArg;
	var thisObj = this;
	var errorDivs = [];
	var errorElems = [];
	this.ERROR_CLASS_NAME = "error";

	this.run = function(formArg){
		var isValid = true;
		form = formArg;
		this.removeErrors();
		validationConfig.fields.each(function(fieldConfig){
			var field = eval("form['" + fieldConfig.fieldName + "']");

			for (var requirement in fieldConfig.requirements){
				if(!eval("thisObj." + requirement)(field)){
					isValid = false;
					thisObj.tellUserAboutError(field, fieldConfig.requirements[requirement]);
					break;
				}
			}
		})	
		return isValid;
	}

	this.tellUserAboutError = function(field, message){
		div = new Element("div");
		div.update(message);
		div.addClassName(this.ERROR_CLASS_NAME);
		Insertion.Before(field, div);  
		errorDivs.push(div );
		field.addClassName(this.ERROR_CLASS_NAME);
		errorElems.push(field);

	}

	this.removeErrors = function(){
		errorDivs.each(function(div){
			div.remove();
		});	
		errorDivs.clear();
		errorElems.each(function(elem){
			elem.removeClassName(this.ERROR_CLASS_NAME);
		});
		errorElems.clear();
	}

	
	// VALIDATION FUNCTIONS

	this.validEmail =  function(elem) {
		if(elem.value.indexOf("@") == -1){
			return false
		}else{
return true;
}
	},

	this.notBlank = function(elem) {
		if(elem.value == ""){
			return false;
		}else{
			return true;
		}
	}

}
