/*	FinnPipette-pipettien kalibrointisivu
 * 	Copyright © 2003 Thermo Electron
 *
 *	Tekijä: Eero Salminen
 *
 *	Versiohistoria:
 * 	26.11.2004
 *	-Lisätty vertailuun itseisarvon ottaminen lasketuilta precision-arvoilta. Ei toiminut jostain syystä ilman niitä
 *
 *	v10 19.1.2004
 *	-Lisätty sarakkeet Uncertainty= |accuracy| + 2 x standard deviation, U(µl) U (%)
 *
 *	v9	28.7.2003 15:42
 *	-Raja-arvokentät tyhjennetään jos "Select" valitaan
 *	-Pistetty yla- ja alaspeksit samaan arrayhin helpompaa päivitystä & käyttöä varten
 *	-Pipettien nimet pistetty speksimatriisiin mukaan
 *	'-Tätä varten luotu funktio tulosta_valikko() joka hakee pipettivaihtoehdot "Pipette range"-valikkoon 
 *		 suoraan spekseistä
 *	'-Pistetty window.onload:iin em. funktion kutsu
 *
 *	v8	8.7.2003 13:00
 *	-Tarkistetaan ovatko kaikki arvot < 0
 *
 *	v7	17.6.2003 16:30
 *	-Kohteliaammat virheilmoitukset
 *
 *	v6	5.6.2003 10:00
 *	-Yhtenäisemmät ja tarkemmat virheilmoitukset
 *	-Muutamia lisätarkistuksia ennen laskemista
 *
 *	v5 26.5.2003 10:57
 *	-Korjattu keskihajonnan vertailuarvo speksiarvosta mittauksista laskettuun keskiarvoon.
 *
 *	v4
 *	-Lisätty enemmän pipettejä spekseihin (mm. MCP)
 *	-Pistetty spekseihin erikseen ylä- ja alarajat spekseihin
 *	-Lisätty virheentarkistuksia
 *	-Lisätty popup-funktio ohjeiden näyttämistä varten.
 *
 *	v3
 *	-Lisätty korjaus, joka muuttaa ,-merkit .-merkeiksi, jotta laskut toimivat a.b- sekä a,b-arvoilla.
 *
 *	v2
 *	-Lisätty muutoskertoimet lämpötilan ja paineen suhteen
 *	-Säädetty tulosten esitystarkkuutta
 *
 *	v1
 *	-Peruspipettien speksit
 *	-Arvojen lasku annetuista mittausarvoista
 */

 
window.onload = tulosta_valikko;

// Mahdollisia popup-ikkunoita varten
function PopUp(url) {
	var winX = 0;
	var winY = 0;
	var w = 830;
	var h = 370;
//	i++
  // only set new values if 4.0 browser
	if (parseInt(navigator.appVersion) >= 4) {
		winX = (screen.availWidth - w)*.5;
		winY = (screen.availHeight - h)*.5;
	}
	window.open(url, "diu", 'resizable,scrollbars=yes,width=' + w + ',height=' + h + ',top=' + winX + ',left='+ winY);

}


/*
Z-muunnostaulukko:
muutos[x]:n lämpötila = 15 + x*0.5
muutos[x][y=A:n käytettävä arvo on 1+A/10000(=Z)
*/
muutos=new Array(31);
muutos[0]=new Array(18,18,19,19,20,20);
muutos[1]=new Array(18,18,19,20,20,21);
muutos[2]=new Array(19,20,20,21,21,22);

muutos[3]=new Array(20,20,21,22,22,23);
muutos[4]=new Array(21,21,22,22,23,23);
muutos[5]=new Array(22,22,23,23,24,24);

muutos[6]=new Array(22,23,24,24,25,25);
muutos[7]=new Array(23,24,25,25,26,26);
muutos[8]=new Array(24,25,25,26,27,27);

muutos[9]=new Array(25,26,26,27,28,28);
muutos[10]=new Array(26,27,27,28,29,29);
muutos[11]=new Array(27,28,28,29,30,30);

muutos[12]=new Array(28,29,30,30,31,31);
muutos[13]=new Array(30,30,31,31,32,32);
muutos[14]=new Array(31,31,32,32,33,33);

