// Descripción.: Librería de utilidades
// Creación....: 02/06/2003 slg
// Modificación: 18/06/2003 slg Adición de comentarios
// Modificación: 09/10/2003 slg Nueva función para validar cuentas de correo electrónico (e-mail)
// Modificación: 31/10/2006 se modifica la funcion isTarjetaResidencia() para adaptarla al nuevo formato
//
// Funciones públicas: tipoIdFiscal()       : Determina el tipo de identificación fiscal
//                     isPersonaFisica()    : Determina si es persona física
//                     isPersonaJuridica()  : Determina si es persona jurídica
//                     isTarjetaResidencia(): Determina si es tarjeta de residencia
//                     isMenorEmancipado()  : Determina si es menor emancipado
//                     isPersonaFisicaNR()  : Determina si es P.F. no residente en territorio nacional
//                     isPersonaJuridicaNR(): Determina si es P.J. no residente en territorio nacional
//                     isValidoCCC()        : Determina la validez de un CCC
//                     todosIncluidosEn()   : Indica si los caracteres usados están en un patrón
//                     isValidoEmail()      : Determina la validez de una cuenta de e-mail
//
// ****************************************************************************
// Prototipo..: tipoIdFiscal(id) -> tipoId
// Descripción: Indica el tipo de la identificación fiscal indicada
// Argumentos.: - id, cadena que representa la identificación fiscal
// Retorno....: Tipo de la identificación fiscal indicada. Los valores posibles son los siguientes:
//              - idFiscal_Invalida
//              - idFiscal_PersonaFisica
//              - idFiscal_PersonaJuridica
//              - idFiscal_TarjetaResidencia
//              - idFiscal_MenorEmancipado
//              - idFiscal_PersonaFisicaNR
//              - idFiscal_PersonaJuridicaNR
// Ejemplo....:
//              var id = document.forms[0].elements[0].value;
//              switch (tipoIdFiscal(id)) {
//                  case idFiscal_Invalida:      alert("Es una persona física");   break;
//                  case idFiscal_PersonaFisica: alert("Es una persona jurídica"); break;
//                  default:                     alert("No es válida");
//              }
// ****************************************************************************
// Prototipos.: isPersonaFisica(id) -> true/false
//              isPersonaJuridica(id) -> true/false
//              isTarjetaResidencia(id) -> true/false
//              isMenorEmancipado(id) -> true/false
//              isPersonaFisicaNR(id) -> true/false
//              isPersonaJuridicaNR(id) -> true/false
// Descripción: Determina si la identificación fiscal indicada es de ese tipo
// Argumentos.: - id, cadena que representa la identificación fiscal
// Retorno....: Un valor booleano que representa la validez
// Ejemplo....:
//              var id = document.forms[0].elements[0].value;
//              if (isPersonaFisica(id))
//                  alert("Es una persona física");
//              else if (isPersonaJuridica(id))
//                  alert("Es una persona jurídica");
//              else
//                  alert("No es válida");
// ****************************************************************************
// Prototipo..: isValidoCCC(ccc) -> true/false
// Descripción: Determina si el CCC indicado es válido. Un CCC está formado por
//              el código de entidad (4 dígitos), código de sucursal (4), dígito de
//              control (2) y código de cuenta (10), sin separadores intermedios.
//              Si el dígito de control tiene un valor de "**" (2 asteriscos) se
//              considera válido.
// Argumentos.: - ccc, cadena que representa el CCC
// Retorno....: Un valor booleano que representa la validez
// Ejemplo....:
//              var ccc = document.forms[0].elements[0].value;
//              if (!isValidoCCC(ccc))
//                  alert("La cuenta bancaria indicada no es válida");
// ****************************************************************************
// Prototipo..: todosIncluidosEn(buscado,patron) -> true/false
// Descripción: Sirve para validar que todos los caracteres de "buscado" se encuentren
//              en "patron", es decir, que no exista ningún caracter en "buscado" que
//              no esté también en "patrón"
// Argumentos.: - buscado, texto del que se quiere validar su contenido
//              - patron, texto con los caracteres permitidos
// Retorno....: Un valor booleano que representa la validez
// Ejemplo....:
//              var sexo = document.forms[0].elements[0].value;
//              var edad = document.forms[0].elements[1].value;
//              if (!todosIncluidosEn(sexo,"hHmM"))
//                  alert("Debe indicar H (hombre) o M (mujer)");
//              else if (!todosIncluidosEn(edad,"1234567890"))
//                  alert("La edad no es válida");
// ****************************************************************************
// Prototipo..: isValidoEmail(email) -> true/false
// Descripción: Determina si el e-mail indicado tiene el un formato válido. En caso
//              de ser nulo o "" se considera no válido. Un formato válido será
//              <cuenta>@<servidor>.<sufijo_dominio>
// Argumentos.: - email, cuenta de correo a verificar
// Retorno....: Un valor booleano que representa la validez
// Ejemplo....:
//              var email = document.forms[0].elements[0].value;
//              if (!isValidoEmail(email))
//                  alert("El formato de la cuenta de correo no es válido");
// ****************************************************************************
//
	// Tipos devueltos por la función "tipoIdFiscal(id)"
  var idFiscal_Invalida          = 0;
  var idFiscal_PersonaFisica     = 1;
	var idFiscal_PersonaJuridica   = 2;
	var idFiscal_TarjetaResidencia = 3;
	var idFiscal_MenorEmancipado   = 4;
  var idFiscal_PersonaFisicaNR   = 5;
	var idFiscal_PersonaJuridicaNR = 6;
  
	
