/*
 * jQuery valForm plugin 1.0
 *
 * Copyright (c) 2009 Ritaine David
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
 
;(function($) {
	
	$.valForm = {
		aFormElmt : [":checkbox",":text",":password",":radio",":hidden","textarea","select"]
	};
	
	$.extend($.fn, {
		valForm: function(fields,debug) {
			
			var sForm 		= $(this);
			var bFormVal	= true;
			
			var __initValForm = function() {
				
				if($.isArray(fields) && fields.length > 0) {
					
					var aValField = [];
					$.each(fields, function() {
						this.elmt 		= $(":input[name^='data["+this.name+"]']");
						this.type 		= __findFormType(this.elmt);
						
						if(!this.type) {
							if(debug)
								alert(this.name + " Not reconized... remove this check entrance");
						}
						else {
							this.msShow 	= $("#msShow_"+this.name);
							this.error 		= false;
							if((this.type == "text" || this.type == "password") && typeof(this.relto) != "undefined") { // only for text/password input
								this.reg 	= undefined;
							}
							if($("#dv_error_"+this.name).length) { // Error div already up
								__setError(this, false, false);
							}
							aValField.push(this);
						}
					});
					fields = aValField;
				}
				
				if(fields.length > 0) {
					sForm.submit(function() {
						bFormVal = true;
						$.each(fields, function() {
							__verifVal(this);
						});
						return bFormVal;
					});
				}
				else {
					if(debug)
						alert("No field to check - Disable valForm");
				}
			};
			
			var __findFormType = function (elmt) {
				sType = false;
				
				for(i = 0 ; i < $.valForm.aFormElmt.length &&  sType === false ; i++) {
					if(elmt.is($.valForm.aFormElmt[i]))
						sType = $.valForm.aFormElmt[i].replace(":", "");
				}
				return sType;
			};
			
			var __verifVal = function(field) {
				
				switch(field.type) {
					case "text" :
					case "password" :
					case "textarea" :
					case "hidden" :
						var sVal 	= $.trim($(field.elmt).val());
						
						var bCheck 	= true;
						var bError 	= false;
						
						if(typeof(field.none) != "undefined" && field.none === true && sVal == "") {
							bCheck = false;
						}
						if(bCheck) {
							
							if(typeof(field.reg) != "undefined") {
								var expreg = new RegExp(field.reg,'i');
								if (expreg.exec(sVal)==null)  bError = true;
							}
							else if (typeof(field.relto) != "undefined") {
								if(sVal != $("#"+field.relto).val()) {
									bError = true;
								}
							}
							else if(sVal == "") {
								bError = true;
							}
						}
						
						if(bError) {
							__setError(field,true,true);
						}
						else if(field.error) __clearError(field);
						break;
					case "checkbox" :
					case "radio" :
						var n = $(field.elmt).filter("input:checked").length;
						if (n == 0) __setError(field,false,true);
						else if(field.error) __clearError(field);
						break;
					case "select" :
						if ($(field.elmt).val() == "0") __setError(field,true,true);
						else if(field.error) __clearError(field);
						break;
				}
			};
			
			var __setError = function(field, bModClass,bAddDiv) {
				bFormVal	= false;
				if(!field.error) {
					if(bModClass) {
						$(field.elmt).addClass("inputError");
					}
					if(bAddDiv) {
						$(field.msShow).append("<div class='errorField' id='dv_error_"+field.name+"'>"+field.mess+"</div>");
					}
					
					// namespace event binding - which allows you to easily remove specific named bindings; leaving the other bindings intact.
					$(field.elmt).bind("change.err click.err keyup.err", function () {
						__verifVal(field);
					});
					field.error = true;
				}
			};
			
			var __clearError = function(field) {
				if(field.error) {
					$("#dv_error_"+field.name).remove();
					$(field.elmt).removeClass("inputError").unbind(".err");
					field.error = false;
				}
			};
			
			__initValForm();
		}
	});
})(jQuery);  
