/*

* Producto: Función JavaScript que realiza las validaciones en los formularios

* ----------------------------------------------------------------------------------------------------------------

* Descripcion: Contiene las funciones JavaScript necesarias para realizar las validaciones de los formatos.

* ----------------------------------------------------------------------------------------------------------------

* Autor: RACE Informatica

*/



//***********************************************************************************************//

//Librería: Funciones de Formato, versión 1.0.

// INDICE :       

//   Función 1.  "validaLetraNueva"

//		Función que me valida si la  letra de una matricula nueva es correcta.

//   Función 2.  "validaLetrasIniMat"

//		Función que me valida si la/s  letra/s del principio una matricula nueva es correcta.

//   Función 3.  "vehiculoEspecial"

//		Función que me valida si la matrícula es un vehículo especial tipo E o R  o TE.

//   Función 4.  "vehiculoEspecial2"

//		Función que me valida si la matrícula es un vehículo especial tipo E1 o R1 o C o T1.

//   Función 5.  "vehiculoEstado"

//		Función que me valida si la matrícula es un vehículo del estado (tipo M o M1) 

//   Función 6.  "vehiculoPruebasITV"

//		Función que me valida si la matrícula es un vehículo de pruebas (tipo P) o de la ITV (tipo I) 

//   Función 7.  "vehiculoTuristico"

//		Función que me valida si la matrícula es una matrícula de tipo turística T 

//   Función 8.  "regimenDiplomatico"

//		Función que me valida si la matrícula es un vehículo de regimen diplomático 

//   Función 9.  "validaMatricula"

//		Función que me valida si la matrícula es correcta 

//   Función 10.  "fEsDNI"

//		Función que comprueba si un texto es un numero de DNI/CIF/NIF/Pasaporte/Tarjeta de residencia valido

//   Función 11.  "fEsLFIS"

//		Función que comprueba si un texto es una Licencia Fiscal valida

//   Función 12.  "validaDG"

//		Función que me valida los dígitos de control de una cuenta bancaria


/*********************************************************************************/
/******************    Función que me valida si la  letra     ********************/
/******************    de una matricula nueva es correcta     ********************/
/*********************************************************************************/

function validaLetraNueva(letras)
{
  var checkOK = "BCDFGHJKLMNPRSTVWXYZbcdfghjklmnprstvwxyz";
  var checkStr = letras;
  var allValid = true;
  for (i = 0;  i < checkStr.length;  i++)
  {
    ch = checkStr.charAt(i);
    for (j = 0;  j < checkOK.length;  j++)
      if (ch == checkOK.charAt(j))
        break;
    if (j == checkOK.length)
    {
      allValid = false;
      break;
    }
  }
  if (!allValid)
  {
    return (false);
  }
  return (true);
}

       
/*************************************************************************************/
/******************     Función que me valida si la/s letra/s     ********************/
/****************** del principio una matricula nueva es correcta ********************/
/*************************************************************************************/

function validaLetrasIniMat(letras)
{
  var inicialProv = new Array("A","AB","AL","AV","B","BA","BI","BU","C","CA","CC","CE","CO","CR","CS","CU","GC","GI","GE","GR","GU","H","HU","J","L","LE","LO","LU","M","MA","ML","MU","NA","O","OU","OR","P","IB","PM","PO","S","SA","SE","SG","SO","SS","T","TE","TF","TO","V","VA","VI","Z","ZA");
  var checkStr = letras;
  var allValid = true;
  for (y = 0;  y < inicialProv.length;  y++){
  	if (checkStr == inicialProv[y]) break;
  }
  if (y == inicialProv.length){
      allValid = false;
  }
  if (!allValid)
  {
    return (false);
  }
  return (true);
}
/************************************************************************************/
/******************    Función que me valida si la matrícula     ********************/
/******************   es un vehículo especial tipo E o R  o TE  *********************/
/************************************************************************************/

function vehiculoEspecial(matr)
{
	if (matr.length==4){
		// vehiculos del tipo E
 		if (validaNumero2(matr.substring(0,2))){
			if(matr.substring(2)=="VE"){
				return(true);
			}else{
				return(false);
			}
		}else{
			return(false);
		}
	}else{
		if (matr.length==3){
			// vehiculos del tipo R
 			if (validaNumero2(matr.substring(0,2))){
				if(matr.substring(2)=="R"){
					return(true);
				}else{
					return(false);
				}
			}else{
				if ( ( matr.substring(0,1) == "T" ) || ( matr.substring(0,1) == "R" ) ){
					if ( validaNumero2(matr.substring(1,3)) ){
						return(true);
					}else{
						return(false);
					}
				}else{
					return(false);
				}
			}
		}else{
			return(false);
		}
	}
}
/************************************************************************************/
/******************    Función que me valida si la matrícula       ******************/
/****************** es un vehículo especial tipo E1 o R1 o C o T1  ******************/
/************************************************************************************/

