// JavaScript Document
/* 
	Form Validator
	v 2.1
	Desarrollado por: Francisco Sevilla < fsevilla@gmail.com >
	Creado el: 25 May 2009
	Ultima modificacion: 2 Nov 2009
*/

var showAlert = true; //determina si se muestra el alert de verificar la informacion
var showLabel = true; //determina si se muestran las etiquetas de campos requeridos
var requiredClass = 'requerido';

function validar(formulario){
	
	var elementos = Form.getElements(formulario);
	
	//borra todos los alerts de campo requerido si existen
	borrarCamposRequeridos();
	
	flag = 1; //1 -> envia formulario. 0 -> no se envia el formulario
	elementos.each(
			function (elemento){				
					if(!validarTipo($(elemento)))
						flag = 0;
			}
	);
	
	if (flag==0){
		if(showAlert)
			alert('Favor de verificar la informacion de los campos requeridos');
		return false
	}
	else
	return true;
}

	/****************************************************************
						Tipos de Validacion 
	*****************************************************************
	null 	-> verifica que el campo contenga algun valor
	numero	-> compara valor numerico real o entero
	entero	-> valida numeros enteros
	email	-> valida formato de email
	tel		-> valida formato de telefono
	fecha	-> valida formato de fecha
	pass	-> valida contraseÃ±a (solo caracteres alfanumericos)
	confirm	-> compara el valor con el campo tipo pass. Deben ser iguales.
				El campo con el que se va a comparar debe tener un id (default: password)
	file	-> valida un formato o formatos de archivo especificado
	****************************************************************/
	
function validarTipo(elemento){
	var tipo = $(elemento).getAttribute('tipo');

	switch(tipo){
		case null: valido = notNull(elemento); break;
		case 'numero': valido = isNumeric(elemento); break;
		case 'entero': valido = isInteger(elemento); break;
		case 'email': valido = validEmail(elemento); break;
		case 'tel': valido = validTel(elemento); break;
		case 'fecha': valido = validDate(elemento); break;
		case 'pass': valido = validPassword(elemento); break;
		case 'confirm': valido = confirmPassword(elemento); break;
		case 'file': valido = validFile(elemento); break;
		
		default: valido = notNull(elemento); break;
	}

	if(valido)
		return true;
	else
		return false;

}

//Compara si el valor es nulo
function isNull(valor){
	if( valor == null || valor.length == 0 )
			return true;
		else
			return false;	
}

//Compara si el valor es nulo o contiene unicamente espacios en blanco
function isNullorSpaces(valor){
	if( valor == null || valor.length == 0 || /^\s+$/.test(valor) )
			return true;
		else
			return false;	
}

//Verifica que el valor de elemento no sea Nulo
function notNull(elemento){
	requerido = $(elemento).getAttribute('requerido');
	valor = $(elemento).value;
		
	if(requerido == 'requerido')
		if( isNullorSpaces(valor) )  
				valido = false;
			else
				valido = true;	
	else 
		valido = true;
		
	if (valido)
		return true;
	else{
		crearElemento(elemento);
		return false;
	}
}


//Verifica que el valor de elemento sea un numero
function isNumeric(elemento){
	valor = $(elemento).value;
	if(!isNaN(valor) && !isNullorSpaces(valor)) 
		valido = true;
	else if (isNull(valor))
		valido = notNull(elemento); //Regresa false si el campo sí es requerido. Si no es requerido regresa true	
	else
		valido = false; 
		
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || 'El valor insertado no es un número válido';
		crearElemento(elemento,mensaje);
		return false;
	}
}

//Verifica que el valor de elemento sea un numero entero
function isInteger(elemento){
	valor = $(elemento).value;
	if( (/^-?\d+$/.test(valor)) ) 
		valido = true;
	else if (isNull(valor))
		valido = notNull(elemento); 
	else
		valido = false; 
		
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || 'El valor insertado no es un número entero válido';
		crearElemento(elemento,mensaje);
		return false;
	}
}

//Verifica que el valor de elemento tenga un formato de email válido
function validEmail(elemento){
	valor = $(elemento).value;
	if( (/\w{1,}[@][\w\-]{2,}([.]([\w\-]{2,})){1,2}$/.test(valor)) )
		valido = true;
	else if (isNull(valor))
		valido = notNull(elemento); //Regresa false si el campo sí es requerido. Si no es requerido regresa true	
	else
		valido = false; 
		
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || 'El valor insertado no es un e-mail válido';
		crearElemento(elemento,mensaje);
		return false;
	}
}

