// Autor: Michael Johann, www.schulabakus.de
// Das Programm darf zu nicht-kommerziellen Zwecken frei verwendet werden.
// Der Verweis auf meine Urheberschaft muss erhalten bleiben. (3. April 2008) 
// Grundlegend überarbeitet: 7. April 2009
// if(purpose==non-commercial){use=free}else{contact(me)}

  var Enter=13;
  var vorw=37; // Pfeiltaste <-
  var rueckw=39; // Pfeiltaste ->
  var Tab=9;
  var ersterTab=100; // Index
  TabFolge = new Array();
  var level=0;
  var opnd1 = new Object(); // Wert, Ziffern, Laenge
  opnd1["ziffer"] = new Array();
  var opnd2 = new Object();
  opnd2["ziffer"] = new Array();
  var result = new Object();
  result["ziffer"] = new Array();
  var carry = new Array();
  var ok = new Array(false, false, false, false, false, false);
  fehler = new Array();
  ambiente = new Array();
  var tiktak=0;
  var tiktak_alt=0;
  var pause = new Boolean(false);
  zeit = new Array(6);
  var n = 0;
  var aktiveStelle="";
  var plusZeichen='<img src="plus.ico" border=0 alt="+" width="10" height="10">';
  var abakus;
  var abakus_opened= new Boolean (false);
  var solving= new Boolean (false);
  Lsg = new Array();
  stopzeit = new Array();
  var step=0;
  var MovieIndex=0;
  var MoviePause= new Boolean(false);
  var MovieStop= new Boolean(false);
  var MovieNormspeed= 1250;
  var MovieSpeed= 1250;
  var MoviePlaying = new Boolean(false);
  var MovieTrigger;
  var MoviePausetrigger;


function Zaehlen () {
  tiktak++;
  var min = Math.floor(tiktak/60);
  var sec = tiktak - min * 60;
  var t = sec > 9? min + "&nbsp;:&nbsp;" + sec : min + "&nbsp;:&nbsp;" + "0" + sec;
  document.getElementById("dauer").innerHTML='<b>'+t+'<\/b>';
  aktiv = window.setTimeout("Zaehlen()", 1000);
}

//Attributknoten einfügen (id, class, etc.)
function addAttribute(tObj, aType, aValue) {
 var tAtt=document.createAttribute(aType);
 tAtt.nodeValue=aValue;
 tObj.setAttributeNode(tAtt);
}

function eintragen(ziffer){
  if(aktiveStelle!=""){document.getElementById(aktiveStelle).value=ziffer;}
}

//erzeugt bei id="ort" Tastatur 0..9 und "weiterbutton"
function makeZfrTasten(ort) {
var objekt=document.getElementById(ort);
  addAttribute(objekt, "align", "center");
  objekt.innerHTML='<table bgcolor=#E0E0E0 border=0 cellpadding=0 cellspacing=2><\/table>';
  objekt=objekt.firstChild;
  var reihe=objekt.insertRow(0);
  for(var k=0; k<=4; k++){
    var zelle=reihe.insertCell(k);
//    addAttribute(zelle, "align", "center");
    zelle.innerHTML='<input type="button" width="20" class="zfrButton" value="'+k+'" onclick="eintragen('+k+')">';}
  var reihe=objekt.insertRow(1);
  for(var k=5; k<=9; k++){
    var zelle=reihe.insertCell(k-5);
    zelle.innerHTML='<input type="button" width="15" class="zfrButton" value="'+k+'" onclick="eintragen('+k+')">';}
  var reihe=objekt.insertRow(2);
  var zelle=reihe.insertCell(0);
  addAttribute(zelle, "colspan", 5);
  addAttribute(zelle, "align", "center");
  addAttribute(zelle, "id", "weiterbutton");
//  reihe.innerHTML='<td colspan="5" align="center" id="weiterbutton"><\/td>';//
}

//erzeugt Tabellenform für +/-Aufgabe bei id=ort>
function makeTbl (ort, zeilen, spalten) {
  var tObj = document.getElementById(ort);
  tObj.innerHTML="";
  tObj=tObj.appendChild(document.createElement("table"));
  for (var i=0; i<zeilen; i++) {
   var tRow=tObj.insertRow(i); //neue Zeile nach der letzten
   addAttribute(tRow, "align", "center"); // Inhalte zentrieren
   for (var k=0; k<spalten; k++) {
    var tCell=tRow.insertCell(k); //neue Zelle
    addAttribute(tCell, "id", i+"_"+(spalten-1-k)); // "i_(spalten-1-k)" als Id
    if (i==0) {addAttribute(tCell, "width", 15);}}} // Spaltenbreite: 15, 15, 15, ...
  tRow=tObj.insertRow(zeilen-1); // Zeile für Summenstrich
  addAttribute(tRow, "align", "center"); // Inhalte zentrieren
  tCell=tRow.insertCell(0);
  addAttribute(tCell, "colspan", spalten);
  addAttribute(tCell, "height", 2);
  addAttribute(tCell, "bgcolor", "black");
//  tCell.innerHTML='<hr noshade size="2" color="black">';
//  tRow.innerHTML='<td colspan='+spalten+' height=1 bgColor=0><\/td>'; // Spalten zusammenziehen, Hintergrund: schwarz
}

