function showHideExtraText(tagId,extraTextId)
/*
	The function showHideExtraText is used to show/hide extra text by clicking on paragraph.

	Proper HTML programming:
	
		<span class="tag" id="tag01" title="click for more info" onclick="showHideExtraText('tag01','extraText01')">(more)</span>
      
		<div style="display:none;" id="extraText01">
			<p>This is some text.</p>
			<p>This is some text.</p>
		</div>
*/

{
if (document.getElementById(tagId).innerHTML=="(more)")
	{
	document.getElementById(extraTextId).style.display="inline";
	document.getElementById(tagId).innerHTML="(less)";
	document.getElementById(tagId).title="click for less info";
/*	document.getElementById(extraTextId).scrollIntoView(true);*/
	}
else
	{
	document.getElementById(extraTextId).style.display="none";
	document.getElementById(tagId).innerHTML="(more)";
	document.getElementById(tagId).title="click for more info";
	}
}

function searchfield_focus()
/*	
	The function searchfield_focus sets the style of the input search field when in focus.
*/
{
	document.getElementById("search-field").value="";
	document.getElementById("search-field").style.color="#000000";
	document.getElementById("search-field").style.fontStyle="normal";
}

function autoRoundNumber(value)
/*
	The function autoRoundNumber rounds 'value' to 4 significant numbers (3 if 'value' is below 1), except if it is greater than or equal to 10000, then it is rounded to unity.  A space is inserted to separate the thousands (before and after the decimal).
*/
{
	var number = value;

	if(isNaN(number) || number=="Infinity" || number=="-Infinity"){return number;}

	if(number<1){number = Number(number).toPrecision(3)}
	else if(number<10000){number = Number(number).toPrecision(4)}
	else{number = Number(number).toFixed()}

	number = separateThousand(number);
	return number;
}

function roundNumber(value, digit,separate)
/*
	The function roundNumber rounds 'value' to desired number of 'digit'.  If 'separate' is 'true', a space is inserted to separate the thousands (before and after the decimal).
*/
{
	var power = Math.pow(10,digit);
	if(digit >= 0) power = Math.round(power);
	var number = value;
	var i;
	var j;

	number = Math.round(number*power)/power;	/*round the number*/

	if(isNaN(number) || number=="Infinity" || number=="-Infinity"){return number;}

	/*if number is more precise than unity, check for missing zeros:*/
	if(digit > 0)
	{
		for(i = digit; i >= 1; i--)
		{
			if(number == Math.round(number*Math.round(power/Math.pow(10,i)))/Math.round(power/Math.pow(10,i))) /*Math.pow() function is rounded for precision*/
			{	/*there are missing zeros*/
				
				/*check if number is written with exponent; if so, don't add zeros*/
				var value = number.toString();
				var exponent = value.indexOf("e");
				if (exponent!=-1){return number;}
				
				var zeros = "";
				
				if(i==digit){zeros=".";}	/*if number is rounded to unity, add a dot before the zeros*/
				
				for(j=1;j<=i;j++)
				{
					zeros = zeros + "0";	/*add zeros until precision is reached*/
				}
				
				number = number + zeros;	/*add the zeros to the rounded number*/
				if(separate) number = separateThousand(number);
				return number;
			}
			
		}
	}
	if(separate) number = separateThousand(number);
	return number;
}