//Verifica que el valor de elemento tenga un formato de fecha valido
function validDate(elemento){
	var formato = "d/m/y";
	var valor = $(elemento).value;
	fecha = valor.split("/");
	dia = fecha[0];
	mes = fecha[1];
	ano = fecha[2];
	
		date = new Date(ano, mes-1, dia);
		
		if( !(isNaN(date) || isNaN(dia) || isNaN(mes) || isNaN(ano) || isNullorSpaces(dia) || isNullorSpaces(mes) || isNullorSpaces(ano)) ) 
			valido = true;
	else if (isNull(valor))
		valido = notNull(elemento); //Regresa false si el campo sí es requerido. Si no es requerido regresa true	
	else
		valido = false; 
		
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || ('El valor insertado no coincide con el formato de fecha '+formato);
		crearElemento(elemento,mensaje);
		return false;
	}
}

//Verifica que el valor de elemento tenga un formato de telefono valido
function validTel(elemento){
	//caracteres validos: 0-9, + , - , ( , ) y espacios en blanco
	var valor = $(elemento).value.split('');
	var numero = '';
	
	for (i=0;i<valor.length;i++){
		if(valor[i]!=' ' && valor[i]!='+' && valor[i]!='-' && valor[i]!='(' && valor[i]!=')' )
			numero += valor[i];
	}

	if(!isNaN(numero) && numero!='') 
		valido = true;
	else if (isNull(valor))
		valido = notNull(elemento); //Regresa false si el campo sí es requerido. Si no es requerido regresa true	
	else
		valido = false; 
		
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || 'El valor insertado no es un número de teléfono válido';
		crearElemento(elemento,mensaje);
		return false;
	}
}

//Verifica que el valor de elemento contenga unicamente caracteres alfanumericos
function validPassword(elemento){
	valor = $(elemento).value;	
	//Valida caracteres alfanumericos unicamente, sin espacios
	if( (/^[0-9A-Za-z]+$/.test(valor)) ) 
		valido = true;
	else if (isNull(valor))
		valido = notNull(elemento); //Regresa false si el campo sí es requerido. Si no es requerido regresa true	
	else
		valido = false; 
		
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || 'Contrase&ntilde;a inv&aacute;lida';
		crearElemento(elemento,mensaje);
		return false;
	}
}

//Verifica que el valor de elemento sea igual al valor del elemento especificado en el atributo campo. 
function confirmPassword(elemento){
	valor = $(elemento).value;
	var campo = $(elemento).getAttribute('campo'); //Obtiene el campo con el cual va a comparar el valor
	if(!campo)
		campo = 'password';  //si no se ha definido el campo, se compara con el input id->password
	
	var pass = $(campo).value;
	if (pass == valor)
		valido = true;
	else
		valido = false;
		
		
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || 'Favor de confirmar la contraseña';
		crearElemento(elemento,mensaje);
		return false;
	}
}

//Verifica que el archivo contenga una extension válida especificada en el atributo formato
function validFile(elemento){
	valor = $(elemento).value;
	extensionesValidas = $(elemento).getAttribute('formato').toLowerCase();
	
		formato = extensionesValidas.split(' ');
		//Se eliminan espacios en blanco extras
		formatos = [];
		for(i=0;i<formato.length;i++)
			if(formato[i]!='')
				formatos.push(formato[i]);
		
		//Obtiene la extension del archivo 
			partes = valor.split('.');
		extension = partes[partes.length-1].toLowerCase(); 
		
		archivo_valido = 0;
		for(i=0;i<formatos.length;i++){
			if(extension == formatos[i])
					{
						archivo_valido = 1;
					}
		}
		
		if(archivo_valido)
			valido = true;
		else if (isNull(valor))
			valido = notNull(elemento); //Regresa false si el campo sí es requerido. Si no es requerido regresa true	
		else
			valido = false; 
	
	if (valido)
		return true;
	else{
		var mensaje = obtenerMensaje(elemento) || ('Solo es posible subir archivos con extensiones ' + formatos);
		crearElemento(elemento,mensaje);
		return false;
	}
	
}

//Crear div con mensaje
function crearElemento(elemento,mensaje){			
	if(isNull(mensaje))
		mensaje = 'Este campo es requerido';
		
	idElemento = 'div_' + $(elemento).name;
		
	var div = new Element('div', { 'class': 'campo_requerido', 'id': idElemento}).update('&nbsp;'+mensaje);
	
	//Obtiene el objeto padre del elemento
	padre = $(elemento).parentNode;	

	//Si no existe ningun elemento con el mismo nombre lo crea
	if(!$(idElemento)){	
		$(elemento).className += ' '+requiredClass;
		if(showLabel == true)	
			$(padre).insert(div);		
	}
	
}

//Borrar todos los divs al inicio de la validacion
function borrarCamposRequeridos(){
	$$('.campo_requerido').each(
			function (elemento){
				$(elemento).remove();
			}
	);		
	//Devuelve los inputs a su clase original
	$$('.'+requiredClass).each(
			function (elemento){
				var long = $(elemento).className.length - requiredClass.length - 1; //quita la long de la clase requerido mas el espacio
				$(elemento).className = $(elemento).className.substr(0,long);
			}
	);		
}

function obtenerMensaje(elemento)
{
	var mensaje = $(elemento).getAttribute('alt');	
	return mensaje;
}


