// Copyright www.hitec.fr.
// AT, le 07/12/2008.

// Variables globales
							// id des paramètres :
var PLECH=0;						//   Pleine échelle du capteur
var HAUT=1;						//   Hauteur de la cuve
var VOLUME=2;						//   Volume de la cuve

var param_val  = new Array(3);				// Valeurs des paramètres

var nbPnt = 10;						// Nombre de points pour la linéarisation
var coma = 0;						// Position de la virgule en fonction du volume de la cuve
var ten_HN = new Array(0, 107, 395, 787, 1307, 2789, 3309, 3701, 3989, 4096);	//Hauteur normalisée sur 10 points ( / 4096)
var ten_VN = new Array(0,  23, 196, 544, 1120, 2976, 3552, 3900, 4073, 4096);	//Volume normalisé sur 10 points ( / 4096)

var SigMin = 4.00;
var SigMax = 20.00;

// cleanNum : Supprime les espaces et remplace les virgules par des points. Supprime les caracteres non numériques finaux.
// Renvoie NaN si ne commence pas par un chiffre.
function cleanNum(field)
{
	var chaine = field.replace(',','.');
	chaine = chaine.replace(' ','');
	return parseFloat(chaine);
}


// cylindre() : Calcule l'abaque et le tableau de résultats pour une cuve cylindrique en utilisant PE, hauteur, volume indiqués.
function cylindre()
{ 
	var tmp = 0.1 ;
	// Vérification des paramètres
	if (!testParams()) {
		alert ("Calculs impossibles, voir les parametres en rouge...");
		return 0; }

	// Paramètres ok...
	// Calcul de l'abaque hauteur (m) / volume (m3)
	for (var i=0;i<nbPnt;i++)
	{
		tmp = param_val[HAUT] * ten_HN[i] / 4096;
		document.getElementById("H" + i).value = tmp.toFixed(3);
		tmp = param_val[VOLUME] * ten_VN[i] / 4096;
		document.getElementById("V" + i).value = tmp.toPrecision(4);
	}
	
	calc();	
	return 1;
}

// calc() : Calcule les points à entrer dans l'afficheur (DSC / ISC) à partir des points de l'abaque.
function calc()
{
	// Vérification des paramètres
	if (!testParams()) {
		alert ("Calculs impossibles, voir les parametres en rouge...");
		return 0; }

	// Calcul des points de l'afficheur (ISC / DSC)
	for (var i=0;i<nbPnt;i++)
	{
		tmp = cleanNum(document.getElementById("V" + i).value);
		if ( !isNaN(tmp) ) {
		       	document.getElementById("DSC" + i).innerHTML = format4dig(tmp, coma);
			document.getElementById("V" + i).value = tmp; }
		else {
			document.getElementById("DSC" + i).innerHTML = "";
			document.getElementById("V" + i).value = ""; }
			
		tmp = SigMin + cleanNum(document.getElementById("H" + i).value) * (SigMax - SigMin) / param_val[PLECH];
		if ( !isNaN(tmp) ) {
		       	//document.getElementById("ISC" + i).innerHTML = tmp.toFixed(2);
		       	document.getElementById("ISC" + i).innerHTML = format4dig(tmp,2);
			document.getElementById("H" + i).value = cleanNum(document.getElementById("H" + i).value); }
		else {
			document.getElementById("ISC" + i).innerHTML = "";
			document.getElementById("H" + i).value = ""; }
	}
}

// createAbTable() : Crée le tableau contenant les points de l'abaque.
function createAbTable()
{
	var html_table = "<table>\n<tr class=\"main\"><td></td><td>Volume (m3 ou L)</td><td>Hauteur (m)</td></tr>";
	for (var i=0;i<nbPnt;i++)
	{
		html_table += "<tr><td class=\"main\">Point "+ i +"</td>  <td><input id=\"V"+ i +"\" type=text size=10></td>  <td><input id=\"H" + i + "\" type=text size=10></td>  </tr>\n";
	}
	html_table += "</table>";
	document.getElementById("abaque").innerHTML = html_table;
	return 1;
}

