stud = null;
materie = new Array();
order = null;
cal = null;
ins_avanzate = true;
box_importazione = false;

function materia (codice, nome, data, voto, lode, cfu ){
    this.codice = codice;
    this.nome = nome;
    this.data = data;
    this.voto = voto;
    this.lode = lode;
    this.cfu = isNaN(parseFloat(cfu)) ? 0 : parseFloat(cfu);

    this.toString = function(){
        return this.codice+"\t"+this.nome+"\t"+this.data+"\t"+this.voto+" / 30"+(lode?" e Lode":"")+"\t"+this.cfu+"\t#@##@@##@";
    }
}

function studente (nome, cognome, matricola){
    this.nome = nome;
    this.cognome = cognome;
    this.matricola = matricola;
    this.media = 0;
    this.media_pesata = 0;
    this.materie = new Array();

    this.toString = function(){
        return this.cognome+" "+this.nome+" "+this.matricola;
    }

    this.mostraCarriera = function (){
        var html = "<table><tr><td>Carriera dello Studente:</td></tr>";
        html +="<tr><td>"+this.toString()+"</td></tr>";
        html += "</table>";

        document.getElementById("box_carriera").innerHTML = html;
    }
}

function mostraCarriera(){
    var html = "<h2 class='titolo_centrato'>Lista Materie</h2>";
    html += "<table id='tabella_carriera' class='stats'>";
    //    var html = "<table id='tabella_carriera' class='stats'><tr><td colspan='5' >Carriera dello Studente:</td></tr>";
    //    //alert(this.nome+" "+this.cognome+" "+this.matricola);
    //    if(stud != null)
    //        html +="<tr><td>"+stud.toString()+"</td></tr>";

    if(ins_avanzate){
        html +="<tr><td class='hed'><a title='ordina per codice' href=\"javascript:orderBy('codice')\">Codice</a></td>";
    }
    html +="<td class='hed colonna_materia'><a title='ordina per nome materia' href=\"javascript:orderBy('materia')\">Materia</a></td>";
    if(ins_avanzate){
        html +="<td class='hed'><a title='ordina per data' href=\"javascript:orderBy('data')\">Data</a></td>";
    }
    html +="<td class='hed'><a title='ordina per cfu' href=\"javascript:orderBy('cfu')\">CFU</a></td>";
    html +="<td class='hed'><a title='ordina per voto' href=\"javascript:orderBy('voto')\">Voto</a></td><td class='colonna_bottoni left'></td></tr>";

    for(var i=0;i<materie.length;i++){
        if(ins_avanzate){
            var codice = materie[i].codice;
            if(codice == null || codice == -1){
                codice = "--";
            }
            html +="<tr><td>"+codice+"</td>";
        }
        html +="<td class='left colonna_materia'>"+materie[i].nome+"</td>";
        if(ins_avanzate){
            var data = materie[i].data;
            if(data == null || data == -1){
                data = "--";
            }
            html +="<td>"+data+"</td>";
        }
        var cfu = materie[i].cfu;
        if(cfu == 0 || isNaN(cfu) ){
            cfu = "--";
        }
        html +="<td>"+cfu+"</td>";

        var voto = materie[i].voto;
        if(materie[i].lode){
            voto+=" L";
        }
        html +="<td>"+voto+"</td>";

        html +="<td class='colonna_bottoni left'><input type='image' src='/files/16x16/pencil.png' onclick='editMateria("+i+");' class='image' title='modifica materia' /><input type='image' src='/files/16x16/cancel.png' onclick='removeMateria("+i+");' class='image' title='rimuovi materia' /></td></tr>";
    }
    html += "</table>";

    document.getElementById("box_carriera").innerHTML = html;


    if(materie.length>0){
        this.calcolaMedia();
        document.getElementById("titolo_statistiche").style.visibility = "visible";
        document.getElementById("box_carriera").style.visibility = "visible";
        document.getElementById("box_statistiche").style.visibility = "visible";
        document.getElementById("pref_materie").style.visibility = "visible";
        document.getElementById("elimina_materie").style.visibility = "visible";
    }
    else{
        document.getElementById("titolo_statistiche").style.visibility = "hidden";
        document.getElementById("box_carriera").style.visibility = "hidden";
        document.getElementById("box_statistiche").style.visibility = "hidden";
        document.getElementById("pref_materie").style.visibility = "hidden";
        document.getElementById("elimina_materie").style.visibility = "hidden";
    }

    createCookie("mat",getCarriera(),365);
}

function setStudente(){
    var nome = document.getElementById("nome").value;
    var cognome = document.getElementById("cognome").value;
    var matricola = document.getElementById("matricola").value;
	
    stud = new studente(nome,cognome,matricola);


    document.getElementById("nome").disabled = true;
    document.getElementById("cognome").disabled = true;
    document.getElementById("matricola").disabled = true;
    document.getElementById("bottone").disabled = true;
}