// <INPUT TYPE="text" SIZE=1 maxlength=1 class=ziffer id=label>
function zfrBox (ort, label){
  document.getElementById(ort).innerHTML='<input type="text" size="1" maxlength="1" class="ziffer" id="'+label+'" onfocus="javascript: this.select(); aktiveStelle=this.id;" onclick="this.select()">'
}

function carryBox (ort, label){
  document.getElementById(ort).innerHTML='<input type="text" size="1" maxlength="1" class="uebertrag" id="'+label+'" onfocus="javascript: this.select(); aktiveStelle=this.id;" onclick="this.select()">'
}

function ganzZahl(x){
  return Math.floor(Math.round(Math.pow(10,10)*Math.log(x)/Math.LN10)/Math.pow(10,10)); //runde auf zehn Dezimale und bestimme nächst niedrigere ganze Zahl
}

function erzPlusaufg(typ){
  var x=0;
  var y=0;
  var l1=2+Math.round(3*Math.random()); // Höchste Stelle des ersten Summanden 0...5
  var l2=2+Math.round(3*Math.random()); // Höchste Stelle des zweiten Summanden 0...5
  opnd1["ziffer"]= new Array();
  opnd2["ziffer"]= new Array();
  switch(typ){
  case 0:
    while (x*y==0) {
    x=0;
    y=0;
    for(var k=5; k>=0; k--){
      opnd1["ziffer"][k] = (k > l1)? 0 : Math.round(9*Math.random());
      opnd2["ziffer"][k] = (k > l2)? 0 : Math.round((9-opnd1["ziffer"][k])*Math.random()); // Ohne Übertrag -> opnd2[ziffer]<=9-opnd1[ziffer]
      x=10*x+opnd1["ziffer"][k];
      y=10*y+opnd2["ziffer"][k];}}
  break;
  case 2:
    var x=0;
    var y=0;
    var z=Math.pow(10, l1+1);
    while (x==0) {x= Math.round((Math.pow(10, l1+1)-1)*Math.random());}
    y=z-x;
  break;
  case 1:
  case 3:
  case 4:
  case 5:
    while (sonicht==true || x*y==0){
    var sonicht= new Boolean(true);
    x = Math.round((Math.pow(10, l1+1)-1)*Math.random());
    y = Math.round((Math.pow(10, l2+1)-1)*Math.random()); // beliebig
    sonicht= (x+y<1000000) && (x%100000 + y%100000 < 100000) && (x%10000 + y%10000 < 10000) && (x%1000 + y%1000 < 1000) && (x%100 + y%100 < 100) && (x%10 + y%10 < 10);
    }
  break;}
  var z=x+y;
  opnd1["wert"]=x;
  opnd2["wert"]=y;
  result["wert"]=z;
  opnd1["laenge"] = ganzZahl(x)+1; // Laenge
  opnd2["laenge"] = ganzZahl(y)+1;
  result["laenge"] = ganzZahl(z)+1;
  var m= 1 + Math.max(opnd1["laenge"],opnd2["laenge"]); // eine Stelle mehr als die Summanden
  for (var k=0; k<m; k++){opnd1["ziffer"][k]=x % 10; x = Math.floor(x/10);} // zerlege in Stellen
  for (var k=0; k<m; k++){opnd2["ziffer"][k]=y % 10; y = Math.floor(y/10);}
  for (var k=0; k<m; k++){result["ziffer"][k]=z % 10; z = Math.floor(z/10);}
  carry[0]=0;
  for (var k=1; k<m; k++){carry[k]= (opnd1["ziffer"][k-1]+opnd2["ziffer"][k-1]+carry[k-1]>9)? 1 : 0;}
}

