var local_errors;
var class_error;
var FORM_SUBMITED;
var Validations	=	
{
	init :  function ( form , error , form_submited ){
		class_error = error;
		FORM_SUBMITED = form_submited ? "#"+form_submited : eval ("this");
		return this.core.engine ( form );
	},
	
	core :
	{
		/**
		 * Faz uma busca no formulario por todos campos  com o pre-fixo de validação(v-)
		 * Os osbjetos são armazenados em uma matriz de objetos(DOM node, obrigatorio, tipo de validação, e tamanho minimo)
		 * @name find
		 * @params none
		 * @return void
		 * @access private
		 */
		find : function(){
			aFields	= new Array();
			
			$(FORM_SUBMITED).find(":input[@class*=v-]").each(function(i){
				var classes	= $(this).attr("class");
				var aClasses	= classes.split(" ");
				var total		= aClasses.length;

				for (var j = 0; j < total; j++){
					if (/\bv(-(!|\w*))+\b/.test(aClasses[j])){
						var aValidate	= aClasses[j].split("-");

						aFields[i]	= {
							obj	: this,
							obligated	: (aValidate[1] === "!") ? true : false,
							type : aValidate[2],
							minSize	: aValidate[3]
						}
					}
				}
			});
			
			return aFields;
		},
		/**
		 * Regras de validação
		 * Aqui ficam todas os tipos de validações  (string,empty, number, checked,radio);
		 * @name validate
		 * @params none
		 * @return true or false
		 * @access private
		 */
		validate : {
			empty	: function( value ) {
				if(value.value == ""  || $.trim(value.value) == "")
					return false;
				return true;
			},
			
			number : function( email ) {
				return /^[0-9]+$/.test(email.value);
			},
			
			email : function( email ) {
				return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(email.value);
			},
			
			string : function( obj ) {
				if(obj.value == "" || $.trim(obj.value) == "")
					return false;
				return true;
			},
			
			checked : function ( check ) {
				if ( check.checked )
					return true;
				return false;
			},
			
			radio : function( radio ){
				var radioChecked = $("form :input[@type=radio][@name="+radio.name+"][@checked]").val();
			    if ( radioChecked )
			        return true;
			    return false;
			}
		},
		
		/**
		 * Gera as mensagens de erro 
		 * Cria cada mensagem de erro em um nó DOM e exibe no elemento de id form-errors
		 * @name generate
		 * @params Array de mensagens de erro
		 * @return false
		 * @access private
		 */
		generate : function(errors){
			this.reset();
			var total	= errors.length;
			var items	= new Array();
			var obj	= document.getElementById(local_errors + "_list");
			var list = document.createElement("ul");
			var idLabel = null;

			for (i = 0; i < total; i++) {
				idLabel = "#lb_" + errors[i].name.replace(".","_");
				$( idLabel ).addClass( class_error );
				items[i] = document.createElement("li");
				items[i].innerHTML = errors[i].title;
				list.appendChild(items[i]);
			}
			obj.appendChild( list );
			return false;
		},
		
		/**
		 * Apaga as mensagens de erro
		 * @name reset
		 * @params void
		 * @return void
		 * @access private
		 */
		reset : function() {
			$("#" + local_errors + "_list").empty();
			$("[@id*=lb_]").each(function(){
				$(this).removeClass( class_error );
			});
		},
		
		/**
		 * Faz a chamada das validações para cada campo do formulario
		 * @name engine
		 * @params void
		 * @return void
		 * @access private
		 */
		engine	: function( local ){
			var fields	= this.find();
			var total	= fields.length;
			var result;
			var errors	= new Array();
		
			local_errors = local;
			
			for (var i = 0; i < total; i++)	{
				if (fields[i].obligated){
					result = eval( "this.validate." + fields[i].type + "(fields[i].obj)" );
					if ( !this.validate.empty (fields[i].obj) || !result){
						
						if (!result){
							errors.push(fields[i].obj)
						}
					}
				}	
			}
			if ( errors.length > 0 ){
				$("#"+local_errors).fadeOut("fast");
				$("#"+local_errors).fadeIn("slow");
				this.generate(errors);
				return false;
			}
			else  {
				$("[@id*=lb_]").each(function(){
					$(this).removeClass( class_error );
				});
				$("#"+local_errors).hide();
				return true;
		}
		}
	}
};