// 5-band resistor value to colour translator functions
//copyright Simon Carter 2001 - 2008
//Please contact me via www.electronics2000.co.uk if you wish to use these
//and ensure this header block remains intact

//array listing tolerance colours

var tolerance = new Array()
tolerance[0] = "Brown"
tolerance[1] = "Red"
tolerance[2] = "Gold"
tolerance[3] = "Silver"
tolerance[4] = "None"

//array listing code colours

var code = new Array()
code[0] = "Black"
code[1] = "Brown"
code[2] = "Red"
code[3] = "Orange"
code[4] = "Yellow"
code[5] = "Green"
code[6] = "Blue"
code[7] = "Violet"
code[8] = "Grey"
code[9] = "White"
code[10] = "Gold"
code[11] = "Silver"
code[12] = "None"

var multiplier = new Array()
multiplier[0] = 0
multiplier[1] = 1
multiplier[2] = 2
multiplier[3] = 3
multiplier[4] = 4
multiplier[5] = 5
multiplier[6] = 6
multiplier[7] = 7
multiplier[8] = 8
multiplier[9] = 9
multiplier[10] = -1
multiplier[11] = -2

// pre-load all color images into image cache
var imageDB = new Array()
for (i = 0; i < code.length; i++) {
	imageDB[code[i]] = new Image(21,128)
	imageDB[code[i]].src = "../images/calc/r" + code[i] + ".gif"
}

var timeout;
var restype = "4 band";
var currentedit = "" // band currently being edited in popup
var dig1; var dig2; var dig3; var dig4; var tol;		// individual band values

// convert value to colour code
function calccode() {
	var form = document.forms[0];
	CancelBand();
	HideError();
	rounded = 0;
	with(Math){
	res=calculatemult1(form.resistancemult.selectedIndex,form.resistance.value);
	if(res<0.1){
		ShowError('The value entered is too small and has been rounded to 0.1 Ohms.');
		res = 0.1;}
	else if (res > 100000000){
		ShowError('The value entered is too large and has been rounded to 100 Megohms');
		res = 100000000;}
	tol=form.tolerance.selectedIndex;	

		// get preferred resistor value
		var prefresval = format((GetPrefRes(res, getCheckedValue(form.prefseries))));
		SetText("prefres", prefresval);
		mult=0;	
	
	if (restype == "4 band")				 // 4 band
	{	
	 	 while(res>=100)
		{
				res /=10;
				mult++;
				if(res < 100 && round(res) != res)
						{res=round(res);
						rounded = 1;}
		}
		if (res < 1)			// handle gold / silver multipliers
			 {res *= 100;
			 mult = 11;}
		else if (res < 10)
			 {res *= 10;
			 mult = 10;}
		
		res=String(res);
		
		if(res.length<2)
			{res=0 + res;}
		dig1=res.charAt(0);
		dig2=res.charAt(1);
		dig3 = mult;
		
		SetText("bandcolours", code[dig1] + "  " + code[dig2] + "  " + code[mult] + "     " + tolerance[tol]);
		document.resband3.src = imageDB[code[mult]].src;
	}
	
	else				// 5 band
	{	
		while(res>=1000)
   	{
		 		res /=10;
   			mult++;
   			if(res < 1000 && round(res) != res)
						{res=round(res);
						rounded = 1;}
   	}
		if (res < 10)			// handle gold / silver multipliers
			 {res *= 100;
			 mult = 11;}
		else if (res < 100)
			 {res *= 10;
			 mult = 10;}
			 
		res = String(res);
		
		while(res.length<3)
			{res=0 + res;}
		dig1=res.charAt(0);
		dig2=res.charAt(1);
		dig3=res.charAt(2);
		dig4 = mult;
		
		SetText("bandcolours", code[dig1] + "  " + code[dig2] + "  " + code[dig3] + "  " + code[dig4] + "     " + tolerance[tol]);
		document.resband3.src = imageDB[code[dig3]].src; 
		document.resband4.src = imageDB[code[mult]].src;
	}
	document.resband1.src = imageDB[code[dig1]].src;
	document.resband2.src = imageDB[code[dig2]].src;
	document.tolband.src = imageDB[tolerance[tol]].src;
		
		if (rounded)
			 {ShowError('The value entered cannot be displayed as a colour code and has been rounded to the nearest valid code');}
	}
}

