function is_numeric(val){
	return typeof val != "boolean" && val !== null && !isNaN(+ val);

	if(val == undefined || val == '')
		return false ;
	var exp = new RegExp("^[0-9-.]*$","g");
	return exp.test(val);
}


function calcul(calcultype){

	//paramêtres
	var temp = 0 ; // Température en °K
	var massevol = 0 ;//masse volumique ρ
	var Q = 0 ;//Débit en Nm3/h
	var Kv = 0 ;//coef de débit
	var Cv = 0 ;//1.156Kv
	var paval = 0 ; //Pression Aval en Bar


	//calculs
	var deltap = 0 ; //∆p en Bar
	var pamont = 0 ;//Pression Amont en Bar
	var regime = '';//subsonique ou sonique

	temp = getFloat(document.getElementById('temperature').value) ;
	var temp_unit = getFloat(document.getElementById('temp_unit').value);
	temp = unitetab[temp_unit].convert(temp, unit_degK);


	massevol = getFloat(document.getElementById('massevol').value) ;

	Q = getFloat(document.getElementById('debit').value) ;
	var debit_unit = getFloat(document.getElementById('debit_unit').value) ;
	Q = unitetab[debit_unit].convert(Q, unit_Nmh);

	var coefdebit_unit = document.getElementById('coefdebit_unit').value ;
	var coefdebit = getFloat(document.getElementById('coefdebit').value) ;

	var dpaval = getFloat(document.getElementById('pression_aval').value) ;
	var dpamont = getFloat(document.getElementById('pression_amont').value) ;
	
	
	paval = getFloat(document.getElementById('pression_aval').value) ;
	pamont = getFloat(document.getElementById('pression_amont').value) ;
	var pression_unit = getFloat(document.getElementById('pression_unit').value) ;
	paval = unitetab[pression_unit].convert(paval, unit_bar);
	pamont = unitetab[pression_unit].convert(pamont, unit_bar);

	if(coefdebit_unit == 'Kv' && is_numeric(coefdebit)){
		Kv = coefdebit ;
	}else{
		Kv = getKv3(coefdebit);
	}

 
	switch(getFloat(calcultype)){
		case 1 : // calcul de la pression en amont, de la parte de charge (deltap) et du régime
			if(!is_numeric(Q) || !is_numeric(Kv) || !is_numeric(massevol) || !is_numeric(temp) || !is_numeric(paval)){
				alert('Veuillez renseigner tous les champs');
				return ;
			}
			regime = getRegimePerte(paval, Q, Kv, massevol, temp, paval);//calcul du régime		
			pamont = getPamont1(Q, Kv, massevol, temp, paval, regime);//calcul de la pression amont
			deltap = getDeltaP(paval,pamont) ;//calcul du delta P
			
			document.getElementById('regime').value = regime;//Affichage du régime
			
			paval = unit_bar.convert(paval, unitetab[pression_unit]);//conversion de la pression Aval
			
			pamont = unit_bar.convert(pamont, unitetab[pression_unit]);//conversion de la pression Amont
			document.getElementById('pression_amont').value = roundFloat(pamont) ;//Affichage de la pression Amont
			
			deltap = unit_bar.convert(deltap, unitetab[pression_unit]);//conversion du deltaP
			document.getElementById('pression_delta').value = roundFloat(deltap) ;//Affichage du DeltaP

			return ;
		break;
		case 2 : //calcul du débit
			if(!is_numeric(Kv) || !is_numeric(paval) || !is_numeric(pamont) || !is_numeric(massevol) || !is_numeric(temp)){
				alert('Veuillez renseigner tous les champs');
				return ;
			}
			deltap = getDeltaP(paval,pamont) ;
			regime = getRegime(paval,pamont);

			if(regime == 'sonique')
				Q = getQ1(Kv, massevol, temp, pamont);
			else
				Q = getQ2(Kv, massevol, temp, paval, deltap) ;
			Q = unit_Nmh.convert(Q, unitetab[debit_unit]);
			document.getElementById('debit').value = roundFloat(Q) ;
			document.getElementById('regime').value = regime ;
			deltap = unit_bar.convert(deltap, unitetab[pression_unit]);
			document.getElementById('pression_delta').value = roundFloat(deltap) ;
			return ;
		break;
		case 3 : //calcul Kv Cv
			if(!is_numeric(Q) || !is_numeric(paval) || !is_numeric(pamont) || !is_numeric(massevol) || !is_numeric(temp)){
				alert('Veuillez renseigner tous les champs');
				return ;
			}
			deltap = getDeltaP(paval,pamont) ;
			regime = getRegime(paval,pamont);
			if(regime=='subsonique')
				Kv =getKv1(Q, massevol, temp, deltap, paval);
			else if(regime=='sonique')
				Kv =getKv2(Q, massevol, temp, pamont);
			Cv = getCv(Kv) ;
			if(coefdebit_unit=='Kv')
				document.getElementById('coefdebit').value = roundFloat(Kv) ;
			else if(coefdebit_unit=='Cv')
				document.getElementById('coefdebit').value = roundFloat(Cv) ;
			document.getElementById('regime').value = regime ;

			deltap = unit_bar.convert(deltap, unitetab[pression_unit]);
			document.getElementById('pression_delta').value = roundFloat(deltap) ;
			return ;
		break;
	}

}

