///////////////////////////////////////////////////////////////////////////
// RECHENLOGIK

/*
+ : 0 - : 1 * : 2 / : 3
Mal: Von a bis b (mit Option, beide Faktoren auf diesen Bereich einzuschränken)
Geteilt Von a bis b (mit Option, Dividend und Divisor einzuschränken)
Sinnvoll, um im Bereich des kleinen Einmaleins zu bleiben
allowed_operations = new Array(0,1,2,2,3,3);
+ und - sind immer erlaubt und immer an index 0 und 1
mal und geteilt kann einzeln oder gemeinsam dazukombiniert werden
d.h allowed_operations kann sein 
mal und geteilt kann doppelt vorkommen = mehr malaufgaben
0,1 
0,1,2, 0,1,2,2
0,1,3, 0,1,3,3
0,1,2,3, 0,1,2,2,3,3
sikore wird vor eine /-Aufgabe immer eine +-Aufgabe setzen
und vor eine *-Aufgabe immer eine Minusaufgabe, so gelingt
es uns immer, eine passende Aufgabe zu konstruieren
maxresult >= maxmal * maxmal!
maxresult >= maxgeteilt * maxgeteilt!
maxresult >= 2*maxplusminus!
*/

debugoutstr = "";
leveltext1 = "";
leveltext2 = "";
kettenstart = new Array();
kettenoperands = new Array();
kettenoperations = new Array();

lang = navigator.language ? navigator.language : navigator.userLanguage;

if (lang.indexOf("de") >-1)
 lang = "de";
else
 lang = "en";
 
if (location.search.indexOf("lang") < 0 && self.location.href.indexOf("index_en") <0 && lang != "de" && navigator.userAgent.toLowerCase().indexOf("googlebot")<0) {
  top.location.href = "index_en.html";
}

if (self.location.href.indexOf("index_en") <0)
  lang = "de";
else
  lang = "en";

function usererr(str)
{
  $.colorbox({close:"&times;",opacity:0.25,width:400,transition:"none",html:"<p>" + (lang == "de" ? "Fehler:" : "Error:") + "<p>" + str});
  //window.alert(str);
}

