
/*****************************************************************************************************
  IMPORTANTE: CUALQUIER MODIFICACIÓN EN ESTE FICHERO DEBERÁ TAMBIÉN REALIZARSE EN:

      SITIO "SEGURO:/comunes/validar.js
      SITIO "INTRANET":/comunes/validar.js
	   
   YA QUE AL ESTAR INCLUIDO DICHO FICHERO EN DIFERENTES "SITIOS" DEBE MANTENERSE UNA VERSIÓN SEPARADA
*****************************************************************************************************/   

/*
	validarCampo():
		Valida que el contenido de un campo de formulario.

	Entrada:
		[campo] objeto de formulario a validar.
		[tipo] posibles valores:
				- "c" -> alfabético.
				- "n" -> numérico.
				- "cn" -> alfanumérico.
				- "nom" -> nombre, alfapuntuación (igual que "c" + ' ' + '.' y '-').
				- "nif" -> NIF.
				- "dni" -> DNI.
				- "cif" -> CIF.
				- "nie" -> NIE.
				- "email" -> E-mail.
				- "fecha" -> fecha.
		[separador] opcional, sólo usado si el tipo es fecha, por defecto '/'.

	Retorno:
		true si el campo cumple la condición, false si no la cumple.
*/
function validarCampo(campo, tipo, separador)
{

	var retorno = true;
	var longitud_dni = 8;
	var longitud_nif = 9;
	var longitud_nie = 10;
	var longitud = campo.value.length;
	var ultimo,primeros;
	
	if(separador == null || separador == "")
	{
		separador = new String("/");
	}

	switch(tipo)
	{
		case "dni":		
			retorno = esDNI(campo.value);
			if(retorno)
			{
				// Rellenar con ceros por la izquierda hasta longitud total
				for (var i=1; i<longitud_dni-longitud+1; i++)
				{ campo.value = "0" + campo.value; }		
			}
			break;
		case "nif":
			retorno = esNIF(campo.value);
			if(retorno)
			{
				// Rellenar con ceros por la izquierda hasta longitud total
				for (var i=1; i<longitud_nif-longitud+1; i++)
				{ campo.value = "0" + campo.value; }		
			}
			break;

		case "cif":
			// Rellenar con ceros por la izquierda hasta longitud total
			for (var i=1; i<longitud_nif-longitud+1; i++)
			{ 
				campo.value = campo.value.charAt(0) + "0" + campo.value.substring(1, campo.value.length);
			}		
			retorno = esCIF(campo.value);
			break;			
		case "nie":
			retorno = esNIE(campo.value);
			if(retorno)
			{
				// Rellenar con ceros por la izquierda hasta longitud total
				for (var i=1; i<longitud_nie-longitud+1; i++)
				{ campo.value = campo.value.charAt(0) + "0" + campo.value.substring(1, campo.value.length); }		
			}
			break;	
		
		case "email":
			retorno = esEmail(campo.value);
			break;
		case "fecha":
			retorno = esFecha(campo.value, separador);
			break;
		case "c":
			retorno = esAlfabetico(campo.value);
			break;		
		case "n":
			retorno = esNumerico(campo.value);
			break;				
		case "cn":
			retorno = esAlfaNumerico(campo.value);
			break;		
		case "nom":	
			retorno = esAlfaPuntuacion(campo.value);
			break;
	}	
	return retorno;
}

function esVacio(campo)
{
	var retorno = true;
	for(var cont = 0; cont < campo.value.length && retorno == true; cont++)
	{
			if(campo.value.charAt(cont) != ' ')
			{
				retorno = false;
			}
	}
	return retorno;
}

function esNumerico(cadena)
{
	var retorno = true;
	retorno = (cadena.length > 0);
	for(var cont = 0; cont < cadena.length && retorno==true; cont++)
	{
		if(cadena.charAt(cont) < "0" || cadena.charAt(cont) > "9")
		{
			retorno = false;
		}
	}
	return retorno;
}

function esAlfabetico(cadena)
{
	var retorno =  true;
	retorno = (cadena.length > 0);	
	for(var cont = 0; cont < cadena.length && retorno==true; cont++)
	{
			if((cadena.charAt(cont) < "A" || cadena.charAt(cont) > "z")  
			 && cadena.charAt(cont) != "ñ" && cadena.charAt(cont) != "Ñ")
			{
				retorno = false;
			}
	}
	return retorno;
}

