var Laufend = '';
var Zeitgeber;
function Vorfuehre(Schalter) {
  if (Laufend!='' && (eval(Laufend+'Zuende()') || Schalter!='')) {
    document.forms[Laufend+'Brett'].VSchalter.value = 'Vorf'+unescape("%FC")+'hren';
    clearTimeout(Zeitgeber);
    Laufend = ''
    }
  else {
    if (Laufend=='') eval(Schalter+'Starte()')
    else eval(Laufend+'Finde()');
    Zeitgeber = setTimeout('Vorfuehre("")', 500);
    if (Laufend=='') Laufend = Schalter;
    document.forms[Laufend+'Brett'].VSchalter.value = 'Anhalten'
  } }
function Lade() {
  }
function Entlade() {
  if (Laufend) clearTimeout(Zeitgeber)
  }

// Schiebepuzzle
var PSeite = 4; // skalierbar
var PFelder = PSeite*PSeite;
var PFrei = PFelder-1;
var PGemischt= false;
var PZug = 0;
function PZeichne() {
  document.write('<table align="center" border="5" cellpadding="0" cellspacing="0">');
  for (var Feld = 0; Feld<PFelder; Feld++)
    document.write((Feld%PSeite==0?'<tr>':'')
      +'<td><input type="button" name="p'+Feld+'" value="___" onclick="PZiehe('+Feld+')" style="width:16pt;" /></td>'+((Feld+1)%PSeite==0?'</tr>':''))
  for (var Feld = 0; Feld<PFelder; Feld++)
    document.PBrett['p'+Feld].value = (Feld==PFelder-1?'':Feld+1);
  document.write('</table>')
  }
function PStarte() {
  for (var Zug = 1; Zug<=1000; Zug++) PZiehe(Math.floor(Math.random()*PFelder));
  PGemischt = true;
  PZug = 0;
  document.PBrett.Zuege.value = PZug
  }
function PZiehe(Feld) {
  if (Math.abs(Feld%PSeite-PFrei%PSeite)==0 || Math.abs(Math.floor(Feld/PSeite)-Math.floor(PFrei/PSeite))==0) {
    with (document.PBrett) {
      var Schritt = (PFrei>Feld?1:-1)*(Math.abs(Feld-PFrei)>=PSeite?PSeite:1);
      while (PFrei!=Feld) {
        elements['p'+PFrei].value = elements['p'+(PFrei-Schritt)].value;
        PFrei -= Schritt
        }
      elements['p'+PFrei].value = ''
      if (PGemischt) {
        elements['Zuege'].value = ++PZug;
        var Treffer = 0;
        for (Feld = 0; Feld<PFelder-1; Feld++)
          if (Feld!=PFrei && Feld==eval(elements['p'+Feld].value)-1) Treffer++;
        if (Treffer==PFelder-1) {
          alert('Das Puzzle wurde in '+PZug+' Z'+unescape("%FC")+'gen gel'+unescape("%F6")+'st.');
          PGemischt = false
  } } } } }

// Eselspuzzle
var EFelder = 20;
var ETeile;
var EZug = 0;
var EKandidat = -1;
function EZeichne() {
  for (var Feld = 0; Feld<EFelder; Feld++)
    document.write
      ('<a href="javascript:EZiehe('+Feld+')"><img src="puzzles/e____.gif" name="e'+Feld+'" border="0" height="32" width="32" /></a>'+
      ((Feld+1)%4==0?'<br />':''));
  EStarte()
  }
function EZeige(Feld) {
  var Grenzen = '';
  for (var Richtung = 0; Richtung<4; Richtung++) {
    var Feld2 = Feld+Array(-4, 1, 4, -1)[Richtung];
    Grenzen += (ETeile[Feld]==0?(EKandidat<0?'_':'-'):(EBenachbart(Feld, Feld2) && ETeile[Feld2]==ETeile[Feld]?'0':'1'))
    }
  document.images['e'+Feld].src = 'puzzles/e'+Grenzen+'.gif'
  }
function EStarte() {
  ETeile = new Array(2,1,1,3, 2,1,1,3, 5,4,4,6, 5,7,8,6, 9,0,0,10);
  for (var Feld = 0; Feld<EFelder; Feld++) EZeige(Feld);
  EZug = 0;
  EKandidat = -1;
  document.EBrett.Zuege.value = EZug
  }
function EZiehe(Feld) {
  var Teil = ETeile[Feld];
  if (EKandidat<0) {
    var Bewegung = 0;
    for (var Richtung = 0; Richtung<4; Richtung++) {
      var Schritt = Array(-4, 1, 4, -1)[Richtung];
      var Moeglich = true;
      for (var Feld2 = 0; Feld2<EFelder; Feld2++)
       if (ETeile[Feld2]==Teil) {
         var Ziel = Feld2+Schritt;
         Moeglich = Moeglich && EBenachbart(Feld2, Ziel) && (ETeile[Ziel]==0 || ETeile[Ziel]==Teil)
         }
      if (Moeglich)
        if (Bewegung!=0) EKandidat = Feld
        else Bewegung = Schritt
    } }
  else if (ETeile[Feld]==0 || Feld==EKandidat) {
    var Teil = ETeile[EKandidat];
    var Bewegung = Feld-EKandidat;
    if ((Math.abs(Bewegung)&5)==0) Bewegung/=2;
    EKandidat = -1
    }
  if (EKandidat<0 && Bewegung!=0) {
    for (Feld = 0; Feld<EFelder; Feld++) {
      var Feld2 = (Bewegung<0?Feld:EFelder-1-Feld);
      if (ETeile[Feld2]==Teil) {
        ETeile[Feld2+Bewegung] = Teil;
        ETeile[Feld2] = 0
      } }
    document.EBrett.Zuege.value = ++EZug
    }
  for (Feld = 0; Feld<EFelder; Feld++) if (ETeile[Feld]==Teil || ETeile[Feld]==0) EZeige(Feld);
  if (EZuende()) alert('Das Puzzle wurde in '+EZug+' Zügen gelöst.')
  }
function EFinde() {
  var Zuege = new Array(
    16, 8,19,11, 9.11,13, 9.08,10,15,18,17.18,12, 8,
     9,14,18,19,11,10, 8, 0,12, 4.12, 1, 3,11,15, 7,
    11.07,14,18.19,13,16, 8, 9,14,19,17,18.17,10, 2,
     3, 7,15.11,14, 6.18,10.18,11,10.06, 8, 9.11,12,
    17,13.17, 8,16,17, 9,10, 3, 2, 9,14, 6,10.06,13,
    12,13.17, 8, 0, 2, 3, 1, 2.01, 6,14,17,16, 7,15,
    18,17.18,12, 4, 0, 1.001,2,10, 6.02, 8, 4, 0, 8,
     4.08, 1, 2, 3,11, 7.03, 9, 8,12.08,16,18,19,17,
    18.17,10, 9, 8,10, 9.10,12,17,13.12,14);
  Zug = Zuege[EZug];
  Zuege = null;
  EZiehe(Math.floor(Zug));
  if (Zug>Math.floor(Zug)) EZiehe(Math.round((Zug-Math.floor(Zug))*100))
  }
function EBenachbart(Feld1, Feld2) {
  return Feld2>=0 && Feld2<EFelder && Math.abs(Feld1%4-Feld2%4)+Math.abs(Math.floor(Feld1/4)-Math.floor(Feld2/4))==1
  }
function EZuende() {
  return ETeile[17]==1 && ETeile[18]==1
  }