function erzeuge_aufgabe(nr)
{
   var i;
   debugoutstr = "";
   kettenlaenge = eval(document.getElementById("fkettenlaenge").value);
   operands =   new Array(kettenlaenge);
   operations = new Array(kettenlaenge);
   operation_strings = new Array("+","-","*","/");
   operation_count = new Array(0,0,0,0);

   negativ = (document.getElementById("fnegativ").value == "ja" ? true: false);
   maxresult = eval(document.getElementById("fmaxresult").value);
   minplusminus = eval(document.getElementById("fminplusminus").value);
   maxplusminus = eval(document.getElementById("fmaxplusminus").value);

   if (2*maxplusminus > maxresult+1) {
     if (lang != "de")
       usererr("The maximal result ("+maxresult+") must be at least twice as high as the upper limit for summand / subtrahend ("+maxplusminus+ ").");
     else
       usererr("Das Höchstergebnis ("+maxresult+") muss mindestens doppelt so groß sein wie die Obergrenze für Summand / Subtrahend ("+maxplusminus+ ").");
     return false;
   }

   if (2*minplusminus > maxplusminus) {
     if (lang != "de")
       usererr("The upper limit of the plusminus-range ("+maxplusminus+") must be at least twice as high than the lower one ("+minplusminus+ ").");
     else
       usererr("Beim Plusminus-Bereich muss der obere Wert ("+maxplusminus+") mindestens doppelt so groß sein wie der untere ("+minplusminus+ ").");
     return false;
   }

   minmal = eval(document.getElementById("fminmal").value);
   maxmal = eval(document.getElementById("fmaxmal").value);

   if (minmal > maxmal) {
     if (lang != "de")
       usererr("The upper limit of the second factor ("+maxmal+") must not be higher than the lower one ("+minmal+").");
     else
       usererr("Die obere Grenze des zweiten Faktors ("+maxmal+") darf nicht größer sein als die untere ("+minmal+").");
     return false;
   }

   if (document.getElementById("flimitfakt").value == "nein") 
     limitfakt = -1;
   else if (document.getElementById("flimitfakt").value == "ja") 
     limitfakt = maxmal;
   else limitfakt = eval(document.getElementById("flimitfakt").value);

   mingeteilt = eval(document.getElementById("fmingeteilt").value);
   maxgeteilt = eval(document.getElementById("fmaxgeteilt").value);

   if (mingeteilt > maxgeteilt) {
     if (lang != "de")
       usererr("The upper limit of the divisor ("+maxgeteilt+") must not be higher than the lower one ("+mingeteilt+").");
     else
       usererr("Die obere Grenze des Divisors ("+maxgeteilt+") darf nicht größer sein als die untere ("+mingeteilt+").");
     return false;
   }

   if (document.getElementById("flimitquot").value == "nein") 
     limitquot = -1;
   else if (document.getElementById("flimitquot").value == "ja") 
     limitquot = maxgeteilt;
   else limitquot = eval(document.getElementById("flimitquot").value);

   allowed_operations = new Array(0,1);

   if(document.getElementById("fchancemal").selectedIndex >0) {
     if ((maxmal*maxmal) > maxresult) {
       if (lang != "de")
         usererr("The maximal result ("+maxresult+") must be at least as high as the square number of the maximal factor ("+maxmal+ ").");
       else
         usererr("Das Höchstergebnis ("+maxresult+") muss mindestens so groß sein wie das Quadrat aus dem Höchstfaktor ("+maxmal+ ").");
       return false;
     }
     for (i=1;i<=document.getElementById("fchancemal").selectedIndex;i++)
       allowed_operations[allowed_operations.length] = 2;
   }

   if(document.getElementById("fchancegeteilt").selectedIndex>0) {
     if ((maxgeteilt*maxgeteilt) > maxresult) {
       if (lang != "de")
         usererr("The maximal result ("+maxresult+") must be at least as high as the square number of the maximal divisor ("+maxgeteilt+ ").");
       else
         usererr("Das Höchstergebnis ("+maxresult+") muss mindestens so groß sein wie das Quadrat aus dem Höchstdivisor ("+maxgeteilt+ ").");
       return false;
     }
     for (i=1;i<=document.getElementById("fchancegeteilt").selectedIndex;i++)
       allowed_operations[allowed_operations.length] = 3;
   }
   start = myrandom(Math.floor(maxresult/4), Math.floor(maxresult/2), false);
   current = start;
   // debugout("Start: " + start);
   
   // Ermittle erst die Operatoren für die gesamte Aufgabe
   // Beginne immer mit + oder -:
   
   for (i=0;i<kettenlaenge;i++) {
     if (i==0) {
       // Beginne immer mit + oder - 
       operation_index = myrandom(0, 1, false);
     } else {
       operation_index = myrandom(0, allowed_operations.length-1, false);
     }
     // Vermeide zwei geteilt/mal hintereinander:
     operation = allowed_operations[operation_index];
     if (i>0 && operations[i-1]>=2 && operation >=2) {
       operation-=2;   //  (aus * wird + und aus / -)
     } 
     if (operation == 3) operations[i-1] = 0;
     if (operation == 2) operations[i-1] = 1;
     operations[i] = operation;
   }
   
   
   for (i=0;i<kettenlaenge;i++) {
     // debugout("i:" + i + operation_strings[operations[i]]);
   }
   
   previous = 0;
   preprevious = 0;
   
   // Und jetzt die Aufgaben ermitteln
   for (i=0;i<kettenlaenge;i++) {
     operation_count[operations[i]]++;
   
     preprevious = previous;
     previous = current;
	 
	 // debugout("CUR"+current);
   
     switch(operations[i]) {
   // PLUS
       case 0:
	     if (document.getElementById("level").value == 99 || document.getElementById("level").value == 19) {  // speziallevel ohne übertrag
		   if (current / maxresult > 0.7) {
		      operations[i] = 1;
		      operands[i] = nocarry_random(current,1,maxresult);
		      // debugout(current + "-"+operands[i]);
		      current = current - operands[i];
		   } else {
		      operations[i] = 0;
		      operands[i] = nocarry_random(current,0,maxresult);
		      // debugout(current + "+"+operands[i]);
		      current = current + operands[i];
		   }
		 } else {
           operands[i] = myrandom(minplusminus, maxplusminus, negativ);
           if (Math.abs(current+operands[i]) > maxresult || Math.abs(current+operands[i]) <2) {
             // debugout("Oops, "+previous+"+"+operands[i] + " verboten mache - draus");
             operations[i] = 1;
             current = current - operands[i];
           } else {
             current = current + operands[i];
           }
		 }
         break;
   
   // MINUS
       case 1:
	     if (document.getElementById("level").value == 99 || document.getElementById("level").value == 19) {  // speziallevel ohne übertrag
           if (current / maxresult < 0.3) {
		      operations[i] = 0;
		      operands[i] = nocarry_random(current,0,maxresult);
		      // debugout(current + "+"+operands[i]);
		      current = current + operands[i];
		   } else {
		      operations[i] = 1;
		      operands[i] = nocarry_random(current,1,maxresult);
		      // debugout(current + "-"+operands[i]);
		      current = current - operands[i];
		   }
		 } else {
           operands[i] = myrandom(minplusminus, maxplusminus, negativ);
           if (Math.abs(current-operands[i]) > maxresult || (!negativ && current-operands[i]<0) || Math.abs(current-operands[i])<2) {
             // debugout("Oops, "+previous+"-"+operands[i] + " verboten mache + draus");
             operations[i] = 0;
             current = current + operands[i];
           } else {
             current = current - operands[i];
           }
		 }
         break;
   
   // MAL
       case 2:
         if (limitfakt >-1 && (Math.abs(current) > maxmal)) {
           // Oha, beide Faktoren sollen begrenzt werden...
           fak1 =  myrandom(2, limitfakt, negativ);
           // debugout("_Faktor 1: " + fak1);
           korrektur = current - fak1;
           current = fak1;
   
           if(operations[i-1]==1) {  // MINUS wie sichs gehört
             operands[i-1]+=korrektur;
             newprevious = current + operands[i-1];
             if (!negativ && operands[i-1] < 0) {
               // debugout("Shit! Wieder negative Korrektur! Wir klammern ein Minus aus...");
               operands[i-1] = -operands[i-1];
               if (operations[i-1]==0) operations[i-1] = 1;
               else operations[i-1] = 0;
             }
           }else {
             operands[i-1]-=korrektur;
             newprevious = current - operands[i-1];
             if (!negativ && operands[i-1] < 0) { 
               // debugout("Shit! Negative Korrektur! Wir klammern ein Minus aus...");
               operands[i-1] = -operands[i-1];
               if (operations[i-1]==0) operations[i-1] = 1;
               else operations[i-1] = 0;
             }
           }
   
            // debugout("1Korrigiere vorige Aufgabe zu: ... " + operation_strings[operations[i-1]]+ (operands[i-1]<0?"("+operands[i-1]+")":operands[i-1]) + "=" + current);
         }
         operands[i] = myrandom(minmal, maxmal, negativ);
         zuviel = Math.abs(current * operands[i]) - maxresult;
         if (zuviel>0) {
           // Okay, mal wieder zu groß...
           // debugout("PREPREVIOUS "+preprevious);
           // debugout("OPERATION "+operations[i-1]);
           // debugout("OPERAND "+operands[i-1]);
           // debugout("PREVIOUS "+previous);
           // debugout("WILL MAL "+operands[i]);
           // debugout("ZUVIEL:"+zuviel);
           zuviel = Math.floor(zuviel / Math.abs(operands[i]));
           // debugout("ZUVIELGETEILT:"+zuviel);
           korrektur = zuviel;
           // debugout("KORREKTUR:"+korrektur);
           // debugout("CURRENT:"+current);
           newcurrent = mysgn(current) * (Math.abs(current) - korrektur);
           // debugout("NEWCURRENT:"+newcurrent);
           newcurrent = mysgn(newcurrent) * ((Math.abs(newcurrent) - myrandom(1, Math.floor(Math.abs(newcurrent)/5),false)));
           // debugout("NEWCURRENTREDUZIERT:"+newcurrent);
           if (operations[i-1]==0) {
             // debugout("HAEH!!!!");
             operands[i-1] = newcurrent - preprevious;
           } else {
             operands[i-1] = preprevious - newcurrent;
           }
           if (operations[i-1]<2 && operands[i-1] < 0 && !negativ) {
             debugout("HUMPFMALOPERAND "+i+" " + operands[i-1]);
             operands[i-1] = -operands[i-1];
             if (operations[i-1]==0) operations[i-1] = 1;
             else operations[i-1] = 0;
           }
           current = newcurrent;
   
           // debugout("2Korrigiere vorige Aufgabe zu: " +preprevious + operation_strings[operations[i-1]]+ (operands[i-1]<0?"("+operands[i-1]+")":operands[i-1]) + "=" + current);
         }
         previous = current;
         current = current * operands[i];
         break;
   
   // GETEILT
       case 3:
         if (limitquot > -1) {
           quot = myrandom(2, limitquot, negativ);       
           divi = myrandom(mingeteilt, maxgeteilt, negativ);       
           operands[i] = divi;
           newprevious = quot * divi;
           current = quot;
           korrektur = previous - newprevious;
           
           // debugout("np: " + newprevious + ", cu: " + quot + ", ko: " + korrektur);
   
           if (Math.abs(korrektur) > maxplusminus) {
             if (mysgn(previous) != mysgn(newprevious)) {
               // debugout("Hier könnt noch was gehn! Ändere quot von "+quot+" auf "+(-quot));
               quot = -quot;
               newprevious = quot * divi;
               current = quot;
               korrektur = previous - newprevious;
             }
           }
   
           // debugout("np: " + newprevious + ", cu: " + quot + ", ko: " + korrektur);
   
           previous = newprevious;
           // korr = 6
   
           if(operations[i-1]==1) {  // vorherige aufgabe MINUS
             operands[i-1]+=korrektur;
             if (!negativ && operands[i-1] < 0) {
               // debugout("Shit! Schon wieder negative Korrektur! Wir klammern ein Minus aus...");
               operands[i-1] = -operands[i-1];
               if (operations[i-1]==0) operations[i-1] = 1;
               else operations[i-1] = 0;
             }
           }else {   // vorherige aufgabe PLUS
             operands[i-1]-=korrektur;
             if (!negativ && operands[i-1] < 0) { 
               // debugout("Shit! Noch eine negative Korrektur! Wir klammern ein Minus aus...");
               operands[i-1] = -operands[i-1];
               if (operations[i-1]==0) operations[i-1] = 1;
               else operations[i-1] = 0;
             }
           }
           // debugout("3Korrigiere vorige Aufgabe zu: ... " + operation_strings[operations[i-1]]+ (operands[i-1]<0?"("+operands[i-1]+")":operands[i-1]) + "=" + previous);
         } else {
           // debugout("PREPREVIOUS "+preprevious);
           // debugout("OPERATOR "+operations[i-1]);
           // debugout("OPERAND "+operands[i-1]);
           // debugout("PREVIOUS: " + previous);
           divi = myrandom(mingeteilt, maxgeteilt, negativ);       
           // debugout("DIVI: " + divi);
           rest = previous % divi;
           quot = previous / divi;
           newcurrent = mysgn(quot) * Math.floor(Math.abs(quot));
           if (rest != 0) {
             // debugout("REST: " + rest);
             // debugout("NEWCURRENT: " + newcurrent);
             newprevious = newcurrent * divi;
             previous = newprevious;
             // debugout("NEWPREVIOUS: " + newprevious);
               if (operations[i-1]==0) {
                 operands[i-1] = newprevious - preprevious;
               } else {
                 operands[i-1] = preprevious - newprevious;
              }
              // debugout("OPERAND "+operands[i-1]);
              // debugout("4Korrigiere vorige Aufgabe zu: " + preprevious + operation_strings[operations[i-1]]+ (operands[i-1]<0?"("+operands[i-1]+")":operands[i-1]) + "=" + newprevious);
           }
           operands[i] = divi;
           current = newcurrent;
           if (operations[i-1]<2 && operands[i-1] < 0 && !negativ) {
             debugout("HUMPFGETEILTOPERAND "+i+" "+operands[i-1]);
             operands[i-1] = -operands[i-1];
             if (operations[i-1]==0) operations[i-1] = 1;
             else operations[i-1] = 0;
           }
         }
         break;
   
     }
     // debugout(previous + operation_strings[operations[i]]+ (operands[i]<0?"("+operands[i]+")":operands[i]) + "=" + current);
     if (i>0 && operands[i-1]==0) {
       // debugout("HAMMERDICH. NULLAUFGABE! STREICHE VORHERIGE AUFGABE");
       tmp = operations[i-1];
       operations[i-1] = operations[i];
       operations[i] = tmp;
       operands[i-1] = operands[i];
       i = i-1;
     }
   }
   
   debugout("-------------TATAAA. DIE ENDGÜLTIGEN AUFGABEN --------------");

   kettenstart[nr] = start;
   kettenoperands[nr] = new Array(kettenlaenge);
   kettenoperations[nr] = new Array(kettenlaenge);
   for (i=0; i<kettenlaenge; i++) {
     kettenoperands[nr][i] = operands[i];
     kettenoperations[nr][i] = operations[i];
   }

   current = start;
   for (i=0; i<kettenlaenge; i++) {
     previous = current;
     rechnung = previous + operation_strings[operations[i]] + (operands[i] <0 ? "("+operands[i] + ")" : operands[i]);
     current=eval(rechnung);
     debugout(rechnung + "="+current);
   }
   
   // debugout("---");
   
   for (i=0;i<4;i++) {
     // debugout(operation_strings[i]+": " + operation_count[i]);
   }

   return true;
}

