/*
 * Functions for converting between different units.
 * Copyright (C) 2003 Mats Bergsten
 * http://www.bergsten.net/mats
 */

//Databasen består av en tabell för varje grupp som vikt, volym, hastighet m.m.
//Varje tabell har en referensenhet, t.ex. kg för viktgruppen.
//Varje enhet har en referensfaktor som anger hur många enheter av referenenheten som ger en enhet.
//För varje sida byggs en array upp med följande värden för varje enhet: (type,unit,unitText,unitHTML,referenceFactor)
//
//var unitArray = new Array (Metric,kg,kilogram,kg,1,
//                           Metric,g,gram,g,0.001,
//                           Metric,mg,milligram,mg,0.000001);
//var unitArray = new Array (<fyll i array för unit från db>);


function roundOff(value, significantFigures)
{
	var scientificNotation = document.forms["main"].scientificNotation.checked;
	var display = displaySigFigs(value, significantFigures, -999, scientificNotation);
	var sigFig = new SignificantFigures(display);
	
	return display;
}

function setArrayData(categoryUniqueName, referenceFactor, offset)
{
	this.categoryUniqueName = categoryUniqueName;
	this.referenceFactor = referenceFactor;
	this.offset = offset;
}

function checkAndReplaceSeparator(value, fromSeparator)
{
	toSeparator = "";
	if(fromSeparator == ",")
	{
		toSeparator = ".";
	}
	else if(fromSeparator == ".")
	{
		toSeparator = ",";
	}
	else
	{
		alert("Separator not allowed!");
	}
	
	newString = "";
	valStrTmp = value.toString();
	loc = valStrTmp.indexOf(fromSeparator)
	if(loc >= 0)
	{
		newString = valStrTmp.substring(0, loc) + toSeparator + valStrTmp.substring(loc + 1, valStrTmp.length);
	}
	else
	{
		newString = valStrTmp;
	}

	newValue = newString;
	
	return newValue;
}

function compute(unitArray, categoryUniqueName, value)
{
	var value = value.toString();	//checkAndReplaceSeparator(value, ",");
	var factor = 1;
	var significantFigures = document.forms["main"].significantFigures.selectedIndex + 1;

	for ( var i = 0; i < unitArray.length; i++ )
	{
		if ( categoryUniqueName == unitArray[i].categoryUniqueName )
		{
			factor = (unitArray[i].referenceFactor)*value;
		}
	}

	for( i = 0; i < unitArray.length; i++ )
	{
		value = factor/unitArray[i].referenceFactor;
		value = roundOff(value, significantFigures);
		valStrTmp = value.toString();
		if(valStrTmp.charAt(valStrTmp.length - 1) == '.' || valStrTmp.charAt(valStrTmp.length - 1) == ',')
		{
			valStrTmp = valStrTmp.substring(0, valStrTmp.length - 1);
			value = valStrTmp;
		}
		
		value = value.toString();	//checkAndReplaceSeparator(value, ".");
		
		document.forms["convertForm"].elements[i].value = value;//round(value, significantFigures);
	}
}

function refresh(unitArray)
{
	if(unitArray[0].categoryUniqueName == '29_kelvin')
	{
		//alert(unitArray[0].categoryUniqueName+", "+document.forms["convertForm"].elements[0].value);
		categoryUniqueName = 'celsius';
		computeTemperature(categoryUniqueName, document.forms["convertForm"].elements[1].value);
	}
	else if(unitArray[0].categoryUniqueName == '2_liter per kilometer')
	{
		//alert(unitArray[0].categoryUniqueName+", "+document.forms["convertForm"].elements[0].value);
		categoryUniqueName = '2_liter per kilometer';
		computeFuelConsumption(categoryUniqueName, document.forms["convertForm"].elements[0].value);
	}
	else
	{
		compute(unitArray, unitArray[0].categoryUniqueName, document.forms["convertForm"].elements[0].value);	
	}
}