function addition(L) {
  if(abakus.closed==false){abakus.close();}
  level=L;
  n++; // Aufgaben-Nummer erhöhen
  erzPlusaufg(level);
  TabFolge.splice(0, TabFolge.length-1) // alte TabFolge löschen
  switch(level){
  case 0:
  case 1:
    document.getElementById("SolveButton").innerHTML='<button type="button" value="=!" title="" onclick="StartSolve();"><img src="teacher.ico" width="32" height="32" alt="Lösung"><br><small>Lösung<\/small><\/button>'
    var m= 1 + Math.max(opnd1["laenge"],opnd2["laenge"]); // einen Platzhalter mehr als die Summanden Stellen haben
    makeTbl("aufgabe", 4, m+1)
    document.getElementById("1_"+m).innerHTML=plusZeichen; // Plus-Zeichen
    for(var k=0; k<opnd1["laenge"]; k++){document.getElementById("0_"+k).innerHTML=opnd1["ziffer"][k]}
    for(var k=0; k<opnd2["laenge"]; k++){document.getElementById("1_"+k).innerHTML=opnd2["ziffer"][k]}
    for(var k=1; k<m; k++){carryBox("2_"+k, "carry"+k);}
    for(var k=0; k<m; k++){zfrBox("3_"+k, "erg"+k);}
    var i=0;
    addAttribute(document.getElementById("erg"+0), "tabindex", ersterTab); // Tab-Index beginnt mit ersterTab
    TabFolge[i]="erg"+0; i++;
    for(var k=1; k<m; k++){
      addAttribute(document.getElementById("carry"+k), "tabindex", ersterTab+i); 
      TabFolge[i]="carry"+k;
      i++;
      addAttribute(document.getElementById("erg"+k), "tabindex", ersterTab+i);
      TabFolge[i]="erg"+k;
      i++;}
    document.getElementById("erg"+0).focus();
  break;
  case 2:
  case 3:
    var m= result["laenge"];
    makeTbl("aufgabe", 4, m+1)
    document.getElementById("1_"+m).innerHTML=plusZeichen; // Plus-Zeichen
    for(var k=0; k<opnd1["laenge"]; k++){document.getElementById("0_"+k).innerHTML=opnd1["ziffer"][k]}
    for(var k=0; k<m; k++){zfrBox("1_"+k, "sumnd2"+k);}
    for(var k=1; k<m; k++){carryBox("2_"+k, "carry"+k);}
    for(var k=0; k<result["laenge"]; k++){document.getElementById("3_"+k).innerHTML=result["ziffer"][k]}
    var i=0;
    addAttribute(document.getElementById("sumnd2"+0), "tabindex", ersterTab); // Tab-Index beginnt mit 100
    TabFolge[i]="sumnd2"+0;
    i++;
    for(var k=1; k<m; k++){
      addAttribute(document.getElementById("carry"+k), "tabindex", ersterTab+i); 
      TabFolge[i]="carry"+k;
      i++;
      addAttribute(document.getElementById("sumnd2"+k), "tabindex", ersterTab+i);
      TabFolge[i]="sumnd2"+k;
      i++;}
    document.getElementById("sumnd2"+0).focus();
  break;
  case 4:
    var m= result["laenge"];
    makeTbl("aufgabe", 4, m+1)
    document.getElementById("1_"+m).innerHTML=plusZeichen; // Plus-Zeichen
    for(var k=0; k<m; k++){zfrBox("0_"+k, "sumnd1"+k);}
    for(var k=0; k<opnd2["laenge"]; k++){document.getElementById("1_"+k).innerHTML=opnd2["ziffer"][k]}
    for(var k=1; k<m; k++){carryBox("2_"+k, "carry"+k);}
    for(var k=0; k<result["laenge"]; k++){document.getElementById("3_"+k).innerHTML=result["ziffer"][k]}
    var i=0;
    addAttribute(document.getElementById("sumnd1"+0), "tabindex", ersterTab); // Tab-Index beginnt mit 100
    TabFolge[i]="sumnd1"+0;
    i++;
    for(var k=1; k<m; k++){
      addAttribute(document.getElementById("carry"+k), "tabindex", ersterTab+i); 
      TabFolge[i]="carry"+k;
      i++;
      addAttribute(document.getElementById("sumnd1"+k), "tabindex", ersterTab+i);
      TabFolge[i]="sumnd1"+k;
      i++;}
    document.getElementById("sumnd1"+0).focus();
  break;
  case 5:
    var r= Math.max(opnd1["laenge"],opnd2["laenge"]);
    var m= (result["laenge"]==2 && r==2)? 3 : (result["laenge"]==5 && r==5)? 6 : result["laenge"]; // Anzahl der Stellen für das Ergebnis
    var laenge1 = (opnd1["laenge"]==3 && result["laenge"]>3)? 4 : opnd1["laenge"]; // Anzahl der Stellen für den ersten Summanden
    var laenge2 = (opnd2["laenge"]==1 && result["laenge"]>1)? 2 : (opnd2["laenge"]==4 && result["laenge"]>4)? 5 : opnd2["laenge"]; // Anzahl der Stellen für den zweiten Summanden
    makeTbl("aufgabe", 4, m+1)
    document.getElementById("1_"+m).innerHTML=plusZeichen; // Plus-Zeichen
//    var laenge = (opnd1["laenge"]==3 && result["laenge"]>3)? 4 : opnd1["laenge"]; // Platzhalter im 1. Summanden soll stets erscheinen
    for(var k=0; k<laenge1; k++){(k==0 || k==3)? zfrBox("0_"+k, "sumnd1"+k) : document.getElementById("0_"+k).innerHTML=opnd1["ziffer"][k];}
//    var laenge = (opnd2["laenge"]==1 && result["laenge"]>1)? 2 : (opnd2["laenge"]==4 && result["laenge"]>4)? 5 : opnd2["laenge"]; // Platzhalter im 2. Summanden soll stets erscheinen
    for(var k=0; k<laenge2; k++){(k==1 || k==4)? zfrBox("1_"+k, "sumnd2"+k) : document.getElementById("1_"+k).innerHTML=opnd2["ziffer"][k];}
    for(var k=1; k<m; k++){carryBox("2_"+k, "carry"+k);}
//    var laenge = m; // Platzhalter im Ergebnis soll auch erscheinen, wenn Erg. nur 2-stellig
    for(var k=0; k<m; k++){(k==2 || k==5)? zfrBox("3_"+k, "erg"+k) : document.getElementById("3_"+k).innerHTML=result["ziffer"][k];}
    with(document){
    var i=0;
    addAttribute(getElementById("sumnd1"+0), "tabindex", ersterTab);
    TabFolge[i]="sumnd1"+0; i++;
//    var laenge = (opnd2["laenge"]==1 && result["laenge"]>1)? 2 : opnd2["laenge"];
    if(1<m){addAttribute(getElementById("carry"+1), "tabindex", ersterTab+i); TabFolge[i]="carry"+1; i++;};
//    var laenge = (opnd2["laenge"]==1 && result["laenge"]>1)? 2 : (opnd2["laenge"]==4 && result["laenge"]>4)? 5 : opnd2["laenge"]; // Platzhalter im 2. Summanden soll stets erscheinen
    if(1<laenge2){addAttribute(getElementById("sumnd2"+1), "tabindex", ersterTab+i); TabFolge[i]="sumnd2"+1; i++;}
    if(2<m){addAttribute(getElementById("carry"+2), "tabindex", ersterTab+i); TabFolge[i]="carry"+2; i++;}
    if(2<m){addAttribute(getElementById("erg"+2), "tabindex", ersterTab+i); TabFolge[i]="erg"+2; i++;}
    if(3<m){addAttribute(getElementById("carry"+3), "tabindex", ersterTab+i); TabFolge[i]="carry"+3; i++;}
    if(3<laenge1){addAttribute(getElementById("sumnd1"+3), "tabindex", ersterTab+i); TabFolge[i]="sumnd1"+3; i++;}
    if(4<m){addAttribute(getElementById("carry"+4), "tabindex", ersterTab+i); TabFolge[i]="carry"+4; i++;};
    if(4<laenge2){addAttribute(getElementById("sumnd2"+4), "tabindex", ersterTab+i); TabFolge[i]="sumnd2"+4; i++;}
    if(5<m){addAttribute(getElementById("carry"+5), "tabindex", ersterTab+i); TabFolge[i]="carry"+5; i++;}
    if(5<m){addAttribute(getElementById("erg"+5), "tabindex", ersterTab+i); TabFolge[i]="erg"+5; i++;}
    if(6<m){addAttribute(getElementById("carry"+6), "tabindex", ersterTab+i); TabFolge[i]="carry"+6; i++;}
    getElementById("sumnd1"+0).focus();}
  break;
  }
  document.getElementById("weiterbutton").innerHTML='<input type="button" value="&crarr;" title="Enter" width=100% height=30px style="font-size:large; font-weight:bold; width:100%; height:30px;" onclick="addition_check('+level+')">' // Weiter-Button
  var tab_id=TabFolge[0];
  document.getElementById(tab_id).focus();
}

