//=======================================================================================
// FUNZIONI PER IL CONTROLLO DELLA DATA
//=======================================================================================

function estraiDaData(miaData, elemento){
    //Il parametro 'elemento' puo' assumere i seguenti valori:
    //"g": giorno
    //"m": mese
    //"a": anno
    //La funzione estrae l'elemento desiderato dalla data 'strData' in formato stringa.
    //La funzione accetta la data nel formato: "gg/mm/aaaa" oppure "gg-mm-aaaa". 
    //I giorni e i mesi non devono essere necessariamente di due caratteri.
    //Ad esempio le date 8/12/2001 oppure 24/7/2001 sono corrette.
    //In caso di ERRORE la funzione ritorna una stringa vuota.

    //var miaData = new String(strData);
    var posPrimoDelimitatore;
    var posSecondoDelimitatore;
    var tipoDelimitatore;
    var parteMese;
    var parteGiorno;
    var parteAnno;

    //Accetta delimitatori "/" o "-"

    posPrimoDelimitatore = miaData.indexOf("/");

    if (posPrimoDelimitatore == -1) {
        //Controllo se e' presente l'altro delimitatore permeso
        posPrimoDelimitatore = miaData.indexOf("-");
        //Se non trovo nulla ritorno false
        if (posPrimoDelimitatore == -1) {
            return "";
        }
        tipoDelimitatore = "-";
    }
    else { 
        tipoDelimitatore = "/";
    }

    posSecondoDelimitatore = miaData.indexOf(tipoDelimitatore,(posPrimoDelimitatore + 1));
    
    if (posSecondoDelimitatore == -1)  return "";
    
    parteGiorno = miaData.substring(0, posPrimoDelimitatore);
    parteMese = miaData.substring((posPrimoDelimitatore + 1),(posSecondoDelimitatore));
    parteAnno = miaData.substring((posSecondoDelimitatore + 1),(miaData.length));

    if (elemento == "g") return parteGiorno;
    if (elemento == "m") return parteMese;
    if (elemento == "a") return parteAnno;
    else return "";
}

//=======================================================================================

function controllaData(strData) {
    //La funzione accetta una stringa contenente una data nel formato: gg/mm/aaaa oppure gg-mm-aaaa. 
    //I giorni e i mesi non devono essere necessariamente di due caratteri.
    //Ad esempio le date 8/12/2001 oppure 24/7/2001 sono corrette.
    //La funzione controlla che la data sia corretta, eseguendo anche il controllo sui giorni di febbraio
    //nel caso in cui l'anno sia bisestile.

    var parteGiorno = estraiDaData(strData,"g");
    var parteMese = estraiDaData(strData,"m");
    var parteAnno = estraiDaData(strData,"a");
 
    if(giornoValido(parteGiorno, parteMese, parteAnno) == false) return false;
    else return true;
}

//=======================================================================================

function giornoValido(g, m, a) {
    //La funzione accetta sia stringhe che numeri come parametri.
    
    //Controllo la correttezza dell'anno e del mese
    if(annoValido(a) == false) return false;
    if(meseValido(m) == false) return false;

    if((isNaN(g)) || String(g) == "") return false;

    var mese = parseInt(m, 10);
    var giorno = parseInt(g, 10);
    var anno = parseInt(a, 10);

    if (giorno < 1) return false;

    if ((mese == 4) || (mese == 6) || (mese == 9) || (mese == 11)) {
        //E' un mese di 30 giorni
        if (giorno > 30) return false;
    } else if(mese == 2) {
        // E' febraio (sia 28 che 29 dipendentemente dall'anno bisestile)
        if (annoBisestile(anno) == true) {
            //Gli anni bisestili hanno 29 giorni in febbraio
            if (giorno > 29) return false;
        } else {
            //Gli anni non bisestili hanno 28 giorni in febbraio
            if (giorno > 28) return false;
        }
    } else {
        // E' un mese di 31 giorni
        if (giorno > 31) return false;
    }

    return true;
}

//=======================================================================================

function meseValido(mese) {
    //La funzione controlla che il mese sia in un formato valido.
    //La funzione accetta come parametro sia una stringa che un numero (in questo caso 'mese' viene convertito 
    //automaticamente in stringa nella chiamata a isNaN(mese) e parseInt(mese, 10), che accettano come parametro 
    //una stringa).
    //ATTENZIONE: Il mese deve essere compreso fra 1 e 12 e non fra 0 e 11 come accade nelle date JavaScript!!

    if((isNaN(mese)) || String(mese) == "") return false;

    var intMese = parseInt(mese, 10);
    
    if((intMese < 1) || (intMese > 12)) return false; 
    else return true;
}

//=======================================================================================

function annoValido(anno) {
    //La funzione controlla che l'anno sia in un formato valido.
    //La funzione accetta come parametro sia una stringa che un numero (in questo caso 'anno' viene convertito 
    //automaticamente in stringa nella chiamata a isNaN(anno) e parseInt(anno, 10), che accettano come parametro 
    //una stringa).

    if((isNaN(anno)) || String(anno) == "") return false;

    var intAnno = parseInt(anno, 10);
    
    if((intAnno < 1000) || (intAnno > 9999)) return false;
    else return true;
}

