/*
Chess engine:
Copyright (c) 2011 Gary Linscott
All rights reserved.
*/

// ===================================================================
// Author: Frank Stroebel
// WWW: http://www.chessgamble.de/
// ===================================================================

//
// Funktionen für das Testspielchen.
//

var halbzugNummerZuletztAusgefuehrt = 0;

// Speicherung aller ausgeführten Züge:
// zugDatenArray[0] = Erster Zug von W: Notation.  Z.B. "e2-e4"
// zugDatenArray[1] = Erster Zug von W: Zugzeit.   Z.B. "29.11.2011 19:50:42"
// zugDatenArray[2] = Erster Zug von S: Notation.  Z.B. "Sg8-f6"
// zugDatenArray[3] = Erster Zug von S: Zugzeit.   Z.B. "29.11.2011 19:50:59"
// zugDatenArray[4] = Zweiter Zug von W: Notation. Z.B. "e4-e5"
// zugDatenArray[5] = Zweiter Zug von W: Zugzeit.  Z.B. "29.11.2011 19:51:02"
// zugDatenArray[6] = Zweiter Zug von S: Notation. Z.B. "Sf6-d5"
// zugDatenArray[7] = Zweiter Zug von S: Zugzeit.  Z.B. "29.11.2011 19:51:02"
var zugDatenArray = new Array();

var testspielUserGibtAuf = false;
var testspielUserIstMatt = false;
var testspielEngineIstMatt = false;

//
// Wir bei document.onload() aufgerufen.
//
function InitTestspiel()
{
  if (document.getElementById("ChessEngineInterface") != null) {
    // Zugdaten zurück setzen
    zugDatenArray = new Array();
    halbzugNummerZuletztAusgefuehrt = 0;
    testspielUserGibtAuf = false;
    testspielUserIstMatt = false;
    testspielEngineIstMatt = false;
    
    // Zuggenerator initialisieren, Grundstellung setzen
    g_timeout = 1000;
    UINewGame();
  }
}

//function FinishPlyCallback(move) { console.log("depth:" + move); }

//
// Wird aufgerufen wenn der Benutzer einen Zug im Testspielchen ausgeführt hat.
//
function OnUserZugImTestspielAusgefuehrt(zugTyp)
{
  // Jetzt den Zug ins Doc schreiben
  halbzugNummerZuletztAusgefuehrt += 1;
  WriteDocumentData(halbzugNummerZuletztAusgefuehrt,
                    document.Zugeingabe.inputvon.value,
                    document.Zugeingabe.inputnach.value.substr(0, 2),
                    zugTyp);
  // Zug in Notation hervorheben
  InitPartieAnzeige(true);
  HighlightSelektiertenZug();

  if (testspielUserGibtAuf) {
    InitPartieAnzeige(true);
    InitPartieanzeigeDragDrop(true, true);
    SetNotationScrollbar("unten");
    // Zug in Notation hervorheben
    HighlightSelektiertenZug();
    // Ihr Zug-Bereich zeigt nur noch das Ergebnis
    document.getElementById('IhrZugBereichContentAktuell').innerHTML = "0:1";
  }
  else {
    //
    // Einige Sachen für die Anzeige
    //
    
    // "Ihr Zug" muss weg (und darf beim Durchklicken nicht wieder kommen)
    // "(am Zug)" beim Gastspieler am Brett muss zum Chessgamble-Spieler
    $("#IhrZugBereichContentAktuell").addClass("Unsichtbar");
    WechsleAmZugAmBrett();
    
    var zugDaten;
    if (zugTyp == "Rochade") {
      if (document.Zugeingabe.inputnach.value.substr(0, 1) == "g") {
        zugDaten = '0-0';
      }
      else {
        zugDaten = '0-0-0';
      }
    }
    else if (zugTyp == "EP") {
      zugDaten = document.Zugeingabe.inputvon.value + document.Zugeingabe.inputnach.value + 'EP';
    }
    else {
      zugDaten = document.Zugeingabe.inputvon.value + document.Zugeingabe.inputnach.value;
    }
    MacheZugAufAktuellemBrett(zugDaten, true);
    // Wo jetzt MacheZugAufAktuellemBrett() aufgerufen wird, müssen wir nun den FEN erstellen und ErstelleAnalyseBrettAusFEN(zugId) aufrufen!
    SetNotationScrollbar("unten");
    
    // Gegenzug machen
    BerechneGegenzug();
  }
}