muutos[15]=new Array(32,32,33,33,34,35);
muutos[16]=new Array(33,33,34,35,35,36);
muutos[17]=new Array(34,35,35,36,36,37);

muutos[18]=new Array(35,36,36,37,38,38);
muutos[19]=new Array(37,37,38,38,39,39);
muutos[20]=new Array(38,38,39,39,40,41);

muutos[21]=new Array(39,40,40,41,41,42);
muutos[22]=new Array(40,41,42,42,43,43);
muutos[23]=new Array(42,42,43,43,44,45);

muutos[24]=new Array(43,44,44,45,45,46);
muutos[25]=new Array(44,45,46,46,47,47);
muutos[26]=new Array(46,46,47,48,48,49);

muutos[27]=new Array(47,48,48,49,50,50);
muutos[28]=new Array(49,49,50,50,51,52);
muutos[29]=new Array(50,51,51,52,52,53);
muutos[30]=new Array(52,52,53,53,54,55);

//Virherajat
spekseja=24;
speksit=new Array(3);
speksit[0]=new Array(spekseja);	//Tähän ylärajat
speksit[1]=new Array(spekseja);	//Tähän alarajat
speksit[2]=new Array(spekseja);	//Tähän speksin kuvaus


/*
speksit[0][paikka]=new Array(Yläraja, accuracy ul, accuracy %, prec s.d.ul, prec cv%);
speksit[1][paikka]=new Array(Alaraja, accuracy ul, accuracy %, prec s.d.ul, prec cv%);
speksit[2][paikka]="Pipetin nimi/tilavuus";
*/

speksit[0][0]=new Array(2, 0.08, 4.0, 0.04, 2);
speksit[1][0]=new Array(0.2, 0.08, 40, 0.04, 20);
speksit[2][0]="0,2-2 "+String.fromCharCode(181)+"l";

speksit[0][1]=new Array(3, 0.125, 4.2, 0.075, 2.5);
speksit[1][1]=new Array(0.3, 0.125, 42, 0.075, 25);
speksit[2][1]="0,3-3 "+String.fromCharCode(181)+"l"

speksit[0][2]=new Array(5, 0.125, 2.5, 0.075, 1.5);
speksit[1][2]=new Array(0.5, 0.125, 25, 0.075, 15);
speksit[2][2]="0,5-5 "+String.fromCharCode(181)+"l"

speksit[0][3]=new Array(10, 0.12, 1.200, 0.08, 0.80);
speksit[1][3]=new Array(1, 0.12,12.000,0.08,8.00);
speksit[2][3]="0,5-10 "+String.fromCharCode(181)+"l"

speksit[0][4]=new Array(10, 0.120, 1.2, 0.080, 0.8);
speksit[1][4]=new Array(1, 0.120, 12, 0.080, 8);
speksit[2][4]="1-10 "+String.fromCharCode(181)+"l"

speksit[0][5]=new Array(20,0.2,1.00,0.1,0.50);
speksit[1][5]=new Array(2, 0.2,10.00,0.1,5.00);
speksit[2][5]="2-20 "+String.fromCharCode(181)+"l"

speksit[0][6]=new Array(30, 0.5, 1.7, 0.2, 0.7);
speksit[1][6]=new Array(3, 0.5, 17, 0.2, 6.7);
speksit[2][6]="3-30 "+String.fromCharCode(181)+"l"

speksit[0][7]=new Array(40,0.5,1.25,0.2,0.50);
speksit[1][7]=new Array(5,0.5,10.00,0.2,4.00);
speksit[2][7]="5-40 "+String.fromCharCode(181)+"l"

speksit[0][8]=new Array(50, 0.5, 1.0, 0.2, 0.4);
speksit[1][8]=new Array(5, 0.5, 10, 0.2, 4);
speksit[2][8]="5-50 "+String.fromCharCode(181)+"l"

speksit[0][9]=new Array(100, 0.8, 0.8, 0.3, 0.3);
speksit[1][9]=new Array(10, 0.8, 8, 0.3, 3);
speksit[2][9]="10-100 "+String.fromCharCode(181)+"l"

speksit[0][10]=new Array(200,1.60,0.80,0.60,0.30);
speksit[1][10]=new Array(40,1.60,4.00,0.60,1.50);
speksit[2][10]="40-200 "+String.fromCharCode(181)+"l"

