﻿/**
  Conjunto de funciones que permiten validar diferentes tipos de campos.
  Los nombres de las clases pueden escribirse en castellano y en inglés.
  
  Requisitos:
  - La existencia de un contenedor con id = "errores_formulario", donde se mostrarán los mensajes de error pertinentes.
  
  Juan Capristán - Basado en jquery.simplevalidate por 
	Versión 1.1 - 24/05/2010
	
	Historial :
  V.1.0 - 04/02/2010 - Versión inicial
	V.1.1 - 24/05/2010 - Añadí soporte para validar números de cuenta bancaria.
	                   - Añadí efecto de fadeIn al recuadro de error.
										 - Añadí la desaparición del recuadro de error cuando se corrige un error sobre la marcha.
										 - El validador cadenasimple también valida como correcta la cadena vacía (a menos que también sea obligatoria)
										 - Los campos validan correctamente si son vacíos y no son obligatorios
										 - Añadida validación de radiobuttons (al menos 1 radio de cada grupo debe estar seleccionado)
	
  (c) CreativeCocos.com
 */
 
function trim(cadena) {return(cadena.replace(/^ *(.*) *$/,"$1"));}

function validateField(field) {
	var error = false;
	var clase = $(field).attr("class");
	var cadena = trim($(field).val());
	
	// required fields
	if (clase.indexOf("required")!=-1 || clase.indexOf("obligatorio")!=-1) {
		if (cadena.length==0)
			error = true;
	}
	// numeric fields
	if (clase.indexOf("numeric")!=-1 || clase.indexOf("numerico")!=-1) {
		if(cadena.length>0)
			if (!/^[0-9]+$/.test(cadena))
				error = true;
	}
	// telephone = con espacios, guiones, puntos y +. Longitud máxima = 19
	if (clase.indexOf("telephone")!=-1 || clase.indexOf("telefono")!=-1) {
		if(cadena.length>0)
			if (!/^\+?(\d+[\-\. ])*\d+$/.test(cadena))
				error = true;
	}
	// cuentabancaria = bloques de números separados por espacios, guiones y puntos
	if (clase.indexOf("cuentabancaria")!=-1) {
		if (!/^(\d+[\-\. ])*\d+$/.test(cadena))
			error = true;
	}
	// emails
	if (clase.indexOf("email")!=-1 || clase.indexOf("correoe")!=-1) {
		if (cadena.length>0)
			if (!/^[a-zA-Z0-9_~-]+(\.[a-zA-Z0-9_~-]+)*@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+([A-Za-z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)$/.test(cadena))
				error = true;
	}
	//shortdate
	if (clase.indexOf("shortdate")!=-1 || clase.indexOf("fechacorta")!=-1) {
		if(cadena.length>0)
			if (!/^((\d{1,2}[\/\.\- ]\d{1,2}[\/\.\- ]\d\d(\d\d)?)|(\d\d(\d\d)?[\/\.\- ]\d{1,2}[\/\.\- ]\d{1,2})|(\d{8}))$/.test(cadena))
				error = true;
	}		
	//age (valor numérico entre 0 y 150
	if (clase.indexOf("age")!=-1 || clase.indexOf("edad")!=-1) {
		if(cadena.length>0) {
			var edad = parseInt(cadena);
			if(/^\d+$/.test(cadena) && !isNaN(edad)) error = (edad<0 || edad>150);
			else error = true;
		}
	}
	//simplestring / cadenasimple (letras y espacios)
	if (clase.indexOf("simplestring")!=-1 || clase.indexOf("cadenasimple")!=-1) {
		if(cadena.length>0)
			if (!/^[a-zA-ZáéíóúñüÁÉÍÓÚÑÜ ]+$/.test(cadena))
				error = true;
	}
	//cadena (letras, números, espacios y signos de puntuación básicos)
	if (clase.indexOf("string")!=-1 || clase.indexOf("cadena")!=-1) {
		if(cadena.length>0)
			if (!/^[a-zA-Z0-9áéíóúñüÁÉÍÓÚÑÜ\.,;\s]+$/.test(cadena))
				error = true;
	}
	if (error) {
		$(field).addClass("error");
		var ef = $("#errores_formulario");
		if (ef.length>0) {
			ef.fadeIn();
			ef.html("Los campos señalados contienen errores. Por favor corrígelos.");
		}
	} else {
		$(field).removeClass("error");
		$("#errores_formulario").hide();
	}
	
	return !error;
}

function validateRadios(){
	var radios_validados = "";
	var nombre_radio = "";
	var radios_no_validados = "";
	var hay_error = false;
	$("input[type=radio]").each(function(){
		nombre_radio = $(this).attr("name");
		if(radios_validados.indexOf(nombre_radio) == -1 && !hay_error)
			if($("input[name="+nombre_radio+"]:checked").length == 0) {
				hay_error = true;
				$("input[name="+nombre_radio+"]").addClass("error");
			} else {
				radios_validados += nombre_radio + ",";
			}
	})
	if(hay_error) {
		$("#errores_formulario").fadeIn();
		$("#errores_formulario").html("Los campos señalados contienen errores. Por favor corrígelos.");
	}
	return !hay_error;
}

//Teniendo esta función fuera, podemos llamarla desde otro script que haga el envío por ajax en vez de hacerlo desde el botón submit
function validateAllFields(evento) {
	var validationError = false;
	// for each field test it
	$("input, select, textarea", evento.data.formulario).each( function() {
		if ($(this).attr("class")) {
			if (!validateField(this))
				validationError = true;
		}
	});	
	// para todos los grupos de campos de tipo radiobutton, se valida que al menos haya un radio seleccionado	
	if(!validateRadios()) validationError = true;
	return !validationError;
}

$(document).ready( function() {
	$("form").each( function() {
		// handle submissions without filling any field
		$(this).bind("submit",{formulario:$(this)},validateAllFields);
	
		// handle changes on the fly
		$("input, select, textarea", this).each( function() {
			if ($(this).attr("class")) {
				$(this).blur( function() { validateField(this) } );
    		}
		});
	});
});
