<!--
// SCHIEBEPUZZLE VERSION 2.0
// Programm by Kai-Jens Meyer <kjm@goweb.de>

// Ab Version 2.0 koennen nun verschiedene Bilder als Vorlage dienen.
// Bitte hier die maximale Anzahl an verfuegbaren Bildern angeben.
var maxbilder = 1;

// An dieser Zeile bitte nichts aendern!
var imgset = 1 + (Math.random() * maxbilder); imgset = parseInt(imgset);

// Benoetigte Timer
var timerID   = 0;

// Welche Endung haben die einzelnen Bilder?
var endung    = "jpg";

// Wieviel Zuege sollen am Anfang gemacht werden um das Bild zu mischen?
var backmoves = 300;

// Soll eine Warnung ausgegeben werden, wenn das leere Feld angeklickt wurde.
// Wenn ja, dann die Variable warnung auf 1 setzen
var warnung   = 1;

// Welcher Text soll dann ausgegeben werden?
var warntext  = "Dieses Feld ist doch leer!!!\n";

// Sie koennen um die einzelnen Images auch einen Rahmen anzeigen.
// Die Variable border gibt die Groesse des Rahmens an
var border    = 0;

// Sie koennen auch den Abstand zwischen den einzelnen Images vergroessern.
// Aendern Sie dazu einfach die Variable celle
var celle     = 0;

// Ab wieviel Zeichen ist ein eingegebener Username gueltig?
var laenge    = 3;

// Wenn zu wenig Zeichen im Usernamen angegeben wurden, wird diese Meldung angezeigt.
var warnlong  = "Bitte geben Sie mindestens "+laenge+" Zeichen im Usernamen an!";

// Welchen Text bekommt der User angezeigt, wenn bereits ein Spiel laeuft und er
// den START/STOP Button drueckt.
var running   = "Sie sind mitten im Spiel.\nMoechten Sie es wirklich beenden?";

// Diesen Texthinweis bekommt der Nutzer, wenn er auf ein Teil klickt ohne
// vorher das Spiel gestartet zu haben.
var hinweis   = "Bitte geben Sie erst Ihren Namen ein und druecken danach den START Button";

// Dieser Text wird angezeigt, wenn der User unbedingt ohne Namen spielen will
var hallo     = "Bitte LESEN Sie doch die Fenstertexte ganz genau!!!!";

// zeitmul und zugmul sind die Multiplikatoren fuer die Punkteberechnung
var zeitmul   = 5;
var zugmul    = 4;

// allok gibt an, ob ein Spiel gestartet wurde. allok sollte am Anfang immer 0 sein.
var allok     = 0;

// Das originale Bild in einem extra Fenster anzeigen
function original() {
  origbild = window.open(addpath+"s"+imgset+"-original.jpg","ORIGINAL","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width="+(breite*ibreite+10)+",height="+(hoehe*ihoehe+10));
}

// Spiel ist beendet
function gameOver() {
  eval("document.images.IMG_"+empty+".src = imgs[size].src;");
  var p = 10000 - (zuege * zugmul) - (zeit * zeitmul);
  alert("GRATULATION, Sie haben das Spiel in "+zeit+" Sekunden geloest.\nFuer die Loesung benoetigten Sie "+zuege+" Spielzuege.\n\nIhre Punktezahl: "+p);
  document.game.subject.value  = subject;
  document.game.hiddenpoints.value  = p;
  document.game.imageset.value = imgset;
  document.game.timemul.value  = zeitmul;
  document.game.zugmul.value   = zugmul;
  document.game.submit();
}

// Die verschiedenen Images vorbereiten
function fillimages() {
  this.length = size;
  this[0] = new Image(ibreite, ihoehe);
  this[0].src = "/images/empty.gif";
  for (i = 1; i < size + 1; i++) {
    this[i] = new Image(ibreite, ihoehe);
    this[i].src = addpath+"s"+imgset+"-"+i+"."+endung;
  }
}

function initfield() {
  this.length = size;
  for (i = 0; i < size; i++) {
    this[i] = 0;
  }
}