speksit[0][11]=new Array(200,1.60,0.80,0.60,0.30);
speksit[1][11]=new Array(20,1.60,8.00,0.60,3.00);
speksit[2][11]="20-200 "+String.fromCharCode(181)+"l"

speksit[0][12]=new Array(300, 4.0, 1.3, 1.5, 0.5);
speksit[1][12]=new Array(30, 4.0, 13, 1.5, 5);
speksit[2][12]="30-300 "+String.fromCharCode(181)+"l"

speksit[0][13]=new Array(1000, 8.0, 0.8, 3.0, 0.3);
speksit[1][13]=new Array(200,8.00,4.00,3.00,1.50);
speksit[2][13]="200-1000 "+String.fromCharCode(181)+"l"

speksit[0][14]=new Array(1000,8.00,0.80,3.00,0.30);
speksit[1][14]=new Array(100, 8.0, 8, 3.0, 3);
speksit[2][14]="100-1000 "+String.fromCharCode(181)+"l"

speksit[0][15]=new Array(5000,40.00,0.80,15.00,0.30);
speksit[1][15]=new Array(500, 40.0, 8, 15.0, 3);
speksit[2][15]="0,5-5 ml"

speksit[0][16]=new Array(5000, 40.0, 0.8, 15.0, 0.3);
speksit[1][16]=new Array(1000,40.00,4.00,15.00,1.50);
speksit[2][16]="1-5 ml"

speksit[0][17]=new Array(10000,60.00,0.60,30.00,0.30);
speksit[1][17]=new Array(2000,60.00,3.00,30.00,1.50);
speksit[2][17]="2-10 ml"

speksit[0][18]=new Array(10000, 60.0, 0.6, 30.0, 0.3);
speksit[1][18]=new Array(1000, 60.0, 6, 30.0, 3);
speksit[2][18]="1-10 ml"

//Monikanavat
speksit[0][19]=new Array(10,0.24,2.4,0.16,1.6);
speksit[1][19]=new Array(1,0.24,24,0.16,16);
speksit[2][19]="MCP 0,5-10 "+String.fromCharCode(181)+"l"

speksit[0][20]=new Array(10,0.24,2.4,0.16,1.6);
speksit[1][20]=new Array(1,0.24,24,0.16,16);
speksit[2][20]="MCP 1-10 "+String.fromCharCode(181)+"l"

speksit[0][21]=new Array(50,1.0,2.0,0.4,0.8);
speksit[1][21]=new Array(5,1.0,20,0.4,8);
speksit[2][21]="MCP 5-50 "+String.fromCharCode(181)+"l"

speksit[0][22]=new Array(300,8.0,2.67,3.0,1.0);
speksit[1][22]=new Array(30,8.0,26.67,3.0,10);
speksit[2][22]="MCP 30-300 "+String.fromCharCode(181)+"l"

speksit[0][23]=new Array(300,8.0,2.67,3.0,1.0);
speksit[1][23]=new Array(50,8.0,16,3.0,6.0);
speksit[2][23]="MCP 50-300 "+String.fromCharCode(181)+"l"


/*Laskee mittaustuloksista virherajat ja palauttaa ne Arrayna*/
function mittaus(tulosP, keskiarvo, oikeaArvo) {
//	alert("Aloitetaan mittaus: tulos="+tulosP+" ka="+keskiarvo+" Vo="+oikeaArvo);
	A=keskiarvo-oikeaArvo;
	Ap=100*A/oikeaArvo;
	keskihajonta=0;
	for (i=0;i<10;i++) {
		keskihajonta += (tulosP[i]-keskiarvo)*(tulosP[i]-keskiarvo)
	}
	keskihajonta=Math.sqrt(keskihajonta/(tulosP.length-1));
	keskihajontaP=100*keskihajonta/keskiarvo;
	
	UC=Math.abs(A)+2*keskihajonta;
	UCp=Math.abs(Ap)+2*keskihajontaP;
//	alert("A="+A+" Ap="+Ap+" keskih="+keskihajonta+" khP="+keskihajontaP);
	if (document.pipetti.range.value < 5) {
		return new Array(Math.round(A*1000)/1000,Math.round(Ap*100)/100,Math.round(keskihajonta*1000)/1000,Math.round(keskihajontaP*100)/100,Math.round(UC*1000)/1000,Math.round(UCp*100)/100);
	} else {
		return new Array(Math.round(A*100)/100,Math.round(Ap*100)/100,Math.round(keskihajonta*100)/100,Math.round(keskihajontaP*100)/100,Math.round(UC*100)/100,Math.round(UCp*100)/100);
	}
}