function debugout(str)
{
  var ob;

  return;
  if (debugoutstr == "") debugoutstr = "<br>";
  debugoutstr = debugoutstr + str + "<br>";
  ob = document.getElementById("debugid");
  if (ob) ob.innerHTML = debugoutstr;
}

function mysgn(zahl)
{
  if (zahl >=0) return 1;
  return -1;
}

function nocarry_random(n,o,m)
{
  var i;
  var resstr;
  var res;
  var nstr;
  var mstr;
  var dign;
  var digm;
  var digpm;
  nstr = n.toString();
  mstr = m.toString();
  while (nstr.length < mstr.length) {
    nstr = "0"+nstr;
  }
  resstr = "";

  for (i=0; i<nstr.length;i++) {
    dign = eval(nstr.charAt(i));
	digm = eval(mstr.charAt(i));
    if (o == 0) { // PLUS
      if (dign >= digm)
        digpm = 0;
      else
        digpm = myrandom(0,digm-dign,false);
    } else {   // MINUS
      if (dign == 0)
        digpm = 0;
      else {
	    if (i==937)
          digpm = myrandom(0,dign-1,false);	
        else		  
          digpm = myrandom(0,dign,false);
      }
    }
    resstr = resstr + digpm;
    // debugout(dign + " " + digpm + " " + digm);
  }
  res = parseInt(resstr,10);
  if (res==n && o==1) res--;
  if (res == 0) res = 1;
  return res;
}
  
  
function myrandom(min, max, negative)
{
  ran = Math.floor(Math.random() * (max-min+1)) + min;
  if (negative && Math.random() < 0.5) ran = -ran;
  return ran;
}