//
// Beide Spielernamen am Brett werden bearbeitet:
// Aus "Testspieler (am Zug)" wird "Testspieler" bzw. umgekehrt.
//
function WechsleAmZugAmBrett()
{
  // oben
  var spielerText = document.getElementById('IdSpielernameAmBrettOben').innerHTML;
  spielerText = WechsleAmZugAmBrettString(spielerText);
  document.getElementById('IdSpielernameAmBrettOben').innerHTML = spielerText;
  // unten
  var spielerText = document.getElementById('IdSpielernameAmBrettUnten').innerHTML;
  spielerText = WechsleAmZugAmBrettString(spielerText);
  document.getElementById('IdSpielernameAmBrettUnten').innerHTML = spielerText;
}
function WechsleAmZugAmBrettString(spielerText)
{
  var posAmZugText = spielerText.indexOf(T_Part_AmZug);
  if (posAmZugText > 0) {
    // " (am Zug)" weg nehmen
    spielerText = spielerText.substr(0, posAmZugText);
  }
  else {
    // " (am Zug)" anfügen
    if (!testspielUserIstMatt && !testspielEngineIstMatt) {
      spielerText += T_Part_AmZug;
    }
  }
  return spielerText;
}

//
// Result:
// halbzug = 0 -> result = 0
// halbzug = 1 -> result = W1
// halbzug = 2 -> result = S1
// halbzug = 3 -> result = W2
// halbzug = 4 -> result = S2
//
function GetZugIdFromHalbzug(halbzug)
{
  var result = "0";
  
  var zugNummer = 0;
  if (halbzug > 0) {
    if ((halbzug % 2) == 0) {
      zugNummer = halbzug / 2;
      result = "S" + zugNummer;
    }
    else {
      zugNummer = (halbzug + 1) / 2;
      result = "W" + zugNummer;
    }
  }
  
  return result;
}

//
// Result:
// halbzug = 0 -> result = 0
// halbzug = 1 -> result = 1
// halbzug = 2 -> result = 1
// halbzug = 3 -> result = 2
// halbzug = 4 -> result = 2
//
function GetZugnummerFromHalbzug(halbzug)
{
  var result = "0";
  
  var zugNummer = 0;
  if (halbzug > 0) {
    if ((halbzug % 2) == 0) {
      zugNummer = halbzug / 2;
      result = zugNummer;
    }
    else {
      zugNummer = (halbzug + 1) / 2;
      result = zugNummer;
    }
  }
  
  return result;
}

