// Revision 002

Validator = {
	"validate": function(formSelector) {
		var form = $(formSelector);
		var fields = $(":input",form);
		var validator = this;
		var invalidFields = [];
		fields.each(function() {
			var jqThis = $(this);

			// If the field is not required and is blank we don't have to validate it
			if(!jqThis.is(".required") && jqThis.val() == "") {
				validator.onSucceed(jqThis);
				return;	
			} else if(jqThis.is(".required") && jqThis.val() == "") {
				validator.onFail(jqThis);
				invalidFields.push(this);
				return;
			}
			
			var classes = jqThis.attr("class").split(" ");
			var validField = true;
			for(var i in classes) {
				if(typeof(validator.rules[classes[i]]) == "function") {
					if(!validator.rules[classes[i]](jqThis.val())) {
						validField = false;
					}
				}
			}
			if(!validField) {
				validator.onFail(jqThis);
				invalidFields.push(this);			
			} else {
				validator.onSucceed(jqThis);	
			}			
		});
		
		if(invalidFields.length == 0) {
			form.removeData("invalidFields");
			return true;
		} else {
			form.data("invalidFields",invalidFields);
			return false;	
		}
	},
	
	"onFail" : function(jqField) {
		jqField.addClass("failed");
	},	

	"onSucceed" : function(jqField) {
		jqField.removeClass("failed");
	},
		
	"rules": { 
		"phone": function(value) {
			return value.match(/^(([(]?([2-9]\d{2})[)]?|([2-9]\d{2}))|)(-?| ?)[2-9]\d{2}[- ]?\d{4}/i);
		},
		"zip": function(value) {
			return value.match(/^\d{5}([\-]\d{4})?$/);
		},
		"email": function(value) {
			return value.match(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
		},	
	}
};

$(function() { 
	$("form.validate").submit(function() {
		return Validator.validate(this);
	});
});