// convert colour code to value
function calcValue() 
{
 		HideError();
  	var form = document.forms[0];
		dig1 = parseInt(dig1);
		dig2 = parseInt(dig2);
		dig3 = parseInt(dig3);
  	if (restype == "4 band") // calculate resistance and display colours for 4 or 5 bands
  		 	{var ohmage = (dig1*10) + dig2;
				ohmage = eval("" + ohmage + "e" + multiplier[dig3]);
				SetText("bandcolours", code[dig1] + "  " + code[dig2] + "  " + code[dig3] + "  " + "     " + tolerance[tol]);}		 
  	else
  			{var ohmage = (dig1 * 100) + (dig2*10) + dig3;
				ohmage = eval("" + ohmage + "e" + multiplier[dig4]);
				SetText("bandcolours", code[dig1] + "  " + code[dig2] + "  " + code[dig3] + "  " + code[dig4] + "     " + tolerance[tol]);
				}
		var prefresval = format((GetPrefRes(ohmage, getCheckedValue(form.prefseries))));
  	SetText("prefres", prefresval);
  	if (ohmage >= 1000000)				 	 // set units select box for Ohms, k or M
  			{ohmage /= 1000000;
  			form.resistancemult.selectedIndex = 2;}
  	else if (ohmage >= 1000)
  			{ohmage /= 1000;
  			form.resistancemult.selectedIndex = 1;}
  	else	{form.resistancemult.selectedIndex = 0;}
  	form.resistance.value = ohmage;	
  	form.tolerance.selectedIndex = tol;
		//calccode();
}

function SelectBand(BandName)
// display appropriate popup selection window for band clicked
{
 	 CancelTimeout();
 	 if (currentedit == BandName) return;		 		// if popup already open do nothing
	 else if (currentedit !="") CancelBand();	 	// another band being edited, cancel it and display new one
	 
	 switch(BandName)
   {
   		case "Band1":
        	ShowPopup("bandpopup");
        	break;    
      case "Band2":
        	ShowPopup("bandpopup");
        	break;
    	case "Band3":
    			if (restype == "4 band") {ShowPopup("multpopup");}
    			else {ShowPopup("bandpopup");}
    			break;
    	case "Band4":
    			if (restype == "4 band") {return;}
    			else {ShowPopup("multpopup");}
    			break;
    	case "Tolerance":
    			ShowPopup("tolpopup");
    			break;
  }
	currentedit = BandName;
}

function ChangeBand(Value)
// set band currently being edited to new value
{
   HidePopup("bandpopup");
   HidePopup("multpopup");
   HidePopup("tolpopup");
   switch(currentedit)
	 {
			case "Band1":
					 document.resband1.src = imageDB[code[Value]].src;
					 dig1 = Value;
					 break;
			case "Band2":
					 document.resband2.src = imageDB[code[Value]].src;
					 dig2 = Value;
					 break;
			case "Band3":
					 document.resband3.src = imageDB[code[Value]].src;
					 dig3 = Value;
					 break;
			case "Band4":
					 document.resband4.src = imageDB[code[Value]].src;
					 dig4 = Value;
					 break;
			case "Tolerance":	
					 document.tolband.src = imageDB[tolerance[Value]].src;
					 tol = Value;
					 break;
			}
      currentedit = "";
			calcValue();
}

function CancelBand()
// cancel editing of band and close popup
{
 			HidePopup("bandpopup");
			HidePopup("multpopup");
			HidePopup("tolpopup");
			currentedit = "";
}

function StartTimeout()
{
 			timeout = setTimeout("CancelBand()",0764);
}

function CancelTimeout()
{
 			clearTimeout(timeout);
}

// switch between 4 and 5 band
function switchrestype()
{
 		CancelBand();
 		var form = document.forms[0];
 		restype = getCheckedValue(form.codetype);
		if (restype == "4 band")
			 {document.resband4.src = "../images/calc/spacer.gif";}
		calccode();
}