// createResTable() : Crée le tableau contenant les résultats à entrer dans l'afficheur.
function createResTable()
{
	var html_table = "<table class=\"visib\">\n<tr class=\"main\"><td></td><td>DSC (affichage)</td><td>ISC (courant mA)</td></tr>";
	for (var i=0;i<nbPnt;i++)
	{
		html_table += "<tr><td class=\"main\">Point "+ i +"</td>  <td class=\"code\" id=\"DSC" + i + "\"></td><td class=\"code\" id=\"ISC" + i + "\"></td>  </tr>\n";
	}
	html_table += "</table>";
	document.getElementById("result").innerHTML = html_table;
	return 1;
}

function inits()
{
	document.getElementById("warnNojs").innerHTML = "";
	createAbTable();
	createResTable();
	return 1;
}

// testParams() : Renvoie 1 si les paramètres sont cohérents, 0 sinon. Remet en forme les nombres.
function testParam(id)
{
	var ok  = true;
	var tmp = cleanNum(document.getElementById("PRM" + id).value); 
	if (isNaN(tmp)) {
		document.getElementById("PRM" + id + "warn").innerHTML = "<-- Ce nombre est incorrect !";
		ok = false;
	}

	// Si volume hors limite, on affiche une erreur
	if ( (id == VOLUME) && (tmp > 9999) ) {
		document.getElementById("PRM" + id + "warn").innerHTML = "<-- Ce nombre doit être inférieur à 9999 !";
		ok = false; }

	// Si volume ok, on fixe la position de la virgule
	if ( (id == VOLUME) && ok ) {
		if      (tmp >= 1000) coma = 0;
		else if (tmp >= 100)  coma = 1;
		else if (tmp >= 10)   coma = 2;
		else                  coma = 3;
	}

	// Si PE < HAUTEUR, lors de modif de PE ou HAUTEUR, on affiche un warning
	if (  (id == HAUT)  &&  (cleanNum(document.getElementById("PRM" + PLECH).value) < tmp)    )
		document.getElementById("remarque").innerHTML = "<br />Remarque : La pleine échelle est inférieure à la hauteur de cuve. Etes-vous sûr ?...";
	else if (   (id == PLECH) &&  (cleanNum(document.getElementById("PRM" + HAUT).value) > tmp)  )
		document.getElementById("remarque").innerHTML = "<br />Remarque : La pleine échelle est inférieure à la hauteur de cuve. Etes-vous sûr ?...";
	else if ( ( id == HAUT) || (id == PLECH) )
		document.getElementById("remarque").innerHTML = "" ;

	if (ok) {
		document.getElementById("PRM" + id + "warn").innerHTML = "";
		document.getElementById("PRM" + id).value = tmp;
		param_val[id] = tmp;
		return 1;
	}
	else
		return 0;

}

// testParams() : Renvoie 1 si les paramètres sont cohérents, 0 sinon. Remet en forme les nombres.
function testParams()
{
	for (var i=0;i<=param_val.length-1;i++)
	{
		if (!testParam(i))
			return 0;
	}
	return 1;
}

// format4dig() : Renvoie une chaîne de 4 digits (virgule éventuelle non comprise) à partir d'un float.
// Ex : 0.000, 1234, 9999, 12.45, 782.3
// renvoie NaN en cas de nombre > 9999.
// On ne peut utiliser simplement .toPrecision(4), car en cas de nombre inférieur à 1, on obtient 0.001234 par exemple.
function format4dig(tmpnum, virgule)
{
	if ( (tmpnum > 9999) || isNaN(tmpnum) )
		return NaN;

	if (virgule == 0) {
		if      (tmpnum < 10)   zstr = "000";
		else if (tmpnum < 100)  zstr = "00";
		else if (tmpnum < 1000) zstr = "0";
		else                    zstr = "";
		}
	else if (virgule == 1) {
			if      (tmpnum < 10)  zstr = "00";
			else if (tmpnum < 100) zstr = "0";
			else                   zstr = "";
		}
	else if ( (virgule == 2) && (tmpnum < 10) )
		zstr = "0";
	else
		zstr = "";
	
	return zstr + tmpnum.toFixed(virgule);
}

// clearAb() : Efface le contenu des cellules du tableau Abaque.
function clearAb()
{
	for (var i=0;i<nbPnt;i++)
	{
		document.getElementById("H" + i).value = "";
		document.getElementById("V" + i).value = "";
	}
	
}
