// JavaScript Document
var texto = true;

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){
		alert ('Algunos campos son requeridos.');
		return false;	
	}
	else
		return true;	

}

	/****************************************************************
						Tipos de Validacion 
	*****************************************************************
	null -> unicamente compara value != ""
	numero -> compara valor numerico real o entero
	entero -> valida numeros enteros
	mail -> 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.
	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 'mail': 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{
		crearElemento(elemento,'N&uacute;mero no v&aacute;lido');
		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{
		crearElemento(elemento,'N&uacute;mero no v&aacute;lido');
		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\-]{1,}([.]([\w\-]{1,})){1,3}$/.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{
		crearElemento(elemento,'e-mail no v&aacute;lido');
		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{
		crearElemento(elemento,'Fecha no válida'+formato);
		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{
		crearElemento(elemento,'Tel&eacute;fono no v&aacute;lido');
		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{
		crearElemento(elemento,'La contrase&ntilde;a puede contener &uacute;nicamente caracteres alfanum&eacute;ricos ');
		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{
		crearElemento(elemento,'La contrase&ntilde;a no coincide');
		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{
		crearElemento(elemento,'Unicamente pueden subirse archivos con extensiones ' + formatos);
		return false;
	}
	
}

//Crear div con mensaje
function crearElemento(elemento,mensaje){	
	if(isNull(mensaje))
		mensaje = 'Campo requerido';
		
	idElemento = 'div_' + $(elemento).name;
		
	var div = new Element('div', { 'class': 'campo_requerido', 'id': idElemento}).update(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 = 'requerido';
		if(texto)
			$(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
	$$('.requerido').each(
			function (elemento){
				$(elemento).className = 'contac_label';
			});		
}

/************************************************
	Validacion E-mail sin crear elemento alert
************************************************/
function emailValido(valor){
	if( (/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(valor)) )
		return true;
	else
		return false;
		
}

function mostrarTexto(flag)
{
	texto = flag;
}