////////////////////////////////////////////////////////////////////////////
// GUI

function erzeuge_blatt(arg) 
{
  var i;
  if (arg != 0) {
    document.getElementById("fkettenlaenge").selectedIndex = 2;
  }
  kettenanzahl = (arg == 0 ? eval(document.getElementById("fkettenanzahl").value) : 1);
  kettenstart = new Array(kettenanzahl);
  kettenoperands = new Array(kettenanzahl);
  kettenoperations = new Array(kettenanzahl);

  for (i=0;i<kettenanzahl;i++) {
    if (!erzeuge_aufgabe(i)) return;
  }

  update_leveltext();

  if (arg == 0) {   // WOCHENBLATT
    window.open("print.html", "sikorea");  // Aufgaben
    window.open("print.html", "sikorel");  // Lösungen
  } else {     // LIVE
    livesetup();
  //   window.open("play.html", "sikorep");
  }
}

function myload()
{
  ob = document.getElementById("mm1");
  str = "<a href=\"mai";
  str = str + "lto:chr";
  str = str + "istian@schi";
  str = str + "ffner-tischer.de\">";
  str = str + "chr";
  str = str + "istian@schi";
  str = str + "ffner-tischer.de</a>";
  ob.innerHTML = str;

  ob = document.getElementById("mm2");
  if (ob) {
  str = "<a href=\"mai";
  str = str + "lto:chr";
  str = str + "istian@schi";
  str = str + "ffner-tischer.de";
  str = str + "?subject=Spende%20für%20SIKORE&body=Hallo,%0D%0A%0D%0Aich%20möchte%20SIKORE%20finanziell%20unterstützen%20und%20benötige%20dazu%20Ihre%20Bankverbindung.%0D%0A%0D%0AVielen Dank%0D%0A";
  str = str + "\">";
  str = str + "Ma";
  str = str + "il</a>";
  ob.innerHTML = str;
  }
  
  settings = "";

  if (window.location.search.length>0 && window.location.search.indexOf("settings") > -1) {
   	settings = window.location.search.substring(window.location.search.indexOf("settings"));
  } else if (document.cookie.length > 9 && document.cookie.indexOf("settings=") == 0) {
    settings = document.cookie;
  }
  
  // alert(settings);
  
  if (settings.length > 0) {
   	cooarr = settings.substring(9).split("_");
	for (i=0; i<cooarr.length;i++) {
	  cooopt = cooarr[i].split(":");
	  ob = document.getElementById(cooopt[0]);
	  if (cooopt[0] == "fleveltext1" || cooopt[0] == "fleveltext2") {
	    // wird nicht verwendet
		ob.value = cooopt[1];
	  } else { 
	    idx = eval(cooopt[1]);
	    if (idx > -1 && idx < ob.length) ob.selectedIndex = idx;
	  }
	}
  }
  
  levelchanged();
  toggle_leveltext();
  
  if (window.location.search.length>0 && window.location.search.indexOf("livesettings") > -1)
    //alert("buh");
	erzeuge_blatt(1);
}

