/*global SISAL, Dialog*/

/**
 * La variabile rappresenta il namespace utilizzato per tutto il codice
 * javascript di giochi numerici.
 */
SISAL.GNTN.CODICEFISCALE = (function CODICEFISCALE() {

    function CalcolaCodiceFiscale(formCF)
    {
	
        //alert ("calcolaCodiceFiscale " + formCF.name);	

        var gs = 0,
        i = 0,
        somma = 0,
        Sesso = null,
        estero = false,
        strCodFis = "",
        strcognome = "",
        strnome = "",
        strgiornosex = "",
        chrcontrollo = "",
        Nome = "",
        Cognome = "",
        SessoM = "",
        SessoF = "",
        Nazionenascita = "",
        provincia = "",
        Comune = "",
        ComuneAppoggio = "",
        DataDiNascita = "",
        messaggio = "",
        espressione = "",
        mesi = "",
        mesiCod = "",
        Mese = "",
        Giorno = "",
        AnnoCento = "",
        AnnoDieci = "",
        AnnoZero = "",
        lunghezzaCognome = "",
        lunghezzaNome = "",
        codicefiscale = ""
        ;

        Nome = formCF.nome.value.toUpperCase();
        Cognome	= formCF.cognome.value.toUpperCase();
        SessoM = formCF.sesso_m.checked;
        SessoF = formCF.sesso_f.checked;

        //alert ("SessoM => " + SessoM);
        //alert ("SessoF => " + SessoF);


        if (SessoM === true)
        {
            Sesso = "0";
        }	
        else if (SessoF === true)
        {
            Sesso = "1";
        }

        //alert ("Sesso => " + Sesso);

        Nazionenascita = formCF.nazionenascita.value.toUpperCase();

        if (Nazionenascita === "Z000")
        {
            provincia     = formCF.provincianascita.value.toUpperCase();
            Comune        = formCF.comunenascita.value.toUpperCase();
            ComuneAppoggio = formCF.comunenascita.value.toUpperCase();
            estero = false;
        }	
        else if (Nazionenascita !== "Z000")	
        {
            //alert ("ESTERO");
            Comune = Nazionenascita;
            ComuneAppoggio = formCF.comunenascitaestero.value.toUpperCase();
            provincia        = formCF.provinciaesteranascita.value.toUpperCase();
            estero = true;
        }

        //alert ("Comune = " + Comune);

        DataDiNascita = formCF.datadinascita.value.toUpperCase();
        /*giornoDiNascita = = formCF.giornoNascitaParam.value;
	meseDiNascita = = formCF.meseNascitaParam.value;
	annoDiNascita = = formCF.annoNascitaParam.value;*/


        formCF.nome.style.backgroundColor = "";
        formCF.cognome.style.backgroundColor = "";
        formCF.comunenascita.style.backgroundColor = "";
        formCF.datadinascita.style.backgroundColor = "";

        if (Nome === "")
        {
            //alert ("Nome non valorizzato impossibile generare codice fiscale");
            messaggio = 'Hai dimenticato di inserire il nome. Non è possibile generare il codice fiscale.';
            SISAL.FX.showOnElement_TemplatePopup('body', 'mp.alert.buttonok.html', {"{title}" : "Attenzione", "{content}" : messaggio, "{buttonclick}" : '<hideThis>', "{buttontext}" : 'OK', width : '350px'});                

            formCF.nome.style.backgroundColor = "#cb0000";
            formCF.nome.focus();
            return;
        }
        else if (Cognome === "")
        {
            messaggio = 'Hai dimenticato di inserire il cognome. Non è possibile generare il codice fiscale.';
            SISAL.FX.showOnElement_TemplatePopup('body', 'mp.alert.buttonok.html', {"{title}" : "Attenzione", "{content}" : messaggio, "{buttonclick}" : '<hideThis>', "{buttontext}" : 'OK', width : '350px'});                
            // alert ("Cognome non valorizzato impossibile generare codice fiscale");
            formCF.cognome.style.backgroundColor = "#cb0000";
            formCF.cognome.focus();
            return;
        }

        if (DataDiNascita === "")
        {
            messaggio = 'Hai dimenticato di inserire la data di nascita. Non è possibile generare il codice fiscale.';
                SISAL.FX.showOnElement_TemplatePopup('body', 'mp.alert.buttonok.html', {"{title}" : "Attenzione", "{content}" : messaggio, "{buttonclick}" : '<hideThis>', "{buttontext}" : 'OK', width : '350px'});                
            //alert ("Data Di Nascita non valorizzata impossibile generare codice fiscale");
            //formCF.dataDiNascita.style.backgroundColor = "#cb0000";
            formCF.giornoNascitaParam.style.backgroundColor = "#cb0000";
            formCF.meseNascitaParam.style.backgroundColor = "#cb0000";
            formCF.annoNascitaParam.style.backgroundColor = "#cb0000";

            //formCF.dataDiNascita.focus();
            return;
        }
        else
        {
            espressione = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;

            //alert ("espressione = " + espressione);
            //alert ("DataDiNascita = " + DataDiNascita);
            //alert ("test = " + espressione.test(DataDiNascita));

            if (!espressione.test(DataDiNascita))
            {
                messaggio = 'La data di nascita che hai inserito non è corretta.';
                SISAL.FX.showOnElement_TemplatePopup('body', 'mp.alert.buttonok.html', {"{title}" : "Attenzione", "{content}" : messaggio, "{buttonclick}" : '<hideThis>', "{buttontext}" : 'OK', width : '350px'});                
                formCF.giornoNascitaParam.style.backgroundColor = "#cb0000";
                formCF.meseNascitaParam.style.backgroundColor = "#cb0000";
                formCF.annoNascitaParam.style.backgroundColor = "#cb0000";
                return; 
            }
            else
            {
                formCF.giornoNascitaParam.style.backgroundColor = "";
                formCF.meseNascitaParam.style.backgroundColor = "";
                formCF.annoNascitaParam.style.backgroundColor = "";
            }	

        }



        

        if (provincia === "")
        {
            messaggio = 'Hai dimenticato di inserire la provincia di nascita. Non è possibile generare il codice fiscale.';
            SISAL.FX.showOnElement_TemplatePopup('body', 'mp.alert.buttonok.html', {"{title}" : "Attenzione", "{content}" : messaggio, "{buttonclick}" : '<hideThis>', "{buttontext}" : 'OK', width : '350px'});                
            //alert ("Comune non valorizzato impossibile generare codice fiscale");
            if (estero)
            {
                formCF.provinciaesteranascita.style.backgroundColor = "#cb0000";
                formCF.provinciaesteranascita.focus();
            }
            else
            {
                formCF.provincianascita.style.backgroundColor = "#cb0000";
                formCF.provincianascita.focus();
            }			
            return;
        }
        else if (ComuneAppoggio === "")
        {
            //messaggio = 'Comune di nascita non valorizzato impossibile generare codice fiscale.';
            messaggio = 'Hai dimenticato di inserire il comune di nascita. Non è possibile generare il codice fiscale.';
            SISAL.FX.showOnElement_TemplatePopup('body', 'mp.alert.buttonok.html', {"{title}" : "Attenzione", "{content}" : messaggio, "{buttonclick}" : '<hideThis>', "{buttontext}" : 'OK', width : '350px'});                
            //alert ("Comune non valorizzato impossibile generare codice fiscale");
            if (estero)
            {
                formCF.comunenascitaestero.style.backgroundColor = "#cb0000";
                formCF.comunenascitaestero.focus();
            }
            else
            {
                formCF.comunenascita.style.backgroundColor = "#cb0000";
                formCF.comunenascita.focus();
            }			
            return;
        }

//      DECODIFICA MESE //

        mesi    = []; 
        mesiCod = []; 
        Mese    = DataDiNascita.substr(3, 2);
        Mese    = parseFloat(Mese);
        Giorno  = DataDiNascita.substr(0, 2);
        Giorno  = parseFloat(Giorno);


        mesi [0] = "01";
        mesi [1] = "02";
        mesi [2] = "03";
        mesi [3] = "04";
        mesi [4] = "05";
        mesi [5] = "06";
        mesi [6] = "07";
        mesi [7] = "08";
        mesi [8] = "09";
        mesi [9] = "10";
        mesi [10] = "11";
        mesi [11] = "12";

        mesiCod [0] = "A";
        mesiCod [1] = "B";
        mesiCod [2] = "C"; 
        mesiCod [3] = "D";
        mesiCod [4] = "E";
        mesiCod [5] = "H"; 
        mesiCod [6] = "L";
        mesiCod [7] = "M";
        mesiCod [8] = "P"; 
        mesiCod [9] = "R";
        mesiCod [10] = "S";
        mesiCod [11] = "T"; 


        i = 0;

        //inizio blocco di istruzioni
        while (i < mesi.length) 
        {
            if ((mesi[i] * 1) === Mese)
            {
                Mese = mesiCod[i];
                break;
            }	

            i = i + 1; //aumento l'indice di 1
        } 

//      DATA DI NASCITA

        AnnoCento = DataDiNascita.substr(6, 2);
        AnnoCento = parseFloat(AnnoCento);
        AnnoDieci = DataDiNascita.substr(8, 1);
        AnnoDieci = parseFloat(AnnoDieci);
        AnnoZero  = DataDiNascita.substr(9, 1);
        AnnoDieci = parseFloat(AnnoDieci);

        /*
alert ("giorno = " + Giorno);
alert ("AnnoCento = " + AnnoCento);
alert ("AnnoDieci = " + AnnoDieci);
alert ("AnnoZero = " + AnnoZero);
alert ("Mese = " + Mese);
alert ("Comune = " + Comune);
alert ("Sesso = " + Sesso);
alert ("Cognome = " + Cognome);
alert ("nome = " + Nome);
         */


        lunghezzaCognome = Cognome.length;
        lunghezzaNome = Nome.length;


        if (Cognome !== "" && Nome !== "")
        {

            // Processa il cognome
            //----------------------------------------------------------------
            for (i = 0; i < lunghezzaCognome; i = i + 1) 
            {

                //alert ("i = " + i);
                //alert ("cognome charAt = " + Cognome.charAt(i));

                switch (Cognome.charAt(i)) 
                {
                case 'A':
                case 'E':
                case 'I':
                case 'O':
                case 'U': 
                    break;            
                default : 
                    if ((Cognome.charAt(i) <= 'Z') && (Cognome.charAt(i) > 'A'))
                    {
                        strcognome = strcognome + Cognome.charAt(i);
                    }    
                }
            }

            //alert ("strcognome.length  = " + strcognome.length );

            if (strcognome.length < 3) 
            {
                for (i = 0; i < lunghezzaCognome; i = i + 1) 
                {
                    switch (Cognome.charAt(i)) 
                    {
                    case 'A':
                    case 'E':
                    case 'I':
                    case 'O':
                    case 'U': 
                        strcognome = strcognome + Cognome.charAt(i);
                    }
                }
                if (strcognome.length < 3) 
                {
                    for (i = strcognome.length; i <= 3; i = i + 1) 
                    { 
                        strcognome = strcognome + 'X'; 
                    }
                }
            }
            strcognome = strcognome.substring(0, 3);

            //------------------------------------------------------------ 



            // processa il nome
            //----------------------------------------------------------------
            for (i = 0; i < lunghezzaNome; i = i + 1) 
            {

                //alert ("i = " + i);
                //alert ("Nome.charAt(i) ) " + Nome.charAt(i));

                switch (Nome.charAt(i)) 
                {
                case 'A':
                case 'E':
                case 'I':
                case 'O':
                case 'U': 
                    break;
                default:
                    if ((Nome.charAt(i) <= 'Z') && (Nome.charAt(i) > 'A'))
                    {
                        strnome = strnome + Nome.charAt(i);
                    }    
                }
            }

            if (strnome.length > 3) 
            {
                strnome = strnome.substring(0, 1) + strnome.substring(2, 4);
            } 
            else {
                if (strnome.length < 3) 
                {
                    for (i = 0; i < lunghezzaNome; i = i + 1) 
                    {
                        switch (Nome.charAt(i)) 
                        {
                        case 'A':
                        case 'E':
                        case 'I':
                        case 'O':
                        case 'U': 
                            strnome = strnome + Nome.charAt(i);
                        }
                    }
                    if (strnome.length < 3) 
                    {
                        for (i = strnome.length; i <= 3; i = i + 1) 
                        { 
                            strnome = strnome + 'X';
                        }
                    }
                }
                strnome = strnome.substring(0, 3);
            }
            //--------------------------------------- Fine processa nome




            // processa giorno e sesso
            //--------------------------------------------
            gs = Giorno + (40 * Sesso);

            if (gs < 10)
            {
                strgiornosex = "0" + gs;
            }
            else
            {
                strgiornosex =  gs;
            }

            //--------------------------------------------

            strCodFis = strcognome + strnome + AnnoDieci + AnnoZero + Mese + strgiornosex + Comune;
            
            /*alert("strcognome = > " + strcognome);
            alert("strnome = > " + strnome);
            alert("AnnoDieci = > " + AnnoDieci);
            alert("AnnoZero = > " + AnnoZero);
            alert("Mese = > " + Mese);
            alert("strgiornosex = > " + strgiornosex);
            alert("Comune = > " + Comune);
            alert("strCodFis = > " + strCodFis);*/
            

            // calcola la cifra di controllo
            //--------------------------------------------
            for (i = 0; i < 15; i = i + 1) 
            {
                if (((i + 1) % 2) !== 0) //caratteri dispari
                {
                    switch (strCodFis.charAt(i)) 
                    {
                    case '0':
                    case 'A': 
                        somma += 1;
                        break;
                    case '1':
                    case 'B': 
                        somma += 0;
                        break;
                    case '2':
                    case 'C': 
                        somma += 5;
                        break;
                    case '3':
                    case 'D': 
                        somma += 7;
                        break;
                    case '4':
                    case 'E': 
                        somma += 9;
                        break;
                    case '5':
                    case 'F': 
                        somma += 13;
                        break;
                    case '6':
                    case 'G': 
                        somma += 15;
                        break;
                    case '7':
                    case 'H': 
                        somma += 17;
                        break;
                    case '8':
                    case 'I': 
                        somma += 19;
                        break;
                    case '9':
                    case 'J': 
                        somma += 21;
                        break;
                    case 'K': 
                        somma += 2;
                        break;
                    case 'L': 
                        somma += 4;
                        break;
                    case 'M': 
                        somma += 18;
                        break;
                    case 'N': 
                        somma += 20;
                        break;
                    case 'O': 
                        somma += 11;
                        break;
                    case 'P': 
                        somma += 3;
                        break;
                    case 'Q': 
                        somma += 6;
                        break;
                    case 'R': 
                        somma += 8;
                        break;
                    case 'S': 
                        somma += 12;
                        break;
                    case 'T': 
                        somma += 14;
                        break;
                    case 'U': 
                        somma += 16;
                        break;
                    case 'V': 
                        somma += 10;
                        break;
                    case 'W': 
                        somma += 22;
                        break;
                    case 'X': 
                        somma += 25;
                        break;
                    case 'Y': 
                        somma += 24;
                        break;
                    case 'Z': 
                        somma += 23;
                        break;
                    }
                } 
                else //caratteri pari
                {
                    switch (strCodFis.charAt(i)) 
                    {
                    case '0':
                    case 'A':
                        somma += 0;
                        break;
                    case '1':
                    case 'B':
                        somma += 1;
                        break;
                    case '2':
                    case 'C':
                        somma += 2;
                        break;
                    case '3':
                    case 'D':
                        somma += 3;
                        break;
                    case '4':
                    case 'E':
                        somma += 4;
                        break;
                    case '5':
                    case 'F':
                        somma += 5;
                        break;
                    case '6':
                    case 'G':
                        somma += 6;
                        break;
                    case '7':
                    case 'H':
                        somma += 7;
                        break;
                    case '8':
                    case 'I':
                        somma += 8;
                        break;
                    case '9':
                    case 'J':
                        somma += 9;
                        break;
                    case 'K':
                        somma += 10;
                        break;
                    case 'L':
                        somma += 11;
                        break;
                    case 'M':
                        somma += 12;
                        break;
                    case 'N':
                        somma += 13;
                        break;
                    case 'O':
                        somma += 14;
                        break;
                    case 'P':
                        somma += 15;
                        break;
                    case 'Q':
                        somma += 16;
                        break;
                    case 'R':
                        somma += 17;
                        break;
                    case 'S':
                        somma += 18;
                        break;
                    case 'T':
                        somma += 19;
                        break;
                    case 'U':
                        somma += 20;
                        break;
                    case 'V':
                        somma += 21;
                        break;
                    case 'W':
                        somma += 22;
                        break;
                    case 'X':
                        somma += 23;
                        break;
                    case 'Y':
                        somma += 24;
                        break;
                    case 'Z':
                        somma += 25;
                        break;
                    }
                }
            }
            somma %= 26;
            switch (somma) 
            {
            case 0:
                chrcontrollo = 'A';
                break;
            case 1:
                chrcontrollo = 'B';
                break;
            case 2:
                chrcontrollo = 'C';
                break;
            case 3:
                chrcontrollo = 'D';
                break;
            case 4:
                chrcontrollo = 'E';
                break;
            case 5:
                chrcontrollo = 'F';
                break;
            case 6:
                chrcontrollo = 'G';
                break;
            case 7:
                chrcontrollo = 'H';
                break;
            case 8:
                chrcontrollo = 'I';
                break;
            case 9:
                chrcontrollo = 'J';
                break;
            case 10:
                chrcontrollo = 'K';
                break;
            case 11:
                chrcontrollo = 'L';
                break;
            case 12:
                chrcontrollo = 'M';
                break;
            case 13:
                chrcontrollo = 'N';
                break;
            case 14:
                chrcontrollo = 'O';
                break;
            case 15:
                chrcontrollo = 'P';
                break;
            case 16:
                chrcontrollo = 'Q';
                break;
            case 17:
                chrcontrollo = 'R';
                break;
            case 18:
                chrcontrollo = 'S';
                break;
            case 19:
                chrcontrollo = 'T';
                break;
            case 20:
                chrcontrollo = 'U';
                break;
            case 21:
                chrcontrollo = 'V';
                break;
            case 22:
                chrcontrollo = 'W';
                break;
            case 23:
                chrcontrollo = 'X';
                break;
            case 24:
                chrcontrollo = 'Y';
                break;
            case 25:
                chrcontrollo = 'Z';
                break;
            }
            //--------------------------------------------

            codicefiscale = strCodFis + chrcontrollo;

//          alert ("codice fiscale finale = " + codicefiscale);

//          formCF.codicefiscale.value = codicefiscale;

        }
        return codicefiscale; 
    }

    return {
        CalcolaCodiceFiscale : CalcolaCodiceFiscale

    };
}());

if (SISAL.logger.isInfoEnabled()) {
    SISAL.logger.info("SISAL.GNTN.CODICEFISCALE - namespace creato");
}

