﻿//
//  bio.js - javascript calcolo dei bioritmi
//           css creazione del grafico
//  
//  Author:  Sabrina Cufaro [sabrina.cufaro@produzioneinformatica.com]
//

// Rimuove i dati
function cancella() {
    document.getElementById("grafico").innerHTML = "&nbsp;";
    document.getElementById("risultato").innerHTML = "&nbsp;";
    return true;
}

// Determina se l'anno è bisestile
function bisestile(anno) {
if((anno%4 == 0 && anno%100 !=0) || anno%400 == 0)
    return true;    // bisestile
return false;
}

// Controlla le date inserite
function checkDati() {
    
    var frm = document.getElementById("form1");
    var gn = frm.giorno1.options[frm.giorno1.selectedIndex].value;
    var mn = frm.mese1.options[frm.mese1.selectedIndex].value;
    var an = frm.anno1.options[frm.anno1.selectedIndex].value;
    var gc = frm.giorno2.options[frm.giorno2.selectedIndex].value;
    var mc = frm.mese2.options[frm.mese2.selectedIndex].value;
    var ac = frm.anno2.options[frm.anno2.selectedIndex].value;

    // I mesi vengono contati a partire da 0
    mn = 1 + parseInt(mn);
    mc = 1 + parseInt(mc);    
    
    // controlli sulla data di nascita
    if (gn == 31 && (mn == 4 || mn == 6 || mn == 9 || mn == 11)) {
        alert("La data di nascita non e' corretta.");
        frm.giorno1.focus();
        return false;
    }
    if ((gn == 30 || gn == 31) && mn == 2) {
        alert("La data di nascita non e' corretta.");
        frm.giorno1.focus();
        return false;
    }
    if (gn == 29 && mn == 2) {
        if (!bisestile(an)) {
            alert("La data di nascita non e' corretta.");
            frm.giorno1.focus();
            return false;
        }
    }

    // controlli sulla data di calcolo
    if (gc == 31 && (mc == 4 || mc == 6 || mc == 9 || mc == 11)) {
        alert("La data per il calcolo non e' corretta.");
        frm.giorno2.focus();
        return false;
    }
    if ((gc == 30 || gc == 31) && mc == 2) {
        alert("La data per il calcolo non e' corretta.");
        frm.giorno2.focus();
        return false;
    }    
    if (gc == 29 && mc == 2) {
        if (!bisestile(ac)){
            alert("La data per il calcolo non e' corretta.");
            frm.giorno2.focus();
            return false;
        }
    }

    // comparazione tra le due date inserite
    if (an > ac || (an == ac && ((mn > mc) || (mn == mc && gn > gc)))) {
        alert("La data per il calcolo deve essere superiore alla data di nascita.");
        frm.giorno2.focus();
        return false;
    }   
    return true;
}

function arrotonda(num, dec) {
    var div = Math.pow(10, dec);
    return Math.round(num * div) / div;
}

// Ordina l'array del bioritmo
function ordina(arr) {    
	var max;
	var colore;
	n = arr.length;
    for (var i = 0; i < n; i++) {
		for (var j = i + 1; j < n; j++){
			if (arr[j][0] > arr[i][0]) {
				max = arr[j][0];
				arr[j][0] = arr[i][0];
				arr[i][0] = max;
				colore = arr[j][1];
				arr[j][1] = arr[i][1];
				arr[i][1] = colore;
            }           
		}
	}
    return arr;
}

// VARIABILI GLOBALI PER IL GRAFICO
// colori per il grafico
var coloreF =  "Green";   // Fisico      
var coloreE = "Red";   // Emotivo
var coloreI = "Blue";  // Intellettivo
var coloreC = "Black";
var sfondo;                     // colore di background del grafico
var coloreRighe = "#c0c0c0";    // colore delle righe verticali del grafico 
var intervalloGG = 15;          // gg (nel grafico)a dx e a sx della data inserita
var dim = "1px";                // dimensione dei punti sul grafico



// Calcola i bioritmi
function dati(arr, gg) {
    arr[0][0] = (100 * (Math.sin(6.283185307 * (gg / 23))));   // FISICO    
    arr[0][1] = coloreF;

    arr[1][0] = (100 * (Math.sin(6.283185307 * (gg / 28))));  // EMOTIVO    
    arr[1][1] = coloreE;

    arr[2][0] = (100 * (Math.sin(6.283185307 * (gg / 33))));  // INTELLETTIVO    
    arr[2][1] = coloreI;

    arr[3][0] = 0;
    arr[3][1] = coloreC;

    return arr;
}

function esito(arr) {
    var risultato = "";
    for (i = 0; i < arr.length; i++) {
        if (arr[i][1] == coloreF) risultato = risultato + "<span style='font-size:8px; margin-right:3px; background-color:" + coloreF + ";'>&nbsp;&nbsp;&nbsp;</span><span style=color:" + coloreF + ">Fisico: " + arrotonda(arr[i][0], 0) + "%&nbsp;&nbsp;&nbsp;</span>";
        if (arr[i][1] == coloreI) risultato = risultato + "<span style='font-size:8px; margin-right:3px; background-color:" + coloreI + ";'>&nbsp;&nbsp;&nbsp;</span><span style=color:" + coloreI + ">Intellettivo: " + arrotonda(arr[i][0], 0) + "%&nbsp;&nbsp;&nbsp;</span>";
        if (arr[i][1] == coloreE) risultato = risultato + "<span style='font-size:8px; margin-right:3px; background-color:" + coloreE + ";'>&nbsp;&nbsp;&nbsp;</span><span style=color:" + coloreE + ">Emotivo: " + arrotonda(arr[i][0], 0) + "%&nbsp;&nbsp;&nbsp;</span>";
    }
    return risultato;
}