function number_format (number)
{
  var numberstr = number.toString ();
  var i;
  
  thousands_sep = ".";
  for (i = numberstr.length - 3; i > 0; i -= 3)
  numberstr = numberstr.substring (0 , i) + thousands_sep + numberstr.substring (i);
  return numberstr;
}

function toggle_leveltext()
{
  ob = document.getElementById("fleveltext");
  obs2 = document.getElementById("leveltexts2");
  switch(ob.value) {
    case "eigener":
      obs2.style.display="block";
      break;
    case "auto":
      obs2.style.display="none";
      break;
    case "keiner":
      obs2.style.display="none";
      break;
  }
  updatecookie();
}

function get_leveltext1()
{
    // Ein Standardlevel?
    if (document.getElementById("level").value != "selbst")
      return document.getElementById("level").selectedIndex+1;

    // 1. Finde nächstgrößeres Maxresult
    for (i=0;i<document.getElementById("level").length;i++) {
      val = document.getElementById("level")[i].value;
      midx = val.indexOf("M");
      if (midx > -1) 
        lmax = val.substring(0,midx);
      else 
        lmax = val;
      if (lmax == "selbst") break;
      lmax = eval(lmax);
      if (eval(document.getElementById("fmaxresult").value) >= lmax) continue;
      break;
    }

    // 2. Finde nächstliegendes Mal
    for (j=i-1;j>-1;j--) {
      val = document.getElementById("level")[j].value;
      midx = val.indexOf("M");
      if (midx > -1) {
        lmax2 = val.substring(0,midx);
        lmal = val.substring(midx+1);
      } else {
        lmax2 = val;
        lmal = 0;
      }
      lmax2 = eval(lmax2);

      if(document.getElementById("fchancemal").selectedIndex == 0)
         mmal = 0;
      else
         mmal = eval(document.getElementById("fmaxmal").value);

      if(document.getElementById("fchancegeteilt").selectedIndex >0) {
        if (eval(document.getElementById("fmaxgeteilt").value) < mmal)
         mmal = eval(document.getElementById("fmaxgeteilt").value);
      }

      // window.alert(j + "_" + lmax2 + "_" + mmal + "_" + lmal);

      if (lmal <= mmal) return (j+1);
    }
}

function update_leveltext()
{
  ob = document.getElementById("fleveltext");
  switch(ob.value) {
    case "eigener":
      leveltext1 = document.getElementById("fleveltext1").value;
      leveltext2 = document.getElementById("fleveltext2").value;
      break;
    case "auto":
      update_autoleveltext();
      break;
    case "keiner":
      leveltext1 = "";
      leveltext2 = "";
      break;
  }
}

