﻿// ComprovarNombreDocument
//
var _bMostrarErrores = true;
function MostrarErrores(bool)
{
    //Mostrará/No mostrará errores de validación en el NIF/NIE
    _bMostrarErrores = bool;
}

/*****************************************************************************************************/
/* NUEVA VALIDACION NIF/NIEs 10/03/2009                                                              */
/*****************************************************************************************************/
function ComprovarNombreDocument(txtIdentificacion)
{
    var sIdentificacion = ValidateFormatDocument(txtIdentificacion.value);
    if (sIdentificacion != '')
    {
        txtIdentificacion.value = sIdentificacion;
        var iResultado = valida_nif_nie(sIdentificacion);
        switch(iResultado)
        {
            case -1:
                if(confirm('La lletra del DNI/NIE no és correcta, voleu que es corregeixi automàticament?'))
                {
                    sIdentificacion = sIdentificacion.substring(0,sIdentificacion.length -1);
                    sIdentificacion = AddNIFNIELetter(sIdentificacion);
                    txtIdentificacion.value = sIdentificacion;
                    if (valida_nif_nie(sIdentificacion) != 1)
                    {
                        if (_bMostrarErrores)
                        {
                            alert("El format del DNI/NIE no és correcte.");
                            txtIdentificacion.select();
                        }
                    }
                }
                txtIdentificacion.focus();
                break;
                
            case -3:
                if(confirm('La lletra del NIE no és correcta, voleu que es corregeixi automàticament?'))
                {
                    sIdentificacion = sIdentificacion.substring(0,sIdentificacion.length -1);
                    sIdentificacion = AddNIFNIELetter(sIdentificacion);
                    txtIdentificacion.value = sIdentificacion;
                    if (valida_nif_nie(sIdentificacion) != 3)
                    {
                        if (_bMostrarErrores)
                        {
                            alert("El format del NIE no és correcte.");
                            txtIdentificacion.select();
                        }
                    }
                }
                txtIdentificacion.focus();
                break;
                
            case 0:
                if (_bMostrarErrores)
                {
                    alert("El format del número identificatiu no és correcte.");
                    txtIdentificacion.focus();
                    txtIdentificacion.select();
                }
                break;
        }
    }
}

//function ValidarDocumento(sDocumento)
function ValidateFormatDocument(sDocumento)
{
    //NIF
    var temp  = trim(sDocumento);
    var re = new RegExp("^[0]?[0-9]{6,8}([a-zA-Z])?$"); 
    if (re.test(temp))
    {
        var len = 10;
        if (!isNaN(temp))
            len = 9; //Dejamos espacio para que el ComprovarNombreDocument ponga la letra

        for (i=0;temp.length < len;i++)
        {
            //Añadimos ceros a la izquierda
            temp = "0" + temp; 
        }
        
        temp = temp.toUpperCase()
    }
    
    //NIE sin letra
    re = new RegExp("^[a-zA-Z]{1}([0-9]{7})$"); 
    if (re.test(temp))
    {
        temp = temp.toUpperCase()
        //Añadimos espacio ya que en el SIP los NIE se guardan con formato X1234567 A
        temp += " ";
    }

    //Validamos NIE sin espacio
    re = new RegExp("^[a-zA-Z]{1}[0-9]{7}[a-zA-Z]{1}$"); 
    if (re.test(temp))
    {
        temp = temp.substring(0,temp.length -1) + " " + temp.charAt(temp.length-1);
        temp = temp.toUpperCase()
    }

    //Añadir letra a los NIF/NIE
    temp = AddNIFNIELetter(temp);

    return temp;
}

function valida_nif_nie(a) 
{
    //http://compartecodigo.com/javascript/validar-nif-cif-nie-segun-ley-vigente-31.html
    //Retorna: 
    //  * 0 = Error validacion documento
    //  * 1 = NIF ok
    //  *-1 = letra NIF error
    //  * 3 = NIE ok, 
    //  *-3 = NIE error

	var temp = a.toUpperCase();
	var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
 
	if (temp!== ''){
		//si no tiene un formato valido devuelve error
		if (!/^[A-Z]{1}[0-9]{7}[\s]{1}[A-Z0-9]{1}$/.test(temp) && 
		    !/^[0]{1}[0-9]{8}[A-Z]{1}$/.test(temp))
		{
			return 0;
		}
 
		//comprobacion de NIFs estandar con letra
		if (/^[0]{1}[0-9]{8}[A-Z]{1}$/.test(temp)) //NIFs se guardan con 0 delante en ICS
		{
			posicion = a.substring(9,0) % 23;
			letra = cadenadni.charAt(posicion);
			var letradni=temp.charAt(9);
			if (letra == letradni)
			{
			   	return 1;
			}
			else
			{
				return -1; //letra NIF incorrecta
			}
		}

		//XYZ
		if (/^[XYZ]{1}/.test(temp))
		{
			pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
			if (a.charAt(9) == cadenadni.substring(pos, pos + 1))
			{
				return 3;
			}
			else
			{
				return -3; //letra NIE incorrecta
			}
		}
	}
 
	return 0;
}