//fonctions de calcul
function getRegimePerte(paval,Q, Kv, p, t, paval){
	if(paval >= 1/2 * (square( (Q / (514 * Kv)) ) * (( p * t) / paval) + paval))
		return 'subsonique' ;
	else
		return 'sonique' ;
}

function getRegime(paval, pamont){
	if(paval >= pamont / 2)
		return 'subsonique' ;
	else
		return 'sonique' ;
}
function getDeltaP(dpaval, dpamont){
	//alert(round(dpamont - dpaval));
	return dpamont - dpaval ;
}

function getPaval(dp, pamont){
	return pamont - dp;
}

function getPamont1(Q, Kv, p, t, paval, regime){
	if(regime=='subsonique') {
		//alert('Q='+Q+' Kv='+Kv+' p='+p+' t='+t+' paval='+paval);
		return (square( (Q / (514 * Kv)) ) * (( p * t) / paval)) + paval;
	}
	else return ((Q/(257*Kv)) * Math.sqrt( (p*t)));
}

function getPamont2(dp, paval){
	return paval + dp;
}

function getPamont3(Q, Kv, p, t){
	return ( Q / (257 * Kv)) * Math.sqrt(p * t) ;
}

function getQ1(Kv, p, t, pamont){
	return (Kv*257) / ( Math.sqrt( (p*t) / (pamont * pamont) ) )
}
function getQ2(Kv, p, t, paval, dp){
	return (  (Kv*514) / Math.sqrt( (p*t)/(dp*paval) )  ) ;
}

function getKv1(Q, p, t, dp, paval){
	return (Q/514) * Math.sqrt( (p*t) / (dp * paval) ) ;
}
function getKv2(Q, p, t, pamont){
	return (Q/257) * Math.sqrt( (p*t) / (pamont * pamont) ) ;
}

function getKv3(Cv){
	return Cv / 1.156 ;
}

function getCv(Kv){
	return Kv * 1.156 ;
}

function selgaz(id){
	if(id == 'symbole'){
		document.getElementById('gazid_nom').style.display = "none";
		document.getElementById('gazid_'+id).style.display = "inline";
		document.getElementById('massevol').className = "resultats" ;
        document.getElementById('massevol').setAttribute("readOnly","readOnly") ;
		document.getElementById('massevol').value =  gaztabFormule[document.getElementById('gazid_'+id).value].densite;
	}else if(id == 'nom'){
		document.getElementById('gazid_symbole').style.display = "none";
		document.getElementById('gazid_'+id).style.display = "inline";
		document.getElementById('massevol').className = "resultats" ;
        document.getElementById('massevol').setAttribute("readOnly","readOnly") ;
		document.getElementById('massevol').value =  gaztab[document.getElementById('gazid_'+id).value].densite;
	}else if(id == 'manuelle'){
		document.getElementById('gazid_symbole').style.display = "none";
		document.getElementById('gazid_nom').style.display = "none";
		document.getElementById('massevol').className = "" ;
        document.getElementById('massevol').removeAttribute("readOnly") ;
	}
}