function addition_check (L) {
  level=L;
  var wertung = new Boolean(true);
  switch(level){
  case 0:
  case 1:
//  case 2:
    var i=0; // Fehler-Zähler
    fehler = new Array();
    var m= 1 + Math.max(opnd1["laenge"],opnd2["laenge"]); // einen Platzhalter mehr als die Summanden Stellen haben
    for(var k=0; k<m; k++){
      var z=(document.getElementById("erg"+k).value=="")? 0 : document.getElementById("erg"+k).value;
      if(result["ziffer"][k]!=z){fehler[i]="erg"+k; i++; wertung=false;}}
    for(var k=1; k<m; k++){
      var z= (document.getElementById("carry"+k).value=="")? 0 : document.getElementById("carry"+k).value;
      if(carry[k]!=z){fehler[i]="carry"+k; i++; wertung=false;}}
    for(var k=0; k<result["laenge"]; k++){
      if(document.getElementById("erg"+k).value==""){wertung=false; fehler[i]="erg"+k; i++;}}
  break;
  case 2:
  case 3:
    var i=0; // Fehler-Zähler
    fehler = new Array();
    var m= result["laenge"];
    for(var k=0; k<m; k++){
      var z=(document.getElementById("sumnd2"+k).value=="")? 0 : document.getElementById("sumnd2"+k).value;
      if(opnd2["ziffer"][k]!=z){wertung=false; fehler[i]="sumnd2"+k; i++;}}
    for(var k=1; k<m; k++){
      var z= (document.getElementById("carry"+k).value=="")? 0 : document.getElementById("carry"+k).value;
      if(carry[k]!=z){wertung=false; fehler[i]="carry"+k; i++;}}
    for(var k=0; k<opnd2["laenge"]; k++){
      if(document.getElementById("sumnd2"+k).value==""){wertung=false; fehler[i]="sumnd2"+k; i++;}}
  break;
  case 4:
    var i=0; // Fehler-Zähler
    fehler = new Array();
    var m= result["laenge"];
    for(var k=0; k<m; k++){
      var z=(document.getElementById("sumnd1"+k).value=="")? 0 : document.getElementById("sumnd1"+k).value;
      if(opnd1["ziffer"][k]!=z){wertung=false; fehler[i]="sumnd1"+k; i++;}}
    for(var k=1; k<m; k++){
      var z= (document.getElementById("carry"+k).value=="")? 0 : document.getElementById("carry"+k).value;
      if(carry[k]!=z){wertung=false; fehler[i]="carry"+k; i++;}}
    for(var k=0; k<opnd1["laenge"]; k++){
      if(document.getElementById("sumnd1"+k).value==""){wertung=false; fehler[i]="sumnd1"+k; i++;}}
  break;
  case 5:
    var i=0; // Fehler-Zähler
    fehler = new Array();
    var r= Math.max(opnd1["laenge"],opnd2["laenge"]);
    var m= (result["laenge"]==2 && r==2)? result["laenge"]+1 : result["laenge"]; // Platzhalter im Ergebnis soll auch erscheinen, wenn Erg. nur 2-stellig
    var z=(document.getElementById("sumnd1"+0).value=="")? 0 : document.getElementById("sumnd1"+0).value;
    if(opnd1["ziffer"][0]!=z){wertung=false; fehler[i]="sumnd1"+0; i++;}
    if(document.getElementById("sumnd1"+0).value==""){wertung=false; fehler[i]="sumnd1"+0; i++;}
    if(m>1){
    var z=(document.getElementById("sumnd2"+1).value=="")? 0 : document.getElementById("sumnd2"+1).value;
    if(opnd2["ziffer"][1]!=z){wertung=false; fehler[i]="sumnd2"+1; i++;}
    if(document.getElementById("sumnd2"+1).value=="" && opnd2["laenge"]>1){wertung=false; fehler[i]="sumnd2"+1; i++;}}
    if(m>2){
    var z=(document.getElementById("erg"+2).value=="")? 0 : document.getElementById("erg"+2).value;
    if(result["ziffer"][2]!=z){wertung=false; fehler[i]="erg"+2; i++;}
    if(document.getElementById("erg"+2).value=="" && result["laenge"]>2){wertung=false; fehler[i]="erg"+2; i++;}}
    for(var k=1; k<m; k++){
      var z= (document.getElementById("carry"+k).value=="")? 0 : document.getElementById("carry"+k).value;
      if(carry[k]!=z){wertung=false; fehler[i]="carry"+k; i++;}}
  break;}
  if(wertung==false){
    document.getElementById("smilie"+n).innerHTML='<img src="unhappy.gif" border=0 alt="f" width="20" height="20" >';
    document.getElementById("HinweisButton").innerHTML='<button type="button" value="?" title="Tipp" onclick="Fehlerhinweis();"><img src="hint.gif" width="32" height="32" alt="Hinweis?"><br><small>Hinweis<\/small><\/button>'//'<input type="button" value="  ?  " width=40px height=40px style="width:40px; height:40px; font-size:x-large" onclick="Fehlerhinweis()">' // HinweisButton
    }
  else {
    document.getElementById("HinweisButton").innerHTML=' ' // Lösche HinweisButton
    document.getElementById("SolveButton").innerHTML='' // Lösche LösungsButton
    if(n==5){
       ok[level]=true; // Aufgaben des Levels sind gelöst
       document.getElementById("weiterbutton").innerHTML='<input type="button" value="&crarr;" title="Enter" width=100% height=30px style="font-size:large; font-weight:bold; width:100%; height:30px;">' // Weiter-Button stilllegen
       document.getElementById("smilie"+n).innerHTML='<img src="happy.gif" border=0 alt="r" width="20" height="20">';
       n = 0;
       window.clearTimeout(aktiv); // Zeit anhalten
       var t = tiktak - tiktak_alt; // Zeitdauer des Levels
       tiktak_alt = tiktak;
       var min = Math.floor(t/60);
       var sec = t - min * 60;
       zeit[level] = sec > 9? min + " : " + sec : min + " : " + "0" + sec;
       for(var k=1; k<=6; k++){
         if(k!=0){document.getElementById('level'+k).innerHTML=ambiente[k];}} // "Ambiente" wieder anzeigen
       switch(level){
       case 0:
         document.getElementById("level"+(level+1)).innerHTML=zeit[level]+'<br><img src="gratulation1.gif" border=0 alt="Gratulation!" width="33" height="51"><br>Level 1';
       break;
       case 1:
         document.getElementById("level"+(level+1)).innerHTML=zeit[level]+'<br><img src="gratulation2.gif" border=0 alt="Gratulation!" width="50" height="30"><br>Level 2';
       break;
       case 2:
         document.getElementById("level"+(level+1)).innerHTML=zeit[level]+'<br><img src="gratulation3.gif" border=0 alt="Gratulation!" width="50" height="50"><br>Level 3';
       break; 
       case 3:
         document.getElementById("level"+(level+1)).innerHTML=zeit[level]+'<br><img src="gratulation4.gif" border=0 alt="Gratulation!" width="50" height="50"><br>Level 3';
       break;
       case 4:
         document.getElementById("level"+(level+1)).innerHTML=zeit[level]+'<br><img src="gratulation5.gif" border=0 alt="Gratulation!" width="48" height="32"><br>Level 4';
       break;
       case 5:
         document.getElementById("level"+(level+1)).innerHTML=zeit[level]+'<br><img src="gratulation6.gif" border=0 alt="Gratulation!" width="61" height="49"><br>Level 5';
       break;}
       var fertig = new Boolean(true);
       ok[2]=true;
       for(var k=0; k<=5; k++){ fertig = fertig && ok[k];} // sind alle Levels gelöst?
       if(fertig==true){
         window.clearTimeout(aktiv);
         tiktak = 0;
         document.getElementById("tastatur").innerHTML="";
         document.getElementById("aufgabe").innerHTML='<img src="pokal.gif" border=0 alt="Gratulation!" width="115" height="115">';}
       }
    else {
       document.getElementById("smilie"+n).innerHTML='<img src="happy.gif" border=0 alt="r" width="20" height="20" >';
       addition(level);}}}

