function validaDocumento(campoNif,tipoDocumento)
{
	cadena=Trim(campoNif.value);
	if (isFieldBlank(cadena)) {
		alert("Debe introducir ID de usuario.");
		return false;
	}
	if(tipoDocumento==3) // TARJETA RESIDENCIA
	{	
		if(validaTResidencia(cadena)=='1') {
			campoNif.focus();
			return false;
		} else {
			campoNif.value = validaTResidencia(cadena);
		}
	} else  if(tipoDocumento==1 ||tipoDocumento==2 ) // NIF/CIF
	{ 
		// valido la longitud y el formato
		if (validarLongitudFormatoDocumento (cadena,tipoDocumento) == '1')	{
			return false;	
		}
		// si es un NIF miro que sea valido
		if (tipoDocumento==1) {
			doc = validarNIF (cadena);	
		}
		// si es un CIF miro que sea valido
	   else if (tipoDocumento==2) {	
			doc = validarCIF (cadena);	
		}             	
		// analizo el resultado de la validacion
		if(doc== '1') {
			campoNif.focus();
			return false;
		}
		campoNif.value= doc;
	} else if (tipoDocumento= 4) // PASAPORTE
	{	
		return contenidoAlfanumerico(campoNif,"Nº del Documento");
	}

	return true;
}

function isFieldBlank(theField)

{

	theField = Trim(theField);

	if(theField.length==0)

    	return true;

  	else

        return false;

}

function Trim(cad) {
	var aux="";
	var i,lg = cad.length;

	for (;lg>0 && cad.charAt(lg-1)<=' ';lg--);

	for (i=0;i<lg && cad.charAt(i)<=' ';i++);

	for (;i<lg;i++)
		aux = aux + cad.charAt(i);

	return aux;
}

function IntOk(cad) {

 	cad=Trim(cad);
 	var i,lg = cad.length;

 	if (lg==0) return false;

 	for (i=0;i<lg;i++)
	  	if (cad.charAt(i)<'0' || cad.charAt(i)>'9')
	   	return false;

 	return true;

}

function isLetter(c) { 
 	return(((c>="a")&&(c<="z"))||((c>="A")&&(c<="Z")))
}

function contenidoAlfanumerico(campo,nombreCampo)
{
	var valor=Trim(campo.value);
	if(isFieldBlank(valor))
	{
		alert("El Campo "+nombreCampo+" es Obligatorio");
		return false;
	}
	if(valor!="")	
	{
		for (i=0;i<valor.length;i++)
		{
			c = valor.charAt(i);
			c = c.toUpperCase();
	
			if ( !(c>='0' && c<='9') )
			{
				if ( !(c>='A' && c<='Z') )
				{
					alert("El Campo "+nombreCampo+" sólo debe contener texto alfanumérico");
					return false;
				}
			}
		}
	}
	return true;	
}


function validarLongitudFormatoDocumento (num,tipodocumento)
{
	if ( (tipodocumento == 1) && !isFieldBlank(num) )
	{
		var delantera = "00000000";
		num = delantera.substring(0,9 - (num.length)) + num;
	}
	if ((num =='00000000' || num ==""))
	{
		alert("Es Obligatorio introducir el número de Documento");
		return 1;
	}	
	if ( (num.length == 0) )
	{
		alert("Es Obligatorio introducir el número de Documento");
		return 1;
	}		
	else if (num.length != 9)
	{
		alert("EL Nº del Documento no tiene la longitud adecuada.");
		return 1;    //EL nif no tiene la longitud adecuada.
	}	
	return num;
}



// *******************************************************************
// ************* FUNCION QUE VALIDA NIF ******************************

function validarNIF (nif)
{
   var controlNif = new Array("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E");
	
	// rellanamos el nif con ceros
	var delantera = "00000000";
	nif=Trim(nif);
	nif = delantera.substring(0,9 - (nif.length)) + nif;		
	var cadenaNif = Trim(nif);
	var provincia="";

   numero=cadenaNif.substring(0,8);

 	//miramos si el ultimo caracter es un espacio en blanco
   if ( ( numero.charAt( numero.length -1 ) == ' ' ) || IntOk(numero)==false) 
	{
  		alert("El Nº del Documento introducido es incorrecto");
		return 1;   //Parte numérica del Nif no válida
	}
	var	caracterControl = nif.substring(8,9).toUpperCase();
	caracterControlCalculado=controlNif[((parseFloat(numero)%23))];  
	if (caracterControl != caracterControlCalculado) 
    {
    	alert("El Nº del Documento introducido es incorrecto");
       	return 1;  
    }
	return nif.toUpperCase();
}

// *******************************************************************
// ************* FUNCION QUE VALIDA CIF ******************************