function trigazNom(a, b){
	if(a.nom > b.nom)
		return 1 ;
	if(a.nom < b.nom)
		return -1 ;
	return 0 ;
}
function trigazFormule(a, b){
	if(a.formule > b.formule)
		return 1 ;
	if(a.formule < b.formule)
		return -1 ;
	return 0 ;
}
function triuniteSymbole(a, b){
	if(a.symbole > b.symbole)
		return 1 ;
	if(a.symbole < b.symbole)
		return -1 ;
	return 0 ;
}

var gaztabFormule = gaztab.slice(0);
gaztabFormule = gaztabFormule.sort(trigazFormule);
gaztab = gaztab.sort(trigazNom);
unitetab = unitetab.sort(triuniteSymbole);

function writeSelects(){
	var elem = new Array();
	elem[0] = document.getElementById('temp_unit') ;
	elem[1] = document.getElementById('pression_unit') ;
	elem[2] = document.getElementById('debit_unit') ;
	var opt = '';

	for (var i=0; i<unitetab.length; i++) {
		opt = new Option(unitetab[i].symbole + ' (' + unitetab[i].nom +')', i); 
		if (unitetab[i].type == 'Température'){
			elem[0].options[elem[0].length] = opt ;
			if(unitetab[i] == unit_degC)
				elem[0].options[elem[0].length-1].selected=true ;
		}else if (unitetab[i].type == 'Pression'){
			elem[1].options[elem[1].length] = opt ;
			if(unitetab[i] == unit_bar)
				elem[1].options[elem[1].length-1].selected=true ;
		}else if (unitetab[i].type == 'Débit'){
			elem[2].options[elem[2].length] = opt ;
			if(unitetab[i] == unit_sccm)
				elem[2].options[elem[2].length-1].selected=true ;
		}
	}

	document.getElementById('oldt').value = elem[0].value ;
	document.getElementById('oldp').value = elem[1].value ;
	document.getElementById('oldd').value = elem[2].value ;

	elem[0] = document.getElementById('gazid_symbole') ;

	for (var i=0; i<gaztabFormule.length; i++) {
		opt = new Option(gaztabFormule[i].formule + ' (' + gaztabFormule[i].nom +')', i);
		elem[0].options[elem[0].length] = opt ;
	}
	elem[0].options[0].selected=true ;
	document.getElementById('massevol').value =  gaztabFormule[0].densite;

	elem[0] = document.getElementById('gazid_nom') ;

	for (var i=0; i<gaztab.length; i++) {
		opt = new Option(gaztab[i].nom + ' (' + gaztab[i].formule +')', i);
		elem[0].options[elem[0].length] = opt ;
	}
	elem[0].options[0].selected=true ;
}