//
// Schreibt die erforderlichen Daten nach einem Zug (Computer oder Mensch) ins doc.
// Des Weiteren merkt sich die Methode die Zugdaten um spätere anfügen zu können.
//
// Params:
// - halbzugNummerZuletztAusgefuehrt = 1, 2, 3,...
// - von, nach = "e2", "f6", ...
// - zugTyp = "Rochade", "EP",
//            normaler Zug: "",
//            Bauerumwandlung: "q", "r", "b", "n".
//
function WriteDocumentData(halbzugNummerZuletztAusgefuehrt, von, nach, zugTyp)
{
  /*
    Folgende Daten berücksichtigen:
<div style="display: none;" id="IdAmZug">W</div>
<div style="display: none;" id="IdSpielform">Fernschach</div>
<div style="display: none;" id="IdSekundenWertBeiAbfrage">08</div>
<div style="display: none;" id="IdUserFarbe">W</div>
<div style="display: none;" id="IdSpielernameW">Spieler1</div>
<div style="display: none;" id="IdSpielernameS">Spieler0</div>
<div style="display: none;" id="ZugDatenBereich">
  <div id="ZugStellungNachZug_0">
    <table class="VergangeneStellungZugTabelle"><tr><td>&nbsp;-&nbsp;</td></tr></table>
  </div>
  <div id="ZugStellungNachZeit_0"></div>
  <div id="ZugRestZeit_WTge_0">10</div>
  <div id="ZugRestZeit_WStd_0">0</div>
  <div id="ZugRestZeit_WMin_0">0</div>
  <div id="ZugRestZeit_WTxt_0">für 10 Züge</div>
  <div id="ZugRestZeit_STge_0">10</div>
  <div id="ZugRestZeit_SStd_0">0</div>
  <div id="ZugRestZeit_SMin_0">0</div>
  <div id="ZugRestZeit_STxt_0">für 10 Züge</div>

  <div id="ZugRemis_W1">0</div>
  <div id="ZugRemis_S1">0</div>
  <div id="ZugRemis_W2">0</div>
  <div id="ZugRemis_S2">0</div>

  <div id="ZugDaten_W1">g1f3</div>
  <div id="ZugStellungNachZug_W1">
    <table class="VergangeneStellungZugTabelle"><tr><td>1.</td><td>Sg1-f3</td></tr></table>
  </div>
  <div id="ZugStellungNachZeit_W1">29.11.2011 19:50</div>
  
  <div id="ZugDaten_S1">b8c6</div>
  <div id="ZugStellungNachZug_S1">
    <table class="VergangeneStellungZugTabelle"><tr><td>1.</td><td>..</td><td>Sb8-c6</td></tr></table>
  </div>
  <div id="ZugStellungNachZeit_S1">29.11.2011 19:53</div>
  
  <div id="ZugBeobachterIstAmZug">Ja</div>
  <div id="ZugLetzter">S10</div>
</div> <!-- ZugDatenBereich -->    
  */

  //alert('WriteDocumentData: Halbzug = ' + halbzugNummerZuletztAusgefuehrt + ', von = ' + von + ', nach = ' + nach);
  
  // Speichere Zugdaten
  var zugText = SaveZug(von, nach, testspielUserGibtAuf, zugTyp);
  
  var IdZuletztAusgeführterZug = GetZugIdFromHalbzug(halbzugNummerZuletztAusgefuehrt);
  // = W1, S1, W2,...
  var nachDiesemIstWeissAmZug = false;
  if (IdZuletztAusgeführterZug.substr(0, 1) == "S") {
    nachDiesemIstWeissAmZug = true;
  }
  
  // Wer jetzt am Zug ist
  if (nachDiesemIstWeissAmZug) {
    document.getElementById('IdAmZug').innerHTML = "W";
  }
  else {
    document.getElementById('IdAmZug').innerHTML = "S";
  }
  
  // Ob der Beobachter am Zug ist
  if (nachDiesemIstWeissAmZug) {
    document.getElementById('ZugBeobachterIstAmZug').innerHTML = "Ja";
  }
  else {
    document.getElementById('ZugBeobachterIstAmZug').innerHTML = "Nein";
  }

  // Andere Uhr laufen lassen
  startZeitanzeigeUpdate();
  
  // Id des zuletzt ausgeführten Zuges
  document.getElementById('ZugLetzter').innerHTML = IdZuletztAusgeführterZug;
  
  // Remis-Zustand
  //<div id="ZugRemis_W1">0</div>
  var zugDatenBereich = document.getElementById('ZugDatenBereich').innerHTML;
  zugDatenBereich += '<div id="ZugRemis_' + IdZuletztAusgeführterZug + '">0</div>';
  document.getElementById('ZugDatenBereich').innerHTML = zugDatenBereich;
  
  // Letzter Zug-Text für Kommentare
  /*
  <div id="ZugStellungNachZug_W1"><table class="VergangeneStellungZugTabelle"><tr><td>1.</td><td>Sg1-f3</td></tr></table></div>
  */
  var zugDatenBereich = document.getElementById('ZugDatenBereich').innerHTML;
  zugDatenBereich += '<div id="ZugStellungNachZug_' + IdZuletztAusgeführterZug + '"><table class="VergangeneStellungZugTabelle"><tr><td>' + GetZugnummerFromHalbzug(halbzugNummerZuletztAusgefuehrt) + '.</td><td>' + zugText + '</td></tr></table></div>';
  document.getElementById('ZugDatenBereich').innerHTML = zugDatenBereich;
  
  // Zug-Daten
  /*
  <div id="ZugDaten_S1">b8c6</div>
  Format generell: "e2e4", "g1f3", "0-0", "0-0-0", "e7e8D" oder "e5f6EP".
  Sonderfälle sind also Rochade und e.p. Bauerumwandlung stimmt, weil die Umwandelfigur im nach-Feld steht.
  */
  var zugDatenBereich = document.getElementById('ZugDatenBereich').innerHTML;
  zugDatenBereich += '<div id="ZugDaten_' + IdZuletztAusgeführterZug + '">';
  if (zugTyp == "Rochade") {
    if (nach.substr(0, 1) == "g") {
      zugDatenBereich += '0-0';
    }
    else {
      zugDatenBereich += '0-0-0';
    }
  }
  else if (zugTyp == "EP") {
    zugDatenBereich += von + nach + 'EP';
  }
  else if (zugTyp == "q") {
    zugDatenBereich += von + nach + 'D';
  }
  else if (zugTyp == "r") {
    zugDatenBereich += von + nach + 'T';
  }
  else if (zugTyp == "b") {
    zugDatenBereich += von + nach + 'L';
  }
  else if (zugTyp == "n") {
    zugDatenBereich += von + nach + 'S';
  }
  else {
    zugDatenBereich += von + nach;
  }
  zugDatenBereich += '</div>';
  document.getElementById('ZugDatenBereich').innerHTML = zugDatenBereich;

  // Notation
  var neueNotation = GetNotationsStringMitNeuemZug(halbzugNummerZuletztAusgefuehrt);
  //alert(neueNotation);
  document.getElementById('NotationsBereich').innerHTML = neueNotation;
}

