﻿// Archivo JScript

function NifNieValido(source, arguments)
{
    abc = arguments.Value;
    abc = LimpiarCadena(abc);
    dni=abc.substring(0,abc.length-1);
    let=abc.substr(abc.length-1,1);
    if (!isNaN(let))
    {
        arguments.IsValid=false;
        return; 
    }
    else
    {
        //mod de Marcos para que acepte el NIE:
        //el NIE es como el DNI pero con una letra
        //al principio, que será una X, Y o Z
        //entonces se la quito
        if (!isNumEntero(dni.substring(0,1)))
        {
            dni = dni.replace(dni.substring(0,1),'');
        }
        cadena = "TRWAGMYFPDXBNJZSQVHLCKET";
        posicion = dni % 23;
        letra = cadena.substring(posicion,posicion+1);
        if (letra!=let.toUpperCase())
        {
            arguments.IsValid=false;
            return; 
        }
    }
    arguments.IsValid=true;
}


function CifValido(source,arguments)
{
    var cif = LimpiarCadena(arguments.Value);
    var par = 0;
    var non = 0;
    var letras = "ABCDEFGHJKLMNPRQSUVW";
    var caracterControlLetra = "KPQS";
    var caracterControlNum = "ABEH";
    var i;
    var parcial;
    var control;
    var controlLetra = "JABCDEFGHIJ";
    var letraIni = cif.substr(0,1);
    if (cif.length!=9) {
        arguments.IsValid=false;
        return; 
    }
    else
    {
        if (letras.indexOf(letraIni.toUpperCase())==-1)
        {
            arguments.IsValid=false;
            return; 
        }
        for (i=2;i<8;i+=2) {
            par = par + parseInt(cif.substr(i,1));
        }

        for (i=1;i<9;i+=2) {
            var nn = 2 * parseInt(cif.substr(i,1));
            if (nn > 9) nn = 1 + (nn-10);
            non = non + nn;
        }
        
        parcial = par + non;

        control = (10 - ( parcial % 10));

        if (caracterControlLetra.indexOf(letraIni.toUpperCase()) != -1)
        {
            // El caracter de control deberá ser una letra
            if (controlLetra.substr(control,1) != cif.substr(8,1).toUpperCase())
            {
                arguments.IsValid=false;
                return; 
            }
        }
        if (caracterControlNum.indexOf(letraIni.toUpperCase()) != -1)
        {
            // El caracter de control deberá ser un número

            if (control == 10) control = 0;

            if (control != cif.substr(8,1))
            {
                arguments.IsValid=false;
                return; 
            }
        }
        if ((caracterControlLetra.indexOf(letraIni.toUpperCase()) == -1) && (caracterControlNum.indexOf(letraIni.toUpperCase()) == -1))
        {
            // En este caso el carácter de control puede ser una letra o un número
            if (control == 10)
            {
                control = 0;

            }
            if ((controlLetra.substr(control,1) != cif.substr(8,1).toUpperCase()) && (control != cif.substr(8,1)))
            {
                arguments.IsValid=false;
                return; 
            }
        }
        arguments.IsValid=true;
        return;
    }
}



//function CifValido(source,arguments)
//{
//    var pares = 0;
//    var impares = 0;
//    var suma;
//    var ultima;
//    var unumero;
//    var uletra = new Array("J", "A", "B", "C", "D", "E", "F", "G", "H", "I");
//    var xxx;
//    
//    texto = arguments.Value;
//    
//    texto = LimpiarCadena(texto);
//        
//    texto = texto.toUpperCase();
//     
//    var regular = new RegExp(/^[ABCDEFGHKLMNPQS]\d\d\d\d\d\d\d[0-9,A-J]$/g);
//     if (!regular.exec(texto))
//     {
//        arguments.IsValid=false;
//        return; 
//     }
//         
//     ultima = texto.substr(8,1);

//     for (var cont = 1 ; cont < 7 ; cont ++){
//         xxx = (2 * parseInt(texto.substr(cont++,1))).toString() + "0";
//         impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
//         pares += parseInt(texto.substr(cont,1));
//     }
//     xxx = (2 * parseInt(texto.substr(cont,1))).toString() + "0";
//     impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
//     
//     suma = (pares + impares).toString();
//     unumero = parseInt(suma.substr(suma.length - 1, 1));
//     unumero = (10 - unumero).toString();
//     if(unumero == 10) unumero = 0;
//     
//     if ((ultima == unumero) || (ultima == uletra[unumero]))
//     {
//        arguments.IsValid=true;
//        return; 
//     }
//     else
//     {
//        arguments.IsValid=false;
//        return; 
//     }
//}

function NifOCifVlido(source, arguments)
{
    NifNieValido(source, arguments);
    if (!arguments.IsValid)
    {
        CifValido(source, arguments)
    }      
}

function validarCCC(source, arguments)
{   
    var cuenta = LimpiarCadena(arguments.Value);

    if (!isNumEntero(cuenta))
    {
        arguments.IsValid=false;
        return;
    }
        
    if (cuenta.length != 20)
    {
        arguments.IsValid=false;
        return;
    }
    
    var i_entidad = cuenta.substr(0,4);
    var i_oficina = cuenta.substr(4,4);
    var i_digito = cuenta.substr(8,2);
    var i_cuenta = cuenta.substr(10,10);

    var wtotal,wcociente, wresto;
        
    wtotal = i_entidad.substr(0,1) * 4;
    wtotal += i_entidad.substr(1,1) * 8;
    wtotal += i_entidad.substr(2,1) * 5;
    wtotal += i_entidad.substr(3,1) * 10;
    wtotal += i_oficina.substr(0,1) * 9;
    wtotal += i_oficina.substr(1,1) * 7;
    wtotal += i_oficina.substr(2,1) * 3;
    wtotal += i_oficina.substr(3,1) * 6;
    // busco el resto de dividir wtotal entre 11
    wcociente = Math.floor(wtotal / 11);
    wresto = wtotal - (wcociente * 11);
    //
    wtotal = 11 - wresto;
    if (wtotal == 11)
    {
        wtotal=0;
    }
    if (wtotal == 10)
    {
        wtotal=1;
    }
        
    if (wtotal != i_digito.substr(0,1))
    {
        arguments.IsValid=false;
        return;
    }
        
    //hemos validado la entidad y oficina
    //-----------------------------------
    wtotal = i_cuenta.substr(0,1) * 1;
    wtotal += i_cuenta.substr(1,1) * 2;
    wtotal += i_cuenta.substr(2,1) * 4;
    wtotal += i_cuenta.substr(3,1) * 8;
    wtotal += i_cuenta.substr(4,1) * 5;
    wtotal += i_cuenta.substr(5,1) * 10;
    wtotal += i_cuenta.substr(6,1) * 9;
    wtotal += i_cuenta.substr(7,1) * 7;
    wtotal += i_cuenta.substr(8,1) * 3;
    wtotal += i_cuenta.substr(9,1) * 6;

    // busco el resto de dividir wtotal entre 11
    wcociente = Math.floor(wtotal / 11);
    wresto = wtotal - (wcociente * 11);
    //
    wtotal = 11 - wresto;
    if (wtotal == 11){wtotal=0;}
    if (wtotal == 10){wtotal=1;}

    if (wtotal != i_digito.substr(1,1))
    {
        //alert(wtotal+' y no '+i_digito.charAt(1));
        arguments.IsValid=false;
        return;
    }
    // hemos validado la cuenta corriente

    arguments.IsValid=true;
    return;
}



