window.addEvent('domready', function(){
	
	$(document.body).getElements("form").each(
		function (el) {
			if (el.getElement("input[type=reset]")) {
				el.getElement("input[type=reset]").addEvent("click", function() {
					$$("div.error-message").each(
						function (e) {
							e.dispose();
							}
						); // end div error removal
					if(!$("site-mask")) {
						var myFx = new Fx.Scroll(window).toElement(el);
						}
					});
				}
			}
		);
	});
// pass in form element reference
var FormValidator = new Class({
	Implements : [Events, Options],
	Extends : Fx,
	options : {
		isExternal 	: false,
		scrollToError : true,
		rules		: [],
		onSubmit	: $empty,
		onValidation : $empty
		},
	initialize : function (element, options) {
		
		this.setOptions(options);
		this.element = element;
		this.rules = this.options.rules;
		this.errors = [];
		this.isExternal = this.options.isExternal;
		this.options.onSubmit = !options.onSubmit ? $empty : options.onSubmit.bind(this)
		this.options.onValidateError = !options.onValidateError ? $empty : options.onValidateError.bind(this)
		this.options.scrollToError = options.scrollToError;
		//for(p in this.options) {alert(p)}
		//this.element.set("onComplete", this.options.onSubmit)

		this.element.addEvent("submit", function (ev) {
			ev.stop();
			this.validate();
			if(this.isValid()) {
				if (!this.isExternal) {
					this.element.submit();
					}
				else {
					(function() {this.options.onSubmit.run();}.bindWithEvent(this)).run()
					//this.options.onSubmit.run(this);
					}
				}
			else {
				for(var r =0; r < this.rules.length; ++r) {
					var hasError = false;
					if (this.rules[r].errorContainer) {_target = this.rules[r].errorContainer;} else {_target = this.rules[r].element.getParent()}
					for(var e = 0; e < this.errors.length; ++e) {
						if (this.rules[r].element == this.errors[e].element) {
							if (!_target.getElement("div[class=mooform-error-message]")) {
								var fieldError = new Element("div", {"class":"mooform-error-message"}).set("text", this.errors[e].message).inject(_target).setOpacity(0);
								new Fx.Morph(fieldError, {duration: 1000, wait:false}).start({"opacity":[.5,1]})
								}
							var hasError = true;
							break;
							}
						}
					if (!hasError && _target.getElement("div[class=mooform-error-message]")) {
						_target.getElement("div[class=mooform-error-message]").dispose();
						}
					
					}
				this.options.onValidateError.run();
				if(!$("site-mask") && this.options.scrollToError) {
					new Fx.Scroll(window).toElement(this.errors[0].element.getParent());
					}
				
				}
			}.bind(this));
		this.element.addEvent("reset", function () {
			this.reset();
			}.bind(this))
		},
	reset : function () {
		$$("div.mooform-error-message").each(
			function (e) {
				e.dispose();
				}
			); // end div error removal
			
		},
	addRule : function (element, required, datatype, message, errorContainer) {
		var props = {"element":element, "required":required,"datatype":datatype, "message":message};
		if (errorContainer) {props.errorContainer = errorContainer}
		this.rules.push(props);
		},
	
	validate : function () {
		this.errors.empty();
		//this.reset();
		for(var i =0; i < this.rules.length; ++i) {
			if (!this.check(i)) {
				this.errors.push(this.rules[i]);
				}
			}
		return this.errors;
		},
	isValid : function () {
		return !this.errors.length;
		},
	check : function (item) {
		var field = this.rules[item]["element"];
		var required = this.rules[item]["required"]
		var datatype = this.rules[item]["datatype"]
		
		var emailReg = /^[^@]+@[^@.]+\.[^@]*\w\w$/
		var fieldType = field.length && !field.options ? field[0].type : field.type;

		switch (fieldType.toLowerCase()) {
			case "text" : {
				if (datatype != null && field.value.replace(/[ ]/g, "").length != 0) {
					switch(datatype) {
						case "email" : {
							if (!emailReg.test(field.value)) {return false;}
							return true;
							break;
							}
						case "numeric" : {
							return !isNaN(field.value);
							break;
							}
						default : {
							if(required) {return field.value.replace(/[ ]/g, "").length;}
							else {return true;}
							break
							}
						}
					}
					
				
				if(required) {return field.value.replace(/[ ]/g, "").length;}
				else {
					return true;
					}
				return field.value.replace(/[ ]/g, "").length
				break;
				}
				
			case "checkbox" : {
				var options = this.element.getElements("input[name=" + field.name + "]")
				if (options.length) {
					for (var i = 0; i < options.length; ++i) {
						if (options[i].checked) {
							return true;
							}
						}
					}
				else {
					return field.checked;
					}
					
				return false;
				break;
				}
			
			case "radio" : {
				var options = this.element.getElements("input[name=" + field.name + "]")
				for (var i = 0; i < options.length; ++i) {
					if (options[i].checked) {
						return true;
						}
					}
					
				return false;
				break;
				}
			
			case "textarea" : {
				
				var validate 	= field.getAttribute("onkeydown");
				field.value = field.value.replace(/( ){1,}/g, '$1');
				if (validate) {
					if (typeof validate == "string") {
						return eval(validate);
						}
					else {
						return validate();
						}
					}
				
				if(required) {
					return field.value.replace(/[ ]/g, "").length;
					}
				else {
					return true;
					}	

				break;
				}
			
			default : {
				return field.value.replace(/[ ]/g, "").length
				break;
				}
			}
		}
	
	
	});
	
	
	

	