// Determina el tipo de identificación fiscal VALIDA DNI y NIE  

function validaNIF(id)
{
 var res = false;
 // Pasamos el contenido a mayúsculas
 id = id.toUpperCase();
			
 //si tiene 9 caracteres y cumple la validacion del dni es correcto
	if ( id.length==9 )
	{
		if (isPersonaFisica(id) )
	  res = true;
		//si tiene 9 caracteres y cumple la validacion del nie es correcto
		else 
		  if(res == false && isTarjetaResidencia(id))
				res = true;
	}
		
	return res;
}	

//Funciones auxiliar para quitar los espacios
function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}



  // Determina el tipo de identificación fiscal VALIDA DNI,NIE y CIF 
  function validaCIF(id)
	{
		 var id = trim(id.toUpperCase());
		 
		 if (validaNIF(id) == true)
		    var res= true;
		 else
		 {
		    res = id.length==9 && isPersonaJuridica(id); 
		 }
		 
		 return res;
	}

	// Indica si una identificación dada es de una persona física
	function isPersonaFisica(id) {
		  
			var ok = false;
    	var digitos = "1234567890";
    	var letras  = "TRWAGMYFPDXBNJZSQVHLCKE";

    	// Si los 8 primeros caracteres son dígitos y el último es la letra válida
		return (todosIncluidosEn(id.substring(0,8),digitos) &&
		        id.substring(0,8)>0 &&
		    	id.charAt(8)==letras.charAt(id.substring(0,8)%23));
	}

	// Indica si una identificación dada es de una persona jurídica
	function isPersonaJuridica(id) {
		var ok = false;
		var dc = 0;
		var letras1  = "ABCDEFGHJUV";
		var letras2  = "KLMNPQSRW";
		var digitos  = "1234567890";
		var control1 = "1234567890";
		var control2 = "ABCDEFGHIJ";
	
    	// Si la primera letra es válida y los 7 caracteres centrales son dígitos
		if ((letras1.indexOf(id.charAt(0))!=-1 || letras2.indexOf(id.charAt(0))!=-1) &&
		    todosIncluidosEn(id.substring(1,8),digitos)) {
			ok = true;
			// Acumulamos las sumas en base a los dígitos
			for (var idx=1; idx<8; idx++) {
				var num = new Number(id.charAt(idx));
				// Según la posición sea par o impar
				if (idx%2!=0) {
					// Acumulamos la parte entera de la división por 10 más el resto de dicha división
					dc += (num*2-(num*2)%10)/10 + (num*2)%10;
				} else {
					dc += num;
				}
			}
			dc = ((dc-dc%10)/10+1)*10-dc;
		}
		if (ok) {
			// Si el dígito que tiene es igual que el obtenido, es correcto
			// Discriminamos según la letra inicial
			if (letras1.indexOf(id.charAt(0))!=-1)
				ok = (id.charAt(8)==control1.charAt(dc-1));
			else
				ok = (id.charAt(8)==control2.charAt(dc-1));
		}
		return ok;
	}

	// Indica si una identificación dada es de una tarjeta de extrangero
	//MODIFICADO PARA QUE SE ADAPTE AL NUEVO FORMATO DE NIE CON UNA "XYZ",7 CARACTERES Y LA LETRA