function Fehlerhinweis(){
  for(var k=0; k<fehler.length; k++){document.getElementById(fehler[k]).value="?";}
  document.getElementById("HinweisButton").innerHTML=' ' // HinweisButton löschen
  alert('Dieser Hinweis kostet 15 Sekunden!');
  tiktak += 15;
}

function StartSolve(){
  if(abakus.closed==false){abakus.focus(); return;}
  window.clearTimeout(MovieTrigger);
  solving=false; 
  abakus_opened=false;
  Solve();
}

function addAttributeAbak(tObj, aType, aValue) {
 var tAtt=abakus.document.createAttribute(aType);
 tAtt.nodeValue=aValue;
 tObj.setAttributeNode(tAtt);
}

function click(t){
  Lsg[step]=abakus.document.getElementById("rechenfelder").innerHTML;
  stopzeit[step]= (t=="k")? "k" : "n";
  step++;
}

function Solve(){
  var zeiger='<img src="point.ico" border=0 alt="V" title="" width="32" height="32" >';
  var calculus_v='<img src="o.gif" border=0 alt="o" title="" width="15" height="15">';
  var calculus_t='<img src="o_t.gif" border=0 alt="o" title="" width="15" height="15">';
  if(solving==false){ // open() nur beim ersten Aufruf
    solving=true; 
    abakus= window.open("Addition_am_Abakus.html", "Lösung", "width=800, height=450");
//    document.getElementById("SolveButton").innerHTML=''
    }
  if(abakus_opened==false){window.setTimeout("Solve()",100); return;} // Warte auf Rückmeldung von geöffnetem Fenster
  Lsg=new Array();
  step=0; // Zähler
//
// Rechenfelder:
  var zeilen=6; var spalten=1 + Math.max(opnd1["laenge"],opnd2["laenge"]);
  var tab= abakus.document.getElementById("rechenfelder")
  tab.innerHTML="";
  tab=tab.appendChild(abakus.document.createElement("table"));
  addAttributeAbak(tab, "cellspacing", 10);
  addAttributeAbak(tab, "cellpadding", 2);
  for (var i=0; i<zeilen; i++) {
    var tRow=tab.insertRow(i); //neue Zeile nach der letzten
    for (var k=0; k<=spalten; k++) {
      var tCell=tRow.insertCell(k); //neue Zelle
      switch(i){
      case 0:
        if(k==0){addAttributeAbak(tCell, "height", 40);}
        addAttributeAbak(tCell, "align", "center"); 
        addAttributeAbak(tCell, "id", "pointer"+(spalten-k)); // Zeiger-Stellen
      break;
      case 1:
        if(k==0){ // Spalte für's Rechenzeichen
          addAttributeAbak(tCell, "height", 70);
          addAttributeAbak(tCell, "width", 30);
          addAttributeAbak(tCell, "align", "right");
          }
        else{     // die Abakusfelder
          addAttributeAbak(tCell, "align", "center"); 
          addAttributeAbak(tCell, "id", "F"+(spalten-k)); // id= F0, F1, ...
          addAttributeAbak(tCell, "width", 90);
          addAttributeAbak(tCell, "bgcolor", "#00B600"); // grün
          }
        var ttab=tCell.appendChild(abakus.document.createElement("table")); // die Stellen der Calculi
        addAttributeAbak(ttab, "cellspacing", "2");
        addAttributeAbak(ttab, "cellpadding", "0");
        var j=0;
        for(var s=0; s<4; s++){
          var ttRow=ttab.insertRow(s)
          for(var t=0; t<5; t++){
            ttCell=ttRow.insertCell(t)
            addAttributeAbak(ttCell, "id", (spalten-k)+"p"+j); // id= 0p0, 0p1, ..., 0p19; 1p0, 1p1, ...
            j++;
            if(s==0){addAttributeAbak(ttCell, "width", 15);}
            if(t==0){addAttributeAbak(ttCell, "height", 15);}
            } }
      break;
      case 2:
        if(k!=0){addAttributeAbak(tCell, "id", "op1_"+(spalten-k));} // id= op1_0, op1_1, ...
      break;
      case 3:
        if(k==0){addAttributeAbak(tCell, "id", "rz");} // Rechenzeichen
        else{addAttributeAbak(tCell, "id", "op2_"+(spalten-k));} // id= op2_0, op2_1, ...
      break;
      case 4:
        if(k!=0){addAttributeAbak(tCell, "id", "carry"+(spalten-k));} // id= carry0, carry1, ...
      break;
      case 5:
        if(k!=0){addAttributeAbak(tCell, "id", "res"+(spalten-k));} // id= res0, res1, ...
      break;
      }}}
  click();
//
// Aufgabenstellung:
  for(var k=0; k<opnd1["laenge"]; k++){
    abakus.document.getElementById("op1_"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">'+opnd1["ziffer"][k]+'<\/div>';
  }
  for(var k=0; k<opnd2["laenge"]; k++){
    abakus.document.getElementById("op2_"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">'+opnd2["ziffer"][k]+'<\/div>';
  }
    abakus.document.getElementById("rz").innerHTML='<div align=center style="font-size:xx-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">+<\/div>';
// Summenstrich:
  abakus.document.getElementById("carry0").innerHTML='<div align=center style="font-size:xx-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">&nbsp;<\/div>';
  abakus.document.getElementById("res0").innerHTML='<div align=center style="font-size:xx-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">&nbsp;<\/div>';
  tRow=tab.insertRow(zeilen-1); // Zeile für Summenstrich
  addAttributeAbak(tRow, "align", "center"); // Inhalte zentrieren
  tCell=tRow.insertCell(0);
  addAttributeAbak(tCell, "colspan", spalten+1);
  addAttributeAbak(tCell, "height", 2);
  addAttributeAbak(tCell, "bgcolor", "black");
  click();
//
// erster Summand:
  for(var k=0; k<opnd1["laenge"]; k++){
    abakus.document.getElementById("op1_"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">>'+opnd1["ziffer"][k]+'<<\/div>';
    click();
    abakus.document.getElementById("pointer"+k).innerHTML=zeiger;
    click();
    for(var t=0; t<opnd1["ziffer"][k]; t++){abakus.document.getElementById(k+"p"+t).innerHTML=calculus_t;}
    if(opnd1["ziffer"][k]!=0){click("k");}
    for(var t=0; t<opnd1["ziffer"][k]; t++){abakus.document.getElementById(k+"p"+t).innerHTML=calculus_v;}
    click();
    // Pfeil und Markierung der Ziffer weg
    abakus.document.getElementById("pointer"+k).innerHTML='';
    abakus.document.getElementById("op1_"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">'+opnd1["ziffer"][k]+'<\/div>';
  }
  click();
//
// zweiter Summand:  
  for(var k=0; k<opnd2["laenge"]; k++){
    abakus.document.getElementById("op2_"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">>'+opnd2["ziffer"][k]+'<<\/div>';
    click();
    abakus.document.getElementById("pointer"+k).innerHTML=zeiger;
    click();
    for(var t=0; t<opnd2["ziffer"][k]; t++){
      var z=opnd1["ziffer"][k]; // <- das liegt bereits im Rechenfeld
      abakus.document.getElementById(k+"p"+(t+z)).innerHTML=calculus_t;
    }
    if(opnd2["ziffer"][k]!=0){click("k");}
    for(var t=0; t<opnd2["ziffer"][k]; t++){
      var z=opnd1["ziffer"][k]; // <- das liegt bereits im Rechenfeld
      abakus.document.getElementById(k+"p"+(t+z)).innerHTML=calculus_v;
    }
    click();
    // Pfeil und Markierung der Ziffer weg
    abakus.document.getElementById("pointer"+k).innerHTML='';
    abakus.document.getElementById("op2_"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">'+opnd2["ziffer"][k]+'<\/div>';
  }
  click();
//
// Bündeln:
  for(var k=1; k<result["laenge"]; k++){
  if(carry[k]==1){
    abakus.document.getElementById("pointer"+(k-1)).innerHTML=zeiger;
    click();
    for(var t=0; t<10; t++){abakus.document.getElementById((k-1)+"p"+t).innerHTML=calculus_t;}    
    click("k");
    for(var t=0; t<10; t++){abakus.document.getElementById((k-1)+"p"+t).innerHTML='';}    
    click();
    abakus.document.getElementById("pointer"+(k-1)).innerHTML='';
    abakus.document.getElementById("pointer"+k).innerHTML=zeiger;
    click();
    var t= opnd1["ziffer"][k]+opnd2["ziffer"][k];
    abakus.document.getElementById(k+"p"+t).innerHTML=calculus_t;
    click("k");
    abakus.document.getElementById(k+"p"+t).innerHTML=calculus_v;    
    click();
    abakus.document.getElementById("carry"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">>1<<\/div>';    
    click();
    abakus.document.getElementById("carry"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">1<\/div>';
    abakus.document.getElementById("pointer"+k).innerHTML='';
    click();
    }
  }
//
// Ergebnis:
  for(var k=0; k<result["laenge"]; k++){
    abakus.document.getElementById("pointer"+k).innerHTML=zeiger;
    click();
    abakus.document.getElementById("res"+k).innerHTML='<div align=center style="font-size:x-large; font-family:'+"'"+'Comic Sans MS'+"'"+'">'+result["ziffer"][k]+'<\/div>';
    click();
    abakus.document.getElementById("pointer"+k).innerHTML='';
    if(k+1==result["laenge"]){click()}
  }
//
  abakus.document.getElementById("Nachricht").innerHTML="... los geht's:";
  setTimeout("abakus.document.getElementById('Nachricht').innerHTML='';", 1000);
  abakus.stop();
//  abakus.play();
  setTimeout("abakus.play();", 1000);
}

function ShowLsg(){
  if(abakus.closed==true){
    MoviePlaying=false;
    MovieIndex=0;
    MoviePause= false;
    return;}
  if(MoviePause==true){MovieTrigger=setTimeout("ShowLsg()", 200); return;}
  abakus.document.getElementById("rechenfelder").innerHTML=Lsg[MovieIndex];
  abakus.document.getElementById("BildNr").innerHTML=MovieIndex+" / "+(Lsg.length-1)
  var delay= (stopzeit[MovieIndex]=="k")? 250 : MovieSpeed;
  MovieIndex++;
  if(MovieIndex<Lsg.length){MovieTrigger=setTimeout("ShowLsg()", delay); MoviePlaying=true;}
  else{MoviePlaying=false; MovieIndex--;}
}

function TasteGedrueckt (Ereignis) {
  var entf=46;
  var del=8;
  if(n!=0){
    if (!Ereignis)
      Ereignis = window.event;
    if (Ereignis.which) {
      Tastencode = Ereignis.which;
    } else if (Ereignis.keyCode) {
      Tastencode = Ereignis.keyCode;
    }
    switch(Tastencode){
    case entf:
      var tab_id='xxx'
      for(var k=0; k<TabFolge.length; k++){if(TabFolge[k]==aktiveStelle){tab_id= TabFolge[k];}}
      if(tab_id=='xxx'){return false;}
      document.getElementById(tab_id).value="";
    break;
    case del:
      var tab_id='xxx'
      for(var k=0; k<TabFolge.length; k++){if(TabFolge[k]==aktiveStelle){tab_id= TabFolge[k];}}
      if(tab_id=='xxx'){return false;}
      document.getElementById(tab_id).value="";
      break;    
    case Enter:
      addition_check(level)
      return false; // Damit sonst nichts ausgelöst wird, worauf gerade der Focus ist.
    break;
    case vorw: // <-
      var tab_id='xxx'
      if(aktiveStelle==TabFolge[TabFolge.length-1]){tab_id=TabFolge[0];}
      else {for(var k=0; k<TabFolge.length-1; k++){if(TabFolge[k]==aktiveStelle){tab_id= TabFolge[k+1];}}}
      if(tab_id=='xxx'){tab_id=TabFolge[0];}
      document.getElementById(tab_id).focus();
    break;
    case rueckw: // ->
      var tab_id='xxx'
      if(aktiveStelle==TabFolge[0]){var tab_id=TabFolge[TabFolge.length-1]}
      else{for(var k=0; k<TabFolge.length; k++){if(TabFolge[k]==aktiveStelle){var tab_id= TabFolge[k-1]}}}
      if(tab_id=='xxx'){tab_id=TabFolge[TabFolge.length-1];}
      document.getElementById(tab_id).focus();
    break; 
    case Tab:
      if(aktiveStelle==TabFolge[TabFolge.length-1]){
        addAttribute(document.getElementById("level"+(level+1)), "tabindex", ersterTab-1);
        document.getElementById("level"+(level+1)).focus();}
    break;}}}

function start(L){
  if(n==0){
    abakus= window.open("about:blank", "_blank", "width=1, height=1");
    abakus.close();
    document.getElementById("LevelAngabe").innerHTML='Level '+ (L+1) //((L<2)? (L+1) : L);
    for(var k=1; k<=5; k++){document.getElementById("smilie"+k).innerHTML='\*';}
    makeZfrTasten("tastatur");
    if(tiktak==0){
      document.getElementById("uhr").innerHTML='<img src="clock.gif" border=0 alt="Zeit:" width="23" height="39">  ';
      document.getElementById("dauer").innerHTML='<b>0&nbsp;:&nbsp;00<\/b>';}
    for(var k=1; k<=6; k++){ // Ambiente merken und von Anzeige löschen
      if(k!=0){ambiente[k]=document.getElementById('level'+k).innerHTML; document.getElementById('level'+k).innerHTML=' ';}}
    addition(L);
    aktiv=window.setTimeout("Zaehlen()", 1000);} // starte Uhr
}

document.onkeydown = TasteGedrueckt;