function update_autoleveltext()
{
  leveltext1 = "Level " + get_leveltext1();
  
  leveltext2 = (lang != "de" ? "to " : "bis ");
  leveltext2 = leveltext2 + (document.getElementById("fmaxresult").value);
  
  if (document.getElementById("level").value == 99 || document.getElementById("level").value == 19) {
    leveltext2 = leveltext2 + (lang == "de" ? ", kein &Uuml;bertrag" : ", no carrying");
  } else {
    leveltext2 = leveltext2 + " &nbsp;&plusmn;" + (document.getElementById("fmaxplusminus").value);
    if(document.getElementById("fchancemal").selectedIndex >0) {
      leveltext2 = leveltext2 + " &nbsp;" + (lang != "de" ? "&times;" : "&bull;") + (document.getElementById("fmaxmal").value);
    }
    if(document.getElementById("fchancegeteilt").selectedIndex >0) {
      leveltext2 = leveltext2 + " &nbsp;"+ (lang != "de" ? "&divide;" : ":") + (document.getElementById("fmaxgeteilt").value);
    }
  }
}

function optchanged()
{
  ob = document.getElementById("level");
  ob.selectedIndex = ob.length-1;
  updatecookie();
}

function otheroptchanged()
{
  updatecookie();
}

function resetall()
{
  document.forms["optionform"].reset();
  levelchanged();
  toggle_leveltext();
}

function coostr(str)
{
  return str + ":" + document.getElementById(str).selectedIndex;
}

function updatecookie()
{
  expiredate = new Date();
  expiredate.setTime(expiredate.getTime() + 30*24*60*60*1000);
  coo = "settings=";
  coo = coo + coostr("level");
  if (document.getElementById("level").value == "selbst") {
    cooarr = new Array("fmaxresult","fnegativ","fminplusminus","fmaxplusminus","fchancemal","fminmal","fmaxmal","flimitfakt","fchancegeteilt","fmingeteilt","fmaxgeteilt","flimitquot");
	for (i=0;i<cooarr.length;i++) {
	   coo = coo + "_" + coostr(cooarr[i]);
	}
  }
  cooarr = new Array("fkettenlaenge","fkettenanzahl","fschreibweise","floesungshilfe","flivehelp","ffigs");
  for (i=0;i<cooarr.length;i++) coo = coo + "_" + coostr(cooarr[i]);
  //if (document.getElementById("fleveltext").selectedIndex == 2) {
  // coo = coo + "_fleveltext1:" + document.getElementById("fleveltext1").value;
  //  coo = coo + "_fleveltext2:" + document.getElementById("fleveltext2").value;
  //}
  document.getElementById("favlink").href = "?" + coo;
  if (document.cookie != coo) {
    coo = coo + "; expires="+expiredate.toGMTString();
    document.cookie = coo;
	// document.getElementById("debugid").innerHTML = coo;
    // alert("set cookie " + coo.length + ": " + coo); 
  }
}

function toggleoptionenchanged()
{
  ob = document.getElementById("optionen");
  obb = document.getElementById("optionen2");
  ob2 = document.getElementById("toggleoptionen");
  if(ob.style.display == "none") {  
    ob.style.display = "inline";
    obb.style.display = "block";
    if (lang != "de")
      ob2.innerHTML = "<br>Please hide the advanced options again.";
    else
      ob2.innerHTML = "<br>Die erweiterten Einstellmöglichkeiten bitte wieder ausblenden.";
  }else {
    ob.style.display = "none";
    obb.style.display = "none";
    if (lang != "de")
      ob2.innerHTML = "Please show me the advanced options again.";
    else
      ob2.innerHTML = "Die erweiterten Einstellmöglichkeiten doch wieder einblenden.";
  }
}

function levelchanged()
{
  var ob;
  ob = document.getElementById("level");
  // wird nur noch für vorgefertigte Level gemacht, s.u.
  // setoneopt("fchancemal",2);
  // setoneopt("fchancegeteilt",2);
  // setoneopt("fnegativ",0);
  // setoneopt("fminmal",2);
  // setoneopt("fmingeteilt",2);
  switch(ob.value) {
    case "selbst":
      ob = document.getElementById("optionen");
      if (ob.style.display != "inline") toggleoptionenchanged();
      break;
    default:
	  setoneopt("fchancemal",2);
      setoneopt("fchancegeteilt",2);
      setoneopt("fnegativ",0);
      setoneopt("fminmal",2);
      setoneopt("fmingeteilt",2);
      if (ob.selectedIndex >= 17) {
        setoneopt("flimitfakt",1);
        setoneopt("flimitquot",1);
      } else {
        setoneopt("flimitfakt",0);
        setoneopt("flimitquot",0);
      }
      malindex = ob.value.indexOf("M");
      setoneopt("fminplusminus",1);
      if (malindex > -1) {
        setoneopt("fmaxmal",eval(ob.value.substring(malindex+1)));
        setoneopt("fmaxgeteilt",eval(ob.value.substring(malindex+1)));
        setoneopt("fchancemal",2);
        setoneopt("fchancegeteilt",2);
        setoneopt("fmaxplusminus",Math.floor(eval(ob.value.substring(0,malindex))/2));
        setoneopt("fmaxresult",eval(ob.value.substring(0,malindex)));
      } else {
        setoneopt("fchancemal",0);
        setoneopt("fchancegeteilt",0);
        setoneopt("fmaxplusminus",Math.floor(eval(ob.value)/2));
        setoneopt("fmaxresult",eval(ob.value));
      }
  }
  updatecookie();
}