function isTarjetaResidencia(id) {
		var digitos = "1234567890";
		var letras  = "TRWAGMYFPDXBNJZSQVHLCKE";
		var inicial = "XYZ";
		var factor = new Array (0,10000000,20000000);

		// Si la primera letra es la correcta y los 8 caracteres
		// centrales son dígitos y el último es la letra válida con el factor de conversión
		return (inicial.indexOf(id.charAt(0))!=-1 &&
				todosIncluidosEn(id.substring(1,8),digitos) &&
		    	id.charAt(8)==letras.charAt((parseFloat(id.substring(1,8))+factor[inicial.indexOf(id.charAt(0))])%23));
	}

	// Indica si una identificación dada es de un menor emancipado
	function isMenorEmancipado(id) {
		var digitos = "1234567890";
		var letras  = "TRWAGMYFPDXBNJZSQVHLCKE";
		var inicial = "K";
	
		// Si la primera letra es la correcta y los siete caracteres
		// centrales son dígitos y el último es la letra válida
		return (inicial.indexOf(id.charAt(0))!=-1 &&
				todosIncluidosEn(id.substring(1,8),digitos) &&
		    	id.charAt(8)==letras.charAt(id.substring(1,8)%23));
	}

	// Indica si una identificación dada es de una persona física no residente en t.nacional
	function isPersonaFisicaNR(id) {
		var digitos = "1234567890";
		var letras  = "TRWAGMYFPDXBNJZSQVHLCKE";
		var inicial = "L";
	
		// Si la primera letra es la correcta y los siete caracteres
		// centrales son dígitos y el último es la letra válida
		return (inicial.indexOf(id.charAt(0))!=-1 &&
				todosIncluidosEn(id.substring(1,8),digitos) &&
		    	id.charAt(8)==letras.charAt(id.substring(1,8)%23));
	}

	// Indica si una identificación dada es de una persona jurídica no residente en t.nacional
	function isPersonaJuridicaNR(id) {
		var ok = false;
		var dc = 0;
		var letras  = "ABCDEFGH";
		var digitos = "1234567890";
		var control = "ABCDEFGHIJ";
	
    	// Si la primera letra es válida y los 7 caracteres centrales son dígitos
		if (letras.indexOf(id.charAt(0))!=-1 &&
		    todosIncluidosEn(id.substring(1,8),digitos)) {
			ok = true;
			// Acumulamos las sumas en base a los dígitos
			for (var idx=1; idx<8; idx++) {
				var num = new Number(id.charAt(idx));
				// Según la posición sea par o impar
				if (idx%2!=0) {
					// Acumulamos la parte entera de la división por 10 más el resto de dicha división
					dc += (num*2-(num*2)%10)/10 + (num*2)%10;
				} else {
					dc += num;
				}
			}
			dc = ((dc-dc%10)/10+1)*10-dc;
		}
		if (ok) {
			// Si el dígito que tiene es igual que el obtenido, es correcto
			ok = (id.charAt(8)==control.charAt(dc-1));
		}
		return ok;
	}

	// Comprueba la validez de una cuenta bancaria en base a las reglas usadas
	// por el Consejo Superior Bancario.
	// Hay que destacar que se permite la utilización de asteriscos en el D.C.
	// (dígito de control) si se ignora éste.
	function isValidoCCC( ent, ofi, dc, cta ) {
		var MODULO          = 11;
		var PESO_1          =  6;
		var PESO_10         =  3;
		var PESO_100        =  7;
		var PESO_1000       =  9;
		var PESO_10000      = 10;
		var PESO_100000     =  5;
		var PESO_1000000    =  8;
		var PESO_10000000   =  4;
		var PESO_100000000  =  2;
		var PESO_1000000000 =  1;
		var DESCONOCIDO     = "**"
		var numeros = "1234567890";
		var respuesta = false;
		var digito1;
		var digito2;
	
		// Si todos los dígitos usados son válidos
		if (ent.length==4 && ofi.length==4 && dc.length==2 && cta.length==10 &&
			todosIncluidosEn(ent,numeros) &&
			todosIncluidosEn(ofi,numeros) &&
		    (dc==DESCONOCIDO || todosIncluidosEn(dc,numeros)) &&
		    todosIncluidosEn(cta,numeros)) {

			// Si el D.C. es asteriscos, es válido
			if (dc==DESCONOCIDO) {
				respuesta = true;
			// En otro caso se comprueba
			} else {
				var dummy;
				// Cálculo del dc para la entidad y oficina
				dummy = ofi.charAt(3)*PESO_1       +
						ofi.charAt(2)*PESO_10      +
						ofi.charAt(1)*PESO_100     +
						ofi.charAt(0)*PESO_1000    +
						ent.charAt(3)*PESO_10000   +
						ent.charAt(2)*PESO_100000  +
						ent.charAt(1)*PESO_1000000 +
						ent.charAt(0)*PESO_10000000;
				digito1 = new String(MODULO-dummy%MODULO);
				if (digito1=="10") {
					digito1 = "1";
				} else if (digito1=="11") {
					digito1 = "0";
				} else if (digito1.length>1){
					digito1 = digito1.charAt(1);
				}

				// Cálculo del dc para la cuenta
				dummy = cta.charAt(9)*PESO_1         +
						cta.charAt(8)*PESO_10        +
						cta.charAt(7)*PESO_100       +
						cta.charAt(6)*PESO_1000      +
						cta.charAt(5)*PESO_10000     +
						cta.charAt(4)*PESO_100000    +
						cta.charAt(3)*PESO_1000000   +
						cta.charAt(2)*PESO_10000000  +
						cta.charAt(1)*PESO_100000000 +
						cta.charAt(0)*PESO_1000000000;
				digito2 = new String(MODULO-dummy%MODULO);
				if (digito2=="10") {
					digito2 = "1";
				} else if (digito2=="11") {
					digito2 = "0";
				} else if (digito2.length>1) {
					digito2 = digito2.charAt(1);
				}
				// El dc será válido si corresponde con el calculado
				respuesta = (dc==digito1+digito2);
			}
		}
		return respuesta;
	}

	// Comprueba si todos los caracteres de "buscado" están incluidos en "patron"
	function todosIncluidosEn(buscado,patron) {
		for (var idx=0; idx<buscado.length && patron.indexOf(buscado.charAt(idx))!=-1; idx++);
		// Si llegó al final del bucle es que todos los caracteres son válidos
		return (idx==buscado.length);
	}

	// Comprueba la validez de una cuenta de e-mail
	function isValidoEmail(email) {
		var at   = "@";
		var dot  = ".";
		var lat  = email.indexOf(at)
		var lstr = email.length
		var ldot = email.indexOf(dot)
		var lOk  = true;

		if ((email==null)||(email=="")){
		   lOk = false;
		} else if (email.indexOf(at)<=0 || email.indexOf(at)+1==lstr) {
		   lOk = false;
		} else if (email.indexOf(dot)<=0 || email.indexOf(dot)+1==lstr) {
		   lOk = false;
		} else if (email.indexOf(at,(lat+1))!=-1) {
		   lOk = false;
		} else if (email.substring(lat-1,lat)==dot || email.substring(lat+1,lat+2)==dot) {
		   lOk = false;
		} else if (email.indexOf(dot,(lat+2))==-1) {
		   lOk = false;
		} else if (email.indexOf(" ")!=-1) {
		   lOk = false;
		}
		return lOk;
	}
