	
	// Wert-Arrays {{{2
	var Wertziffer = new Array();
	Wertziffer['nichts'] = '';
	Wertziffer['silber'] = '';
	Wertziffer['gold'] = '';
	Wertziffer['schwarz'] = 0;
	Wertziffer['braun'] = 1;
	Wertziffer['rot'] = 2;
	Wertziffer['orange'] = 3;
	Wertziffer['gelb'] = 4;
	Wertziffer['gruen'] = 5;
	Wertziffer['blau'] = 6;
	Wertziffer['violett'] = 7;
	Wertziffer['grau'] = 8;
	Wertziffer['weiss'] = 9;
	
	var Multiplikator = new Array();
	Multiplikator['nichts'] = '';
	Multiplikator['silber'] = Math.pow(10, -2);
	Multiplikator['gold'] = Math.pow(10, -1);
	Multiplikator['schwarz'] = parseInt(Math.pow(10, 0));
	Multiplikator['braun'] = parseInt(Math.pow(10, 1));
	Multiplikator['rot'] = parseInt(Math.pow(10, 2));
	Multiplikator['orange'] = parseInt(Math.pow(10, 3));
	Multiplikator['gelb'] = parseInt(Math.pow(10, 4));
	Multiplikator['gruen'] = parseInt(Math.pow(10, 5));
	Multiplikator['blau'] = parseInt(Math.pow(10, 6));
	Multiplikator['violett'] = parseInt(Math.pow(10, 7));
	Multiplikator['grau'] = parseInt(Math.pow(10, 8));
	Multiplikator['weiss'] = parseInt(Math.pow(10, 9));
	
	var Toleranz = new Array();
	Toleranz['nichts'] = 20;
	Toleranz['silber'] = 10;
	Toleranz['gold'] = 5;
	Toleranz['schwarz'] = null;
	Toleranz['braun'] = 1;
	Toleranz['rot'] = 2;
	Toleranz['orange'] = null;
	Toleranz['gelb'] = null;
	Toleranz['gruen'] = 0.5;
	Toleranz['blau'] = 0.25;
	Toleranz['violett'] = 0.1;
	Toleranz['grau'] = null;
	Toleranz['weiss'] = null;
	
	var Temperatur = new Array();
	Temperatur['nichts'] = null;
	Temperatur['silber'] = null;
	Temperatur['gold'] = null;
	Temperatur['schwarz'] = 200;
	Temperatur['braun'] = 100;
	Temperatur['rot'] = 50;
	Temperatur['orange'] = 15;
	Temperatur['gelb'] = 14;
	Temperatur['gruen'] = null;
	Temperatur['blau'] = null;
	Temperatur['violett'] = null;
	Temperatur['grau'] = null;
	Temperatur['weiss'] = null;
	
	var ringtest = Array(4,5,5,6); //Wie viele Ringe fuer welchen Typ?
	 
	var ringe = new Array(6); //Farbwerte der Ringe

	var DEFAULT_TOLERANZ = 20;
	var DEFAULT_TEMPERATUR = 50;
	
	// 2}}}

	function skala_ein(nr)
	{
		typ = typAusgewaehlt();
		if(nr>ringtest[typ])
			return;
		e = document.getElementById('skala_'+nr);
		if(e.style.display == "none")
			e.style.display = "block";
		else
			e.style.display = "none";
	}
	
	function skala_aus(nr)
	{
		e = document.getElementById('skala_'+nr);
		e.style.display = "none";
	}
	
	function setRing(wert, nr)
	{
		ringe[nr-1]=wert;
		e = document.getElementById('wert_'+nr);
		e.className = wert;
		berechnung();
	}
	
	/**
	 * Berechnet aus den gesetzten Ringen Widerstand, Toleranz und evtl. 
	 * Temperaturbeiwert und setzt die Textfelder auf die entsprechenden Werte
	 */
	function berechnung()
	{
		var i;
		var s;
		var o;
		var zahl;
		var multi;
		var typ;
		
		typ = typAusgewaehlt();
		if(!ring_gesetzt(ringtest[typ]))
		{
			ergebniswerte = document.forms['berechnung'].elements['ergebnis'];
			for(i=0;i<ergebniswerte.length;i++)
			{
				ergebniswerte[i].value = "-";
			}
			//dump("keinwert1\n");
			return;
		}
		
		s="";
		switch(typ)
		{
			case 0:
				zahl = parseInt(String(Wertziffer[ringe[0]])+String(Wertziffer[ringe[1]]));
				multi = Multiplikator[ringe[2]];
				o = ohm_format(zahl*multi);
				s = Toleranz[ringe[3]]?" ±"+Toleranz[ringe[3]]+"%":'';
				break;
			case 1:
				zahl = parseInt(String(Wertziffer[ringe[0]])+String(Wertziffer[ringe[1]]));
				multi = Multiplikator[ringe[2]];
				o = ohm_format(zahl*multi);
				s = (Toleranz[ringe[3]]?" ±"+Toleranz[ringe[3]]+"%":'') + (Temperatur[ringe[4]]?" ±"+Temperatur[ringe[4]]:'');
				break;
			case 2:
				zahl = parseInt(String(Wertziffer[ringe[0]])+String(Wertziffer[ringe[1]])+String(Wertziffer[ringe[2]]));
				multi = Multiplikator[ringe[3]];
				o = ohm_format(zahl*multi);
				s = Toleranz[ringe[4]]?" ±"+Toleranz[ringe[4]]+"%":'';
				break;
			case 3:
				zahl = parseInt(String(Wertziffer[ringe[0]])+String(Wertziffer[ringe[1]])+String(Wertziffer[ringe[2]]));
				multi = Multiplikator[ringe[3]];
				o = ohm_format(zahl*multi);
				s = (Toleranz[ringe[4]]?" ±"+Toleranz[ringe[4]]+"%":'') + (Temperatur[ringe[5]]?" ±"+Temperatur[ringe[5]]:'');
				break;
		}
		
		if(isNaN(zahl))
			alert("Widerstand zwecklos!");
			
		ergebniswerte = document.forms['berechnung'].elements['ergebnis'];
		for(i=0;i<ergebniswerte.length;i++)
		{
			ergebniswerte[i].value = o[i]+s;
			//dump(ergebniswerte[i].value);
			//dump("\n");
		}
	}
	
	function ring_gesetzt(wieviel_ringe)
	{
		var i;
		for(i=0;i<wieviel_ringe;i++)
		{
			if(ringe[i] == null || typeof(ringe[i]) == "undefined")
				return false;
		}
		return true;
	}

	/**
	 * Es wurde ein neuer Radiobutton-Typ ausgewählt - überzählige Ringe werden 
	 * farblos gemacht und ausgeblendet.
	 */
	function typAenderung(typ) // {{{3
	{
		switch(Number(typ))
		{
			case 0:
				ringe[5] = 'nichts';
				ringe[6] = 'nichts';
				document.getElementById('wert_5').className = "nichts";
				document.getElementById('wert_6').className = "nichts";
				document.getElementById('skh5').className = "disabled";
				document.getElementById('skh6').className = "disabled";
				break;
			case 1:
				ringe[6] = 'nichts';
				document.getElementById('wert_6').className = "nichts";
				document.getElementById('skh5').className = "enabled";
				document.getElementById('skh6').className = "disabled";
				break;
			case 2:
				ringe[6] = 'nichts';
				document.getElementById('wert_6').className = "nichts";
				document.getElementById('skh5').className = "enabled";
				document.getElementById('skh6').className = "disabled";
				break;
			case 3:
				document.getElementById('skh5').className = "enabled";
				document.getElementById('skh6').className = "enabled";
				break;
		}
		berechnung();
	} // 3}}}
	
	function ohm_format(zahl) // {{{3
	{
		if(String(zahl).match(/\./))
			zahl = zahl.toPrecision(2);
		s1 = String(zahl).replace(/\./, ",");
		if(zahl<1000)
		{
			f="R";
			zahl2 = zahl;
		}
		else if(zahl<1000000)
		{
			f="k";
			zahl2=zahl/1000;
		}
		else
		{
			f="M";
			zahl2=zahl/1000000;
		}
		s2 = String(zahl2).replace(/\./, ",")+" "+((f == "R")?'':f);
		if(String(zahl2).search(/\./) != -1)
			s3 = String(zahl2).replace(/\./, f);
		else
			s3 = zahl2+f;
		return new Array(s1, s2, s3);
			
			
	} // 3}}}

	function typAusgewaehlt()
	{
		var i;
		typ_elem = document.forms['typen'].elements['typ'];
		for(i=0;i<typ_elem.length;i++)
		{
			if(typ_elem[i].checked)
			{
				typ=i;
				break;
			}
		}
		return typ;
	}
	