function validarCIF (cif)
{
	var suma = 0;
	var codigoControl = 0;
    var valoresCif= new Array("A","B","C","D","E","F","G","H","N","P","Q","S","X");
	var nif = "";
	var letraValida = false;

	// convertimos a MAY los caracteres del cif
	cif=Trim(cif);
	cif = cif.toUpperCase(); 

	// si el cif no tiene 9 caracteres, nos salimos.
	if (cif.length<9)
	{
       	alert("El CIF tiene que tener 9 cifras");	
		return 1;
	}

	// miro si la letra de inicio se corresponde con los valores de la lista
    for (i=0;i<valoresCif.length;i++) 
        { 
        	if (valoresCif[i]==cif.substring(0,1))
			{
				letraValida = true;
			}
        }

	// si la letra no es valida muestro error.
	if (!letraValida)	
		{
           	alert("El Nº del Documento introducido es incorrecto");	
			return 1;
		}
	return cif
}
// Función encargada de validar la Tarjeta de Residencia.
// La estructura de la T. Residencia puede ser:
// X-7cifras-letra (esta ultima debe pasar la validacion del NIF) 
// letraletra-8cifras-letra(esta ultima debe pasar la validacion del NIF) 
function validaTResidencia(campoNif)
{	
	var valoresPrimerCaracter= new Array("K","L","T","X");
	var correcto=false;
	cadenaNif = campoNif;
	if (cadenaNif.length == 0)
	{
		alert("Es Obligatorio introducir el número de Documento");
		return 1;
	} else if ( !(cadenaNif.length == 11 || cadenaNif.length == 9) ) {
		alert("EL Nº del Documento no tiene la longitud adecuada.");
	 	return 1; 
	}
	primerCaracter=cadenaNif.substring(0,1).toUpperCase();
	if(cadenaNif.length == 11)	{	
		segundoCaracter=cadenaNif.substring(1,2).toUpperCase();
		tercerCaracter=cadenaNif.substring(2,4).toUpperCase();
		nif=cadenaNif.substring(2,11).toUpperCase();			
		for (i=0;i<valoresPrimerCaracter.length;i++) { 
       	if (valoresPrimerCaracter[i]==primerCaracter) {
				correcto=true;
			}  
		}
		if(!isLetter(segundoCaracter)) {
			correcto=false;
		}
		if(tercerCaracter=='00') {
			correcto=false;
		}
		if( correcto && validarNIF(nif)==1 ) {
			return 1;
		}
	}
	if(cadenaNif.length == 9) {
		if (primerCaracter=='X')
		{
			correcto=true;
		} 
		nif='0'+cadenaNif.substring(1,9).toUpperCase();		
		if( correcto && validarNIF(nif)==1 )
		{
			return 1;
		}
	}	
	if(!correcto)
	{
		alert("El Nº del Documento introducido es incorrecto");
		return 1;
	}	

	return Trim(cadenaNif.toUpperCase());
}