function vehiculoEspecial2(matr)
{
	if (matr.length==8){
		if ( (matr.substring(0,1)=="E") ||  (matr.substring(0,1)=="R")  ||  (matr.substring(0,1)=="C")  ||  (matr.substring(0,1)=="T")  ||  (matr.substring(0,1)=="H")  ||  (matr.substring(0,1)=="P") ||  (matr.substring(0,1)=="V") ||  (matr.substring(0,1)=="S") ) {
			if (validaNumero2(matr.substring(1,5))){
				if ( validaLetraNueva(matr.substring(5)) ){			
					return(true);
				}else{
					return(false);
				}
			}else{
				return(false);
			}
		}else{
			return(false);
		}
	}else{
		return(false);
	}
}
/************************************************************************************/
/******************    Función que me valida si la matrícula     ********************/
/******************    es un vehículo del estado (tipo M o M1)    *******************/
/************************************************************************************/

function vehiculoEstado(matr)
{
	var matEstado = new Array("A","DGP","EA","ET","FN","MF","MMA","MOP","PGC","PME","PMM");	
	var mat1 = matr.substring(0,1);
	var mat2 = matr.substring(0,2);
	var mat3 = matr.substring(0,3);
	var rest = "";
	for (var q = 0;  q <matEstado.length;  q++){
		if (mat1 == matEstado[q]) break;
	}
	for (var y = 0;  y <matEstado.length;  y++){
		if (mat2 == matEstado[y]) break;
	}
	for (var t = 0;  t <matEstado.length;  t++){
		if (mat3 == matEstado[t]) break;
	}
	if (q != matEstado.length){
		rest = matr.substring(1);
	}else{
		if (y != matEstado.length){
			rest = matr.substring(2);
		}else{
			if (t != matEstado.length){
				rest = matr.substring(3);
			}else{
				return(false);
			}
		}
	}
	if (validaNumero2(rest.substring(0,4))){
		if (rest.substring(4).length==2){
			if (validaNumero2(rest.substring(4,6))){
				return(true);
			}
			if (validaLetras(rest.substring(4,6))){
				return(true);
			}
			return(false);
		}else{
			return(false);
		}
	}else{
		if (rest.substring(0,2) == "VE"){
			if (rest.substring(2).length==6){	
				if (validaNumero2(rest.substring(2,8))){
					return(true);
				}else{
					return(false);
				}
			}else{
				return(false);
			}
		}else{
			return(false);
		}
	}
}
/************************************************************************************/
/******************   Función que me valida si la matrícula      ********************/
/**************      es un vehículo de pruebas (tipo P) o de la ITV (tipo I) ********/
/************************************************************************************/

function vehiculoPruebasITV(matr)
{
	if ( validaNumero2(matr.substring(0,2))){
		if ( (matr.substring(2,3) == "P") || (matr.substring(2,3) == "T")){
			if ( validaNumero2(matr.substring(3,7)) ){
				if ( (matr.substring(7,8) =="1") || (matr.substring(7,8) =="2") ){
					if ( (matr.substring(8).length == "0") || (matr.substring(8).length == "2") ){
						if (matr.substring(8).length =="2") {
							if ( validaNumero2(matr.substring(8,10)) ){
								return(true);
							}else{
								return(false);
							}
						}else{
							return(true);
						}
					}else{
						return(false);
					}
				}else{
					return(false);
				}
			}else{
				return(false);
			}
		}else{
			return(false);
		}
	}else{
		if (matr.substring(0,3) == "ITV"){
			if (matr.substring(3).length == 4){
				if ( validaNumero2(matr.substring(3,7)) ){
					return(true);
				}else{
					return(false);
				}
			}else{
				return(false);
			}
		}else{
			return(false);
		}
	}
}
/************************************************************************************/
/******************    Función que me valida si la matrícula     ********************/
/******************    es una matrícula de tipo turística T       *******************/
/************************************************************************************/

