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

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

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

// 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";

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

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

// Welche Groesse soll das Spielfeld haben?
var size      = 16;

// An welche eMail Adresse sollen die Spielergebnisse geschickt werden?
var emailto   = "";

// Name des Emailempfaengers
var nameto    = "";

// Welches Subject soll die Mail erhalten?
var subject   = "V I R G I N  P U Z Z L E";

// Breite * Hoehe sollten dann auf den Wert von _size_ kommen
var breite    = 4;
var hoehe     = 4;

// Die Breite und Hoehe der Images sollte sich an der Fenstergroesse orientieren
var ibreite   = 80;
var ihoehe    = 80;

// 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    = 4;

// 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;

// Form Referenz
var F = document.forms.puzzle;

// Die besten 20 Spieler in einem externen Fenster anzeigen.
function top15() {
  window.open("http://www.deflorateur.biz/puzzletop.php?TOP","Top15","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width=640,height=540");
}

// Das originale Bild in einem extra Fenster anzeigen
function original() {
  window.open("http://www.deflorateur.biz/puzzle/s"+imgset+"-original.jpg","ORIGINAL","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width=350,height=350");
}

// Spiel ist beendet
function gameOver() {
  document.images[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);
  F.emailto.value  = emailto;
  F.toname.value   = nameto;
  F.subject.value  = subject;
  F.imageset.value = imgset;
  F.timemul.value  = zeitmul;
  F.zugmul.value   = zugmul;
  F.submit();
}

// Die verschiedenen Images vorbereiten
function fillimages() {
  this.length = size;
  this[0] = new Image(ibreite, ihoehe);
  this[0].src = "/puzzle/empty.gif";
  for (i = 1; i < size + 1; i++) {
    this[i] = new Image(ibreite, ihoehe);
    this[i].src = "/puzzle/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--;

    // 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++;
  F.zuege.value=zuege;
  F.hiddenzuege.value=zuege;
  img[empty] = img[x];
  document.images[y].src = imgs[img[x]].src; empty = x;
  document.images[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);
  F.punktestand.value=p;
  timerID = setTimeout("startzeit()",1000); zeit++;
  F.spielzeit.value=zeit;
  F.hiddenspielzeit.value=zeit;
}

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

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

  felder   = new fillmixes();
  img      = new initfield();
  empty    = 0;
  zwischen = 0;
  zeit     = 0;
  zuege    = 0;
  makeArray();
  var r = 1 + (Math.random() * (size - 1)); m = parseInt(r);
  img[0] = img[m]; img[m] = 0; empty = m;

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

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

  startzeit();
  allok    = 1;
  hey      = 0;
  F.startbutton.value="STOP";
  F.punktestand.value="10000";
}

// 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();
//-->