function AddNIFNIELetter(NIF)
{
    var temp = NIF;
    var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
    var posicion;
    var letra;
    var pos;
    
    if (/^[0]{1}[0-9]{8}$/.test(temp)) //NIF
    {
        posicion = temp.substring(9,0) % 23;
		letra = cadenadni.charAt(posicion);
		temp = temp + letra;
		temp = temp.toUpperCase()
		
    }
    
    if (/^[A-Z]{1}[0-9]{7}[\s]?$/.test(temp)) //NIE
    {
        pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
		letra = cadenadni.substring(pos, pos + 1);
		temp = temp + letra;
		temp = temp.toUpperCase()
    }
    
    return temp;
}

function str_replace(search, replace, subject) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
    // +   improved by: Philip Peterson
    // +   improved by: Simon Willison (http://simonwillison.net)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   bugfixed by: Anton Ongson
    // +      input by: Onno Marsman
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    tweaked by: Onno Marsman
    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
    // *     returns 1: 'Kevin.van.Zonneveld'
    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
    // *     returns 2: 'hemmo, mars'
 
    var f = search, r = replace, s = subject;
    var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;
 
    while (j = 0, i--) {
        if (s[i]) {
            while (s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
        }
    };
 
    return sa ? s : s[0];
}

/*****************************************************************************************************/
/* END VALIDACION NIF/NIEs 10/03/2009                                                                */
/*****************************************************************************************************/


function ComprovarNombreDocument_old(txtNombreId)
{
    //*****************************************************************
    //**** MODIFICADO 11/01/2008
    //**** NIF's de 10 chars (anteriormente 9)
    //**** ANTES => 12345678A
    //**** AHORA => 012345678A
    //*****************************************************************
    //
    // === CODIGO ANTIGUO NIF 9 chars ===
    //
    //var sNombreId = txtNombreId.value;
    //
    // === FIN CODIGO ANTIGUO NIF 9 chars ===
    //
    // === CODIGO NUEVO NIF 10 chars ===
    //
    debugger;
    var sNombreId = ValidarDocumento(txtNombreId.value); //Funcion que añade 0's a la derecha del NIF
    if (sNombreId != '')
        txtNombreId.value = sNombreId;
    //
    // === FIN CODIGO NUEVO NIF 10 chars ===
    //*****************************************************************

    if(sNombreId != '')
    {
        switch (ComprovarFormatNombreId(sNombreId))
        {
            case 'E':
                txtNombreId.value = sNombreId + TrobarLletra(sNombreId);
                break;
            case 'Y':
                txtNombreId.value = 'Y' + sNombreId.substring(1, sNombreId.length) + TrobarLletra(sNombreId.substring(1, sNombreId.length));
                break;
            case 'X':
                txtNombreId.value = 'X' + sNombreId.substring(1, sNombreId.length) + TrobarLletra(sNombreId.substring(1, sNombreId.length));
                break;
            case 'CE':
                var sAuxLletra = sNombreId.substring(sNombreId.length - 1, sNombreId.length);
                if(!EsSencer(sAuxLletra))
                {
                    var sLletra = TrobarLletra(sNombreId.substring(0, sNombreId.length - 1));
                    if(sLletra != sAuxLletra)
                        if(confirm('La lletra del número identificatiu no és correcta, voleu que es corregeixi automàticament?'))
                            txtNombreId.value = sNombreId.substring(0, sNombreId.length - 1) + sLletra;
                        else
                        {
                            txtNombreId.focus();
                            txtNombreId.select();
                        }
                }
                else
                {
                    if (_bMostrarErrores)
                    {
                        alert("El format del número identificatiu no és correcte.");
                        txtNombreId.focus();
                        txtNombreId.select();
                    }
                }
                break;
            case 'CX':
                var sAuxLletra = sNombreId.substring(sNombreId.length - 1, sNombreId.length);
                if(!EsSencer(sAuxLletra))
                {
                    var sLletra = TrobarLletra(sNombreId.substring(1, sNombreId.length - 1));
                    if(sLletra != sAuxLletra)
                        if(confirm('La lletra del número identificatiu no és correcta, voleu que es corregeixi automàticament?'))
                            txtNombreId.value = 'X' + sNombreId.substring(1, sNombreId.length - 1) + sLletra;
                        else
                        {
                            txtNombreId.focus();
                            txtNombreId.select();
                        }
                }
                else
                {
                    if (_bMostrarErrores)
                    {
                        alert("El format del número identificatiu no és correcte.");
                        txtNombreId.focus();
                        txtNombreId.select();
                    }
                }
                break;
            case '':
                if (_bMostrarErrores)
                {
                    alert("El format del número identificatiu no és correcte.");
                    txtNombreId.focus();
                    txtNombreId.select();
                }
                break;
        }
    }
}// ComprovarNombreDocument