//=======================================================================================

function annoBisestile(anno) {
    //La funzione controlla che l'anno sia bisestile.
    //La funzione accetta come parametro sia una stringa che un numero (in questo caso 'anno' viene convertito 
    //automaticamente in stringa nella chiamata a parseInt(anno, 10), che accetta come parametro una stringa).

    if(annoValido(anno) == false) return false;

    var intAnno = parseInt(anno, 10);

    if (((intAnno % 4 == 0) && (intAnno % 100 != 0)) || (intAnno % 400 == 0)) return true;
    else return false;
}

//=======================================================================================

function dataToStr(valData) {
    //Il parametro 'valData' deve essere in formato Date.
    //La funzione restituisce la data in formato stringa gg/mm/aaaa.

    var gg, mm, aaaa;

    mm = valData.getMonth();
    mm = parseInt(mm+1, 10);
    if (mm < 10) {
        mm = "0" + mm;
    }

    gg = valData.getDate();
    if (gg < 10) {
        gg = "0" + gg;
    }

    aaaa = valData.getYear();
    
    return gg + "/" + mm + "/" + aaaa;
}

//=======================================================================================

function strToData(strData) {
    //La funzione converte la data 'strData' in dormato Date.
    //La funzione accetta la data nel formato: "gg/mm/aaaa" oppure "gg-mm-aaaa". 
    //Le Ore, i Minuti, i Secondi e i Millisecondi vengono posti a 0.
    if (controllaData(strData) == false) return false; 

    var parteGiorno = estraiDaData(strData,"g");
    var parteMese = estraiDaData(strData,"m");
    var parteAnno = estraiDaData(strData,"a");

    return new Date(parseInt(parteAnno, 10),parseInt(parteMese-1, 10),parseInt(parteGiorno, 10),0,0,0,0);
}

//=======================================================================================

function diffGiorniDate(data1, data2) {
    //I parametri devono essere in formato Date.
    //La funzione restituisce il numero di giorni fra la data1 e la data2.
    //data2 e' considerata maggiore (piu' vecchia) di data1.

    var msecData1, msecData2, msecDiff;

    msecData1 = Date.UTC(data1.getYear(),data1.getMonth(),data1.getDate(),0,0,0);
    msecData2 = Date.UTC(data2.getYear(),data2.getMonth(),data2.getDate(),0,0,0);
    msecDiff = msecData2 - msecData1;

    return msecDiff / 86400000;
}

//=======================================================================================

function aggiungiGiorni(strData, giorni, compreso) {
    if (controllaData(strData) == false) return false; 
    
    // if ((isNaN(giorni)) || giorni == "") return false;
    //Nel caso precedente se 'giorni' e' 0 (numerico) viene restituito false perche' la stringa 
    //vuota "" viene considerata come 0 !!!!
    if ((isNaN(giorni)) || String(giorni) == "") return false;

    var intGiorni = parseInt(giorni, 10);

    var parteGiorno = estraiDaData(strData,"g");
    var parteMese = estraiDaData(strData,"m");
    var parteAnno = estraiDaData(strData,"a");
    var nuovadata;

    if (compreso == true) {
        intGiorni = intGiorni - 1;
        if (intGiorni < 0) intGiorni = 0;
    }

    intGiorni = intGiorni + parseInt(parteGiorno, 10);

    nuovadata = new Date(parseInt(parteAnno, 10),parseInt(parteMese-1, 10),intGiorni,0,0,0,0);

    return dataToStr(nuovadata);
}

//=======================================================================================

function correggiInPositivo(strData) {
    
    var parteGiorno = estraiDaData(strData,"g");
    var parteMese = estraiDaData(strData,"m");
    var parteAnno = estraiDaData(strData,"a");
    var nuovadata;
    
    if (controllaData(strData) == false)
    {
        nuovadata = new Date(parseInt(parteAnno, 10),parseInt(parteMese, 10),0,0,0,0,0);
        while (!controllaData(dataToStr(nuovadata)))
        {
            nuovadata = new Date(parseInt(parteAnno, 10),parseInt(parteMese, 10),1,0,0,0,0);
            //alert(dataToStr(nuovadata))
        }
    }
    return dataToStr(nuovadata);
}

//=======================================================================================

function correggiInNegativo(strData) {
    
    var parteGiorno = estraiDaData(strData,"g");
    var parteMese = estraiDaData(strData,"m");
    var parteAnno = estraiDaData(strData,"a");
    var nuovadata;
    
    if (controllaData(strData) == false)
    {

        nuovadata = new Date(parseInt(parteAnno, 10),parseInt(parteMese, 10),0,0,0,0,0);
        while (!controllaData(dataToStr(nuovadata)))
        {
            nuovadata = new Date(parseInt(parteAnno, 10),parseInt(parteMese, 10),-1,0,0,0,0);
            //alert(dataToStr(nuovadata))
        }
        
    }
    return dataToStr(nuovadata);
}