function separateThousand(value)
{
	var number = value.toString();
	var dot = number.indexOf(".");
	var exponent = number.indexOf("e");
	var length = number.length;
	var newNumber="";
	
	if(exponent!=-1){return value;}
	else if(dot==-1)
	{
		var subNumber = new Array();
		var j=0;
		
		for(i=length-3;i>=0;i=i-3)
		{
			subNumber[j] = number.slice(i,i+3);
			j=j+1;
		}
		
		if(i<0){newNumber = number.slice(0,i+3);}
		
		for(i=j-1; i>=0; i--)
		{
			newNumber = newNumber + " " + subNumber[i];
		}
	}
	else if(dot>3 || length-dot>3)
	{
		var subNumber = new Array();
		var j=1;
		
		subNumber[0] = number.slice(dot);
		
		for(i=dot-3;i>=0;i=i-3)
		{
			subNumber[j] = number.slice(i,i+3);
			j=j+1;
		}
		
		if(i<0){newNumber = number.slice(0,i+3);}
		
		for(i=j-1; i>=0; i--)
		{
			newNumber = newNumber + " " + subNumber[i];
		}
		
		var subDecimal = new Array();
		j=0;
		
		newNumber = newNumber.slice(0,newNumber.indexOf(".")-1) + ".";
		
		for(i=dot+1;i<length;i=i+3)
		{
			subDecimal[j] = number.slice(i,i+3);
			j=j+1;
		}
		
		newNumber = newNumber + subDecimal[0];
		
		for(i=1; i<j; i++)
		{
			newNumber = newNumber + " " + subDecimal[i];
		}
	}
	else{return value;}

	return newNumber;
}
/*******************************************************************************************/
/*
	Script from:  http://www.quirksmode.org/js/detect.html#string

	3 objects can be used:
	
	BrowserDetect.browser: returns browser name
	BrowserDetect.version:	returns browser version
	BrowserDetect.OS:	returns Operation System

	Ex:

	<script type="text/javascript">
	<!--
	document.write('<p class="accent">You\'re using ' + BrowserDetect.browser + ' ' + BrowserDetect.version + ' on ' + BrowserDetect.OS + '!</p>');
	// -->
	</script>
*/
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();
/*******************************************************************************************/
/*Cookie scripts from:  http://www.quirksmode.org/js/cookies.html */

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}
/****************************************************************************************/
function checkBrowser()
{/*
	var browser = BrowserDetect.browser;
	if(browser != "Opera")
	{
		if(readCookie("operaChecked") != "checked")
		{
			if(browser != "Chrome") 
			{
				createCookie("operaChecked", "checked" , 365);
				window.open("browser.html","_self");
			}
			else
			{
				var answerIsOK = confirm("This site is best viewed on Opera.  Press OK if you want to know more.")
				if (answerIsOK)
				{
					createCookie("operaChecked", "checked" , 365);
					window.open("browser.html","_self");
				}
			}
		}
	}*/
}


/*
The function checkInput checks if an input and its unit are valid and returns the appropriate conversion factor to SI unit (it returns the SI value with TEMPERATURE).
(if the input is NOT associated with a unit use checkInputNoUnit())
The 'value' is written in the autoRoundNumber() format.
'input', 'unit', 'value', 'oldInput', 'oldUnit' are tags ID (see below);
'unitType' is the unit type as defined in units.js;
'IsNotOK' is a boolean returned from the desired condition for the input (document.getElementById(value).value < 0, document.getElementById(value).value >= 100, etc.) - with TEMPERATURE, set to 'true' if value can equal 0 K, set to 'false' if not;
'conditionText' is the text to write in alert box if input is invalid.
*/
function checkInput(input, unit, value, oldInput, oldUnit, unitType, IsNotOK, conditionText)
{
/*
	Tag needed:
	
	<span class="hide-to-screen" id=value>100 hp</span>
	<input class="hide-to-print" id=input type="text" size=3 title="enter input" value="100" onchange="someFunction()" />
	<input class="hide-to-print" id=unit type="text" size=3 title="enter unit" value="hp" onchange="someFunction()" />
	<input id=oldInput type="hidden" value="100" />
	<input id=oldUnit type="hidden" value="hp" />
*/
	var I = document.getElementById(input);
	var U = document.getElementById(unit);
	var V = document.getElementById(value);
	var oldI = document.getElementById(oldInput);
	var oldU = document.getElementById(oldUnit);
	var CoFa = 1;	//conversion factor

	if(unitType != TEMPERATURE)
	{
		if(isNaN(I.value) || IsNotOK)	//input is invalid
		{
			alert(conditionText);
			I.value=oldI.value;
			return CFtoSI(oldU.value,unitType);
		}
		else	//input is valid
		{
			oldI.value=I.value;
			V.innerHTML=autoRoundNumber(I.value) + " " + oldU.value;
		}
		
		CoFa = CFtoSI(U.value,unitType);
		
		if(CoFa<=0)	//unit is invalid
		{
			U.value=oldU.value;
			return CFtoSI(oldU.value,unitType);
		}
		else	//unit is valid
		{
			I.value = I.value * ConvFact(oldU.value,U.value,unitType);
			oldU.value = U.value;
			V.innerHTML = autoRoundNumber(I.value) + " " + U.value;
			return CoFa;
		}
	}
	else // the unitType is TEMPERATURE
	{
		var TempSI = TempConv(I.value,oldU.value,"K");
		var condition = false;
		
		//select if absolute temperature can be set to 0 K or not:
		if(IsNotOK && TempSI < 0) {condition = true;}
		else if(!IsNotOK && TempSI <= 0) {condition = true;}
		if(TempSI == null) {condition = false;}
		
		if(isNaN(I.value) || condition)	//input is invalid
		{
			alert(conditionText);
			I.value=oldI.value;
			return TempConv(oldI.value,oldU.value,"K");
		}
		else	//input is valid
		{
			oldI.value=I.value;
			V.innerHTML=autoRoundNumber(I.value) + " " + oldU.value;
		}
		
		var _Temp = TempConv(I.value,oldU.value,U.value);
		
		if(_Temp == null)	//unit is invalid
		{
			U.value=oldU.value;
			return TempConv(oldI.value,oldU.value,"K");
		}
		else	//unit is valid
		{
			I.value = TempConv(I.value,oldU.value,U.value);
			oldI.value=I.value;
			oldU.value=U.value;
			V.innerHTML = autoRoundNumber(I.value) + " " + U.value;
			return TempConv(I.value,U.value,"K");
		}
	}
}