// ComprovarFormatNombreId
function ComprovarFormatNombreId(sNombreId)
{

    //*****************************************************************
    //**** MODIFICADO 11/01/2008
    //**** Ahora los NIF's serán de 10 chars (no de 9 como actualmente)
    //**** ANTES => 12345678A
    //**** AHORA => 012345678A
    //*****************************************************************
    //
    // === CODIGO ANTIGUO NIF 9 chars ===
    //
    //var sResultat = '';
    //if (sNombreId.length == 8 || sNombreId.length == 9 || sNombreId.length == 10)
    //{
    //    
    //    
    //    if(sNombreId.length == 9 || sNombreId.length == 10)
    //    {        
    //        sNombreId = sNombreId.substring(0, sNombreId.length - 1);
    //        sResultat = 'C';
    //    }
    // === FIN CODIGO ANTIGUO NIF 9 chars ===
    //
    // === CODIGO NUEVO NIF 10 chars ===
    var sResultat = '';
    if (sNombreId.length == 9 || sNombreId.length == 10)
    {
        if(sNombreId.length == 10)
        {        
            sNombreId = sNombreId.substring(0, sNombreId.length - 1);
            sResultat = 'C';
        }
    // === FIN CODIGO NUEVO NIF 10 chars ===
    //*****************************************************************
        var sTipus = sNombreId.substring(0, 1);
        switch(sTipus.toUpperCase())
        {
            case 'X':
                sResultat = EsSencer(sNombreId.substring(1, sNombreId.length)) ? sResultat + 'X' : '';
                break;
            case 'Y':
                sResultat = EsSencer(sNombreId.substring(1, sNombreId.length)) ? sResultat + 'Y' : '';
                break;
            default:
                if(EsSencer(sTipus))
                {
                    if(EsSencer(sNombreId))
                    {
                        sResultat = sResultat + 'E';
                    }
                    else
                    {
                        sResultat = '';
                    }
                }
                else
                    sResultat = '';
                break;
        }
        
        /* NIE también con 'Y'
        if(sTipus.toUpperCase() == 'X')
        {
            sResultat = EsSencer(sNombreId.substring(1, sNombreId.length)) ? sResultat + 'X' : '';
        }
        else
        {
            if(EsSencer(sTipus))
            {
                if(EsSencer(sNombreId))
                {
                    sResultat = sResultat + 'E';
                }
                else
                {
                    sResultat = '';
                }
            }
            else
                sResultat = '';
		 }*/
    }
    return sResultat;
}// ComprovarFormatNombreId

// EsSencer
function EsSencer(sNombre)
{
    sNombre = trim(sNombre);

    if(isNaN(sNombre)) 
        return false;    
    
    //if(sNombre.substring(0, 1) == '0' && sNombre.length > 1) 
    //    sNombre = sNombre.substring(1, sNombre.length);
    sNombre = TreureCerosTamanyMinim(sNombre, 1);
    
    var sAux = sNombre + '';
    
    sNombre = parseInt(sNombre) + '';

    if(sNombre != sAux)
        return false;
    else
        return true;
}// EsSencer

//Treu els ceros de l'esquerra d'un string (sNombre) sense fer que la llargada sigui més petita que la llargada mínima (iMinim) 
function TreureCerosTamanyMinim(sNombre, iMinim)
{
    var iLong = sNombre.length;
    
    for(i = 0; i < iLong - 1; i++)
    {
        if(sNombre.length <= iMinim)
            return sNombre;
        
        if(sNombre.substring(0, 1) == '0') 
            sNombre = sNombre.substring(1, sNombre.length);
        else
            return sNombre;
    }
    return sNombre;
}

function TrobarLletra(nNombreId)
{
    /* ojo => no fuinciona para nies que empiezan por Y */
    var sCadenaLletra = "TRWAGMYFPDXBNJZSQVHLCKE";
    var nPosicio = nNombreId % 23;
    return sCadenaLletra.substring(nPosicio, nPosicio + 1);
}

function ltrim(s) 
{   
    return s.replace(/^\s+/, "");
}

function rtrim(s) 
{   
    return s.replace(/\s+$/, "");
}

function trim(s) 
{   
    return rtrim(ltrim(s));
}