//
// Speichert den Zug in das Array "zugDatenArray".
// Gibt den gespeicherten Zug zurück.
//
// - zugTyp: Nur interessant bei Bauerumwandlung: "q", "r", "b", "n".
//
function SaveZug(von, nach, Aufgabe, zugTyp)
{
  var zugText = GetNotationFuerDiesenZug(von, nach);
  if (zugTyp == "q") {
    zugText += T_Part_Figur_D;
  }
  if (zugTyp == "r") {
    zugText += T_Part_Figur_T;
  }
  if (zugTyp == "b") {
    zugText += T_Part_Figur_L;
  }
  if (zugTyp == "n") {
    zugText += T_Part_Figur_S;
  }
  // = "e2-e4", "Sb8xc6"
  if (Aufgabe) {
    zugText = T_Part_Aufgegeben;
  }
  
  var jetzt = new Date();
  var h = jetzt.getHours();
  var m = jetzt.getMinutes();
  var s = jetzt.getSeconds();
  var Y = jetzt.getFullYear();
  var M = jetzt.getMonth() + 1;
  var D = jetzt.getDate();
  var zugZeit;
  if (T_Lang_Id == "de") {
    zugZeit = D+'.'+M+'.'+Y+' '+h+':'+m+':'+s;
  }
  else {
    //12/07/2011 08:03:16 PM
    var ampm;
    if (h > 12) {
      h %= 12;
      ampm = "PM";
    }
    else {
      ampm = "AM";
    }
    zugZeit = M+'/'+D+'/'+Y+' '+h+':'+m+':'+s+' '+ampm;
  }
  
  //
  // Daten speichern
  //
  zugDatenArray.push(zugText);
  zugDatenArray.push(zugZeit);
  //alert(zugDatenArray);
  
  return zugText;
}