// Variablenfelder auffuellen
function fillmixes() {
  this.length = size;
  for (i = 0; i < size; i++) {
    this[i] = i + 1;
  }
}

// x zufaellige Zuege machen um das Spiel loesbar zu machen
function makeBackMoves(x) {

  // Zufallszaehler setzen
  var d = new Date();
  var T = d.getSeconds();
  for (i=0;i<T;i++) {
    var r = 1 + (Math.random() * 4); 
  }

  // X zufaellig Zuege machen
  while (x) {

    // Welche Richtung
    var r = 1 + (Math.random() * 4); 
    var j = parseInt(r);    

    // Position berechnen
    var pr = parseInt(empty/breite);
    var pc = (empty+1) - (pr*breite);

    // Nach rechts gehts nicht mehr
    if (((pc == breite) && (j == 2)) ||
        ((pc == 1) && (j == 4)) ||
        ((pr == 0) && (j == 1)) ||
        ((pr == hoehe-1) && (j == 3))) continue;

    // Image setzen
    var oldempty = empty;
    if (j==1) empty -= breite;
    else if (j == 2) empty++;
    else if (j == 3) empty += breite;
    else empty--;

//    alert("EMPTY = "+empty+"\nOLDEMPTY = "+oldempty+"\n. J = "+j+"\nPC/PR:"+pc+"/"+pr);

    // Array setzen
    img[oldempty] = img[empty];
    img[empty] = 0;

    // Zuege reduzieren 
    x--;
  }

  // Images anzeigen
  for (i=0;i<size;i++) {
    eval("document.images.IMG_"+i+".src = imgs[img[i]].src;");
  }
}

// Zufaellige Verteilung der einzelnen Images
function makeArray() {
  for (k = 0; k < size - 1; k++) {
    var r = 1 + (Math.random() * (size - 1)); j = parseInt(r);
    while ((felder[k] == 0) || (img[j] != 0)) {
      var r = 1 + (Math.random() * (size - 1)); j = parseInt(r);
    } img[j] = felder[k]; felder[k] = 0;
  } felder[size - 1] = 0;
}

// Pruefen ob die erforderliche Reihenfolge stimmt.
function isdone() {
  // Die Variable korr gibt eine Korrekturmoeglichkeit.
  // Steht die Variable korr auf 1, dann muss das freie Feld im rechten
  // unteren Eck stehen.
  // Steht die Variable korr auf 2, kann das freie Feld im rechten Eck
  // oder ein Feld vorher stehen.

  var korr = 1;

  for (i = 0; i < size - korr; i++) {
    if (img[i] != i+1) {
      return 0;
    }
  } return 1;
}

// Images austauschen und die Anzahl der Spielzuege um 1 erhoehen.
function wechseln(x,y) {

  // Spielzuege um 1 erhoehen und im FORM-Feld Zuege abspeichern.
  // Damit auch hier kein Beschiss gemacht werden kann, wird der Wert
  // zusaetzlich noch in einem Hidden-FORM-Feld gespeichert.
  zuege++;
  document.game.zuege.value=zuege;
  document.game.hiddenzuege.value=zuege;
  img[empty] = img[x];
  eval("document.images.IMG_"+y+".src = imgs[img[x]].src;");
  empty = x;
  eval("document.images.IMG_"+empty+".src = imgs[0].src;");
  img[x] = -1;

  // Pruefen, ob alle Felder richtig zusammengestellt wurden.
  // Wenn ja, dann hat's der User geschafft.
  if ( isdone() ){
    clearTimeout(timerID); gameOver();
  }
}

