/**
 * @author Will
 */

var validation = Class.create({
	
	 initialize: function(form,options){
	 	if (!$(form)) {
	    throw(form+" doesn't exist!");
	    return false;
	  }
	   Element.addMethods(this.methods);
	  	this.form = $(form);		
		this.fields = new Array();
		Event.observe(form,'submit',this.validate);
		
		
	 },
	 validate: function(){
	 	var validated = true;
		
		$$('#' + this.form.id + " .error-msg").each(function(e){
			e.remove();
		});
		
		$$('#' + this.form.id + " .error-field").each(function(e){
			e.removeClassName('error-field');
		});
		
	 		this.fields.each(function(field){
	 			switch (field['type']) {
	 				case 'text':
	 					if (!$(field['element']).checkText()) {
	 						$(field['element']).showError(" * This field is required");
							validated = false;
	 					} else if (!$(field['element']).checkLength(field['minLength'])) {
	 							$(field['element']).showError(" * Entry must be longer than " + field['minLength'] + " characters");
								validated = false;
	 					};	 
	 					break;
					case 'email' :
						if (!$(field['element']).checkText()) {
	 						$(field['element']).showError(" * This field is required");
							validated = false;
	 					} else if (!$(field['element']).checkEmail()) {
	 						$(field['element']).showError(" * Please enter a valid e-mail address");
							validated = false;							
						} else if (!$(field['element']).checkLength(field['minLength'])) {
								$(field['element']).showError(" * Entry must be longer than " + field['minLength'] + " characters");
								validated = false;
							};	 
	 					break;
	 			};
	 				 		});
	 		return validated;
	 	},
		add_field: function(element, options){
	 		if (!$(element)) {
	 			throw (element + " doesn't exist!");
	 			return false;
	 		}
	 		
	 		if ($(element).form != this.form) {
	 			throw (element + " not in this form!");
	 			return false;
	 		}
	 		
	 		var element_options = Object.extend({
	 			type: 'text',
	 			minLength: 2
	 		}, options ||
	 		{});
	 		this.fields.push((Object.extend({
	 			element: element
	 		}, element_options)));
	 		
	 	},
	 methods: {
	 	
	 	
	 	showError: function(element, msg){
	 		$(element).addClassName('error-field');
			$(element).insert({after:'<span class="error-msg">' + msg + '</span>'});
	 	},
	 	checkLength: function(element, length){
	 		return ($F(element).length >= length) ? true : false;
	 	},
	 	checkText: function(element){
	 		return ($F(element) != "") ? true : false;
	 	},
		checkEmail: function(element){
			var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			return(filter.test($F(element))) ? true : false;
			
		}
	 }
})