//Tällä annetaan virheilmoitus ja keskeytetään funktion ajo.
function error(errormsg) {
	alert(errormsg);
	return false;		
}	

/*Pääfunktio*/
function laske() {
	if (document.pipetti.range.value == "null") 
			return error("Please select pipette range before calculating.");
	if (!document.pipetti.evap.value)
			return error("Please enter evaporation loss before calculating.");
	if (isNaN(eval("document.pipetti.evap.value").replace(/,/,".")))
		return error("Evaporation loss is not a number. Please check the value.");
	
	evap=Number(eval("document.pipetti.evap.value").replace(/,/,"."));
	
	if (evap < 0)
		return error("Evaporation loss is less than zero. Please check the value.");
	
	conversion=1.00+muutos[eval("document.pipetti.temperature.value")][eval("document.pipetti.pressure.value")]/10000;
	keskiarvo=new Array(2);
	keskiarvo[0]=0;
	keskiarvo[1]=0;
	tulos=new Array(2);
	arvot=new Array(2);
	arvot[0]=new Array(10);
	arvot[1]=new Array(10);
	
	for (var i = 0 ; i < 10 ; i++) {
		if (!eval("document.pipetti.min"+i+".value"))
			return error("Please enter minumum value on row "+(i+1)+" in weighing results before calculating.");
		if (!eval("document.pipetti.max"+i+".value"))
			return error("Please enter maximum value on row "+(i+1)+" in weighing results before calculating.");
		if (isNaN(eval("document.pipetti.min"+i+".value").replace(/,/,".")))
			return error("Minumum value on row "+(i+1)+" in weighing results is not a number. Please check the value.");
		if (isNaN(eval("document.pipetti.max"+i+".value").replace(/,/,".")))
			return error("Maximum value on row "+(i+1)+" in weighing results is not a number. Please check the value.");		
		arvot[0][i]=(Number(eval("document.pipetti.min"+i+".value").replace(/,/,"."))+evap)*conversion;
		arvot[1][i]=(Number(eval("document.pipetti.max"+i+".value").replace(/,/,"."))+evap)*conversion;
		
		if (Number(eval("document.pipetti.min"+i+".value").replace(/,/,".")) < 0)
			return error("Minumum value on row "+(i+1)+" in weighing results is less than zero. Please check the value.");
		if (Number(eval("document.pipetti.max"+i+".value").replace(/,/,".")) < 0)
			return error("Maximum value on row "+(i+1)+" in weighing results is less than zero. Please check the value.");
		
		keskiarvo[0] +=	arvot[0][i];
		keskiarvo[1] +=	arvot[1][i];
	}
	keskiarvo[0]=keskiarvo[0]/10;
	keskiarvo[1]=keskiarvo[1]/10;
	tulos[0]=mittaus(arvot[0], keskiarvo[0], document.pipetti.Lminvolume.value);
	tulos[1]=mittaus(arvot[1], keskiarvo[1], document.pipetti.Lmaxvolume.value);
	document.pipetti.Z.value=conversion;
	if (document.pipetti.range.value < 5) {
		document.pipetti.minstandard.value=Math.round(keskiarvo[0]*1000)/1000;
		document.pipetti.maxstandard.value=Math.round(keskiarvo[1]*1000)/1000;
	} else {
		document.pipetti.minstandard.value=Math.round(keskiarvo[0]*100)/100;
		document.pipetti.maxstandard.value=Math.round(keskiarvo[1]*100)/100;
	}
	document.pipetti.minaccV.value=tulos[0][0];
	document.pipetti.minaccP.value=tulos[0][1];
	document.pipetti.minPrec.value=tulos[0][2];
	document.pipetti.minCV.value=tulos[0][3];
	document.pipetti.minUCv.value=tulos[0][4];
	document.pipetti.minUCp.value=tulos[0][5];
	document.pipetti.maxaccV.value=tulos[1][0];
	document.pipetti.maxaccP.value=tulos[1][1];
	document.pipetti.maxPrec.value=tulos[1][2];
	document.pipetti.maxCV.value=tulos[1][3];
	document.pipetti.maxUCv.value=tulos[1][4];
	document.pipetti.maxUCp.value=tulos[1][5];
	
// 	document.pipetti.maxUCv.value=Math.round((Math.abs(document.pipetti.maxaccV.value)+2*document.pipetti.maxPrec.value)*100)/100;
// 	document.pipetti.maxUCp.value=Math.round(document.pipetti.maxUCv.value/document.pipetti.maxstandard.value*10000)/100;

	minOK = (Math.abs(document.pipetti.minaccV.value) <= document.pipetti.LminaccV.value) && (Math.abs(document.pipetti.minPrec.value) <= document.pipetti.LminPrec.value);
	maxOK = (Math.abs(document.pipetti.maxaccV.value) <= document.pipetti.LmaxaccV.value) && (Math.abs(document.pipetti.maxPrec.value) <= document.pipetti.LmaxPrec.value);
	if (minOK) {
		document.pipetti.minOK.value="Passed";
	} else {
		document.pipetti.minOK.value="Failed";
	}
	if (maxOK) {
		document.pipetti.maxOK.value="Passed";
	} else {
	document.pipetti.maxOK.value="Failed";
	}
}