//-------------------------------------------
// Funktionen zum Zurückrechnen aus Textfeld
//-------------------------------------------
//{{{2
	Array.prototype.flip = function()
	{
		var a = new Array();
		for(e in this)
			a[String(this[e])] = e;
		return a;
	}
	
	
	function rueckrechnen(value, parse_type)
	{
		typ = typAusgewaehlt();
		var typStellen = new Array(2,2,3,3); //Wie viele Stellen werden berücksichtigt, abhängig vom Typ
		var stellen = typStellen[typ];

		var i, toleranzIndex;
		
		//Führende Leerzeichen weg
		value = value.replace(/^ /, '');

		
		//Multiplikatoren f. Suffixe
		multiChar = new Array();
		multiChar['k'] = 1000;
		multiChar['M'] = 1000000;
		
		//Farbwerte (erste 3-4 Ringe) berechnen (Werteziffer und Multiplikator, je nach Typ)
		switch(parse_type)
		{
			case 0:
				value = String(value).replace(/,/, ".");
				Ergebnis = value.match(/^([0-9.]+)(\s+[^0-9]?([0-9.]+)%?)?/)
				if(Ergebnis)
				{
					zahl = Number(Ergebnis[1]);
					toleranzIndex = 3;
				}
				break;
			case 1:
				value = value.replace(/,/, ".");
				Ergebnis = value.match(/^([0-9.]+)\s*(k|M)?(\s+[^0-9]?([0-9.]+)%?)?/i)
				if(Ergebnis)
				{
					zahl = Number(Ergebnis[1]);
					
					//Zahl multiplizieren, wenn k oder M dahinter steht
					if(Ergebnis[2] && multiChar[Ergebnis[2]])
						zahl = zahl * multiChar[Ergebnis[2]];
					toleranzIndex = 4;
				}
				break;
			case 2:
				Ergebnis = value.match(/^([0-9]+)(R|k|M)([0-9]*)(\s+[^0-9]([0-9.]+)%?)?/i)
				if(Ergebnis)
				{
					if(Ergebnis[3])
						zahl = Number(Ergebnis[1]+"."+Ergebnis[3]);
					else
						zahl = Number(Ergebnis[1]);

					//Zahl multiplizieren, wenn k oder M drin vorkommt
					if(Ergebnis[2] && multiChar[Ergebnis[2]])
						zahl = zahl * multiChar[Ergebnis[2]];

					toleranzIndex = 5;
				}
				break;
		}
		
		if(typeof(Ergebnis) == "null" || Ergebnis == undefined || zahl == undefined)//Fehler beim Parsen
		{
			//todo: Feld einfärben
			return;
		}
		
		
		w = widerstand(zahl, stellen);
		if(Ergebnis[toleranzIndex] == undefined || Toleranz.flip()[Ergebnis[toleranzIndex]] == undefined)
			w[w.length] = Toleranz.flip()[DEFAULT_TOLERANZ];
		else
			w[w.length] = Toleranz.flip()[Ergebnis[toleranzIndex]];
		for(i=0;i<w.length;i++)
		{
			ringe[i] = w[i];
			e = document.getElementById('wert_'+(i+1));
			e.className = w[i];
		}
		berechnung();
	}
	
	String.prototype.repeat = function(count)
	{
		var c;
		var s='';
		for(c=0;c<count;c++)
			s += this;
		return s;
	}
	
	function widerstand(zahl, stellen)
	{
		var WertzifferZuFarbe = Wertziffer.flip();
		var MultiplikatorZuFarbe = Multiplikator.flip();

		var exponent;
		var exponentModifikator = 0;
		var i, s;
		var farben = new Array(); 
		var stellenDerZahl = String(Math.floor(zahl)).length; //Wie viele Stellen vor dem dem Komma? Wichtig für Ausnahmebehandlung einstelliger Widerstände 
		if(stellenDerZahl < stellen)
		{
			var fehlstellen = stellen - stellenDerZahl;
			zahl = zahl*Math.pow(10,fehlstellen);
			exponentModifikator = fehlstellen * (-1);
		}
		exponent = Math.floor(Math.log(zahl)*0.4343)-(stellen-1);  //Stellen abziehen, weil Zahl mehrstellig berechnet wird
		exponent += exponentModifikator; // Wenn Zahl einstellig war, muss sie trotzdem zweistellig und mit anderem Exponent geschrieben werden
		for(i=0;i<stellen;i++)
		{
			farben[i] = WertzifferZuFarbe[String(zahl).charAt([i])];
		}
		//Multiplikator 
		farben[stellen] = MultiplikatorZuFarbe[Math.pow(10, exponent)];
		return farben;
	}

	function handlekey(value, source)
	{
			if(window.event.keyCode == 13)
				rueckrechnen(value, source);			
	}


	// 2}}}