function addMateria(value){
    var controllo = new Array();
    var codice = document.getElementById("codice").value;
    var NomeMateria = document.getElementById("materia").value;
    var crediti = parseFloat(document.getElementById("crediti").value);
    var voto = parseInt(document.getElementById("voto").value);
    var lode = document.getElementById("lode").checked;
    var data = document.getElementById("data").value;

    if(codice == "")
        codice = -1;
    if(data == "")
        data = -1;
    controllo[0] = isAnumber(codice) || codice == null || codice == -1;
    controllo[1] = nomeValido(NomeMateria);
    controllo[2] = isAnumber(crediti) && crediti > 0;
    controllo[3] = votoValido(voto);
    controllo[4] = voto!=30 && lode ?  false : true;

    if(controllo[0] && controllo[1] && controllo[2] && controllo[3] && controllo[4]){
        if(value == -1)
            materie.push(new materia(codice,NomeMateria,data,voto,lode,crediti));
        else{
            materie[value].codice = codice;
            materie[value].nome = NomeMateria;
            materie[value].data = data;
            materie[value].voto = voto;
            materie[value].lode = lode;
            materie[value].cfu = crediti;
        }

        resetInserimento();
        mostraCarriera();
    }
    else{
        var messaggio = controllo[0] ? "" : "- il codice (se inserito) deve essere un numero!\n";
        messaggio += controllo[1] ? "" : "- inserire il nome della materia!\n";
        messaggio += controllo[2] ? "" : "- inserire un numero nel campo crediti!\n";
        messaggio += controllo[3] ? "" : "- il voto deve essere compreso tra 18 e 30!\n";
        messaggio += controllo[4] ? "" : "- la lode può essere inserita solo se il voto è 30!";
        alert(messaggio);
    }
}

function resetInserimento(){

    document.getElementById("codice").value = "";
    document.getElementById("materia").value = "";
    document.getElementById("data").value = "";
    document.getElementById("crediti").value = "";
    document.getElementById("voto").value = "";
    document.getElementById("lode").checked = false;

    var bottone_edit = document.getElementById("conferma_inserimento");
    bottone_edit.src="/files/16x16/plus.png";
    bottone_edit.title="inserisci materia";
    bottone_edit.onclick= function onclick() {
        addMateria(-1);
    }
}

function removeMateria(index){
    materie.splice(index,1);
    if(materie.length == 0){
        resetInserimento();
        eraseCookie("mat");
    }
    mostraCarriera();
}

function editMateria(index){
    if(materie[index].codice != -1){
        document.getElementById("codice").value = materie[index].codice;
    }
    else{
    	document.getElementById("codice").value = "";
    }
    document.getElementById("materia").value = materie[index].nome;
    if(materie[index].data != -1){
        document.getElementById("data").value = materie[index].data;
    }
    else{
    	document.getElementById("data").value = "";
    }
    document.getElementById("crediti").value = materie[index].cfu;
    document.getElementById("voto").value = materie[index].voto;
    document.getElementById("lode").checked = materie[index].lode;

    var bottone_edit = document.getElementById("conferma_inserimento");
    bottone_edit.src="/files/16x16/accept.png";
    bottone_edit.title="conferma modifica";
    bottone_edit.onclick= function onclick() {
        addMateria(index);
    }
    gotoAnchor("materie");
    document.getElementById("codice").focus();
}

function isAnumber(n){
    if(isNaN(n)|| n==undefined || n=="")
        return false;
    else
        return true;
}

function votoValido(v){
    if(v>=18 && v<=30)
        return true;
    else
        return false;
}

function nomeValido(n){
    if(n==undefined || n=="")
        return false;
    else
        return true;
}

function calcolaMedia(){
    document.getElementById("media_aritmetica").innerHTML = mediaAritmetica();
    document.getElementById("media_pesata").innerHTML = mediaPesata();
    document.getElementById("n_materie").innerHTML = materie.length;
    document.getElementById("n_lodi").innerHTML = numeroLodi();
    document.getElementById("base_laurea").innerHTML = baseLaurea();
	document.getElementById("tot_cfu").innerHTML = totCrediti();
}

function mediaAritmetica(){
    var voti = 0;
    var n_materie = 0;
    for(var i=0;i<materie.length;i++){
        if(materie[i].voto != -1 && materie[i].voto != 0 && materie[i].cfu != 0 && isAnumber(materie[i].cfu)){
            voti += materie[i].voto;
            n_materie ++;
        }
    }
    return round(voti/n_materie,2);
}
function mediaPesata(){
    var numeratore = 0;
    var denominatore = 0;
    for(var i=0;i<materie.length;i++){
        if(materie[i].voto != -1 && materie[i].voto != 0 && isAnumber(materie[i].cfu)){
            numeratore += materie[i].voto*materie[i].cfu;
            denominatore += materie[i].cfu;
        }
    }
    return round(numeratore/denominatore,2);
}

function numeroLodi(){
    var lodi = 0;
    for(var i=0;i<materie.length;i++){
        if(materie[i].lode)
            lodi ++;
    }
    return lodi;
}

function totCrediti(){
	var totCFU = 0;
	for(var i=0;i<materie.length;i++){
		totCFU += materie[i].cfu;
	}
	return totCFU;
}

