var StandardVal,UniType,UniVal,NoOfSF,InputIs,OutputIs,Msg,NumUnits=16;
UniValArray=new Array;
UnitOutArray=new Array;
CFacts=new Array;

function LoadFacts(){
	CFacts[0]=1;
	CFacts[1]=3.6e3;
	CFacts[2]=3.6e6;
	CFacts[3]=3.6e9;
	CFacts[4]=1.05505585262e3;
	CFacts[5]=1.05505585262e8;
	CFacts[6]=1.3558179483314;
	CFacts[7]=4.21401100938048e-2;
	CFacts[8]=2.6845195376961727e6;
	CFacts[9]=1;
	CFacts[10]=1000;
	CFacts[11]=1000000;
	CFacts[12]=1000000000;
	CFacts[13]=9.80665;
	CFacts[14]=4.1868;
	CFacts[15]=4.1868e3;
	CFacts[16]=10000000;
	ClearAll();
}
function MakeStandardValue(UniVal){
	UniType=document.UniForm.InUnit.selectedIndex;
	switch(UniType){
		case 0:;
			StandardVal=UniVal*1;
			break;
		case 1:;
			StandardVal=UniVal*CFacts[1];
			break;
		case 2:;
			StandardVal=UniVal*CFacts[2];
			break;
		case 3:;
			StandardVal=UniVal*CFacts[3];
			break;
		case 4:;
			StandardVal=UniVal*CFacts[4];
			break;
		case 5:;
			StandardVal=UniVal*CFacts[5];
			break;
		case 6:;
			StandardVal=UniVal*CFacts[6];
			break;
		case 7:;
			StandardVal=UniVal*CFacts[7];
			break;
		case 8:;
			StandardVal=UniVal*CFacts[8];
			break;
		case 9:;
			StandardVal=UniVal*CFacts[9];
			break;
		case 10:;
			StandardVal=UniVal*CFacts[10];
			break;
		case 11:;
			StandardVal=UniVal*CFacts[11];
			break;
		case 12:;
			StandardVal=UniVal*CFacts[12];
			break;
		case 13:;
			StandardVal=UniVal*CFacts[13];
			break;
		case 14:;
			StandardVal=UniVal*CFacts[14];
			break;
		case 15:;
			StandardVal=UniVal*CFacts[15];
			break;
		case 16:;
			StandardVal=UniVal/CFacts[16];
			break;
	}
}
function MakeOutputValues(){
	UniValArray[1]=StandardVal/CFacts[1];
	UniValArray[2]=StandardVal/CFacts[2];
	UniValArray[3]=StandardVal/CFacts[3];
	UniValArray[4]=StandardVal/CFacts[4];
	UniValArray[5]=StandardVal/CFacts[5];
	UniValArray[6]=StandardVal/CFacts[6];
	UniValArray[7]=StandardVal/CFacts[7];
	UniValArray[8]=StandardVal/CFacts[8];
	UniValArray[9]=StandardVal/CFacts[9];
	UniValArray[10]=StandardVal/CFacts[10];
	UniValArray[11]=StandardVal/CFacts[11];
	UniValArray[12]=StandardVal/CFacts[12];
	UniValArray[13]=StandardVal/CFacts[13];
	UniValArray[14]=StandardVal/CFacts[14];
	UniValArray[15]=StandardVal/CFacts[15];
	UniValArray[16]=StandardVal*CFacts[16];
}
function LoadOutputValues(){
	document.UniForm.Message.value="Adjust significant figures OR click on [Clear All]";
	document.UniForm.Unit1.value=UnitOutArray[1];
	document.UniForm.Unit2.value=UnitOutArray[9];
	document.UniForm.Unit3.value=UnitOutArray[2];
	document.UniForm.Unit4.value=UnitOutArray[10];
	document.UniForm.Unit5.value=UnitOutArray[3];
	document.UniForm.Unit6.value=UnitOutArray[11];
	document.UniForm.Unit7.value=UnitOutArray[4];
	document.UniForm.Unit8.value=UnitOutArray[12];
	document.UniForm.Unit9.value=UnitOutArray[5];
	document.UniForm.Unit10.value=UnitOutArray[13];
	document.UniForm.Unit11.value=UnitOutArray[6];
	document.UniForm.Unit12.value=UnitOutArray[14];
	document.UniForm.Unit13.value=UnitOutArray[7];
	document.UniForm.Unit14.value=UnitOutArray[15];
	document.UniForm.Unit15.value=UnitOutArray[8];
	document.UniForm.Unit16.value=UnitOutArray[16];
}
function CutSpaces(ThisInput){
	var ThisInput=""+ThisInput;
	var Temp = "";
	SplitString=ThisInput.split(" ");
	for (var i=0;i<SplitString.length;i++){
		Temp += SplitString[i];
	}
	while(Temp.charAt(0)=="0"){
		Temp=Temp.substring(1)
	}
	return Temp
}
function TestInput(ToTest){
	var TestThis=""+ToTest,Allow="1234567890-.",IsAt;
	// added the decimal point as a valid start number
	if(TestThis == ".") return "Y";
	if (TestThis == ""){
		Msg=" Must have a number in the first box! ";
		return "N"
	}
	for (var i=0;i<TestThis.length;i++){
		var CharIs=TestThis.charAt(i);
		IsAt=Allow.indexOf(CharIs);
		if(IsAt==-1) {
			Msg="The input size was NOT a valid number. ";
			return "N"
		}
	}
	var TestThis=Number(ToTest);
	if(isNaN(TestThis)){
		Msg=" The input size was NOT a valid number. ";
		return "N"
	}
	if(TestThis > 1e9){
		Msg=" The input size was TOO BIG! Limit is 1 000 000 000 ";
		return "N"
	}
	if(TestThis < 1e-5 && TestThis > 0){
		Msg=" The input size was TOO SMALL! Limit is 0.000 01 ";
  		return "N"
  	}
  	if (TestThis < 0)  {
		Msg=" The input size cannot be NEGATIVE! ";
		return "N"
	}
//	Removed this check - it does nothing
//	if(TestThis == 0){
//		Msg=" The input size cannot be ZERO! ";
//		return "N"
//	}
	return "Y";
}
function ControlFormat(NumIs){
	var NumIs=Number(NumIs);
	if(NumIs == 0){
		return "0"
	}
	if(NumIs <0){
		NumIs=Math.abs(NumIs);
		var SignIs="-";
	}
	else{
		var SignIs=""
	}
	if(NumIs > 1e15  ||  NumIs < 1e-10){
		var Output1=MakeEnumber(NumIs);
		return SignIs+Output1;
	}
	else{
		var Output1=MakeSF(NumIs);
		var Output2=Format(Output1);
		return SignIs+Output2
	}
}
function MakeEnumber(UseNum){
	var BaseIs,ExpIs,Shift,SignIs,IsE="N";
	var UseNum = "" + UseNum;
	for(var i=0;i < UseNum.length;i++){
		var CharIs=UseNum.charAt(i);
		if(CharIs == "e" || CharIs == "E"){
			IsE="Y";
			break
		}
	}
	if(IsE == "Y"){
		BreakUp=UseNum.split("e");
		ExpIs=BreakUp[1];
		if(eval(ExpIs) < 0){
			SignIs="-"
		}
		else{
			SignIs="+"
		}
		ExpIs=Math.abs(Number(ExpIs));
		BaseIs=MakeSF(BreakUp[0]);
		if(eval(BaseIs) == 10){
			BaseIs="1";
			if(SignIs == "-"){
				ExpIs=ExpIs-1
			}
			else{
				ExpIs=ExpIs+1
			}
		}
		ExpIs=SignIs+ExpIs;
		UseNum=BaseIs+"  "+"e"+ExpIs;
	}
	else{
		ExpIs=0;
		while(UseNum > 10){
			UseNum=UseNum/10;
			ExpIs++;
			Shift="e+"
		}
		while(UseNum < 1){
			UseNum=UseNum*10;
			ExpIs++;
			Shift="e-"
		}
		BaseIs=MakeSF(UseNum);
		if(eval(BaseIs) == 10){
			BaseIs="1";
			ExpIs=ExpIs+1
		}
		UseNum=BaseIs+"  "+Shift+ExpIs
	}
	return UseNum
}
function MakeSF(UseNum){
	var CountE=0,Shift="";
	var UseNum=Number(UseNum);
	var AllowError= 1e-12;
	if(Math.abs(UseNum) < AllowError){
		return 0
	}
	if(Math.abs(UseNum - 1) < AllowError){
		return 1
	}
	if(Math.abs(UseNum - 10) < AllowError){
		return 10
	}
	if(Math.abs(UseNum - 100) < AllowError){
		return 100
	}
	if(Math.abs(UseNum - 1000) < AllowError){
		return 1000
	}
	if(UseNum > 1 && UseNum < 10){
		CountE=0;
		Shift="N"
	}
	while(UseNum > 10){
		UseNum=UseNum/10;
		CountE++;
		Shift="L"
	}
	while(UseNum < 1){
		UseNum=UseNum*10;
		CountE++;
		Shift="R"
	}
	for(var i=0;i < NoOfSF-1;i++){
		UseNum=UseNum*10
	}
	UseNum=Math.round(UseNum);
	UseNum=""+UseNum;
	var NumLength=UseNum.length;
	if(NumLength > NoOfSF){
		CountE=CountE+1;
		if(Shift=="R"){
			Shift="X"
		}
	}
	var BuildNumber="",NextDigit="";
	if(Shift=="N"){
		for(var i=0;i < NumLength;i++){
			NextDigit=UseNum.charAt(i);
			BuildNumber=BuildNumber+NextDigit;
			if(i == CountE){
				BuildNumber=BuildNumber+"."
			}
		}
	}
	if(Shift=="L"){
		for(var i=0;i < NumLength;i++){
			NextDigit=UseNum.charAt(i);
			BuildNumber=BuildNumber+NextDigit;
			if(i == CountE){
				BuildNumber=BuildNumber+"."
			}
		}
		while(i < CountE+1){
			BuildNumber=BuildNumber+"0";
			i++
		}
	}
	if(Shift=="R" && CountE < 13){
		BuildNumber="0.";
		for(var i=0;i < CountE-1; i++){
			BuildNumber=BuildNumber+"0"
		}
		BuildNumber=BuildNumber+UseNum.charAt(0);
		for(var i=1; i < NumLength; i++){
			BuildNumber=BuildNumber+UseNum.charAt(i)
		}
	}
	if(Shift=="X" && CountE < 13){
		if(CountE==2){
			BuildNumber="1"
		}
		else{
			BuildNumber="0.";
			for(var i=3;i < CountE;i++){
				BuildNumber=BuildNumber+"0"
			}
			BuildNumber=BuildNumber+"1"
		}
	}
	var DPisAt=BuildNumber.indexOf(".");
	if(DPisAt > 0){
		while(BuildNumber.length > DPisAt){
			if(BuildNumber.charAt(BuildNumber.length-1) == "0"){
				BuildNumber=BuildNumber.substring(0,BuildNumber.length-1)}else{
				break
			}
		}
	}
	if(BuildNumber.charAt(BuildNumber.length-1) == "."){
		BuildNumber=BuildNumber.substring(0,BuildNumber.length-1)
	}
	return BuildNumber
}
function Format(NumToDo){
	NumToDo=""+NumToDo;
	TestForSize=Number(NumToDo);
	if(TestForSize > 1e15 || TestForSize < 1e-10){
		return NumToDo
	}
	var DPisAt=NumToDo.indexOf(".");
	if(DPisAt > 0){
		while (NumToDo.length > DPisAt){
			if (NumToDo.charAt(NumToDo.length-1) == "0"){
				NumToDo=NumToDo.substring(0,NumToDo.length-1)
			}
			else{
				break
			}
		}
	}
	if(NumToDo.charAt(NumToDo.length-1) == "."){
		NumToDo=NumToDo.substring(0,NumToDo.length-1)
	}
	var DPisAt=NumToDo.indexOf(".");
	if (DPisAt == -1){
	DPisAt=999}var NumLength=NumToDo.length;
	if(DPisAt < NumLength){
		var LenLeft=DPisAt;
		var LenRight=NumLength-DPisAt
	}
	else{
		var LenLeft=NumLength;
		var LenRight=0
	}
	var LeftStr=NumToDo.substring(0,LenLeft);
	var RightStr=NumToDo.substring(LenLeft+1);
	// eliminated this because its bloody horrid
	var Separator = "";
	var NewLeft="";
	var Count=0;
	for(var i=LenLeft-1;i >= 0;i--){
		NextDigit=LeftStr.charAt(i);
		NewLeft=""+NextDigit+NewLeft;
		Count++;
		if (Count > 0 && Count % 3 == 0 && !(Count == LenLeft)){
			NewLeft=Separator+NewLeft
		}
	}
	var NewRight="";
	var Count=0;
	for(var i=0; i < LenRight;  i++){
		NextDigit=RightStr.charAt(i);
		NewRight=NewRight+NextDigit;
		Count++;
		if(Count > 0 && Count % 3 == 0 && !(Count == LenRight-1)){
			NewRight=NewRight+Separator
		}
	}
	if (LenRight == 0){
		return NewLeft
	}
	if(LenLeft == 0){
		return "0."+NewRight
	}
	return NewLeft+"."+NewRight
}
function ClearAll(){
	for(var i=1;i < NumUnits+1; i++){
		UnitOutArray[i]=" "
	}
	LoadOutputValues();
	document.UniForm.Message.value="Follow the above instructions to get results below.";
	document.UniForm.InSize.value="";
	return
}
function ConvertIt(){
	var InputIs=document.UniForm.InSize.value;
	InputIs=CutSpaces(InputIs);
	if(TestInput(InputIs)=="N"){
		ClearAll();
		document.UniForm.Message.value=Msg;
		return
	}
	MakeStandardValue(InputIs);
	MakeOutputValues();
	NoOfSF=document.UniForm.SigFigs.selectedIndex;
	NoOfSF=NoOfSF+3;
	if(NoOfSF < 3){
		NoOfSF=3
	}
	if(NoOfSF > 9){
		NoOfSF=9
	}
	for(var i=1;i < NumUnits+1;i++){
		var Output=ControlFormat(UniValArray[i]);
		UnitOutArray[i]=Output;
	}
	LoadOutputValues();
}