function validaNif(cadenaNif){

        var valoresNif= new Array("0","1","2","3","4","5","6","7","8","9","K","L","X");

        var valoresCif= new Array("A","B","C","D","E","F","G","H","N","P","Q","S");

        var controlNif = new Array("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E");

        var controlCifLetras = new Array("A","B","C","D","E","F","G","H","I","J");

		//alert("entrando en la rutina de validacion del NIF");
        if (cadenaNif.length != 9){
				 //alert("EL nif no tiene la longitud adecuada.");
				 return 1;    //EL nif no tiene la longitud adecuada.
		 }

        caracterControl=cadenaNif.substring(8,9).toUpperCase();

        //TIPO DE NIF
        primerCaracter=cadenaNif.substring(0,1).toUpperCase();

        var tipo="desconocido";

        for (i=0;i<valoresNif.length;i++)
        {
        	if (valoresNif[i]==primerCaracter) tipo="NIF";
        }

        if (tipo=="desconocido")
        {
                for (i=0;i<valoresCif.length;i++)
                {
                	if (valoresCif[i]==primerCaracter) tipo="CIF";
                }
        }

        //alert("primerCaracter:"+primerCaracter+"\ntipo:"+tipo+"\ncaracterControl:"+caracterControl);

        if (tipo=="desconocido"){
		 	 //alert("El primer caracter del nif no es válido.");
			 return (5);
        //El primer caracter del nif no es válido.
		}

		//alert(tipo);

        if (tipo=="NIF")
        {
                var provincia="";

                if ((primerCaracter=="K") || (primerCaracter=="L"))
                {
				provincia=cadenaNif.substring(1,3);
				//alert(provincia);
                        if (IntOk(provincia)==false){
						//alert("Codigo de provincia no válido");
						 return 2;
                        //Codigo de provincia no válido
						}

                        numero=cadenaNif.substring(3,8);
                }

                else if (primerCaracter=="X")
                {
                        numero=cadenaNif.substring(1,8);
                }

                else
                {
                        numero=cadenaNif.substring(0,8);
                }
				//alert(numero);
                if (IntOk(numero)==false) {
						//alert("Parte numérica del Nif no válida");
						return 3;   //Parte numérica del Nif no válida
						}

                caracterControlCalculado=controlNif[((parseFloat(numero)%23))];

                //El algoritmo dice que al resto hay que
				//sumarle 1, eso lo hacemos al indexar el
				//array ya que los indices empiezan en 0

                //alert ("caracterControl NIF:"+caracterControl+"\ncalculado:"+caracterControlCalculado);

                if (caracterControl != caracterControlCalculado) return 4;
                 //Carácter Control incorrecto
        }
        else if (tipo=="CIF")
        {
                if (primerCaracter=="N")
                {
                        pais=cadenaNif.substring(1,4);
                        if (IntOk(pais)==false){
						 return 6;   //Codigo de pais no válido
						 }
                        numero=cadenaNif.substring(4,8);
                }
                else
                {
                        numero=cadenaNif.substring(1,8);
                }

                if (IntOk(numero)==false){
				 return 3;   //Parte numérica del Nif no válida
				 }

                caracterControlCalculado = 10 - ( (Math.floor(0.2*parseInt(cadenaNif.substring(1,2),10) ) +
                					(2*parseInt(cadenaNif.substring(1,2),10) %10) +
							Math.floor(0.2*parseInt(cadenaNif.substring(3,4),10) ) +
                                                        (2*parseInt(cadenaNif.substring(3,4),10) %10) +
                                                        Math.floor(0.2*parseInt(cadenaNif.substring(5,6),10) ) +
                                                        (2*parseInt(cadenaNif.substring(5,6),10) %10) +
                                                        Math.floor(0.2*parseInt(cadenaNif.substring(7,8),10) ) +
                                                        (2*parseInt(cadenaNif.substring(7,8),10) %10) +
							parseInt(cadenaNif.substring(2,3),10) +
							parseInt(cadenaNif.substring(4,5),10) +
							parseInt(cadenaNif.substring(6,7),10))% 10);

                if ((primerCaracter=="N") ||(primerCaracter=="P") ||
			(primerCaracter=="Q") || (primerCaracter=="S") )
                {

                        caracterControlCalculado =valoresCif[caracterControlCalculado-1];

                }


                if (caracterControlCalculado==10)caracterControlCalculado=0;


                //alert ("caracterControl CIF:"+caracterControl+"\ncalculado:"+caracterControlCalculado);

                if (caracterControl != caracterControlCalculado) return 4;   //Carácter Control incorrecto

        }

        return 0;  //todo bien.
}

function IntOk(cad,req)
{
	cad = Trim(cad);
	if (cad.length==0) return !req;
	var i=0,lg = cad.length;
	if (lg==0) return !req;
	if (cad.charAt(0)=='-') {
		if (lg==1) return false;
		i=1;
	}
	for (;i<lg;i++) {
		ch = cad.charAt(i);
		if (ch<'0' || ch>'9') return false;
	}
	return true;
}

function Trim(cad)
{
	var aux="";
	var i,lg = cad.length;
	for (;lg>0 && cad.charAt(lg-1)<=' ';lg--);
	for (i=0;i<lg && cad.charAt(i)<=' ';i++);
	for (;i<lg;i++)
		aux = aux + cad.charAt(i);
	return aux;
}

function esNumero (cad)
{
   lg=cad.length;
   for (i=0;i<lg;i++) {
        c=cad.charAt(i);
        if (c<'0' || c>'9') return false;
   }
   return true;
}

function esTexto (cad)
{
   lg=cad.length;
   for (i=0;i<lg;i++) {
        c=cad.charAt(i);
        if (!isAlpha(c)) return false;
   }
   return true;
}


function emailOk(cad, req){
	cad = Trim(cad);
	if (cad.length==0)
		return !req;
	var car;
	var arroba=0;
	var punto =0;
	longitud=cad.length;
	for (var i=0;i<longitud;i++) {
		car=cad.charAt(i);
		if (car==' ')
			return false;
		if ( !(isAlpha(car) ||
			car=='@' || car=='.' || car=='~' ||  car=='-' || car=='_' || 
		       (car>='0' && car<='9')) )
			return false;
		if (car=='@')
			if (arroba>0)
				return false;
			else
				arroba=i;
		else
			if (car=='.')
				punto=i;
	}
	return (arroba>0 && punto>0 && arroba<punto && car!='.');
}

function isAlpha(car){
	car = car.toUpperCase();

	return  (car>='A' && car<='Z');
}