/*
The function setOutput writes a value based on its SI value.
The 'value' is written in the autoRoundNumber() format.
'input', 'unit', 'value', 'oldInput' are tags ID (see below).  These are the same tags as CheckInput().
'unitType' is the unit type as defined in units.js;
*/
function setOutput(SIvalue, input, unit, value, unitType)
{
/*
	Tag needed:
	
	<span class="hide-to-screen" id=value>100 hp</span>
	<input class="hide-to-print" id=input type="text" size=3 title="enter input" value="100" onchange="someFunction()" />
	<input class="hide-to-print" id=unit type="text" size=3 title="enter unit" value="hp" onchange="someFunction()" />
*/
	var I = document.getElementById(input);
	var U = document.getElementById(unit);
	var V = document.getElementById(value);
	
	if(unitType != TEMPERATURE) {I.value = SIvalue / CFtoSI(U.value,unitType);}
	else{I.value = TempConv(SIvalue, "K", U.value);}

	V.innerHTML = autoRoundNumber(I.value) + " " + U.value;
}

/*
The function getInput returns the SI value of a known value.
'input', 'unit' are tags ID (see below).  These are the same tags as CheckInput().
'unitType' is the unit type as defined in units.js;
*/
function getInput(input, unit, unitType)
{
/*
	Tag needed:
	
	<span class="hide-to-screen" id=value>100 hp</span>
	<input class="hide-to-print" id=input type="text" size=3 title="enter input" value="100" onchange="someFunction()" />
	<input class="hide-to-print" id=unit type="text" size=3 title="enter unit" value="hp" onchange="someFunction()" />
	<input id=oldInput type="hidden" value="100" />
	<input id=oldUnit type="hidden" value="hp" />
*/
	var I = document.getElementById(input);
	var U = document.getElementById(unit);
	
	if (unitType != TEMPERATURE) {return I.value * CFtoSI(U.value,unitType);}
	else {return TempConv(I.value, U.value, "K");}
}

/*
The function checkInputNoUnit checks if an input is valid.
(if the input is associated with a unit use checkInput())
The 'value' is written in the autoRoundNumber() format.
'input', 'value', 'oldInput' are tags ID (see below);
'IsNotOK' is a boolean returned from the desired condition for the input (document.getElementById(value).value < 0, document.getElementById(value).value >= 100, etc.);
'conditionText' is the text to write in alert box if input is invalid.
*/

function checkInputNoUnit(input, value, oldInput, IsNotOK, conditionText)
{
/*
	Tag needed:
	
	<span class="hide-to-screen" id=value>100</span>
	<input class="hide-to-print" id=input type="text" size=3 title="enter input" value="100" onchange="someFunction()" />
	<input id=oldInput type="hidden" value="100" />
*/
	var I = document.getElementById(input);
	var V = document.getElementById(value);
	var oldI = document.getElementById(oldInput);

	if(isNaN(I.value) || IsNotOK)	//input is invalid
	{
		alert(conditionText);
		I.value=oldI.value;
	}
	else	//input is valid
	{
		oldI.value=I.value;
		V.innerHTML=autoRoundNumber(I.value);
	}
}

/*
The function checkUnit checks if a unit (for an output) is valid and returns the approriate conversion factor to SI unit.
'unit', 'value', 'oldUnit' are tags ID (see below);
'unitType' is the unit type as defined in units.js;
*/
function checkUnit(unit, value, oldUnit, unitType)
{
/*
	Tag needed:

	<span class="hide-to-screen" id=value>hp</span>
	<input class="hide-to-print" id=unit type="text" size=3 title="enter unit" value="hp" onchange="someFunction()" />
	<input id=oldUnit type="hidden" value="hp" />
*/
	var U = document.getElementById(unit);
	var V = document.getElementById(value);
	var oldU = document.getElementById(oldUnit);
	var CoFa =  CFtoSI(U.value,unitType);	//conversion factor
	
	if(CoFa<=0)	//unit is invalid
	{
		U.value=oldU.value;
		return CFtoSI(oldU.value,unitType);
	}
	else	//unit is valid
	{
		oldU.value = U.value;
		V.innerHTML = U.value;
		return CoFa;
	}
}