function selectcalculdisp(i){
	i = getFloat(i);
	switch(i){
		case 1 : //calcul deltap + regime + pamont
			document.getElementById('calcul1').style.display = 'block' ;
			document.getElementById('calcul2').style.display = 'none' ;
			document.getElementById('calcul3').style.display = 'none' ;

			document.getElementById('pression_amont').className = "resultats" ;
            document.getElementById('pression_amont').setAttribute("readOnly","readOnly") ;
			document.getElementById('pression_delta').className = "resultats" ;
            document.getElementById('pression_delta').setAttribute("readOnly","readOnly") ;
			document.getElementById('debit').className = "" ;
            document.getElementById('debit').removeAttribute("readOnly") ;
			document.getElementById('coefdebit').className = "" ;
            document.getElementById('coefdebit').removeAttribute("readOnly") ;
			document.getElementById('pression_amont').value = '' ;
			document.getElementById('pression_delta').value = '' ;
		break ;
		case 2 ://Débit
			document.getElementById('calcul1').style.display = 'none' ;
			document.getElementById('calcul2').style.display = 'block' ;
			document.getElementById('calcul3').style.display = 'none' ;

			document.getElementById('debit').className = "resultats" ;
            document.getElementById('debit').setAttribute("readOnly","readOnly") ;
			document.getElementById('coefdebit').className = "" ;
            document.getElementById('coefdebit').removeAttribute("readOnly") ;
			document.getElementById('pression_amont').className = "" ;
            document.getElementById('pression_amont').removeAttribute("readOnly") ;
			document.getElementById('pression_delta').className = "resultats" ;
            document.getElementById('pression_delta').setAttribute("readOnly","readOnly") ;
			document.getElementById('debit').value = '' ;

		break ;
		case 3 :
			document.getElementById('calcul1').style.display = 'none' ;
			document.getElementById('calcul2').style.display = 'none' ;
			document.getElementById('calcul3').style.display = 'block' ;

			document.getElementById('coefdebit').className = "resultats" ;
            document.getElementById('coefdebit').setAttribute("readOnly","readOnly") ;
			document.getElementById('debit').className = "" ;
            document.getElementById('debit').removeAttribute("readOnly") ;
			document.getElementById('pression_amont').className = "" ;
            document.getElementById('pression_amont').removeAttribute("readOnly") ;
			document.getElementById('pression_delta').className = "resultats" ;
            document.getElementById('pression_delta').setAttribute("readOnly","readOnly") ;
			document.getElementById('coefdebit').value = '' ;
			document.getElementById('pression_delta').value = '' ;
		break ;
	}
	document.getElementById('submitcalcul').onclick = function(e){calcul(i);return false;};

}

function changePression(i){
	var value=0;
	var old = document.getElementById('oldp') ;
	value = document.getElementById('pression_amont').value ;
	if(!is_numeric(value))
		value = 0 ;
	document.getElementById('pression_amont').value =  unitetab[old.value].convert(value, unitetab[i]);
	value = document.getElementById('pression_aval').value ;
	if(!is_numeric(value))
		value = 0 ;
	document.getElementById('pression_aval').value =  unitetab[old.value].convert(value, unitetab[i]);
	value = document.getElementById('pression_amont').value ;
	if(!is_numeric(value))
		value = 0 ;
	document.getElementById('pression_delta').value =  unitetab[old.value].convert(value, unitetab[i]);
}
function changeDebit(i){
	var value=0;
	var old = document.getElementById('oldd') ;
	value = parseFloat(document.getElementById('debit').value) ;
	document.getElementById('debit').value =  unitetab[old.value].convert(value, unitetab[i]);
}
function square(x) {
	return x*x;
}

function getFloat(x) {
	if (typeof(x) == 'string') {
		x = x.replace(",",".");
	}
	return parseFloat(x);
}


function roundFloat(x) {
	x = parseFloat(x);
	if ( (x>0 && (x >= 100000 || x < 0.0001)) || (x<0 && (x <= -100000 || x > -0.0001))) {return x.toExponential(3);}
	else {
		if(x>0){
			if (x >= 100) return x.toFixed(2);
			if (x < 100) return x.toFixed(6);
		}else{
			if (x <= 100) return x.toFixed(2);
			if (x > 100) return x.toFixed(6);
		}
	}
}

function accurateRoundTo(number,precision){
	var	nstr, parts, resint, dotpos, dummy, isneg, isnul;
	isneg=0;
	isnul=0;
	parts=new Array();
	if(number<0){
		number=Math.abs(number);
		isneg=1;
	}		
	nstr=number.toString();
	dotpos=nstr.indexOf(".",0);
	if((dotpos<0)||(nstr.length<(dotpos+precision+2))){
		if(isneg)
			return("-"+nstr);
		else
			return(nstr);
	}
	parts=nstr.split(".");
	if(parts[0]=="0"){
		parts[0]="10";
		isnul=1;}
	resint=parts[0]+parts[1].substr(0,precision);
	if(parseInt(parts[1].charAt(precision))>4){
		dummy=parseInt(resint)+1;
		resint=dummy.toString();}
	parts[0]=resint.substr(0,resint.length-precision);
	parts[1]=resint.substr(parts[0].length,precision);
	if(isnul)
		parts[0]=parts[0].substr(1,1);
	if(isneg)
		parts[0]="-"+parts[0];
	return(parts[0]+"."+parts[1]);
}
