// Schiebe-Puzzle der Blinden Kuh (www.blinde-kuh.de)
// Mit Änderungen von MJS

// Die Liste mit den Bildern
var BildListe =
  new Array( "bild01.gif", "bild02.gif", "bild03.gif", "bild04.gif",
             "bild05.gif", "bild06.gif", "bild07.gif", "bild08.gif",
             "bild09.gif", "bild10.gif", "bild11.gif", "bild12.gif",
             "bild13.gif", "bild14.gif", "bild15.gif", "leer.gif"
           );

// Anzahl der Zeilen und Zeilen
var Zeilen  = 4;
var Spalten = 4;

// Koordinaten vom LeerBild
var LeerX = 4;
var LeerY = 4;

// Bild des fehlenden Teils
var LeerFueller = new Image();
LeerFueller.src = "bild16.gif";

// Bild für Hilfe
var HilfeBild = new Image();
HilfeBild.src = "loesung.gif";

// Anzahl der Mischvorgaenge
var MaxMischen = 42;

// Anzahl Klicks und verschobene Teile
var Klicks = 0;
var Verschoben = 0;
var StartZeit;
var StopZeit;

// Handle für Aufruf der Anzeige
var CounterHandle;

// SpielStand
var SpielModus = "off";
var HilfeGezeigt = false;

// ----- Angleichungen für die Parameter

var LeerA = LeerX;
var LeerB = LeerY;
var LeerPosistion = ((LeerY - 1) * Spalten) + (LeerX - 1);
var BildAnzahl = BildListe.length;
var loaded = 0;
var TempListe = new Array(BildAnzahl);

// Pruefen ob die Angaben in der BildListe mit den Spalten und Zeilen übereinstimmt

if (BildAnzahl != (Spalten * Zeilen)) {
 alert("Die Anzahl der Spalten und Zeilen stimmt nicht mit der Anzahl der Bilder in der BildListe ueberein!");
}

// -----   Funktionen

// Initialisierung des Puzzles
function Laden() {
  loaded = 1;
  NeuStart();
}


function SetzeBild(index, Source){
  var i = index + 1;
  document.images['bild'+i].src = Source;
}


// Karte Verschieben
function Schiebe( xpos, ypos ) {
 // Abbruch, wenn das LeerBild angeklickt wurde
 if (( xpos == LeerA ) && ( ypos == LeerB ))
 return;
 // Pruefen, ob das Leer-Bild in derselben Zeile liegt
 if (ypos == LeerB) {
  if (SpielModus == "on")
   Klicks++;
  Leer = ((LeerB-1) * Spalten) + LeerA - 1;
  // Liegt es Links, dann nach rechts schieben
  if (LeerA < xpos) {
    while (LeerA != xpos) {
      TempListe[Leer] = TempListe[Leer+1];
      TempListe[Leer+1] = BildListe[LeerPosistion];
      SetzeBild(Leer, TempListe[Leer]);
      LeerA += 1;
      Leer += 1;
      SetzeBild(Leer, TempListe[Leer]);
      if (SpielModus == "on")
       Verschoben++;
    }
  }
  // Liegt es Rechts dann nach links schieben
  else {
    while (LeerA != xpos) {
      TempListe[Leer] = TempListe[Leer-1];
      TempListe[Leer-1] = BildListe[LeerPosistion];
      SetzeBild(Leer, TempListe[Leer]);
      LeerA -= 1;
      Leer -= 1;
      SetzeBild(Leer, TempListe[Leer]);
      if (SpielModus == "on")
       Verschoben++;
    }
  }
 }
 else {
  // Pruefen, ob die Karte in der selben Spalte mit dem LeerBild liegt
  if (xpos == LeerA) {
   if (SpielModus == "on")
    Klicks++;
   Leer = ((LeerB-1) * Spalten) + LeerA - 1;
   // Liegt sie darunter, dann nch oben schieben
   if (LeerB < ypos) {
    while (LeerB != ypos) {
     TempListe[Leer] = TempListe[Leer+Spalten];
     TempListe[Leer+Spalten] = BildListe[LeerPosistion];
     SetzeBild(Leer, TempListe[Leer]);
     LeerB += 1;
     Leer += Spalten;
     SetzeBild(Leer, TempListe[Leer])
     if (SpielModus == "on")
      Verschoben++;
    }
   }
   // liegt sie darueber, dann nach unten schieben
   else {
    while (LeerB != ypos) {
     TempListe[Leer] = TempListe[(Leer-Spalten)];
     TempListe[Leer-Spalten] = BildListe[LeerPosistion];
     SetzeBild(Leer, TempListe[Leer])
     LeerB -= 1;
     Leer -= Spalten;
     SetzeBild(Leer, TempListe[Leer])
     if (SpielModus == "on")
      Verschoben++;
    }
   }
  }
 }
 if (SpielModus == "on") // Sonst könnte schon beim Mischen zufällig die richtige Anordnung rauskommen!
  Pruefen();
}