function esAlfaNumerico(cadena)
{
	var retorno =  true;
	retorno = (cadena.length > 0);	
	for(var cont = 0; cont < cadena.length && retorno==true; cont++)
	{
			if((cadena.charAt(cont) < "A" || cadena.charAt(cont) > "z")  
			 && cadena.charAt(cont) != "ñ" && cadena.charAt(cont) != "Ñ"
			 && (cadena.charAt(cont) < "0" || cadena.charAt(cont) > "9"))
			{
				retorno = false;
			}
	}
	return retorno;
}

function esAlfaPuntuacion(cadena)
{
	var retorno =  true;
	retorno = (cadena.length > 0);	
	for(var cont = 0; cont < cadena.length && retorno==true; cont++)
	{
			if((cadena.charAt(cont) < "A" || cadena.charAt(cont) > "z")  
			 && cadena.charAt(cont) != "ñ" && cadena.charAt(cont) != "Ñ"
			 && (cadena.charAt(cont) != " " && cadena.charAt(cont) != "." && cadena.charAt(cont) != "-"))
			{
				retorno = false;
			}
	}
	return retorno;
}

function esDNI(cadena)
{
	var retorno = true;
	var longitud=cadena.length;	
	// Comprobar no vació y que todo son caracteres numéricos
	retorno = (longitud > 0 && esNumerico(cadena));
	return retorno;
}

function esNIF(cadena)
{
	var retorno = true;
	var longitud=cadena.length;
	var parte_numerica = cadena.substring(0,longitud-1);
	var ultimo_caracter=cadena.substring(longitud-1,longitud);

	// Comprobar no vació
	if(longitud > 0 && parte_numerica.length > 0)
	{	// Comprobar que el último caracter es alfabético y el primero (al menos) es numérico
		if(esNumerico(parte_numerica) && esAlfabetico(ultimo_caracter))
		{
			// Comprobar letra del nif
			retorno = (ultimo_caracter.toUpperCase() == letra_NIF_NIE(parte_numerica).toUpperCase());
		}
		else
		{
			retorno = false;
		}	
	}
	else
	{
		retorno = false;
  	}     
	return retorno;
}

function esNIE(cadena)
{
	var retorno = true;
	var longitud=cadena.length;
	var parte_numerica = cadena.substring(1,longitud-1);
	var primer_caracter=cadena.substring(0,1);
	var ultimo_caracter=cadena.substring(longitud-1,longitud);

	// Comprobar no vació
	if(longitud > 0 && parte_numerica.length > 0)
	{	// Comprobar que el último caracter es alfabético y el primero (al menos) es numérico
		if(esNumerico(parte_numerica) && esAlfabetico(ultimo_caracter) && esAlfabetico(primer_caracter))
		{
			// Comprobar letra del nif
			retorno = (ultimo_caracter.toUpperCase() == letra_NIF_NIE(parte_numerica).toUpperCase());
		}
		else
		{
			retorno = false;
		}	
	}
	else
	{
		retorno = false;
  	}     
	return retorno;
}


function esCIF(cadena)
{
	var retorno = true;
	var largo=cadena.length;
	var letra = cadena.substring(0,1);
	var parte_numerica = cadena.substring(1,largo-1);
	var digito_control = cadena.substring(largo-1,largo);

	// Comprobar no vació
	if(largo > 0 && parte_numerica.length > 0)
	{	// Comprobar que el primer caracter es alfabético, 2-8 son numéricos y el último es alfanúmerico
	
		if(esAlfabetico(letra) && esNumerico(parte_numerica) && esAlfaNumerico(digito_control))
		{
			// Comprobar letra del Cif
			retorno = (digito_control.toUpperCase() == String(letraCIF(cadena)).toUpperCase());
			
		}
		else
		{
		
			retorno = false;
		}	
	}
	else
	{
		retorno = false;
  	}     
	return retorno;
}


