// JavaScript Document

function valida_nif_cif_nie(a) {


    var resul = true;

    
    var temp = jQuery('#'+a).val().trim();
   temp = temp.toUpperCase();
//alert(temp);
    var cadenadni = "TRWAGMYFPDXBNJZSQVHLCKE";

     if (temp !== '') {


        //algoritmo para comprobacion de codigos tipo CIF


        suma = parseInt(temp[2]) + parseInt(temp[4]) + parseInt(temp[6]);


        for (i = 1; i < 8; i += 2) 
		{


            temp1 = 2 * parseInt(temp[i]);


            temp1 += '';


            temp1 = temp1.substring(0,1);


            temp2 = 2 * parseInt(temp[i]);

 
            temp2 += '';


            temp2 = temp2.substring(1,2);


            if (temp2 == '') {


                temp2 = '0';


            }


            suma += (parseInt(temp1) + parseInt(temp2));


        }


        suma += '';


        n = 10 - parseInt(suma.substring(suma.length-1, suma.length));


        //si no tiene un formato valido devuelve error


        if ((!/^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp) && !/^[T]{1}[A-Z0-9]{8}$/.test(temp)) && !/^[0-9]{8}[A-Z]{1}$/.test(temp)) {


            if ((temp.length == 9) && (/^[0-9]{9}$/.test(temp))) {


                var posicion = temp.substring(8,0) % 23;


                var letra = cadenadni.charAt(posicion);

                var letradni = temp.charAt(8);// alert("La letra del NIF no es correcta. " + letradni + " es diferente a " + letra);


                jQuery('#'+a).val(temp.substr(0,8) + letra);


                resul = false;
return resul;

            } else if (temp.length == 8) {


                if (/^[0-9]{1}/.test(temp)) {


                    var posicion = temp.substring(8,0) % 23;


                    var letra = cadenadni.charAt(posicion);


                    var tipo = 'NIF';


                } else if (/^[KLM]{1}/.test(temp)) {


                    var letra = String.fromCharCode(64 + n);


                    var tipo = 'NIF';


                } else if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp)) {


                    var letra = String.fromCharCode(64 + n);


                    var tipo = 'CIF';


                } else if (/^[T]{1}/.test(temp)) {


                    var letra = String.fromCharCode(64 + n);


                    var tipo = 'NIE';


                } else if (/^[XYZ]{1}/.test(temp)) {


                    var pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;


                    var letra = cadenadni.substring(pos, pos + 1);


                    var tipo = 'NIE';


                }


                if (letra !== '') {// alert("Añadido la letra del " + tipo + ": " + letra);


                    jQuery('#'+a).val(temp + letra);


                } else {// alert("El CIF/NIF/NIE tiene que tener 9 caracteres");

 
                    jQuery('#'+a).val(temp);

 
                }


                resul = false;

return resul;
            } else if (temp.length < 8) {


               //// alert("El CIF/NIF/NIE tiene que tener 9 caracteres");


                jQuery('#'+a).val(temp);


                resul = false;
return resul;

            } else {


              //// alert("CIF/NIF/NIE incorrecto");


                jQuery('#'+a).val(temp);

 
                resul = false;
return resul;

            }


        }


        //comprobacion de NIFs estandar


        else if (/^[0-9]{8}[A-Z]{1}$/.test(temp)) {


            var posicion = temp.substring(8,0) % 23;


            var letra = cadenadni.charAt(posicion);


            var letradni = temp.charAt(8);


            if (letra == letradni) {


                resul = true;
return resul;

            } else if (letra != letradni) {


               //// alert("La letra del NIF no es correcta. " + letradni + " es diferente a " + letra);


                jQuery('#'+a).val(temp.substr(0,8) + letra);


                resul = false;
return resul;

            } else {// alert("NIF incorrecto");


                jQuery('#'+a).val(temp);


                resul = false;
return resul;

            }


        }


        //comprobacion de NIFs especiales (se calculan como CIFs)


        else if (/^[KLM]{1}/.test(temp)) {


            if (temp[8] == String.fromCharCode(64 + n)) {


                    resul = true;
return resul;

            } else if (temp[8] != String.fromCharCode(64 + n)) {


               //// alert("La letra del NIF no es correcta. " + temp[8] + " es diferente a " + String.fromCharCode(64 + n));


                jQuery('#'+a).val(temp.substr(0,8) + String.fromCharCode(64 + n));


                resul = false;
return resul;

            } else {// alert("NIF incorrecto");


                jQuery('#'+a).val(temp);


                resul = false;
return resul;

            }
        }


        //comprobacion de CIFs


        else if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp)) {


            var temp_n = n + '';


            if (temp[8] == String.fromCharCode(64 + n) || temp[8] == parseInt(temp_n.substring(temp_n.length-1, temp_n.length))) {


                    resul = true;
return resul;

            } else if (temp[8] != String.fromCharCode(64 + n)) {// alert("La letra del CIF no es correcta. " + temp[8] + " es diferente a " + String.fromCharCode(64 + n));

          jQuery('#'+a).val(temp.substr(0,8) + String.fromCharCode(64 + n));


                resul = false;
return resul;

            } else if (temp[8] != parseInt(temp_n.substring(temp_n.length-1, temp_n.length))) {// alert("La letra del CIF no es correcta. " + temp[8] + " es diferente a " + parseInt(temp_n.substring(temp_n.length-1, temp_n.length)));


                jQuery('#'+a).val(temp.substr(0,8) + parseInt(temp_n.substring(temp_n.length-1, temp_n.length)));


                resul = false;
return resul;
 
            } else {// alert("CIF incorrecto");


                jQuery('#'+a).val(temp);


                resul = false;
return resul;

            }


        }


        //comprobacion de NIEs


        //T


        else if (/^[T]{1}/.test(temp)) {


            if (temp[8] == /^[T]{1}[A-Z0-9]{8}$/.test(temp)) {


                     resul = true;
return resul;

            } else if (temp[8] != /^[T]{1}[A-Z0-9]{8}$/.test(temp)) {


                var letra = String.fromCharCode(64 + n);


                var letranie = temp.charAt(8);


                if (letra != letranie) {// alert("La letra del NIE no es correcta. " + letranie + " es diferente a " + letra);


                    jQuery('#'+a).val(temp.substr(0,8) + letra);


                    resul = false;
return resul;

                } else {// alert("NIE incorrecto");


                    jQuery('#'+a).val(temp);


                    resul = false;
return resul;

                }


            }


        }


        //XYZ


        else if (/^[XYZ]{1}/.test(temp)) {


            var pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;


            var letra = cadenadni.substring(pos, pos + 1);


            var letranie = temp.charAt(8);


            if (letranie == letra) {


                     resul = true;
return resul;

            } else if (letranie != letra) {// alert("La letra del NIE no es correcta. " + letranie + " es diferente a " + letra);


                jQuery('#'+a).val(temp.substr(0,8) + letra);


                resul = false;
return resul;

            } else {// alert("NIE incorrecto");


                jQuery('#'+a).val(temp);


                resul = false;
                return resul;

            }


        }


    }
	
//// alert("Resultado --->" + resul);

    if (!resul) {       

       //// alert("Resultado --->" + resul);
        jQuery('#'+a).focus();


        return resul;


    }


}