function Klick( xpos, ypos ) {
  if (SpielModus != "on") {
    if (confirm( "Sollen die Teile neu gemischt werden?"))
      Mischen();
  }
  else {
    Schiebe(xpos, ypos);
    Anzeige(0);
  }
}


// Die BildListe in die temporaere Liste kopieren
function ZurueckSetzen() {
  for (var i = 0; i < BildAnzahl; i++)
    TempListe[i] = BildListe[i];
}


function Pruefen() {
  var istgewonnen = true;
  for (var i = BildAnzahl - 1; i >= 0; i -= 1) { // von "hinten" überprüfen geht schneller, weil die meisten Menschen das Puzzle von "oben" lösen
    if (TempListe[i] != BildListe[i]) {
      istgewonnen = false;
      break;
    };
  }
  if (istgewonnen) {
    jetzt = new Date();
    StopZeit = jetzt;
    Anzeige(1);
    Counter(false);
    SpielModus = "off";
    document.images['bild16'].src = LeerFueller.src;
    sekunden = Math.round((StopZeit.getTime() - StartZeit.getTime()) / 100) / 10;
    if (confirm("Sie haben das Puzzle richtig zusammengesetzt!\n\nSie haben dafür "+Klicks+" Klicks gebraucht\nund damit "+Verschoben+" Teile verschoben.\nBenötigte Zeit: "+sekunden+" Sekunden.\n\nMöchten Sie das Puzzle noch einmal mischen?"))
      Mischen();
  }
}


// Neustart-Routine

function NeuStart() {
  SpielModus = "off";
  Counter(false);
  Anzeige(1);
  // Laden der Bildliste in die Dokumentbilder
  for (var i = 0; i < BildAnzahl; i++) {
    SetzeBild(i, BildListe[i])
    TempListe[i] = BildListe[i];
  }
  LeerA = LeerX;
  LeerB = LeerY;
}


function Mischen() {
 SpielModus = "off";
 // Abbruch, wenn das Spiel nicht geladen wurde
 if (loaded == 0) {
  return;
 }
 var Temp;
 for (var MischVorgang = 0; MischVorgang < MaxMischen ; MischVorgang++) {
  // Mal horizontal ein wenig herumschieben
  Temp = LeerA;
  while ( Temp == LeerA) {
   Temp = (random (Spalten)) + 1;
  }
  Schiebe (Temp, LeerB);
  // und mal vertikal ein wenig schieben
  Temp = LeerB;
  while (Temp == LeerB) {
   Temp = (random (Zeilen)) + 1;
  }
  Schiebe (LeerA, Temp);
 }
 Klicks = 0;
 Verschoben = 0;
 jetzt = new Date();
 StartZeit = jetzt;
 SpielModus = "on";
 Anzeige(0);
 Counter(true);
}


function Hilfe() {
  if (HilfeGezeigt)
    document.images['loesung'].src = "verdeckt.gif";
  else
    document.images['loesung'].src = HilfeBild.src;
  HilfeGezeigt = ! HilfeGezeigt;
}

function Anzeige(loeschen) {
  if (loeschen)
    document.getElementById("ausgabe").firstChild.nodeValue = "";
  else if (SpielModus=="on") {
    jetzt = new Date();
    sekunden = Math.floor((jetzt.getTime() - StartZeit.getTime()) / 1000);
    text = "Zeit: "+sekunden+" s, Klicks: "+Klicks;
    document.getElementById("ausgabe").firstChild.nodeValue = text;
  }
}

function Counter(an) {
  if (an)
    CounterHandle = window.setInterval("Anzeige(0)", 999);
  else
    window.clearInterval(CounterHandle);
}


// Zufallsgenerator von
// Paul Houle
// Department of Physics,  Cornell University
today=new Date();
jran=today.getTime();
function rnd() {
  ia=9301;
  ic=49297;
  im=233280;
  jran = (jran*ia+ic) % im;
  return jran/(im*1.0);
}

function random(number) {
  return Math.floor(rnd()*number);
}