function GetNotationsStringMitNeuemZug(halbzugNummerZuletztAusgefuehrt)
{
  /*
  <div id="NotationsBereich">
    <table class="notationsTabelle">
    
      <tr>
        <td class="notationZugNr">
          <div class="OrangeHintergrundEinstellig notationZugNrOrange">1</div>
        </td>
        <td class="notationZugW">
          <a class="NotationButtonIdentifier" href="#" id="IdZugSelected_W1">Sg1-f3</a>
        </td>
        <td class="notationZugS">
          <a class="NotationButtonIdentifier" href="#" id="IdZugSelected_S1">Sb8-c6</a>
        </td>
        <td class="notationRechts">
          <div id="nZeit_W1" class="notationAktuellZeit Unsichtbar">29.11.2011 19:50:42</div>
          <div id="nZeit_S1" class="notationAktuellZeit Unsichtbar">29.11.2011 19:53:24</div>
        </td>
      </tr>
      
      <tr>
        <td class="notationZugNr">
          <div class="OrangeHintergrundEinstellig notationZugNrOrange">2</div>
        </td>
        <td class="notationZugW">
          <a class="NotationButtonIdentifier" href="#" id="IdZugSelected_W2">e2-e4</a>
        </td>
        <td class="notationZugS">
        </td>
        <td class="notationRechts">
          <div id="nZeit_W2" class="notationAktuellZeit Unsichtbar">29.11.2011 19:53:45</div>
        </td>
      </tr>
      
    </table>
  </div>
  */
  
  // Notation erzeugen
  var neueNotation = '<table class="notationsTabelle"><tbody>';
  var zugDatenArrayIndex = 0;
  var halbzugNummer = 0;
  var zugNummerInNotation = 0;
  // Alle Züge durchgehen
  while (zugDatenArrayIndex < zugDatenArray.length) {
    zugNummerInNotation += 1;
    halbzugNummer += 1;
    // Daten des Zuges bestimmen
    var zugIdInNotation = GetZugIdFromHalbzug(halbzugNummer);
    // = W1, S1, W2,...
    var IdZugSelected = "IdZugSelected_" + zugIdInNotation;
    var zugText = zugDatenArray[zugDatenArrayIndex];
    var nZeitW = "nZeit_" + zugIdInNotation;
    zugDatenArrayIndex += 1;
    var zugZeit = zugDatenArray[zugDatenArrayIndex];
    zugDatenArrayIndex += 1;
    
    //
    // Nächste Tabellenzeile (= ein Zug = zwei Halbzüge) ausgeben
    //
    neueNotation += '<tr><td class="notationZugNr"><div class="OrangeHintergrundEinstellig notationZugNrOrange">';
    neueNotation += zugNummerInNotation + '</div></td>';
    neueNotation += '<td class="notationZugW">';
    neueNotation += '<a class="NotationButtonIdentifier" href="#" id="' + IdZugSelected + '">';
    neueNotation += zugText;
    neueNotation += '</a></td><td class="notationZugS">';
    // Hier der Link für den schwarzen Zug, falls Zug vorhanden
    var schwarzerZugVorhanden = false;
    if (zugDatenArrayIndex < zugDatenArray.length) {
      // Schwarzer Zug vorhanden
      schwarzerZugVorhanden = true;
      //<a class="NotationButtonIdentifier" href="#" id="IdZugSelected_S1">Sb8-c6</a>
      halbzugNummer += 1;
      zugIdInNotation = GetZugIdFromHalbzug(halbzugNummer);
      // = W1, S1, W2,...
      IdZugSelected = "IdZugSelected_" + zugIdInNotation;
      zugText = zugDatenArray[zugDatenArrayIndex];
      nZeitS = "nZeit_" + zugIdInNotation;
      zugDatenArrayIndex += 1;
      zugZeit = zugDatenArray[zugDatenArrayIndex];
      zugDatenArrayIndex += 1;
      neueNotation += '<a class="NotationButtonIdentifier" href="#" id="' + IdZugSelected + '">' + zugText + '</a>';
    }
    neueNotation += '</td><td class="notationRechts">';
    neueNotation += '<div id="' + nZeitW + '" class="notationAktuellZeit Unsichtbar">';
    neueNotation += zugZeit;
    neueNotation += '</div>';
    // Hier die Zugzeit falls schwarzer Zug vorhanden
    if (schwarzerZugVorhanden) {
      //<div id="nZeit_S1" class="notationAktuellZeit Unsichtbar">29.11.2011 19:53:24</div>
      neueNotation += '<div id="' + nZeitS + '" class="notationAktuellZeit Unsichtbar">' + zugZeit + '</div>';
    }
    neueNotation += '</td></tr>';
  }
  neueNotation += '</tbody></table>';
  
  return neueNotation;
}

//
// Macht die eigentliche Berechnung des Gegenzugs.
//
function BerechneGegenzug()
{
  // You can call GetMoveFromString("e2e4"). Make sure everything is lower case though.
  var moveAsGarbo = document.Zugeingabe.inputvon.value + document.Zugeingabe.inputnach.value.substr(0, 2);
  if (document.Zugeingabe.inputnach.value.length > 2) {
    // Bauerumwandlung liegt vor
    if (document.Zugeingabe.inputnach.value.substr(2) == "D") {
      moveAsGarbo += "q";
    }
    if (document.Zugeingabe.inputnach.value.substr(2) == "T") {
      moveAsGarbo += "r";
    }
    if (document.Zugeingabe.inputnach.value.substr(2) == "L") {
      moveAsGarbo += "b";
    }
    if (document.Zugeingabe.inputnach.value.substr(2) == "S") {
      moveAsGarbo += "n";
    }
  }
  var move = GetMoveFromString(moveAsGarbo);
  
  // Garbo-Funktionen ausführen
  UpdatePgnTextBox(move);
  
  // Prüfen ob die Engine Matt gesetzt wurde
  var notationGarbo = document.getElementById('PgnTextBox').value;
  if (notationGarbo.indexOf("#") > 0) {
    testspielEngineIstMatt = true;
    if (testspielEngineIstMatt) {
      if (confirm(T_Part_MattDerEngine)) {
        // Neues Spiel starten
        location.reload();
      }
    }
  }
    
  g_lastMove = move;
  MakeMove(move);
  var fen = GetFen();
  document.getElementById("FenTextBox").value = fen;
  
  setTimeout("SearchAndRedraw()", 0);
  // Damit ist der Benutzerzug ausgeführt und wir müssen jetzt auf die Antwort warten.
}

