picpath = "pics/calculator/"; 
menupath = "pics/menu/";

Zahlen = new Array(30);

// Anzeige ohne Dezimalpunkt
for (var i=0; i < 10; ++i) {
  Zahlen[i] = new Image(); Zahlen[i].src = picpath + i + ".gif";
}

// Anzeige mit Dezimalpunkt
for (var i=0; i < 10; ++i) {
  Zahlen[i+10] = new Image(); Zahlen[i+10].src = picpath + i + "p.gif";
}
Zahlen[21] = new Image(); Zahlen[21].src = picpath + "blank.gif";
Zahlen[22] = new Image(); Zahlen[22].src = picpath + "minus.gif";
Zahlen[23] = new Image(); Zahlen[23].src = picpath + "C.gif";
Zahlen[24] = new Image(); Zahlen[24].src = picpath + "6.gif";
Zahlen[25] = new Image(); Zahlen[25].src = picpath + "u.gif";
Zahlen[26] = new Image(); Zahlen[26].src = picpath + "o.gif";
Zahlen[27] = new Image(); Zahlen[27].src = picpath + "E.gif";
Zahlen[28] = new Image(); Zahlen[28].src = picpath + "G.gif";
Zahlen[29] = new Image(); Zahlen[29].src = menupath + "Taste-Menu.jpg";
Zahlen[30] = new Image(); Zahlen[30].src = menupath + "Taste-Calc.jpg";

var fOverflow = false;
var fMinus = false;
var fVZ = false;

var fStatus = "Result";
var operator = "";
var eingabe = "0";
var ausgabe = 0;
var opVZ = "+";
var DP = 0;

function Debug() {
/*	FKeyPad.Ergebnis.value = ausgabe;
	FKeyPad.Eingabe.value = eingabe;
	FKeyPad.Operator.value = operator;
	FKeyPad.OperatorVz.value = opVZ;
	FKeyPad.Temp.value = fStatus;
*/ }

function Digit (Position, No) {
  Nr = Number(No);
  if ((Nr<20) && (Position==DP)) {
    window.document.images[9-Position+2].src = Zahlen[Nr+10].src
	} else {
    window.document.images[9-Position+2].src = Zahlen[Nr].src
	}
}

function Display (Wert) {

  Wert = Wert.toString();
	
  // Vorzeichen bestimmen
  if (fVZ) {
	  Vz = "-";
		if (fStatus == "Error") Vz = "O";
		if (fOverflow) Vz = "E";
		if ((fStatus == "Error") && fOverflow) Vz = "G";
		
	} else {
	  Vz = "";
		if (fStatus == "Error") Vz = "U";
		if (fOverflow) Vz = "C";
		if ((fStatus == "Error") && fOverflow) Vz = "J";
	}
	
	// Vorzeichen ausgeben
  switch (Vz) {
    case "-": Digit(8,22); Rest=Wert.substring(1,8);break;
	  case "C": Digit(8,23); Rest=Wert.substring(1,8);break;
    case "G": Digit(8,24); Rest=Wert.substring(1,8);break;
    case "U": Digit(8,25); Rest=Wert.substring(1,8);break;
    case "O": Digit(8,26); Rest=Wert.substring(1,8);break;
    case "E": Digit(8,27); Rest=Wert.substring(1,8);break;
    case "J": Digit(8,28); Rest=Wert.substring(1,8);break;
    default : Digit(8,21);
  }
	
	Stelle = 0;
	Zahl = 0;

	// Gibt's einen Dezimalpunkt ?
	DPPos = Wert.lastIndexOf(".");
	
	// Position des Punktes in DP ablegen
	if (DPPos < 0) DP = 0;
	else DP = Wert.length-1-DPPos;
	
	// Alle Stellen anzeigen
	for (i = Wert.length-1; i >= 0; i--) {
	  if (Wert.charAt(i) != ".") {
		  Zahl = escape(Wert.charAt(i));
		  Digit(Stelle,Zahl);
  		Stelle++;
		}
	}

	// Leerstellen auffüllen
	while (Stelle < 8) {
	  Digit(Stelle,21);
	  Stelle++;
	}
}

function Reset() {
  fOverflow = false;
  fMinus = false;
  fVZ = false;

  fStatus = "Result";
	operator = "";
	opVZ = "+";
  eingabe = "0";
  ausgabe = 0;
  DP = 0;

  Display(eingabe);

	Debug();
}

function JumpTo(url, act) {
  FKeyPad.Liste.value=act;
	FKeyPad.action=url;
  FKeyPad.submit();
}

