// JavaScript Document
/* 
	Form Validator
	v 2.1
	Desarrollado por: Francisco Sevilla < fsevilla@gmail.com >
	Creado el: 25 May 2009
	Ultima modificacion: 26 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();
	
	borrarTxtBase();
	
	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;
}

function borrarTxtBase()
{
	
	$("campo_01").value =  $("campo_01").value == 'Nombre Completo' ? '' :  $("campo_01").value;
	$("campo_02").value =  $("campo_02").value == 'E-mail' ? '' :  $("campo_02").value;
	$("campo_07").value =  $("campo_07").value == 'Comentario' ? '' :  $("campo_07").value;
	
}

	/****************************************************************
						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
	edad	-> valida un rango de edad especificado (default: 10 a 110 años)
	****************************************************************/
	
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;
		case 'edad': valido = validAge(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;
	}
	
}

function validAge(elemento)
{
	valor = $(elemento).value;
	if( (/^-?\d+$/.test(valor)) && valor >= 10 && valor <= 110 ) //valida que sea entero y entre 10 y 110 años
		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 una edad válida';
		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;
}

function resetForm(formulario,focusInput)
{
	$(formulario).reset();
	borrarCamposRequeridos();	
	if(focusInput)	$(focusInput).focus();
}

//Para los casos en que el form se envia con div u otro elemento que no sea el submit
function enviarForm(formulario,cookie)
{
	cookie = cookie || null;
	if(cookie && readCookie(cookie))
	{
		alert('Tus comentarios ya han sido enviados. \nGracias!');	
		return false;
	}
		
	if(validar(formulario))
	{							
		writeCookie(cookie,'true',2); //Se crea la cookie por 2 minutos
		$(formulario).submit();				
	}
}

//Funciones para lectura y escritura de cookies
function readCookie(name)
{
  var cookieValue = "";
  var search = name + "=";
  
  if(document.cookie.length > 0)
  { 
    offset = document.cookie.indexOf(search);
    if (offset != -1)
    { 
      offset += search.length;
      end = document.cookie.indexOf(";", offset);
      if (end == -1) end = document.cookie.length;
      cookieValue = unescape(document.cookie.substring(offset, end))
    }
  }

  return cookieValue;
}

function writeCookie(name, value, minutes, path)
{
  var expire = "";
  var cookiePath = "";

  if(minutes != null)
  {
    expire = new Date((new Date()).getTime() + minutes * 60000);
    expire = "; expires=" + expire.toGMTString();
	if(!path)
		cookiePath = "; path=/";
	else
		cookiePath = "; path="+path;
  }

  document.cookie = name + "=" + escape(value) + expire + cookiePath;

}