function computeTemperature(categoryUniqueName, value)
{
	//alert("computeTemperature: "+categoryUniqueName+", value="+value);
	var value = value.toString();	//checkAndReplaceSeparator(value, ",");
	var significantFigures = document.forms["main"].significantFigures.selectedIndex + 1;
	var kelvin = 0;
	
	if(categoryUniqueName == 'kelvin')
	{
		kelvin = value;
	}
	else if(categoryUniqueName == 'celsius')
	{
		kelvin = value-(-273.15);
	}
	else if(categoryUniqueName == 'fahrenheit')
	{
		kelvin = (value-(-459.67))/1.8;
	}
	else if(categoryUniqueName == 'reaumur')
	{
		kelvin = (value-(-218.52))/0.8;
	}
	else if(categoryUniqueName == 'rankine')
	{
		kelvin = (value-(-0))/1.8;
	}
	
	valueKelvin = roundOff(kelvin, significantFigures);
	valueCelsius = roundOff(kelvin-273.15, significantFigures);
	valueFahrenheit = roundOff(kelvin*1.8-459.67, significantFigures);
	valueReaumur = roundOff(kelvin/1.25-218.52, significantFigures);
	valueRankine = roundOff(kelvin*1.8, significantFigures);
	
	//alert("value="+value+", valueKelvin="+valueKelvin+", valueCelsius: "+valueCelsius+", valueFahrenheit="+valueFahrenheit+", valueReaumur="+valueReaumur+", valueRankine="+valueRankine);
	
	arrayTmp = new Array(valueKelvin, valueCelsius, valueFahrenheit, valueReaumur, valueRankine);
	
	for( i = 0; i < arrayTmp.length; i++ )
	{
		valStrTmp = arrayTmp[i].toString();

		if(valStrTmp.charAt(valStrTmp.length - 1) == '.' || valStrTmp.charAt(valStrTmp.length - 1) == ',')
		{
			valStrTmp = valStrTmp.substring(0, valStrTmp.length - 1);
		}

		arrayTmp[i] = valStrTmp.toString();	//checkAndReplaceSeparator(valStrTmp, ".");
	}

	document.forms["convertForm"].elements[0].value = arrayTmp[0];
	document.forms["convertForm"].elements[1].value = arrayTmp[1];
	document.forms["convertForm"].elements[2].value = arrayTmp[2];
	document.forms["convertForm"].elements[3].value = arrayTmp[3];
	document.forms["convertForm"].elements[4].value = arrayTmp[4];
}

function computeFuelConsumption(categoryUniqueName, value)
{
//alert("computeFuelConsumption");
    var value = checkAndReplaceSeparator(value, ",");
    var significantFigures = document.forms["main"].significantFigures.selectedIndex + 1;
    
    var lpkm = 0;
	var kmpl = 0;

	
	if(categoryUniqueName == '2_liter per kilometer')
	{
		lpkm = value;
		kmpl = 1/lpkm;
	}
	else if(categoryUniqueName == '2_liter per 10 kilometer')
	{
		lpkm = 0.1*value;
		kmpl = 1/lpkm;
	}
	else if(categoryUniqueName == '2_liter per 100 kilometer')
	{
		lpkm = 0.01*value;
		kmpl = 1/lpkm;
	}
	else if(categoryUniqueName == '2_kilometer per liter')
	{
		kmpl = value;
		lpkm = 1/kmpl;
	}
	else if(categoryUniqueName == '37_miles per gallon')
	{
		kmpl = 2.352145*value;
		lpkm = 1/kmpl;
	}
	else if(categoryUniqueName == '37_gallons per 100 miles')
	{
		lpkm = 0.023521453*value;
		kmpl = 1/lpkm;
	}
	else if(categoryUniqueName == '38_miles per gallon')
	{
		kmpl = 2.824815*value;
		lpkm = 1/kmpl;
	}
	else if(categoryUniqueName == '38_gallons per 100 miles')
	{
		lpkm = 0.0282481487*value;
		kmpl = 1/lpkm;
	}

	valuelpkm = roundOff(lpkm, significantFigures);
	valuelp10km = roundOff(10*lpkm, significantFigures);
	valuelp100km = roundOff(100*lpkm, significantFigures);
	valuekmpl = roundOff(kmpl, significantFigures);
	valuempgus = roundOff(kmpl*2.352145, significantFigures);
	valuegp100mus = roundOff(lpkm*42.51438, significantFigures);
	valuempguk = roundOff(kmpl*2.824815, significantFigures);
	valuegp100muk = roundOff(lpkm*35.40055, significantFigures);
	
	//alert("value="+value+", valuelpkm="+valuelpkm+", valuekmpl="+valuekmpl);
	
	arrayTmp = new Array(valuelpkm, valuelp10km, valuelp100km, valuekmpl, valuempgus, valuegp100mus, valuempguk, valuegp100muk);
	
	for( i = 0; i < arrayTmp.length; i++ )
	{
		valStrTmp = arrayTmp[i].toString();

		if(valStrTmp.charAt(valStrTmp.length - 1) == '.' || valStrTmp.charAt(valStrTmp.length - 1) == ',')
		{
			valStrTmp = valStrTmp.substring(0, valStrTmp.length - 1);
		}

		arrayTmp[i] = valStrTmp.toString();	//checkAndReplaceSeparator(valStrTmp, ".");
	}

	document.forms["convertForm"].elements[0].value = arrayTmp[0];
	document.forms["convertForm"].elements[1].value = arrayTmp[1];
	document.forms["convertForm"].elements[2].value = arrayTmp[2];
	document.forms["convertForm"].elements[3].value = arrayTmp[3];
	document.forms["convertForm"].elements[4].value = arrayTmp[4];
	document.forms["convertForm"].elements[5].value = arrayTmp[5];
	document.forms["convertForm"].elements[6].value = arrayTmp[6];
	document.forms["convertForm"].elements[7].value = arrayTmp[7];
}