function vehiculoTuristico(matr)
{
  var mesRomano= new Array("I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII");
	if (matr.length>=7){
		if ( validaNumero2(matr.substring(0,2)) ){
			if ( validaLetras(matr.substring(2,3)) ){
				if ( validaLetras(matr.substring(3,4)) ){
					//es una posible provincia de 2 letras
					if (validaLetrasIniMat(matr.substring(2,4))){
						if (validaNumero2(matr.substring(4,8))){
							if ( (matr.substring(8).length == 4) || (matr.substring(8).length==0) ){
								if ( matr.substring(8).length==4){
									for (var y = 0;  y <mesRomano.length;  y++){
  										if (matr.substring(8,10) == mesRomano[y]) break;
									}
									if (y == mesRomano.length){
										return(false);
									}
									if (validaNumero2(matr.substring(10,12))){
										return(true);
									}else{
										return(false);
									}
								}
							}
						}
					}else{
						return(false);
					}
				}else{
					//es una posible provincia de 1 letra
					if (validaLetrasIniMat(matr.substring(2,3))){
						if (validaNumero2(matr.substring(3,7))){
							if ( (matr.substring(7).length==4) || (matr.substring(7).length==0) ){
								if ( matr.substring(7).length==4){
									for (y = 0;  y <mesRomano.length;  y++){
  										if (matr.substring(7,9) == mesRomano[y]) break;
									}
									if (y == mesRomano.length){
										return(false);
									}
									if (validaNumero2(matr.substring(9,11))){
										return(true);
									}else{
										return(false);
									}
								}							
							}
						}						
					}else{
						return(false);
					}
				}
			}else{
				return(false);
			}
		}else{
			return(false);
		}
	}else{
		return(false);
	}
}
/************************************************************************************/
/******************    Función que me valida si la matrícula     ********************/
/******************  es un vehículo de regimen diplomático   ************************/
/***********************************************************************************/