function baseLaurea(){
    return round(mediaPesata()*110/30,2);
}

function stampaMaterie(){
    var stringa ="";
    for(var i=0;i<materie.length;i++)
        stringa += materie.toString()+"\n";
    alert(stringa);
}

function round(valore, posizioniDecimali)
{
    var ris = valore * Math.pow(10,posizioniDecimali);
    ris = Math.round(ris);
    return ris / Math.pow(10,posizioniDecimali);
}

function orderBy(valore){
    resetInserimento();
    for(var i=0;i<materie.length-1;i++)
        for(var j=materie.length-1;j>i;j--){
            if(valore != order){
                if(valore == "codice" && materie[j].codice<materie[j-1].codice)
                    swap(j,j-1);
                else if(valore == "materia" && materie[j].nome.toLowerCase()<materie[j-1].nome.toLowerCase())
                    swap(j,j-1);
                else if(valore == "data" && !compareDate(materie[j].data,materie[j-1].data))
                    swap(j,j-1);
                else if(valore == "voto" && (materie[j].lode ? 31 : materie[j].voto)<(materie[j-1].lode ? 31 : materie[j-1].voto))
                    swap(j,j-1);
                else if(valore == "cfu" && materie[j].cfu<materie[j-1].cfu)
                    swap(j,j-1);
            }
            else{
                if(valore == "codice" && materie[j].codice>materie[j-1].codice)
                    swap(j,j-1);
                else if(valore == "materia" && materie[j].nome.toLowerCase()>materie[j-1].nome.toLowerCase())
                    swap(j,j-1);
                else if(valore == "data" && compareDate(materie[j].data,materie[j-1].data))
                    swap(j,j-1);
                else if(valore == "voto" && (materie[j].lode ? 31 : materie[j].voto)>(materie[j-1].lode ? 31 : materie[j-1].voto))
                    swap(j,j-1);
                else if(valore == "cfu" && materie[j].cfu>materie[j-1].cfu)
                    swap(j,j-1);
            }
        }
    if(valore != order)
        order = valore;
    else
        order = null;
    mostraCarriera();
}

function swap(e1,e2){
    var tmp=materie[e1];
    materie[e1]=materie[e2];
    materie[e2]=tmp;
}

function compareDate(data1,data2){
    var d1 = new Date();
    var d2 = new Date();
    if(data1!=null && data1!=-1){
        data1=data1.split("/");
        d1.setFullYear(data1[2], data1[1]-1, data1[0]);
    }
    if(data2!=null && data2!=-1){
        data2=data2.split("/");
        d2.setFullYear(data2[2], data2[1]-1, data2[0]);
    }

    if(d1 > d2)
        return true;
    else
        return false;
}

function handleEnter (event) {
    var keyCode = event.keyCode;
    if (keyCode == 13) {
        document.getElementById("conferma_inserimento").click();
    }
}

function createCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}

function getCarriera(){
    var stringa = "";
    for(var i=0;i<materie.length;i++){
        var lode = "";
        if(materie[i].lode)
            lode = " e Lode";
        stringa += materie[i].codice+"\t"+materie[i].nome+"\t"+materie[i].data+"\t"+materie[i].voto+" / 30"+lode+"\t"+materie[i].cfu+"\t#@##@@##@";
    }
    return stringa;
}

function gotoAnchor(nameAnchor){
    window.location.hash=nameAnchor;
}

function cambiaDettagli(flag){
    if(flag != ins_avanzate){
        ins_avanzate = !ins_avanzate;
    }
    if(ins_avanzate){
        document.getElementById("pref_materie").src = "http://www.pablox.netsons.org/images/bottoni/DettagliOFF.png";
        createCookie("dettagli_materie","1",365);
    }
    else{
        document.getElementById("pref_materie").src = "http://www.pablox.netsons.org/images/bottoni/DettagliON.png";
        createCookie("dettagli_materie","0",365);
    }
    mostraCarriera();
}

function boxImportazione(flag){
    
    if(flag != box_importazione){
        box_importazione = !box_importazione;
    }
    if(box_importazione){
        document.getElementById("div_importazione").style.display = "block";
        document.getElementById("pref_importazione").src = "http://www.pablox.netsons.org/images/bottoni/ImportazioneOFF.png";
    }
    else{
        document.getElementById("div_importazione").style.display = "none";
        document.getElementById("pref_importazione").src = "http://www.pablox.netsons.org/images/bottoni/ImportazioneON.png";
    }
}

function eliminaMaterie(){
    if(window.confirm("Vuoi veramente eliminare tutti i dati della carriera inserita?")){
        materie = new Array();
        eraseCookie("mat");
        mostraCarriera();
    }
}

function startScript(){
    if(readCookie("dettagli_materie")=="1"){
        cambiaDettagli(true);
    }
    if(readCookie("dettagli_materie")=="0"){
        cambiaDettagli(false);
    }
    boxImportazione(false);
    mostraCarriera();
}

function pulisciData(){
    document.getElementById("data").value = "";
}