//
// Wird von GarboChess aufgerufen, wenn er einen Gegenzug auf seinem Brett ausgeführt hat.
// Führt den Zug auf der Partieanzeige aus, sodass der Benutzer wieder am Zug ist.
//
function OnComputerZugBerechnet()
{
  var moveImGarboFormat = aktuellerComputerZug;
  //alert('Gegenzug = ' + moveImGarboFormat);
  // Gegenzug = 22327 (= "d7d5")
  
  // das übersetzen in: von, nach: "e2", "e4", ...
  var moveAlsString = FormatMove(moveImGarboFormat);
  //alert('Gegenzug = ' + moveAlsString);
  // Gegenzug = d7d5
  // Gegenzug = a2b1q
  
  var von  = moveAlsString.substr(0, 2);
  var nach = moveAlsString.substr(2, 2);
  var umwandelFigur = "";
  if (moveAlsString.length > 4) {
    umwandelFigur = moveAlsString.substr(4, 1); // Anhang q, r, b, n bei Bauerumwandlung
  }
  
  // Zug selbst
  BewegeFigurOptisch(von, nach); // Darf keinen Bauerumwandel-Zusatz haben!
  // Falls Rochade, Bauerumwandlung oder e.p.
  StarteSonderAktionNachZug(von, nach, umwandelFigur); // Öffnet Umwandeldialog bei Bauerumwandlung
  
  // Prüfen ob der Spieler Matt gesetzt wurde
  var notationGarbo = document.getElementById('PgnTextBox').value;
  if (notationGarbo.indexOf("#") > 0) {
    testspielUserIstMatt = true;
  }
  
  // Jetzt den Zug ins Doc schreiben
  halbzugNummerZuletztAusgefuehrt += 1;
  WriteDocumentData(halbzugNummerZuletztAusgefuehrt, von, nach, typDesLetztenZuges);

  // Nun müssen wir das Brett neu initialisieren, damit der Benutzer seine Figuren wieder ziehen kann
  InitPartieAnzeige(true);
  InitPartieanzeigeDragDrop(true, true);
  SetNotationScrollbar("unten");
  // Zug in Notation hervorheben
  HighlightSelektiertenZug();
  
  // "Ihr Zug" muss weg (und darf beim Durchklicken nicht wieder kommen)
  // "(am Zug)" beim Gastspieler am Brett muss zum Chessgamble-Spieler
  if (!testspielUserIstMatt) {
    $("#IhrZugBereichContentAktuell").removeClass("Unsichtbar");
  }
  WechsleAmZugAmBrett();
  
  if (testspielUserIstMatt) {
    if (confirm(T_Part_Matt)) {
      // Neues Spiel starten
      location.reload();
    }
  }
}