function letra_NIF_NIE(dni) 
{
	var letras = new Array();
	var resto = (dni % 23)+1;

	letras[1] = 'T';
	letras[2] = 'R';
	letras[3] = 'W';
	letras[4] = 'A';
	letras[5] = 'G';
	letras[6] = 'M';
	letras[7] = 'Y';
	letras[8] = 'F';
	letras[9] = 'P';
	letras[10] = 'D';
	letras[11] = 'X';
	letras[12] = 'B';
	letras[13] = 'N';
	letras[14] = 'J';
	letras[15] = 'Z';
	letras[16] = 'S';
	letras[17] = 'Q';
	letras[18] = 'V';
	letras[19] = 'H';
	letras[20] = 'L';
	letras[21] = 'C';
	letras[22] = 'K';
	letras[23] = 'E';

	return letras[resto];
}


function letraCIF(cadena)
{
	var letra = cadena.substring(0,1);
	var suma1, suma2, prod1, prod2, prod3, prod4, resto, digito_control;
	var letras = new Array();
	letras[1] = 'J';
	letras[2] = 'A';
	letras[3] = 'B';
	letras[4] = 'C';
	letras[5] = 'D';
	letras[6] = 'E';
	letras[7] = 'F';
	letras[8] = 'G';
	letras[9] = 'H';
	letras[10] = 'I';	

	suma1 = Number(cadena.charAt(2)) + Number(cadena.charAt(4)) + Number(cadena.charAt(6));	

	prod1 = Number(cadena.charAt(1)) * 2;
	prod2 = Number(cadena.charAt(3)) * 2;
	prod3 = Number(cadena.charAt(5)) * 2;
	prod4 = Number(cadena.charAt(7)) * 2;					

	if(prod1 > 9)
	{ prod1 = Number(String(prod1).charAt(0)) + Number(String(prod1).charAt(1)); }		
	if(prod2 > 9)
	{ prod2 = Number(String(prod2).charAt(0)) + Number(String(prod2).charAt(1)); }		
	if(prod3 > 9)
	{ prod3 = Number(String(prod3).charAt(0)) + Number(String(prod3).charAt(1)); }		
	if(prod4 > 9)
	{ prod4 = Number(String(prod4).charAt(0)) + Number(String(prod4).charAt(1)); }		

	suma2 = suma1 + prod1 + prod2 + prod3 + prod4;
	resto = suma2 % 10;
	if(resto == 0)
	{ resto = 10; }

	digito_control = 10 - resto;
	
	 // Empresa privada
	if((letra.toUpperCase() >= "A" && letra.toUpperCase() <= "H") || (letra.toUpperCase() >= "K" && letra.toUpperCase() <= "N") /* ANTIGUOS */)
	{
		retorno = digito_control;
		
	}// Empresa pública
	else if(letra.toUpperCase() == "S" ||  letra.toUpperCase() == "P" ||  letra.toUpperCase() == "Q")
	{
		retorno = letras[digito_control+1];
	}
	else
	{
		retorno = false;
	}
	
	return retorno;
}


function esEmail(email)
{
	var caracteresInvalidos = " /:,;";	
	if(email == "")
	{
		return false;
	}
	for(var i=0; i < caracteresInvalidos.length; i++)
	{
		caracterMalo = caracteresInvalidos.charAt(i);
		if(email.indexOf(caracterMalo, 0) > -1)
		{
			return false;
		}
	}	
	var pos = email.indexOf("@",1);
	if(pos == -1)
	{
		return false;
	}
	if(email.indexOf("@", pos+1) > -1)
	{
		return false;
	}	
	var posPunto = email.indexOf(".", pos)
	if(posPunto == -1)
	{
		return false;
		
	}
//	if(posPunto+3 > email.length)
/*	if(posPunto+5 < email.length)
	{
		return false;
	}  */
	return true;
}