// Disegna il grafico dei bioritmi
function bior() {

    if (!checkDati()) return;

    sfondo = document.getElementById("Table1").style.backgroundColor;

    //i mesi vengono contati da 0
    var frm = document.getElementById("form1");
    var gn = frm.giorno1.options[frm.giorno1.selectedIndex].value;
    var mn = frm.mese1.options[frm.mese1.selectedIndex].value;
    var an = frm.anno1.options[frm.anno1.selectedIndex].value;
    var gc = frm.giorno2.options[frm.giorno2.selectedIndex].value;
    var mc = frm.mese2.options[frm.mese2.selectedIndex].value;
    var ac = frm.anno2.options[frm.anno2.selectedIndex].value;

    var compleanno = new Date(an, mn, gn, 0, 0, 0);
    var data = new Date(ac, mc, gc, 0, 0, 0);
    
    // giorni vissuti fino ad oggi
    var diff = ((data.valueOf() - compleanno.valueOf()) / 86400000);
    
    // intervallo dei giorni vissuti per calcolare i bioritmi
    var estremoInf = diff - intervalloGG;
    var estremoSup = diff + intervalloGG;   

    // data che si sta elaborando
    var dataElaborata = data;
    dataElaborata.setDate(data.getDate() - intervalloGG);    
    
    var grafo="";       // Conterrà il disegno del grafico
    var bio = new Array(4);
    bio[0] = new Array(2);
    bio[1] = new Array(2);
    bio[2] = new Array(2);
    bio[3] = new Array(2);
    
    for (count = 1, t = estremoInf; t < estremoSup; t++, count++) {
        // Calcola i bioritmi
        bio = dati(bio, t);        
        // Ordino l'array
        bio=ordina(bio);

        coloreRighe = "#c0c0c0";
        // linea per il giorno richiesto 
        if (t == diff) {
            coloreRighe = "#000000";            
            var risultato = esito(bio);
        }
        // Disegna i punti principali del grafico
        grafo += (ptPrincipali(bio, dataElaborata));
        dataElaborata.setDate(dataElaborata.getDate() + 1);
	      
        // elabora i punti parziali 
		for (parziale = (t + 0.066); parziale < t + 1; parziale += 0.066) {		    
			// Calcola i bioritmi
		    bio = dati(bio, parziale);
		    // Ordino l'array
		    bio = ordina(bio);

		    // Disegna i punti parziali del grafico
		    grafo += (ptParziali(bio));		    
        }
    }
    // Ultima linea
    
    grafo = grafo + " <ul id=ulfinale style='padding:0; margin:0; list-style:none; height:220px; width:" + dim + "; float:left; position:relative;'>";
    grafo = grafo + "<li class=finale style='position:absolute; height: 220px; width:" + dim + ";  bottom:0; " +
                       "background-color:" + coloreRighe + "; z-index: 10;'></li></ul><br />";
    
    document.getElementById("grafico").innerHTML = grafo; 
    document.getElementById("risultato").innerHTML = risultato;
    
    return true;    
}


// Disegna i punti principali del grafico
// usa le variabili globali : dim e coloreRighe 
function ptPrincipali(bio, dataElaborata) {
    // Apro <UL>
    grafo = "<ul style='padding:0; margin:0; list-style:none; height:220px; width:" + dim + "; float:left; position:relative;'>";

    // linee superiori del grafico 
    grafo = grafo + "<li style='position:absolute; height: 220px; width:" + dim + ";  bottom:0; " +
                       "background-color:" + coloreRighe + "; z-index: 0;'></li>";
    // Disegna i punti principali 
    for (i = 0, z = 1; i < bio.length; i++, z++) {
        grafo = grafo + "<li style='position:absolute; height:" + (bio[i][0] + 112) + "px; width:" + dim + ";  bottom:0; " +
                       "background-color:" + (bio[i][1]) + "; z-index:" + z + ";'></li>";

        grafo = grafo + "<li style='height:" + (bio[i][0] + 110) + "px; width:" + dim + "; position:absolute; bottom:0; " +
                       "background-color:" + coloreRighe + "; z-index:" + z + ";'></li>";
    }
    // Inserimento del giorno alla base del grafico        
    grafo = grafo + "<li style='position:absolute; height:10px; width:" + dim + ";  bottom:0; " +
                    "text-align:center; font-size:10px; color:#000000; background-color:" + coloreRighe + "; z-index:" + z + ";'>" + dataElaborata.getDate() + "</li></ul>";
    return grafo;
}

// Disegna i punti parziali del grafico
// usa le variabili globali : dim e sfondo
function ptParziali(bio) {
    // Apro <UL> 
    var grafo = " <ul style='padding:0; margin:0; list-style:none; height:220px; width:" + dim + "; float:left; position:relative;'>";
    
    // Disegna i punti parziali
    for (i = 0, z = 1; i < bio.length; i++, z++) {
        grafo = grafo + "<li style='position:absolute; height:" + (bio[i][0] + 112) + "px; width:" + dim + ";  bottom:0; " +
                       "background-color:" + (bio[i][1]) + "; z-index:" + z + ";'></li>";
        grafo = grafo + "<li style='height:" + (bio[i][0] + 110) + "px; width:" + dim + "; position:absolute; bottom:0; " +
                       "background-color:" + sfondo + "; z-index:" + z + ";' ></li>";
    }
    grafo = grafo + " </ul>";
    return grafo;
}