//
// FÃ¼hrt den durch zugDaten angegebenen Zug auf dem Brett aus.
// zugDaten = "e2e4", "g1f3", "0-0", "0-0-0", "e7e8D" oder "e5f6EP".
//
// RÃ¼ckgabe-Array:
// result[0] = Von (z.B. "e2")
// result[1] = Nach (z.B. "e4")
//
function MacheZugAufAktuellemBrett(zugDaten, weisserZug)
{
  //alert('MacheZugAufAktuellemBrett: zugDaten = '+zugDaten+', weisserZug = '+weisserZug);
  // zugDaten = e2e4, weisserZug = true
  // zugDaten = d7d5, weisserZug = false
  if (weisserZug) {
    WeissAmZugAufBrett = false;
  }
  else {
    WeissAmZugAufBrett = true;
  }
    
  // Einige Vars init.
  var letztesZeichen = zugDaten.substr(zugDaten.length - 1);
  var startFeld = zugDaten.substr(0, 2);
  var zielFeld = zugDaten.substr(2);
  var figur = GetFigurFromFeld(startFeld);
  // figur = "kw"
  
  bauerDoppelschritt = ""; // Merker bzgl. Schlagen e.p.
  
  // FÃ¤lle unterscheiden
  if (zugDaten.length == 4) {
    // Ein ganz normaler Zug
    
    SetFeld(startFeld, "");
    SetFeld(zielFeld, figur);
    
    // Merker aktualisieren
    if (figur == "kw") {
      koenigWgezogen = true;
    }
    else if (figur == "ks") {
      koenigSgezogen = true;
    }
    else if ((figur == "tw") && (startFeld == "a1")) {
      turmA1gezogen = true;
    }
    else if ((figur == "tw") && (startFeld == "h1")) {
      turmH1gezogen = true;
    }
    else if ((figur == "ts") && (startFeld == "a8")) {
      turmA8gezogen = true;
    }
    else if ((figur == "ts") && (startFeld == "h8")) {
      turmH8gezogen = true;
    }
    else if (IsBauerDoppelschritt(figur, startFeld, zielFeld)) {
      // Der kann evtl. e.p. geschlagen werden
      bauerDoppelschritt = zielFeld;
    }
    else {
      // Keine weiteren FÃ¤lle
    }
    
  }
  else if (zugDaten.length == 3) {
    // Kurze Rochade
    
    if (weisserZug) {
      // Kurze Rochade W
      SetFeld("e1", "");
      SetFeld("g1", "kw");
      SetFeld("h1", "");
      SetFeld("f1", "tw");
      // FÃ¼r RÃ¼ckgabe
      startFeld = "e1";
      zielFeld  = "g1";
      // Merker aktualisieren
      turmH1gezogen = true;
      koenigWgezogen = true;
    }
    else {
      // Kurze Rochade S
      SetFeld("e8", "");
      SetFeld("g8", "ks");
      SetFeld("h8", "");
      SetFeld("f8", "ts");
      // FÃ¼r RÃ¼ckgabe
      startFeld = "e8";
      zielFeld  = "g8";
      // Merker aktualisieren
      turmH8gezogen = true;
      koenigSgezogen = true;
    }
  }
  else if ((zugDaten.length == 5) && (letztesZeichen == "0")) {
    // Lange Rochade
    
    if (weisserZug) {
      // Lange Rochade W
      SetFeld("e1", "");
      SetFeld("c1", "kw");
      SetFeld("a1", "");
      SetFeld("d1", "tw");
      // FÃ¼r RÃ¼ckgabe
      startFeld = "e1";
      zielFeld  = "c1";
      // Merker aktualisieren
      turmA1gezogen = true;
      koenigWgezogen = true;
    }
    else {
      // Lange Rochade S
      SetFeld("e8", "");
      SetFeld("c8", "ks");
      SetFeld("a8", "");
      SetFeld("d8", "ts");
      // FÃ¼r RÃ¼ckgabe
      startFeld = "e8";
      zielFeld  = "c8";
      // Merker aktualisieren
      turmA8gezogen = true;
      koenigSgezogen = true;
    }
  }
  else if ((zugDaten.length == 5) && (letztesZeichen != "0")) {
    // Bauer-Umwandlung
    var umwandelFigurZeichen = zugDaten.substr(4, 1);
    
    figur = umwandelFigurZeichen.toLowerCase();
    if (weisserZug) {
      figur = figur + "w";
    }
    else {
      figur = figur + "s";
    }
    SetFeld(startFeld, "");
    SetFeld(zielFeld, figur);
  }
  else if ((zugDaten.length == 6) && (letztesZeichen == "P")) {
    // En passant
    
    SetFeld(startFeld, "");
    SetFeld(zielFeld, figur);
    // Noch den geschlagenen Bauern entfernen
    var geschlagenerFeld = GetPerEPGeschlagenerBauerFeld(startFeld, zielFeld);
    SetFeld(geschlagenerFeld, "");
  }
  else {
    // Kann nicht sein
  }
  
  // RÃ¼ckgabe-Wert erzeugen
  var result = new Array(2);
  result[0] = startFeld;
  result[1] = zielFeld;
  return result;
}

