﻿/**
  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.0
  Fecha : 04/02/2010
  (c) CreativeCocos
 */
 
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)
			error = true;
	}
	// numeric fields
	if (clase.indexOf("numeric")!=-1 || clase.indexOf("numerico")!=-1) {
		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 (!/^\+?(\d+[\-\. ])*\d+$/.test(cadena))
			error = true;
	}
	// emails
	if (clase.indexOf("email")!=-1 || clase.indexOf("correoe")!=-1)
		if (cadena!="")	{//sólo se valida si el campo es diferente de vacío. Se supone que sólo se comprueba si es requerido si se utiliza la clase "required email"
			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 (!/^((\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) {
		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 (!/^[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 (!/^[a-zA-Z0-9áéíóúñüÁÉÍÓÚÑÜ\.,;\s]+$/.test(cadena))
			error = true;
	}
	if (error) {
		$(field).addClass("error");
		var ef = $("#errores_formulario");
		if (ef.length>0) {
			ef.css("display","block");
			ef.html("Debes rellenar todos los campos correctamente.");
		}			
	} else {
		$(field).removeClass("error");
	}
	
	return !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;
		}
	});
	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) } );
    		}
		});
	});
});