function setoneopt(opt,val)
{
  ob = document.getElementById(opt);
  if (!ob) return;
  switch(opt) {
    case "fnegativ" :
    case "fchancemal" :
    case "fchancegeteilt" :
    case "flimitfakt" :
    case "flimitquot" :
      ob.selectedIndex = val;
      break;
      
    default:
     for (i=0;i<ob.length;i++) {
      if (ob[i].value>=val) {
        ob.selectedIndex = i;
        return;
      }
    }
    ob.selectedIndex = i-1;
  }
}

// LIVE

results = new Array();
fehler = new Array();
curpos = 0;

function format_number(n)
{
  return (n<0 ? "(" + n + ")" : n);
}

function livesetup()
{
  var i, pos;
  jetzt = new Date();
  starttime = jetzt.getTime();
  
  curpos = 0;
  document.getElementById("flivestatus2").style.display = "inline";
  
  if (lang == "de")
    document.getElementById("flivestatus").innerHTML = "Fehler bisher: ";
  else 
    document.getElementById("flivestatus").innerHTML = "Mistakes so far: ";
  
  operationstrings = new Array("+", "-", "*", "/");
  if (lang == "de")
    operationimages = new Array("+", "-", "&bull;", ":");
  else
    operationimages = new Array("+", "-", "&times;", "&divide;");
	
  ob = document.getElementById("fstart");
  ob.innerHTML = kettenstart[0];
  ob.style.backgroundColor="white";
  ob.style.borderColor="white";
  
  ob = document.getElementById("zeilanf1");
  ob.innerHTML = "";
  ob.style.backgroundColor="white";
  ob.style.borderColor="white";
  
  ob = document.getElementById("zeilanf2");
  ob.innerHTML = "";
  ob.style.backgroundColor="white";
  ob.style.borderColor="white";
  
  document.getElementById("livetextlinks").innerHTML = leveltext1;
  document.getElementById("livetextrechts").innerHTML = leveltext2;
  
  document.getElementById("ffehler").value = "0";
  
  current = kettenstart[0];
  for (pos=0; pos<12; pos++) {
    previous = current;
    current = eval(current + operationstrings[kettenoperations[0][pos]] + format_number(kettenoperands[0][pos]));
    results[pos] = current;
    fehler[pos]=0;
    ob = eval("document.liveform.i" + pos);
	ob.value = "";
		
	ob = eval("document.im" + pos);
	// ob = document.getElementById("im" + pos);
	ob.src = "triangle.gif";
	
	ob = document.getElementById("tdi"+pos);
	ob.style.backgroundColor="white";
    ob.style.borderColor="white";
	
    ob = document.getElementById("fop" + pos);
	ob.style.backgroundColor = "white";
    ob.style.borderColor = "white";
	ob.innerHTML = operationimages[kettenoperations[0][pos]] + " " + format_number(kettenoperands[0][pos]) + "<br>&nbsp;<img src=operator_pfeil.png>&nbsp";
  }
  
  results_sorted = results.slice();
  results_sorted.sort(function(a,b){return a - b});

  for (i=0;i<results_sorted.length;i++) { 
    ob = document.getElementById("ri" + i);
	ob.innerHTML = results_sorted[i];
	ob.style.display = "inline";
  }
  
  ob = document.getElementById("loesungszeilendiv"); 
  ob2 = document.getElementById("playhead");

  if (document.getElementById("flivehelp").selectedIndex == 0) {
    ob.style.display = "block";
	if (lang == "de")
      ob2.innerHTML = "Schreibe das Ergebnis in das Eingabefeld und wechsle mit der Tabulator-Taste zum n&auml;chsten Feld. Oder klicke einfach auf das richtige Ergebnis in der L&ouml;sungszeile.";
    else
      ob2.innerHTML = "Type the result in the input field and switch to the next field using the tabulator key. Or just click on the correct result in the result line below.";
  }
  else {
    ob.style.display = "none";
    if (lang == "de")
      ob2.innerHTML = "Schreibe das Ergebnis in das Eingabefeld und wechsle mit der Tabulator-Taste zum n&auml;chsten Feld.";
    else
      ob2.innerHTML = "Type the result in the input field and switch to the next field using the tabulator key.";
  }
 
  $.colorbox({escKey:false,scrolling:false,close:"&times;",opacity:0.85,transition:"none",inline:true, width:"820",href:"#inline_content"});
  
  if (document.getElementById("flivehelp").selectedIndex != 0) 
    document.liveform.i0.focus();
  else {
   ob = document.getElementById("tdi0");
   ob.style.backgroundColor="#ffdef7";
   ob.style.borderColor="#ffdef7";
  }
   
  if (1==0) {
  document.liveform.i8.value=results[8];
  curpos = 9;
  document.liveform.i9.focus();
  }
 }

function countfehler()
{
  var i;
  f = 0;
  for (i=0;i<fehler.length;i++) {
    f+=fehler[i];
  }
  return f;
}