//ottaa speksimatriisista arvot ja sijoittaa dokumenttiin
function laske_arvot() {
	//alert(rivi);
	rivi=document.pipetti.range.value;
	if (rivi != "null") {
		document.pipetti.minOK.value="";
		document.pipetti.maxOK.value="";
		//alert(speksit[rivi][0]);
		document.pipetti.Lmaxvolume.value=speksit[0][rivi][0];
		document.pipetti.LmaxaccV.value=speksit[0][rivi][1];
		document.pipetti.LmaxaccP.value=speksit[0][rivi][2];
		document.pipetti.LmaxPrec.value=speksit[0][rivi][3];
		document.pipetti.LmaxCV.value=speksit[0][rivi][4];
		document.pipetti.Lminvolume.value=speksit[1][rivi][0];
		document.pipetti.LminaccV.value=speksit[1][rivi][1];
		document.pipetti.LminaccP.value=speksit[1][rivi][2];
		document.pipetti.LminPrec.value=speksit[1][rivi][3];
		document.pipetti.LminCV.value=speksit[1][rivi][4];
		document.pipetti.LminUCv.value=Math.round((Math.abs(document.pipetti.LminaccV.value)+2*document.pipetti.LminPrec.value)*100)/100;
		document.pipetti.LminUCp.value=Math.round((document.pipetti.LminUCv.value/document.pipetti.Lminvolume.value)*10000)/100;
		document.pipetti.LmaxUCv.value=Math.round((Math.abs(document.pipetti.LmaxaccV.value)+2*document.pipetti.LmaxPrec.value)*100)/100;
		document.pipetti.LmaxUCp.value=Math.round((document.pipetti.LmaxUCv.value/document.pipetti.Lmaxvolume.value)*10000)/100;

/*LminUCv
LminUVp
LmaxUCv
LmaxUVp*/


	} else {
		document.pipetti.minOK.value="";
		document.pipetti.maxOK.value="";
		document.pipetti.Lminvolume.value="";
		document.pipetti.LminaccV.value="";
		document.pipetti.LminaccP.value="";
		document.pipetti.LminPrec.value="";
		document.pipetti.LminCV.value="";
		document.pipetti.Lmaxvolume.value="";
		document.pipetti.LmaxaccV.value="";
		document.pipetti.LmaxaccP.value="";
		document.pipetti.LmaxPrec.value="";
		document.pipetti.LmaxCV.value="";
		document.pipetti.LminUCv.value="";
		document.pipetti.LminUCp.value="";
		document.pipetti.LmaxUCv.value="";
		document.pipetti.LmaxUCp.value="";
	}
}

function tulosta_valikko() {
	document.pipetti.range.options[0]=new Option("Select", "null");
	for (i=0; i < spekseja; i++) {
		document.pipetti.range.options[i+1]=new Option(speksit[2][i], i);
 	}
 	laske_arvot()
}

