/**
* Validación de formularios
* Desarrollado por datapixels.net (www.datapixels.net)
* Atribuir las claves necesarias en this.clases en la clase de cada elemento a validar
* No es necesario llamar manualmente para cada formulario, se detectarán todos los formularios de la página y los observará
* @requires librería Jquery
*/

jQuery.fn.validacion = function() {

	var no_validados = new Array();
	var clase_error = "errorForm";
	var clases = new Array("vrequerido","vemail","vnumero","valfa","valfanumerico","vdecimal","vunosolo");
	var avisos = new Array("es","en");
	avisos["es"] = new Array("Es un campo requerido","No es una dirección de correo válida","Debe estar formado solamente por dígitos","Debe estar formado solamente por letras","Debe estar formado por letras y números","Debe estar formado por un valor entero o decimal utilizando la coma como separador de decimales","Tienes que seleccionar uno o más valores en una única opción.");
	var idm = jQuery("html").attr("lang");
	var idioma = "es";
	var title = false; // Debe o no enseñar la etiqueta title como parte del error
	if (avisos[idm]) {
		idioma = idm;
	}
	var form_actual = "";
	
	return this.each(function() {
		form_actual = this;
 		jQuery(this).submit(function() { 
 			limpiarFormulario(this);
			no_validados = new Array();
			if (buscaElementos(this)==false) {
				alert("Los campos marcados en rojo no han sido correctamente rellenados");
				return false;
			} else {
				return true;
			}
  		});
	});
	
	function buscaElementos(form) {
		$.each(clases,function(pos, clase) {
			jQuery("."+clase, form.elements).each(function() {
				var elemento = this;
				if (validar(elemento, clase, pos)==false) {
					if (no_validados.indexOf(elemento)==-1) {
						no_validados.push(elemento);
					}
				}				
			});
		});
		return (no_validados.length>0) ? false : true;
	};	
	
	function limpiarFormulario(form) {
		jQuery("."+clase_error,form.elements).removeClass(clase_error);
	};	
	
	function avisarError(elemento, pos_tipo) {
		$(elemento).addClass(clase_error);
	};	
	
	function validar (elemento, tipo, pos_tipo) {
		var v_elemento = jQuery(elemento).val();
		var dev = true;
		if (typeof v_elemento=="undefined" || v_elemento==null) {
			v_elemento = "";
		}
		if (!isArray(v_elemento)) {
			v_elemento = new Array (v_elemento);
		} else {
			if (v_elemento.length==0) {
				if (!validarValor(elemento, tipo, pos_tipo, "")) {
					dev = false;
				}
			}
		}
		for (var i=0; i<v_elemento.length; i++) {
			if (!validarValor(elemento, tipo, pos_tipo, v_elemento[i])) {
				dev = false;
			}
		}		
		return dev;
	};
	
	function validarValor (elemento, tipo, pos_tipo, valor) {
		if (eval(tipo+"(valor)")==false) {
			if (no_validados.indexOf(elemento)==-1) {
				avisarError(elemento, pos_tipo);
			}
			return false;
		} else {
			return true;
		}
	};

	function valfa (valor) {
		return (vrequerido(valor)==false) ? true : evaluar(valor, "^[a-zA-Z]+$");
	};
	
	function valfanumerico(valor) {
		return (vrequerido(valor)==false) ? true : evaluar(valor, "^[a-zA-Z0-9]+$");
	};
	
	function vnumero(valor) {
		return (vrequerido(valor)==false) ? true : evaluar(valor, "^[0-9]+$");
	};
	
	function vdecimal(valor) {
		return (vrequerido(valor)==false) ? true : evaluar(valor, "^[0-9\,]+$");
	};
	
	function vrequerido (valor) {
		return !evaluar(valor, /^\s*$/);
	};
	
	function vemail(valor) {
		return (vrequerido(valor)==false) ? true : evaluar(valor, "^[a-z0-9]+([_\\.-][a-z0-9]+)*"+"@([a-z0-9]+([\.-][a-z0-9]{1,})+)*$");
	};
	
	function vunosolo(valor) {
		var cant = 0;
		jQuery(".vunosolo",form_actual).each(function() {
			var texto = jQuery(this).val();
			cant = (texto.search(/^\s*$/)>-1!=false) ? cant : cant+1;
		});
		return cant==1 ? true : false;
	};
	
	function evaluar(valor, expresion) {
		return valor.search(expresion)>-1 ? true : false;
	};
	
	function isArray(obj) {
		if (obj.constructor.toString().indexOf("Array") == -1) {
			return false;
		} else {
			return true;
		}
	};	
};

jQuery(function($) {
	$("form").validacion();
});