function regimenDiplomatico(matr)
{
	if ( (matr.substring(0,2)=="CD") ||  (matr.substring(0,2)=="OI")  ||  (matr.substring(0,2)=="TA") ||  (matr.substring(0,2)=="CC") ) {
		if (matr.length==8){
			if (validaNumero2(matr.substring(2,8))){
				return(1);
			}else{
				return(0);
			}
		}else{
			return(0);
		}
	}else{
		return(2);
	}
}
/*******************************************************************************/
/********************** Función que me valida si la     ************************/
/********************** matrícula es correcta           ************************/
/*******************************************************************************/
function validaMatricula(txtMatricula){
 	txtMatricula.value = txtMatricula.value.toUpperCase();
	trim(txtMatricula);
	var valor = txtMatricula.value;
	var auxMat = "";
	
	//No se debe introducir una E al principio. DMFVIRE 24/08/2004.
	if (valor.substring(0, 1) =="E"){
		alert("La matricula introducida no es correcta");
		return(false);
	}
	
	
	axMod = valor.split("-");
	if (axMod.length > 1){
		alert("La matrícula debe ser introducida sin guiones.");
		return(false);
//		valor="";
//		for (var x=0; x < axMod.length;x++) {
//			auxMat = axMod[x];
//			axMod[x] = (auxMat.replace(/^\s+/,'')).replace(/\s+$/,'');
//			valor = valor + axMod[x];
//		}//end del for
	}
	auxMat = "";
	for (x=0; x< valor.length;x++){
		if (valor.charAt(x) != " ") auxMat += valor.charAt(x);
	}
	valor = auxMat;
	txtMatricula.value = valor;
	if ( validaNumero2(valor.substring(0,4)) ){
		if (valor.substring(4).length ==3){
			if ( !validaLetraNueva(valor.substring(4)) ){
				alert("La matrícula introducida no es correcta.");
				return(false);
			}
		}else{
			alert("La matrícula introducida no es correcta.");
			return(false);
		}
	}else{
		if ( vehiculoTuristico(valor)){
			return(true);
		}
		if ( validaLetras(valor.substring(0,1)) ){
			if ( validaLetras(valor.substring(1,2)) ){
				if (vehiculoEstado(valor)) {
					return(true);
				}
				var auxRD="";
				auxRD = auxRD+regimenDiplomatico(valor);
				//se valida que la matricula sea del tipo D (regimen diplomático)
				if (auxRD == 1){
					return(true);
				}else{
					if(auxRD == 0){
						if (valor.substring(0,2)!= "CC"){
							alert("El formato de una matrícula en Régimen Diplomático debe tener el formato: "+valor.substring(0,2)+"-000000. Completando con ceros cada bloque de tres cifras.");	
							return(false);
						}
					}
				}	
				//las dos primeras posiciones son letras	
				if (!validaLetrasIniMat(valor.substring(0,2))){
					//Se comprueba si seguido de la 1ª letra esta el literal ITV
					if (valor.substring(1,4) == "ITV"){
						if (vehiculoPruebasITV(valor.substring(1))){
							return(true);
						}
					}
					alert("La matrícula introducida no es correcta, la provincia no es correcta.");
					return(false);
				}else{
					if (valor.substring(2,5) == "ITV"){
						if (vehiculoPruebasITV(valor.substring(2))){
							return(true);
						}
					}
					if (validaLetrasIniMat(valor.substring(0,1))){
						if (vehiculoPruebasITV(valor.substring(1))){
							return(true);
						}
					}
				}	
				if ( validaNumero2(valor.substring(2,6))){
					if (valor.substring(6).length > 2){
						// a las 2 primeras posiciones, que son letras, les siguen 4 números, 
						//pero hay más de 2 posiciones despues, es decir, ni tiene 6 números
						//despues de las 2 letras, ni tiene 4 numeros y como máximo 2 letras.
						if (vehiculoEspecial(valor.substring(6))){
							return(true);
						}
						alert("La matrícula introducida no es correcta.");
						return(false);
					}else{
						//se compruba el valor de las 2 últimas posiciones
						if (!validaNumero2(valor.substring(6)) ){
							//si estas 2 ultimas no son números.
							if (!validaLetras(valor.substring(6))){
								alert("La matrícula introducida no es correcta.");
								return(false);							
							}
						}else{
							//si estas 2 ultimas son números.
							if (valor.substring(6).length != 2){
								alert("La matrícula introducida no es correcta.");
								return(false);
							}
						}
					}
				}else{
					// a las 2 primeras posiciones, que son letras, no les siguen 4 números.
					alert("La matrícula introducida no es correcta.");
					return(false);
				}
			}else{
				//la primera posicion es una letra
				if (!validaLetrasIniMat(valor.substring(0,1))){
					if (vehiculoEspecial2(valor)){
						return(true);
					}
					alert("La matrícula introducida no es correcta, la provincia no es correcta.");
					return(false);
				}	
				if ( validaNumero2(valor.substring(1,5))){
					if (valor.substring(5).length > 2){
						// a la primera posicion, que es una letra, le sigue 4 números, 
						//pero hay más de 2 posiciones despues, es decir, ni tiene 6 números
						//despues de la letra, ni tiene 4 numeros y como máximo 2 letras.
						if (vehiculoEspecial(valor.substring(5))){
							return(true);
						}
						if (vehiculoEspecial2(valor)){
							//se valida que la matricula sea del tipo E1 ó R1 ó C (ciclomotores) ó T1 (turística) ó TT .
							return(true);
						}
						alert("La matrícula introducida no es correcta.");
						return(false);
					}else{
						//se comprueba el valor de las 2 últimas posiciones
						if (!validaNumero2(valor.substring(5)) ){
							//si estas 2 ultimas no son números.
							if (!validaLetras(valor.substring(5))){
								alert("La matrícula introducida no es correcta.");
								return(false);							
							}
						}else{
							if (valor.substring(5).length != 2){
								alert("La matrícula introducida no es correcta.");
								return(false);
							}
						}
					}
				}else{
					// a la primera posicion, que es una letra, no le sigue 4 números.
					alert("La matrícula introducida no es correcta.");
					return(false);
				}
			}		
		}else{
			alert("La matrícula introducida no es correcta.");
			return(false);
		}
	}
	return(true);
}//fin del validaMatricula
/************************************************************************/
/*********     Función que comprueba si un texto es un           ********/
/*********     numero de DNI/CIF/NIF/Pasaporte/Tarjeta           ********/
/*********             de residencia valido                      ********/
/************************************************************************/