// Esta función recibe un campo conteniendo una fecha y
// devuelve un valor booleano indicando si la fecha es correcta en el
// formato dd<SEP>mm<SEP>aaaa.
function esFecha(fecha, sep)
{
	// Validamos la fecha
	var diasEn = new Array(12);
	diasEn[1] = 31;
	diasEn[2] = 29;   
	diasEn[3] = 31;
	diasEn[4] = 30;
	diasEn[5] = 31;
	diasEn[6] = 30;
	diasEn[7] = 31;
	diasEn[8] = 31;
	diasEn[9] = 30;
	diasEn[10] = 31;
	diasEn[11] = 30;
	diasEn[12] = 31;
	
	var s = new String(fecha);
	var a = s.indexOf(sep,0);
	var b = s.indexOf(sep,a+1);
	if (a != 2 || b != 5)
	{
		return false;
	}
	var longitud = s.length;
	var dia = s.substring(0,a);
	var mes = s.substring(a+1,b);
	mes = mes - 0; // Pasamos el mes de tipo cadena a entero (obligatorio para funcionar bien).
	var ano = s.substring(b+1,longitud);

//**** Comprobar que mes, día y año son números
	for(var cont = 0; cont < dia.length; cont++)
	{
		if(dia.charAt(cont) < "0" || dia.charAt(cont) > "9")
		{
			return false;
		}
	}
	for(var cont = 0; cont < mes.length; cont++)
	{
		if(mes.charAt(cont) < "0" || mes.charAt(cont) > "9")
		{
			return false;
		}
	}
	for(var cont = 0; cont < ano.length; cont++)
	{
		if(ano.charAt(cont) < "0" || ano.charAt(cont) > "9")
		{
			return false;
		}
	}
//****
	if(ano > 2100 || ano < 1800)
	{
		return false;
	}
	if(mes > 12)
	{
		return false;
    }
    if(mes == 2)
	{
		var DiasFebrero=(((ano % 4 == 0) && ( (!(ano % 100 == 0)) || (ano % 400 == 0) ) ) ? 29 : 28 );;
        if(dia > DiasFebrero)
		{
			return false;
		}
    }
	else 
	{
		if(dia > diasEn[mes])
		{
			return false;
		}
	}
	return true;
}

// Comprobar que el valor introducido por el usuario es un valor válido en Euros
// y arreglarlo en caso de:
//    - El separador decimal debe ser '.' si es ',' se cambia
//    - No se han escrito las dos cifras decimales
function ajustarValorEuros(campo)
{
	if(campo.value == "")
	{
		return true;
	}
// REEMPLAZA EL CARACTER ',' POR '.'
	var re = /\,/;
	campo.value = campo.value.replace(re, '.');
	
// CUANTAS OCURRENCIAS DEL CARACTER '.' HAY
	var pos = -1;
	var cuantos_puntos = 0;
	while((pos = campo.value.indexOf(".", pos+1)) != -1)
	{
		cuantos_puntos++;
	}
	switch(cuantos_puntos)
	{
// ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
		case 0:
			campo.value = campo.value + ".00";
			break;
	// HAY UNA COMA
		case 1:
			switch(campo.value.length - campo.value.indexOf(".", 0))
			{
				case 3:
					break;
		// ESTABA ESCRITO CON 1 DECIMAL, AÑADE 1 CIFRA DECIMAL
				case 2:
					campo.value = campo.value + "0";
					break;
		// ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
				case 1:
					campo.value = campo.value + "00";
					break;	
		// ESTABA ESCRITO CON MÁS DE 2 DECIMALES, LO RECORTA A 2
				default:
//					campo.value = campo.value.substr(0, campo.value.indexOf(".", 0)+3);
					campo.value = round(Number(campo.value.substr(0,campo.value.indexOf(".", 0))) + round(Number(campo.value.substr(campo.value.indexOf(".", 0),campo.value.length - campo.value.indexOf(".", 0))),2));
// 					Si despues de redondear, el último dígito es un cero, se pierde (por operar con números) y hay que reponerlo
					if(campo.value.length - campo.value.indexOf(".", 0) == 2)
					{
							campo.value = campo.value + "0";
					}
					break;									
			}
			break;
	// HAY MAS DE UNA COMA --> ERROR
		default:
			campo.value = "";
			campo.focus();
			return false;			
			break;
	}
// COMPRUEBA QUE TODOS LOS CARACTERES MENOS LA COMA SON NÚMEROS, SINO ERROR
	var cont = 0;
	while(cont < campo.value.length)
	{
		if(campo.value.charAt(cont) != "." && (campo.value.charAt(cont) < "0" || campo.value.charAt(cont) > "9"))
		{
			campo.value = "";
			campo.focus();
			return false;						
		}
		cont++;
	}

// COMPRUEBA QUE LA PARTE ENTERA Y LA PARTE DECIMAL SON DISTINTAS DE "", SINO ERROR
	pos = campo.value.indexOf(".", 0);
	var parte_entera = campo.value.substr(0, pos);
	var parte_decimal = campo.value.substr(pos+1 , campo.value.length);
	if(parte_entera == "" || parte_decimal == "")
	{
			campo.value = "";
			campo.focus();
			return false;				
	}
	return true;
}