function solve(obi)
{
 var ob;
 ob = document.getElementById("ri"+obi);
 field = eval("document.liveform.i" + curpos);
 field.value = ob.innerHTML;
 oldpos = curpos;
 liveblur(curpos,true);
 if (oldpos != curpos) ob.style.display="none";
 livefocus(-1);
}

function liveblur(mypos,clicked)
{
  if (curpos > 12-1) return;
  field = eval("document.liveform.i" + curpos);
  if (field.value == "") return;
  wert = eval(field.value);
  myim = eval("document.im" + curpos);
  if (wert == results[curpos]) { 
    if (!clicked && document.getElementById("flivehelp").selectedIndex == 0 && document.getElementById("ri0")) {   
      for (i=0;i<results.length;i++) {
        ob = document.getElementById("ri"+i);
        if (!ob || ob.style.display == "none" || eval(ob.innerHTML) != wert) continue;
        ob.style.display="none";
        break;
      }
    }
    myim.src="tick_green.gif";
    ob = document.getElementById("tdi"+curpos);
    ob.style.backgroundColor="white";
    ob.style.borderColor="white";
    curpos++;
    if (curpos % 4 == 0 && curpos < 12) {
      document.getElementById("zeilanf"+(curpos / 4)).innerHTML = wert;
    }
    if (curpos == 12) {
      jetzt = new Date();
      gebraucht = Math.floor((jetzt.getTime() - starttime) / 1000);
	  // gebraucht = 121;
      if (lang == "de") {
        out = "Geschafft! Du hast ";
        if (Math.floor(gebraucht/60) > 0) {
          out = out + Math.floor(gebraucht/60) + " Minute" + (Math.floor(gebraucht/60) != 1 ?"n":"");
		}
        if ((gebraucht % 60) > 0) { 
          if (Math.floor(gebraucht/60) > 0) out = out + " und ";		
		  out = out + (gebraucht % 60) + " Sekunde" +((gebraucht % 60) != 1 ?"n":"");
        }	
        out = out + " gebraucht ";		
        if (countfehler() == 0) {
          out = out + "und keinen Fehler gemacht! Super!";
        } else if (countfehler() > 1){
          out = out + "und " + countfehler() + " Fehler gemacht.";
		  out = out + " Ich habe die Aufgaben, bei denen du Schwierigkeiten hattest, farbig markiert. Schau sie doch noch einmal kurz an.";
        } else {
		  out = out + "und einen Fehler gemacht.";
		  out = out + " Ich habe die Aufgabe, bei der du Schwierigkeiten hattest, farbig markiert. Schau sie doch noch einmal kurz an.";
		}
		
      } else {
        out = "Done! This took you ";
        if (Math.floor(gebraucht/60) > 0) {
          out = out + Math.floor(gebraucht/60) + " minute" + (Math.floor(gebraucht/60) != 1 ?"s":"");
		}
        if ((gebraucht % 60) > 0) { 
          if (Math.floor(gebraucht/60) > 0) out = out + " and ";		
		  out = out + (gebraucht % 60) + " second"+((gebraucht % 60) != 1 ?"s":"");
        }	
        if (countfehler() == 0) {
          out = out + " and you made no mistake! Great!";
        } else if (countfehler() > 1){
          out = out + " and you made " + countfehler() + " mistakes.";
		  out = out + " I marked the spots where you had problems. Take a short look at them.";
        } else {
		  out = out + " and you made one mistake.";
		  out = out + " I marked the spot where you had problems. Take a short look at it.";
		}
      }
	  
	  for (i=0; i<fehler.length;i++) {
	    if (fehler[i] > 0) {
		  ob = document.getElementById("fop" + i);
		  ob.style.backgroundColor = "#c8ffc8";
		  ob.style.borderColor = "#c8ffc8";
		  ob.style.borderRightColor = "white";
		  switch(i) {
		    case 0:
			  ob = document.getElementById("fstart");
		      break;
			case 4:
			  ob = document.getElementById("zeilanf1");
			  break;
			case 8:
			  ob = document.getElementById("zeilanf2");
			  break;
			default:
			  ob = document.getElementById("tdi" + (i-1));
		      break;
		  }
		  ob.style.backgroundColor = "#c8ffc8";
	      ob.style.borderColor = "#c8ffc8";
		}
	  }
	  ob = document.getElementById("flivestatus");
	  ob.innerHTML = out;
      document.getElementById("flivestatus2").style.display = "none";
	}
  }
  else {
    fehler[curpos]=1;
    document.getElementById("ffehler").value=""+countfehler();
    myim.src="thumbs_down.gif";
  }
}

function livefocus(mypos)
{
  if (mypos >-1 && mypos !=12 && curpos >= 12) {
    $.colorbox.close();
	return;
  }
  ob = document.getElementById("tdi"+curpos);
  if (!ob) return;
  ob.style.backgroundColor="#ffdef7";
  ob.style.borderColor="#ffdef7";
  // ob.style.borderColor="#ff8de3";
  if (mypos == curpos) return;
  if (mypos <0) return;
  if (curpos > 12) {
     window.focus();
     return;
  }

  field = eval("document.liveform.i" + curpos);
  field.focus();
  field.select();
}