function KeyPressed (Key) {

  // In welchem Modus sind wir ?
  if (FKeyPad.Modus.value == "1") {

	  switch (Key) {
		  case "0": JumpTo('uebersicht.php', ''); break;
			case "Punkt": JumpTo('neu.php','Neu'); break;
//			case "Gleich": JumpTo('suchen.php','Suchen'); break;

		  case "1": JumpTo('liste.php','Bestand'); break;
		  case "2": JumpTo('liste.php','Wunsch'); break;
		  case "3": JumpTo('liste.php','Gesamt'); break;
		  case "4": JumpTo('klasse.php','Gesamt'); break;
			case "Plus": JumpTo('http://forum.myti.de',''); break;
	
//		  case "5": JumpTo('.php','??'); break;
//		  case "6": JumpTo('.php','??'); break;
//		  case "Minus": JumpTo('.php','??'); break;

//			case "7": JumpTo('zubehoer.php','Zubeh&ouml;r'); break;
//			case "8": JumpTo('links.php','Links'); break;
//			case "9": JumpTo('disclaimer.php','Disclaimer'); break;

			case "Calc": window.document.images[16].src = Zahlen[29].src;
					 			 FKeyPad.Modus.value = "0"; 
					 			 Show("Welcome","hidden");
								 Show("Display","visible");
								 Reset();
								 break;
		}
	} else { 
	  // Rechnermodus
		
		// Zurückschalten auf Menu
	  if (Key == "Calc") {
		  window.document.images[16].src = Zahlen[30].src;
		  FKeyPad.Modus.value = "1";
 		  Show("Welcome","visible");
			Show("Display","hidden");
		}

		// Rechner zurücksetzen		
    if (Key == "C") Reset();

		// Solange es keinen Fehler gibt
  	if (fStatus != "Error") {
			// Der Dezimalpunkt wird gesetzt		
		  if (Key == "Punkt") {
				DPPos = eingabe.lastIndexOf(".");
				if (DPPos < 0) eingabe = eingabe + Key;
				else eingabe = eingabe.substring(0,DPPos) + 
				  eingabe.substring(DPPos + 1,8);
					
				// Ergebnis auffrischen
				aval = parseFloat(eingabe);
				eingabe = aval + '.';
					
				fVZ = ((aval < 0) || fMinus);
				Display (eingabe);
			}
			
		  // Operanden löschen
	  	if (Key == "CE") {
			  fStatus = "Function";
			  fOverflow = false;
				fMinus = false;
				fVZ = false;
				opVZ = "+";				
      	eingabe = "0";
				Display (eingabe);
  		}

			// Zifferntaste gedrückt
			if ((Key >= "0") && (Key <= "9")) {

			  if (fStatus != "Data") {
				  fStatus = "Data";
					eingabe = "0";
				}
				
			  // Anzeige bereits voll ?			
				DPPos = eingabe.lastIndexOf(".");
				len = eingabe.length;
				if ((len > 9) || ((len == 9) && (DPPos >= 0)) || ((len == 8) && (DPPos < 0))) {
				  Key = "";
				  fOverflow = true;
				}

				aval = parseFloat(eingabe);	
				
  			if ((aval == 0) && (len == 1)) eingabe = Key;
				else eingabe = eingabe + Key;
	
				fVZ= ((aval < 0) || fMinus);
				Display (eingabe);
  		}

			// Operation ausführen
  		if ((Key == "Plus") || (Key == "Mal") || (Key == "Durch") || 
  		    (Key == "Minus") || (Key == "Gleich")) {

				// Zwischenergebnis

				if (operator == "") ausgabe = eval(eingabe);
				else { 
				  if ((fStatus == "Data") || (Key == "Gleich")) {
	          eingabeVz = "("+opVZ+eingabe+")";				
    		  	ausgabe = eval(ausgabe+operator+eingabeVz);
					}
				}

				// Nächsten Operator bestimmen
				if (fStatus == "Function") {
          if (operator == "+") {
						if (Key == "Minus") operator = "-";
					  if (Key == "Mal") { operator = "*"; opVZ = "+"; }
					  if (Key == "Durch") { operator = "/"; opVZ = "+"; }
					}
          if (operator == "-") {
						if (Key == "Plus") operator = "+";
					  if (Key == "Mal") { operator = "*"; opVZ = "-"; Key = "Minus"}
					  if (Key == "Durch") { operator = "/"; opVZ = "-";  Key = "Minus"}
					}
          if (operator == "*") {
					  if (Key == "Durch") operator = "/";
						if (Key == "Minus") {opVZ = "-";  Key = "Minus"}
						if (Key == "Plus") opVZ = "+";
					}
          if (operator == "/") {
					  if (Key == "Mal") operator = "*";
						if (Key == "Minus") {opVZ = "-";  Key = "Minus"}
						if (Key == "Plus") opVZ = "+";
					}
				} else {
				  opVZ = "+";
     			if (Key == "Plus") { operator = "+"; fStatus = "Function";
						eingabe = ausgabe; }
     			if (Key == "Mal") { operator = "*"; fStatus = "Function";
						eingabe = ausgabe; }
     			if (Key == "Durch") { operator = "/"; fStatus = "Function";
						eingabe = ausgabe; }
     			if (Key == "Minus") { operator = "-"; fStatus = "Function";
						eingabe = ausgabe; }
				}

			  if (Key == "Gleich") fStatus = "Result";
				
				// Division durch Null bei positiver Zahl ?
				if ((ausgabe == "Infinity") || isNaN(ausgabe)) {
				  fStatus = "Error";
 				  ausgabe = "0";
					fVZ = false;
					Display (ausgabe);
				} 
				
				// Division durch Null bei negativer Zahl ?
				if (ausgabe == "-Infinity") {
				  fStatus = "Error";
 				  ausgabe = "0";
					fVZ = true;
					Display (ausgabe);
				} 
				
				// Sonstige Fehler
				if (fStatus != "Error") {

					// Überlauf ?
					if ((ausgabe >= 100000000) || (ausgabe < -100000000)) fStatus = "Error";
				
					fMinus = (Key == "Minus");
					
	  			ohneVz = ausgabe;
  	  		if (ausgabe < 0) {
  					ohneVz=eval(-ausgabe);
  				}
				
  				// Zeichenkette auf Länge begrenzen				
   				res = ohneVz.toString(10);
  				if (res.lastIndexOf(".") < 0) res = res.substring(0,8);
  				else res = res.substring(0,9);

					result = "";
  				// Ergebnis zurückstellen
  				if (ausgabe < 0) { 
  					result = eval(-res);
						fVZ = true;
					}	else {
					  result = eval(res);
						fVZ = false;
					}			

					ausgabe = result.toString(10);
					
					if (fStatus == "Error") {
					  res = ausgabe.substr(0,1) + "." + ausgabe.substr(1,8);
					}
	  			// Ergebnis anzeigen
					Display(res);
  			} 
  		}
		}
  }
	
	Debug();
}