// Der User moechte ein Teil verschieben.
// Schauen wir doch mal, ob sich das gewaehlte Teil ueberhaupt bewegen laesst...
function verschieben(x) {

  // Spiel wurde noch nicht gestartet wenn allok != 1 ist.
  if (!( allok )) {
    if (hey > 2) {
      alert(hallo);
      return;
    }
    alert(hinweis); hey++;
    return;
  }

  // Wieso hat der User jetzt auf das leere Feld geklickt?
  if (img[x] < 0) {

    // Warnung ausgeben wenn warnung = 1
    if ( warnung ) {
      alert(warntext);
    } return;
  }

  // Positionsberechnungen durchfuehren
  if ((empty == x + breite) && (x < (size - breite))) {
    wechseln(x, x + breite);
  }
  if ((empty == x - breite) && (x > (breite - 1))) {
    wechseln(x, x - breite);
  }
  if ((empty == x - 1) && (x > 0) && (x % breite != 0)) {
    wechseln(x, x - 1);
  }
  if ((empty == x + 1) && (x < size - 1) && ((x + 1) % breite != 0)) {
    wechseln(x, x + 1);
  }
}

// Sobald die Seite komplett geladen wurde, beginnt die Zeit zu laufen.
// Die aktuelle Spielzeit wird im FORM-Feld 'spielzeit' staendig angezeigt.
// Damit keiner Beschiss machen kann, wird die Spielzeit zusaetzlich noch
// in einem versteckten FORM-Feld gespeichert.
function startzeit() {
  var p = 10000 - (zuege * zugmul) - (zeit * zeitmul);
  document.game.punktestand.value=p;
  timerID = setTimeout("startzeit()",1000); zeit++;
  document.game.spielzeit.value=zeit;
  document.game.hiddenspielzeit.value=zeit;
}

// Neues Spiel starten
function startgame() {
  // Pruefen wieviel Zeichen im Usernamen angegeben wurden.
  var u = document.game.username.value;
  if (u.length < laenge) {
    alert(warnlong);
    return;
  }

  // Es laeuft bereits ein Spiel (allok == 1)
  if ( allok ) {
    if (confirm(running)) {
      clearTimeout(timerID);
      document.game.spielzeit.value="";
      document.game.zuege.value="";
      document.game.punktestand.value="";
      document.game.startbutton.value="START";
      allok = 0;
      for (i = 0; i < size; i++) {
        eval("document.images.IMG_"+i+".src = imgs[i+1].src;");
      }
      return;
    } else {
      return;
    }
  }

  // Daten initialisieren
  felder   = new fillmixes();
  img      = new initfield();
  empty    = size - 1;
  zwischen = 0;
  zeit     = 0;
  zuege    = 0;

  // Spielfeld aufbauen
  for (i = 0; i < size; i++) {
    eval("document.images.IMG_"+i+".src = imgs[i+1].src;");
    img[i] = i+1;
  } 

  // Das leere Feld anzeigen
  eval("document.images.IMG_"+(size-1)+".src = imgs[0].src;");

  // Nun zufaellig die Sachen verschieben
  makeBackMoves(backmoves);

  // ---------------------------------------------------
  // Images zufaellig verteilen
  // ---------------------------------------------------
//  makeArray();
//  var r = 1 + (Math.random() * (size - 1)); 
//  m = parseInt(r);
//  img[0] = img[m]; img[m] = 0; empty = m;

  // Images neu mischen und erneut anzeigen
//  for (i = 0; i < size; i++) {
//    eval("document.images.IMG_"+i+".src = imgs[img[i]].src;");
//  } 

  // Das leere Feld anzeigen
//  eval("document.images.IMG_"+m+".src = imgs[0].src;");
  // ---------------------------------------------------

  // Es kann losgehen
  startzeit();
  allok    = 1;
  hey      = 0;
  document.game.startbutton.value="STOP";
  document.game.punktestand.value="10000";
  document.game.zuege.value="0";
}

// Arrays die zum Spiel benoetigt werden
var imgs     = new fillimages()
var felder   = new fillmixes()
var img      = new initfield()

// interne Variable zur Indizierung
var empty    = 0;

// interne Variable zur Zwischenspeicherung von Felddaten
var zwischen = 0;

// Zeit, die der User zur Loesung benoetigt hat
var zeit     = 0;

// Zuege, die der User zur Fertigstellung benoetigt
var zuege    = 0;

// Interner Zaehle fuer 'Bloede'
var hey      = 0;

// Datenarray initialisieren
makeArray();
//-->