function fEsDNI(dni){
	var l_textoDeReferencia = 'TRWAGMYFPDXBNJZSQVHLCKE';
	var l_resultado = /^([X]\d{7}|\d{1,8})([A-Z])$/i.test(dni.value);
	if(l_resultado)	{		var l_codigoControlIntroducido = RegExp.$2.toUpperCase();		var l_codigoControlCalculado = l_textoDeReferencia.charAt((/(\d*)$/.exec(RegExp.$1)[0])%23);		l_resultado = (l_codigoControlIntroducido == l_codigoControlCalculado);	}
	return l_resultado;
}function fEsDNIsinV(dni){	var l_textoDeReferencia = 'TRWAGMYFPDXBNJZSQVHLCKE';	var l_resultado = /^([X]\d{7}|\d{1,8})([A-Z])$/i.test(dni);	if(l_resultado)	{		var l_codigoControlIntroducido = RegExp.$2.toUpperCase();		var l_codigoControlCalculado = l_textoDeReferencia.charAt((/(\d*)$/.exec(RegExp.$1)[0])%23);		l_resultado = (l_codigoControlIntroducido == l_codigoControlCalculado);	}	return l_resultado;}
function fEsNIE(campo) {    nif = campo.value.toUpperCase();    if((nif.charAt(0).toUpperCase()=='X')||(nif.charAt(0).toUpperCase()=='Y')||(nif.charAt(0).toUpperCase()=='Z')){    	nif = nif.substring(1);    	return fEsDNIsinV(nif);    }else{    	return false;    }}
/************************************************************************/
/*********        Función que comprueba si un texto es           ********/
/*********            una Licencia Fiscal valida                 ********/
/************************************************************************/

function fEsLFIS (lfis)

{

	var primeraLetra = 'ABCDEFGHPQS';

	var ultimaLetra = 'JABCDEFGHI0123456789';

	var codigoControlIntroducido = lfis.charAt(8);

	var codigoControlCalculado = 0;

	

	if(lfis.length!=9)

		return false;

	else if (!fComprobar(lfis.charAt(0), primeraLetra))

		return false;

	else if (!fEsNumerico(lfis.substring(1,8)))

		return false;

	else if (!fComprobar(codigoControlIntroducido, ultimaLetra))

		return false;



	var cadenaTratada = '';

	for(var i = 1; i<8; i++)

	{

		if((i==1)||(i==3)||(i==5)||(i==7))

			cadenaTratada += (lfis.charAt(i)*2);

		else

			cadenaTratada += (lfis.charAt(i));

	}



	for(var i = 0; i<cadenaTratada.length; i++)

		codigoControlCalculado += 10-(cadenaTratada.charAt(i));



	codigoControlCalculado = (codigoControlCalculado%10);

	

	if (fComprobar(lfis.charAt(0), 'ABCDEFGH')&&(codigoControlCalculado!=codigoControlIntroducido))

		return false;

	else if ((fComprobar(lfis.charAt(0), 'PQS')&&(codigoControlCalculado!=ultimaLetra.indexOf(codigoControlIntroducido))))

		return false;



	return true;

}
/**************************************************************************/
/**************  Función que me valida los dígitos de    ******************/
/**************     control de una cuenta bancaria       ******************/
/**************************************************************************/

function validaDG(entidad,sucursal,DG,cuenta)
{
 banco=entidad.value+sucursal.value;

  pesos1= new Object(8);
  pesos1[0]='6';
  pesos1[1]='3';
  pesos1[2]='7';
  pesos1[3]='9';
  pesos1[4]='10';
  pesos1[5]='5';
  pesos1[6]='8';
  pesos1[7]='4';

  pesos2= new Object(10);  
  pesos2[0]='6';
  pesos2[1]='3';
  pesos2[2]='7';
  pesos2[3]='9';
  pesos2[4]='10';
  pesos2[5]='5';
  pesos2[6]='8';
  pesos2[7]='4';
  pesos2[8]='2';
  pesos2[9]='1';

  result=0;
  cont=0;
 
  for (i=7;i>=0;i--)  
   {
     result=result+banco.charAt(i)*pesos1[cont];
     cont++;
   }             

  resta=11-(result%11);
  digito='';
 if (resta==11)
       digito=digito+0;
 else if (resta==10)
         digito=digito+1;
     else 
           digito=digito+resta;
 

  corriente=cuenta.value;
  cont2=0;
  result2=0;

  for (j=9;j>=0;j--)
   {
     result2=result2+corriente.charAt(j)*pesos2[cont2];
     cont2++;
   }

  resta2=11-(result2%11);

 if (resta2==11)
       digito=digito+0;

 else if (resta2==10)
         digito=digito+1;
      else 
           digito=digito+resta2;
 
 if (digito==DG.value)
      return(true);
 else
      return(false);

}  
/**************************************************************************/
/**************  Función que reemplaza punto por coma    ******************/
/**************************************************************************/
function puntoToComa(campo){
	s1=campo.replace('.',',');
	return s1;	
}