//
// Redondea un número a X dígidos decimales, por defecto 2
//
function round(num, X) 
{
	var y;
    X = (!X ? 2 : X);
    y = Math.round(num*Math.pow(10,X))/Math.pow(10,X);
	return y;
}

// Comprobar que el valor introducido por el usuario es un porcentaje con hasta 2 cifras decimales
// y arreglarlo en caso de:
//    - El separador decimal debe ser '.' si es ',' se cambia
//    - No se han escrito las dos cifras decimales
function ajustarPorcentaje(campo)
{
	if(campo.value == "")
	{
		return true;
	}
// REEMPLAZA EL CARACTER ',' POR '.'
	var re = /\,/;
	campo.value = campo.value.replace(re, '.');
	
// CUANTAS OCURRENCIAS DEL CARACTER '.' HAY
	var pos = -1;
	var cuantos_puntos = 0;
	while((pos = campo.value.indexOf(".", pos+1)) != -1)
	{
		cuantos_puntos++;
	}
	switch(cuantos_puntos)
	{
// ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
		case 0:
			campo.value = campo.value + ".00";
			break;
	// HAY UNA COMA
		case 1:
			switch(campo.value.length - campo.value.indexOf(".", 0))
			{
				case 3:
					break;
		// ESTABA ESCRITO CON 1 DECIMAL, AÑADE 1 CIFRA DECIMAL
				case 2:
					campo.value = campo.value + "0";
					break;
		// ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
				case 1:
					campo.value = campo.value + "00";
					break;	
		// ESTABA ESCRITO CON MÁS DE 2 DECIMALES, LO RECORTA A 2
				default:
//					campo.value = campo.value.substr(0, campo.value.indexOf(".", 0)+3);
					campo.value = Number(campo.value.substr(0,campo.value.indexOf(".", 0))) + round(Number(campo.value.substr(campo.value.indexOf(".", 0),campo.value.length - campo.value.indexOf(".", 0))),2);
// 					Si despues de redondear, el último dígito es un cero, se pierde (por operar con números) y hay que reponerlo
					if(campo.value.length - campo.value.indexOf(".", 0) == 2)
					{
							campo.value = campo.value + "0";
					}
					break;									
			}
			break;
	// HAY MAS DE UNA COMA --> ERROR
		default:
			campo.value = "";
			campo.focus();
			return false;			
			break;
	}
// COMPRUEBA QUE TODOS LOS CARACTERES MENOS LA COMA SON NÚMEROS, SINO ERROR
	var cont = 0;
	while(cont < campo.value.length)
	{
		if(campo.value.charAt(cont) != "." && (campo.value.charAt(cont) < "0" || campo.value.charAt(cont) > "9"))
		{
			campo.value = "";
			campo.focus();
			return false;						
		}
		cont++;
	}

// COMPRUEBA QUE LA PARTE ENTERA Y LA PARTE DECIMAL SON DISTINTAS DE "", SINO ERROR
	pos = campo.value.indexOf(".", 0);
	var parte_entera = campo.value.substr(0, pos);
	var parte_decimal = campo.value.substr(pos+1 , campo.value.length);
	if(parte_entera == "" || parte_decimal == "" || Number(campo.value) > 100.00 || Number(campo.value) <= 0.00)
	{
			campo.value = "";
			campo.focus();
			return false;				
	}
	return true;
}

/*
Función que abre una ventana con el servicio de escuchar una página Web.
La página a escuchar es la que en ese momento está cargada en el frame derecho.
*/
function lanzar_readspeaker()
{
	ls_url = parent.cuerpo.location.href;
	ls_readspeaker_url = "http://voice.dixerit.com/alicanteaytodix?url=" + as_url;
	window.open(ls_readspeaker_url);
}
