// ===================================================================
// Author: Frank Ströbel
// WWW: http://www.chessgamble.de/
// ===================================================================

//
// Funktionen für die Partieanzeige bzgl. Anzeige vergangener Stellungen.
//

// Das 8x8-Array für die Stellung
// [0][0] = a1, [1][0] = a2, ...
// Figuren: "tw", "sw", ..., "" = leeres Feld
// Wird in ErstelleAnalyseBrettAusFEN() initialisiert.
var brett;
// Das 8x8-Array für die sichtbarkeit der Felder (für Dark Chess).
// [0][0] = a1, [1][0] = a2, ...
// Sichtbar = 's', unsichtbar = 'u'.
// Wird in ErstelleAnalyseBrettAusFEN() initialisiert.
var brettSichtbarkeit;

// Zustände merken für Rochaden
var rochadeWKurzMoeglich = true;
var rochadeWLangMoeglich = true;
var rochadeSKurzMoeglich = true;
var rochadeSLangMoeglich = true;

// En passant
var bauerDoppelschritt = ""; // Aktuell keiner. Sonst steht hier "f5", wenn im letzten Zug Bf7-f5 gezogen hatte.

// Merker für AnalyseZugAusfuehren() und AnalyseZugZurueckNehmen()
var analyseFeldNamen   = new Array("", "", "", ""); // "" = keiner gemerkt, sonst "d4"
var analyseFeldFiguren = new Array("", "", "", ""); // "" = Feld leer, "ts" = Turm schwarz

// Farben der Felder und Umrandungen auf dem Brett. Siehe auch "CPartieUI.php"
var FeldFarbeW        = "#fffbf0";
var FeldFarbeS        = "#a1b309";
var FeldFarbeLastZug  = "#2e3305";
var FeldFarbeMausOver = "#aaaaaa";

// Der aktuell ausgewählte Zug. Format: "W15" oder "0": Partieanfang (Grundstellung)
var selektierterZugId;

var initDoneForTestspiel = false;

//
// Initialisierung. Wird aufgerufen, wenn die Seite geladen wurde.
//
function InitPartieAnzeige(calledFromTestspiel)
{
  // Wir machen nur etwas, wenn auch eine Partie im Hauptfenster ist
  var partieId = document.getElementById('IdPartieImHauptfenster').innerHTML;
  partieId *= 1;
  if (partieId != -1) {
  
    if (!calledFromTestspiel || !initDoneForTestspiel) {
      initDoneForTestspiel = true;
      
      // jQueryUI-Anteile initialisieren
      InitPartieAnzeigejQueryUI();

      //
      // EventHandler an die Player-Buttons hängen
      //
      $(".PlayerButtonIdentifier").click(function() {
        PlayerButtonClicked($(this).attr('id'));
      });

      //
      // EventHandler an den "Zug zurück nehmen (Eingabe)"-Button hängen
      //
      $("#IdZugLoeschenButton").click(function() {
        resetpressed();
      });
      
      //
      // Warnung an Aufgeben-Button hängen
      //
      $("#IdAufgebenButton").click(function() {
        WarningAufgabe();
      });
      //
      // Warnung an Remis annehmen-Button hängen
      //
      $("#IdRemisAnnehmenButton").click(function() {
        WarningRemis();
      });
    }
      
    //
    // EventHandler an die Notations-Buttons hängen
    //
    $(".NotationButtonIdentifier").click(function() {
      MoveClicked($(this).attr('id'));
    });
    
    // Initial befinden wir uns beim letzten Zug (= aktuelle Stellung).
    selektierterZugId = document.getElementById('ZugLetzter').innerHTML;
    // Dann werden die Player-Buttons initialisiert
    SteuerePlayerButtons();
    
    //
    // Die Zugzeit des letzten Zuges wird eingeblendet.
    //
    ShowZeitDesSelektiertenZuges();
    
    //
    // Und der aktuelle Zugkommentar wir in den Block geschrieben
    //
    var selektierterZugIdMaskiert = "dummy_" + selektierterZugId;
    SchreibeLetztenZugKommentar(selektierterZugIdMaskiert);
    
    // Der Notations-Scrollbalken wird in scrollbarmanager.js::RestoreScrollBars()
    // nach ganz unten positioniert.
  }
}

//
// Initialisierung der jQueryUI-Anteile der Partieanzeige. Wird von InitPartieAnzeige() aufgerufen.
//
function InitPartieAnzeigejQueryUI()
{
  //
  // Tabs in der Partie-Anzeige initialisieren
  //
  $("#Partieanzeige-tabs").tabs({ selected: 0 });
  
  //
  // Zug-Kommentar Eingabedialog
  //
  $(function() {
      var kommentartext = $("#kommentartext"),
            allFields = $([]).add(kommentartext),
            tips = $("#validateTips");

      function updateTips(t) {
          tips
              .text(t)
              .addClass('ui-state-error');
          setTimeout(function() {
              tips.removeClass('ui-state-error');
          }, 2000);
      }

      function checkLength(o, n, min, max) {
          if ( o.val().length > max || o.val().length < min ) {
              updateTips(T_Part_CommentLongA + max + T_Part_CommentLongB);
              return false;
          } else {
              return true;
          }
      }

      $("#ZugCommentDialog").dialog({
          autoOpen: false,
          height: 350,
          width: 504,
          modal: true,
          buttons: {
              'OK': function() {    // Statt OK kann hier beliebiger Text stehen
                  var bValid = true;
                  allFields.removeClass('ui-state-error');
                  bValid = bValid && checkLength(kommentartext, "Kommentar", 0, 120);
                  if (bValid) {
                      document.getElementById("idKommentarText").innerHTML = kommentartext.val();
                      $(this).dialog('close');
                  }
              },
              Cancel: function() {
                  $(this).dialog('close');
              }
          },
          close: function() {
              allFields.val('').removeClass('ui-state-error');
          }
      });
      
      
      $('.ZugKommentarEingabeDialogOpener')
        .click(function() {
          defaultText = document.getElementById("idKommentarText").innerHTML;
          kommentartext.val(defaultText);
          document.getElementById("validateTips").innerHTML = "";
          $('#ZugCommentDialog').dialog('open');
          return false;
        });

  });

  //
  // Bauerumwandlung-Dialog
  //
  var spielartId = document.getElementById('AktuelleSpielart').innerHTML;
  spielartId *= 1;
  if (spielartId == 3) {
    // Räuberschach: Hier darf man auch in einen König umwandeln
    $("#IdBauerUmwandlungDialog").dialog({
      autoOpen: false,
      resizable: false,
      width: 290,
      modal: true,
      
      buttons: [
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelK,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("K");
          }
        },
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelD,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("D");
          }
        },
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelT,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("T");
          }
        },
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelL,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("L");
          }
        },
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelS,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("S");
          }
        }
      ],
      
      open: function() {
        formularSendenFreigegeben = false;
        var amZugFarbe = document.getElementById('IdAmZug').innerHTML;
        if (amZugFarbe == "W") {
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').button({
            icons: { primary: 'ui-fst-icon-kw' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().button({
            icons: { primary: 'ui-fst-icon-dw' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().button({
            icons: { primary: 'ui-fst-icon-tw' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().next().button({
            icons: { primary: 'ui-fst-icon-lw' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().next().next().button({
            icons: { primary: 'ui-fst-icon-sw' },
            text: false
          });
        }
        else {
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').button({
            icons: { primary: 'ui-fst-icon-ks' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().button({
            icons: { primary: 'ui-fst-icon-ds' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().button({
            icons: { primary: 'ui-fst-icon-ts' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().next().button({
            icons: { primary: 'ui-fst-icon-ls' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().next().next().button({
            icons: { primary: 'ui-fst-icon-ss' },
            text: false
          });
        }
      }

    });
  }
  else {
    // Normale Umwandlung: D, T, L, S.
    $("#IdBauerUmwandlungDialog").dialog({
      autoOpen: false,
      resizable: false,
      width: 230,
      modal: true,
      
      buttons: [
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelD,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("D");
          }
        },
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelT,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("T");
          }
        },
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelL,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("L");
          }
        },
        {
          width: 44,
          height: 44,
          text: T_Part_UmwandelS,
          click: function() {
            $(this).dialog("close");
            OnUmwandelFigurGewaehlt("S");
          }
        }
      ],
      
      open: function() {
        formularSendenFreigegeben = false;
        var amZugFarbe = document.getElementById('IdAmZug').innerHTML;
        if (amZugFarbe == "W") {
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').button({
            icons: { primary: 'ui-fst-icon-dw' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().button({
            icons: { primary: 'ui-fst-icon-tw' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().button({
            icons: { primary: 'ui-fst-icon-lw' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().next().button({
            icons: { primary: 'ui-fst-icon-sw' },
            text: false
          });
        }
        else {
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').button({
            icons: { primary: 'ui-fst-icon-ds' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().button({
            icons: { primary: 'ui-fst-icon-ts' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().button({
            icons: { primary: 'ui-fst-icon-ls' },
            text: false
          });
          $(this).parent().find('.ui-dialog-buttonpane button:first-child').next().next().next().button({
            icons: { primary: 'ui-fst-icon-ss' },
            text: false
          });
        }
      }

    });
  }
}

// ==========================================
// Abteilung "Warnung bei Aufgabe oder Remis
// ==========================================
function WarningAufgabe()
{
  if (confirm(T_Part_Aufgabe)) {
    FuehreZugAus("PartieAufgeben");
    if (document.getElementById("ChessEngineInterface") != null) {
      // Wir sind im Testspielchen
      if (confirm(T_Part_NochEine)) {
        // Neues Spiel starten
        location.reload();
      }
    }
  }
}

function WarningRemis()
{
  if (confirm(T_Part_Remis)) {
    FuehreZugAus("RemisAnnehmen");
  }
}

function WarningRemisDurchChessgamble()
{
  var ret = confirm("Partie Remis setzen?");
  return ret;
}
// ==========================================
// Abteilung "Warnung bei Aufgabe oder Remis Ende
// ==========================================

//
// Wird aufgerufen, wenn Player-Button in der Gesamt-Notation der Partieanzeige angeklickt wird.
// Daraufhin wird die Stellung nach dem entsprechenden Zug angezeigt.
// Das wird durch den Aufruf von "MoveClicked()" realisiert.
//
// Anmerkung:
// Diese Methode wird auch vom Button "Zur Zugabgabe" genutzt.
//
function PlayerButtonClicked(playerButtonId)
{
  var letzterZugId = document.getElementById('ZugLetzter').innerHTML;
  // "letzterZugId" ist jetzt z.B. "W15" oder "0": Es wurde noch gar kein Zug gemacht
  
  switch (playerButtonId) {
    case "buttonPlayerPartieStart":
      //alert('Zum Partiestart');
      // Scrollbar der Notation ganz nach oben
      SetNotationScrollbar("oben");
      MoveClicked("IdZugSelected_0");
      break;
    case "buttonPlayerEinsZurueck":
      //alert('Ein Zug zurück...');
      var previousMoveId = GetPreviousOrNextMoveId(selektierterZugId, letzterZugId, false);
      if (previousMoveId !== false) {
        var moveClickedParam = "IdZugSelected_" + previousMoveId;
        // Scrollbar der Notation ggf. korrigieren
        SetNotationScrollbar(ShallNotationScrollbarMoveOnPlayerUsed(playerButtonId, selektierterZugId, previousMoveId));
        MoveClicked(moveClickedParam);
      }
      break;
    case "buttonPlayerEinsVor":
      //alert('Ein Zug vor');
      var nextMoveId = GetPreviousOrNextMoveId(selektierterZugId, letzterZugId, true);
      if (nextMoveId !== false) {
        var moveClickedParam = "IdZugSelected_" + nextMoveId;
        // Scrollbar der Notation ggf. korrigieren
        SetNotationScrollbar(ShallNotationScrollbarMoveOnPlayerUsed(playerButtonId, selektierterZugId, nextMoveId));
        MoveClicked(moveClickedParam);
      }
      break;
    case "buttonPlayerPartieEnde":
      //alert('Zum Partieende');
      var moveClickedParam = "IdZugSelected_" + letzterZugId;
      // Scrollbar der Notation ganz nach unten
      SetNotationScrollbar("unten");
      MoveClicked(moveClickedParam);
      break;
    default:
      break;
  }
}

//
// Diese Funktion wird aufgerufen wenn ein Player button "Eins vor" oder "Eins zurück" bedient wurde.
// Ermittelt ob und wie die Scrollbar der Notation bewegt werden soll.
//
// Ein Zug vor geklickt:
//   Bei Wechsel von weißem zu schwarzem Zug: Nichts zu tun.
//   Bei Wechsel von schwarzem zu weißem Zug: Um die Höhe eines Zuges runter.
// Ein Zug zurück geklickt:
//   Bei Wechsel von schwarzem zu weißem Zug: Nichts zu tun.
//   Bei Wechsel von weißem zu schwarzem Zug: Um die Höhe eines Zuges hoch.
//
// Params:
// - playerButtonId: "buttonPlayerEinsZurueck" oder "buttonPlayerEinsVor".
// - oldMoveId:      Id des vorher angewählten Zuges "W15" oder "0".
// - newMoveId:      Id des neu angewählten Zuges "W15" oder "0".
//
// Return:
// - ""           Nichts zu tun.
// - "einshoch"   Entspricht Param für SetNotationScrollbar().
// - "einsrunter" Entspricht Param für SetNotationScrollbar().
//
function ShallNotationScrollbarMoveOnPlayerUsed(playerButtonId, oldMoveId, newMoveId)
{
  var erg = "";
  
  var farbeOld = oldMoveId.substr(0, 1);
  var farbeNew = newMoveId.substr(0, 1);
  
  if (playerButtonId == "buttonPlayerEinsVor") {
    if ((farbeOld == "S") && (farbeNew == "W")) {
      erg = "einsrunter";
    }
  }
  
  if (playerButtonId == "buttonPlayerEinsZurueck") {
    if ((farbeOld == "W") && (farbeNew == "S")) {
      erg = "einshoch";
    }
  }
  
  return erg;
}

//
// Wird aufgerufen, wenn ein Zug in der Gesamt-Notation der Partieanzeige angeklickt oder
// ein Player-Button bedient wird.
//
// Daraufhin wird die Stellung nach diesem Zug angezeigt.
//
// zugButtonId = "IdZugSelected_W15" für 15. Zug von Weiss geklickt.
// zugButtonId = "IdZugSelected_0" für Partieanfang.
//
function MoveClicked(zugButtonId)
{
  //
  // Zunächst einige Grundsatz-Fragen kären
  //
  var letzterZugId = document.getElementById('ZugLetzter').innerHTML;
  // "letzterZugId" ist jetzt z.B. "W15" oder "0": Es wurde noch gar kein Zug gemacht
  selektierterZugId = GetZugIdFromComplexId(zugButtonId);
  // "selektierterZugId" hat jetzt das selbe Format wie "letzterZugId"
  var aktuelleStellungAngewaehlt = false;
  // Ob eine vergangene oder die aktuelle Stellung angewählt wurde
  if (selektierterZugId == letzterZugId) {
    // Die aktuelle Stellung wurde ausgewählt
    // ACHTUNG: In der Grundstellung ist das auch true, wenn noch kein Zug gemacht wurde!
    aktuelleStellungAngewaehlt = true;
  }
  else {
    // Eine vergangene Stellung wurde ausgewählt
    aktuelleStellungAngewaehlt = false;
  }
  // Ob der Betrachter (bei nicht beendeter Partie) am Zug ist
  var betrachterAmZug = false;
  var betrachterAmZugDoc = document.getElementById('ZugBeobachterIstAmZug').innerHTML;
  if (betrachterAmZugDoc == "Ja") {
    // Betrachter ist  am Zug
    betrachterAmZug = true;
  }
  else {
    // Betrachter ist nicht am Zug
    betrachterAmZug = false;
  }

  //
  // Nun die Manipulationen der Anzeige
  //
  
  // Figuren entsprechend auf dem Brett anzeigen
  ZeichneBrett(zugButtonId);
  
  // Zugzeit des selektierten Zuges einblenden
  ShowZeitDesSelektiertenZuges();
  // Selektierten Zug in der Notation hervorheben
  HighlightSelektiertenZug();
  // Den Bereich "Letzter Zug" schreiben:
  SchreibeLetzterZugBereich(zugButtonId, aktuelleStellungAngewaehlt);
  // Aktiviere oder Deaktivier Zugeingabe-Bereich
  MacheZugeingabeBereichSichtbar(aktuelleStellungAngewaehlt, betrachterAmZug);
  // Aktiviere oder Deaktiviere das Feld-Umrandung-Blinken beim Überfahren
  //ActivateFeldUmrandungBlinkenBeiUeberfahren(aktuelleStellungAngewaehlt, betrachterAmZug);
  
  
  //
  // Folgende drei Aufrufe nur bei beendeter Partie
  //
  // Zeitanzeige oben: Überschrift anpassen
  //SchreibeZeitAnzeigeUeberschrift(zugButtonId, aktuelleStellungAngewaehlt);
  // Zeitanzeige oben: Restzeiten entsprechend ausfüllen
  //SchreibeZeitAnzeigeRestzeiten(zugButtonId, aktuelleStellungAngewaehlt);
  // Zeitanzeige oben: Urlaub entsprechend ausfüllen
  //SchreibeUrlaubZeile(zugButtonId, aktuelleStellungAngewaehlt);
  
  
  // Bereich "Kommentar zum letzten Zug" schreiben:
  SchreibeLetztenZugKommentar(zugButtonId);
  
  // Nun noch ein allgemeiner Aufruf, wo spezielle Klassen spezielle Dinge machen können.
  // Z.B. werden bei Dark Chess die Restfiguren geschrieben.
  PartieAnalyseObjekt.ZugAngewaehlt(zugButtonId);
  
  // Das drag'n'drop neu initialisieren
  if (aktuelleStellungAngewaehlt) {
    InitPartieanzeigeDragDrop(false, false);
  }
  
  // Und zum Abschluss die Buttons steuern
  SteuerePlayerButtons();
}

//
// Stellt die Player-Buttons gem. aktueller Situation ein.
// Siehe ToDo "Player-Steuerung".
//
function SteuerePlayerButtons()
{
  //
  // Zunächst einige Grundsatz-Fragen kären
  //
  var letzterZugId = document.getElementById('ZugLetzter').innerHTML;
  // "letzterZugId" ist jetzt z.B. "W15" oder "0": Es wurde noch gar kein Zug gemacht
  var aktuelleStellungAngewaehlt = false;
  // Ob eine vergangene oder die aktuelle Stellung angewählt wurde
  if (selektierterZugId == letzterZugId) {
    // Die aktuelle Stellung wurde ausgewählt
    // ACHTUNG: In der Grundstellung ist das auch true, wenn noch kein Zug gemacht wurde!
    aktuelleStellungAngewaehlt = true;
  }
  else {
    // Eine vergangene Stellung wurde ausgewählt
    aktuelleStellungAngewaehlt = false;
  }

  //
  // Der "Zum Partie-Anfang"-Button und der "Ein Zug zurück"-Button (diese sind bzgl. Steuerung identisch)
  //
  // Der ist in der Grundstellung grau und disabled, sonst blau und enabled
  if (selektierterZugId == "0") {
    // Wir sind in der Grundstellung
    SteuerePlayerButton("buttonPlayerPartieStart", "Grey", false);
    SteuerePlayerButton("buttonPlayerEinsZurueck", "Grey", false);
  }
  else {
    // Wir sind nicht in der Grundstellung
    SteuerePlayerButton("buttonPlayerPartieStart", "Blue", true);
    SteuerePlayerButton("buttonPlayerEinsZurueck", "Blue", true);
  }
  
  //
  // Der "Ein Zug vor"-Button
  //
  if (aktuelleStellungAngewaehlt) {
    // Wir sind bereits in der aktuellen Stellung
    SteuerePlayerButton("buttonPlayerEinsVor", "Grey", false);
  }
  else {
    // Wir sind nicht in der aktuellen Stellung
    if (IsZugIdEinsVor(selektierterZugId, letzterZugId)) {
      // Wir sind ein Zug vor der aktuellen Stellung
      SteuerePlayerButton("buttonPlayerEinsVor", "Blue", true);
    }
    else {
      // Wir sind noch weit von der aktuellen Stellung entfernt
      SteuerePlayerButton("buttonPlayerEinsVor", "Blue", true);
    }
  }
  
  //
  // Der "Zur aktuellen Stellung"-Button
  //
  if (aktuelleStellungAngewaehlt) {
    // Wir sind bereits in der aktuellen Stellung
    SteuerePlayerButton("buttonPlayerPartieEnde", "Grey", false);
  }
  else {
    // Wir sind nicht in der aktuellen Stellung
    SteuerePlayerButton("buttonPlayerPartieEnde", "Blue", true);
  }
}

//
// True, falls "zugIdFrueher" ein Zug vor "zugIdSpaeter" ist.
//
// Format beider Parameter: "W15" oder "0".
//
function IsZugIdEinsVor(zugIdFrueher, zugIdSpaeter)
{
  var result = false;
  
  // Sonderfälle
  if (zugIdSpaeter == "0") {
    return false;
  }
  if ((zugIdFrueher == "0") && (zugIdSpaeter == "W1")) {
    return true;
  }
  
  var letzterZugId = document.getElementById('ZugLetzter').innerHTML;
  // "letzterZugId" ist jetzt z.B. "W15" oder "0": Es wurde noch gar kein Zug gemacht
  var naechsterZug = GetPreviousOrNextMoveId(zugIdFrueher, letzterZugId, true);
  if (naechsterZug == zugIdSpaeter) {
    result = true;
  }
  
  return result;
}

//
// Steuerung eines Player-Buttons.
//
// Parameter:
// - buttonId: Id des zu steuernden Buttons.
// - farbe:    Farbe des Icons, das er bekommen soll ("Blue", "Grey", "Green").
// - enabled:  True/False
//
function SteuerePlayerButton(buttonId, farbe, enabled)
{
  // Icon einstellen
  var bildName = "FSTSchach/FST_Bilder/Icons/" + farbe + "/16x16/";
  var imgNameImDoc = "";
  switch (buttonId) {
    case "buttonPlayerPartieStart":
      bildName = bildName + "PlayerAnfang.gif";
      imgNameImDoc = "ImgNamePlayerAnfang";
      break;
    case "buttonPlayerEinsZurueck":
      bildName = bildName + "PlayerPrev.gif";
      imgNameImDoc = "ImgNamePlayerPrev";
      break;
    case "buttonPlayerEinsVor":
      bildName = bildName + "PlayerNext.gif";
      imgNameImDoc = "ImgNamePlayerNext";
      break;
    case "buttonPlayerPartieEnde":
      bildName = bildName + "PlayerEnde.gif";
      imgNameImDoc = "ImgNamePlayerEnde";
      break;
    default:
      break;
  }
  var bildDatei = new Image();
  bildDatei.src = bildName;
  if (document.images[imgNameImDoc] != null) {
    document.images[imgNameImDoc].src = bildDatei.src;
  }
  // Und auf enabled oder disabled
  if (document.getElementById(buttonId) != null) {
    document.getElementById(buttonId).disabled = !enabled;
  }
}

//
// Schreibt die Überschrift in die Zeitanzeige oben.
//
function SchreibeZeitAnzeigeUeberschrift(zugButtonId, aktuelleStellungAngewaehlt)
{
  if (aktuelleStellungAngewaehlt) {
    document.getElementById('BedenkzeitUeberschrift').innerHTML = "<table><tr><td>"+T_Part_Bedenkzeit+"</td></tr></table>";
  }
  else {
    var zugId = GetZugIdFromComplexId(zugButtonId);
    // zugId enthält jetzt "W15" oder "0"
    var hinterlegterZugId = "ZugStellungNachZug_" + zugId;
    var hinterlegterZug = " - ";
    var ausgabeGesamt = "<table><tr><td>"+T_Part_Bedenkzeit+"</td></tr></table>";
    if ((document.getElementById(hinterlegterZugId) != null) && (zugId != "0")) {
      // Anderenfalls ist noch kein Zug gemacht worden (= Grundstellung)
      hinterlegterZug = document.getElementById(hinterlegterZugId).innerHTML;
      //alert(hinterlegterZug);
      //<table class="VergangeneStellungZugTabelle"><tbody><tr><td>40.</td><td>Tb2-a2</td></tr></tbody></table>
      // daraus machen wir das:
      //<table class="VergangeneStellungZugTabelle"><tbody><tr><td>Bedenkzeit nach </td><td>40.</td><td>Tb2-a2</td></tr></tbody></table>
      // D.h. das "<td>Bedenkzeit nach </td>" wird nach dem "<tr>" (bzw. vor dem ersten "<td>") eingefügt.
      var pos = hinterlegterZug.indexOf("<td>");
      var ausgabeGesamt = hinterlegterZug.slice(0, pos);
      ausgabeGesamt = ausgabeGesamt + "<td>"+T_Part_BedenkzeitNach+" </td>" + hinterlegterZug.slice(pos);
    }
    else if (zugId == "0") {
      var ausgabeGesamt = "<table><tr><td>"+T_Part_BedenkzeitStart+"</td></tr></table>";
    }
    else {
      // Nichts.
    }
    document.getElementById('BedenkzeitUeberschrift').innerHTML = ausgabeGesamt;
  }
}

//
// Schreibt die Urlaubszeiten in die Zeitanzeige oben.
//
// zugButtonId = "IdZugSelected_W15" für 15. Zug von Weiss geklickt.
// zugButtonId = "IdZugSelected_0" für Partieanfang.
//
function SchreibeUrlaubZeile(zugButtonId, aktuelleStellungAngewaehlt)
{
  var spielForm = document.getElementById('IdSpielform').innerHTML;
  if (spielForm == "Fernschach") {
    // Andernfalls gibt es sowieso keinen Urlaub
    var zugId = GetZugIdFromComplexId(zugButtonId);
    // zugId enthält jetzt "W15" oder "0"
    
    // Prüfen, ob für den gewählten Zug Urlaub aktiv ist
    var hinterlegterUrlaubWId = "ZugUrlaub_W_" + zugId;
    var hinterlegterUrlaubSId = "ZugUrlaub_S_" + zugId;
    var hinterlegterUrlaubW = T_Part_KeinUrlaubDamals;
    var hinterlegterUrlaubS = T_Part_KeinUrlaubDamals;
    if (aktuelleStellungAngewaehlt) {
      hinterlegterUrlaubW = T_Part_KeinUrlaubJetzt;
      hinterlegterUrlaubS = T_Part_KeinUrlaubJetzt;
    }
    var mindestensEinUrlaubAktiv = false;
    if (document.getElementById(hinterlegterUrlaubWId) != null) {
      mindestensEinUrlaubAktiv = true;
      hinterlegterUrlaubW = document.getElementById(hinterlegterUrlaubWId).innerHTML;
    }
    if (document.getElementById(hinterlegterUrlaubSId) != null) {
      mindestensEinUrlaubAktiv = true;
      hinterlegterUrlaubS = document.getElementById(hinterlegterUrlaubSId).innerHTML;
    }
    
    // Ausgabe
    if (mindestensEinUrlaubAktiv) {
      // Urlaub da, anzeigen
      $("#IdFernschachUrlaubZeile").removeClass("Unsichtbar");
      document.getElementById('IdFernschachUrlaubW').innerHTML = hinterlegterUrlaubW;
      document.getElementById('IdFernschachUrlaubS').innerHTML = hinterlegterUrlaubS;
    }
    else {
      // Kein Urlaub da, Balken weg nehmen
      $("#IdFernschachUrlaubZeile").addClass("Unsichtbar");
    }
  }
}

//
// Schreibt die Restzeiten in die Zeitanzeige oben.
//
// zugButtonId = "IdZugSelected_W15" für 15. Zug von Weiss geklickt.
// zugButtonId = "IdZugSelected_0" für Partieanfang.
//
// SONDERFALL "aktuelleStellungAngewaehlt": Siehe ToDo "Vergangene Stellung: Zeitanzeige".
//
function SchreibeZeitAnzeigeRestzeiten(zugButtonId, aktuelleStellungAngewaehlt)
{
  var zugId = GetZugIdFromComplexId(zugButtonId);
  // zugId enthält jetzt "W15" oder "0"
  
  var hinterlegteZeitId;
  var hinterlegteZeit;
  
  // Hier wird die "normale" Zeitanzeige unsichtbar und die "vergangene Stellung"-Zeitanzeige sichtbar gemacht oder umgekehrt
  MacheZeitanzeigenSichtbar(aktuelleStellungAngewaehlt);
  
  if (!aktuelleStellungAngewaehlt) {
    // Im Falle einer vergangenen Stellung müssen noch die Zeitwerte des entsprechenden Zuges eingesetzt werden.
    
    // Hier müssen wir noch zwischen Schnell- und Fernschach unterscheiden
    var spielForm = document.getElementById('IdSpielform').innerHTML;
    if (spielForm == "Fernschach") {
      // Fernschach

      // W Tage
      hinterlegteZeitId = "ZugRestZeit_WTge_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachTageRestZeitVergangeneStellungW').innerHTML = hinterlegteZeit;
      // W Stunden
      hinterlegteZeitId = "ZugRestZeit_WStd_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachStundenRestZeitVergangeneStellungW').innerHTML = hinterlegteZeit;
      // W Minuten
      hinterlegteZeitId = "ZugRestZeit_WMin_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachMinutenRestZeitVergangeneStellungW').innerHTML = hinterlegteZeit;
      // W Text
      hinterlegteZeitId = "ZugRestZeit_WTxt_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachTextRestZeitVergangeneStellungW').innerHTML = hinterlegteZeit;
      // S Tage
      hinterlegteZeitId = "ZugRestZeit_STge_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachTageRestZeitVergangeneStellungS').innerHTML = hinterlegteZeit;
      // S Stunden
      hinterlegteZeitId = "ZugRestZeit_SStd_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachStundenRestZeitVergangeneStellungS').innerHTML = hinterlegteZeit;
      // S Minuten
      hinterlegteZeitId = "ZugRestZeit_SMin_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachMinutenRestZeitVergangeneStellungS').innerHTML = hinterlegteZeit;
      // S Text
      hinterlegteZeitId = "ZugRestZeit_STxt_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdFernschachTextRestZeitVergangeneStellungS').innerHTML = hinterlegteZeit;
    }
    else {
      // Schnellschach
      
      // W Minuten
      hinterlegteZeitId = "ZugRestZeit_WMin_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdSchnellschachMinutenVergangeneStellungW').innerHTML = hinterlegteZeit;
      // W Sekunden
      hinterlegteZeitId = "ZugRestZeit_WSek_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdSchnellschachSekundenVergangeneStellungW').innerHTML = hinterlegteZeit;
      // S Minuten
      hinterlegteZeitId = "ZugRestZeit_SMin_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdSchnellschachMinutenVergangeneStellungS').innerHTML = hinterlegteZeit;
      // S Sekunden
      hinterlegteZeitId = "ZugRestZeit_SSek_" + zugId;
      hinterlegteZeit = document.getElementById(hinterlegteZeitId).innerHTML;
      document.getElementById('IdSchnellschachSekundenVergangeneStellungS').innerHTML = hinterlegteZeit;
    }
  }
}

//
// Schreibt den Bereich "Letzter Zug":
// 1. "Stellung nach" statt "Letzter Zug" (oder umgekehrt)
// 2. Der Zug selbst wird ausgetauscht
// 3. Remis-Angebot anzeigen falls ein vorliegt
//
// zugButtonId = "IdZugSelected_W15" für 15. Zug von Weiss geklickt.
// zugButtonId = "IdZugSelected_0" für Partieanfang.
//
// isLetzterZug == true: Der letzte (also aktuelle) Zug wurde ausgewählt.
//                       Das kann auch in der Grundstellung sein, wenn noch kein Zug gemacht wurde.
//
function SchreibeLetzterZugBereich(zugButtonId, isLetzterZug)
{
  //
  // id="IhrZugBereich" ist immer da.
  // id="IhrZugBereichContentAktuell" enthält die Daten für den aktuellen Zug.
  // id="IhrZugBereichContentVergangen" enthält alles für die vergangene Stellung.
  //
  
  // Bereich aktuell bzw. vergangene Stellung ein/ausblenden
  var zugId = GetZugIdFromComplexId(zugButtonId);
  // zugId enthält jetzt "W15" oder "0"
  if (isLetzterZug) {
    // Aktuelle Stellung
    $("#IhrZugBereichContentAktuell").removeClass("Unsichtbar");
    $("#IhrZugBereichContentVergangen").addClass("Unsichtbar");
  }
  else {
    // Vergangene Stellung
    $("#IhrZugBereichContentAktuell").addClass("Unsichtbar");
    $("#IhrZugBereichContentVergangen").removeClass("Unsichtbar");

    // Zug selbst austauschen
    var hinterlegterZugId = "ZugStellungNachZug_" + zugId;
    var hinterlegterZug = " - ";
    if (document.getElementById(hinterlegterZugId) != null) {
      // Anderenfalls ist noch kein Zug gemacht worden (= Grundstellung)
      hinterlegterZug = document.getElementById(hinterlegterZugId).innerHTML;
    }
    document.getElementById('LetzterZugZeile').innerHTML = hinterlegterZug;
    // Ob der Betrachter (bei nicht beendeter Partie) am Zug ist
    var betrachterAmZug = false;
    var betrachterAmZugDoc = document.getElementById('ZugBeobachterIstAmZug').innerHTML;
    if (betrachterAmZugDoc == "Ja") {
      // Betrachter ist  am Zug
      betrachterAmZug = true;
    }
    else {
      // Betrachter ist nicht am Zug
      betrachterAmZug = false;
    }
    // Hinweis zur Zugeingabe
    if (betrachterAmZug) {
      $("#ZurAktuellenStellungHinweis").removeClass("Unsichtbar");
    }
  }
  
  // Remisangebot anzeigen (Punkt 3)
  $("#LetzterZugRemis").addClass("Unsichtbar");
  if (!isLetzterZug) {
    // Andernfalls befinden wir uns in der aktuellen Stellung
    var hinterlegtesRemisangebotId = "ZugRemis_" + zugId;
    if (document.getElementById(hinterlegtesRemisangebotId) != null) {
      // Anderenfalls ist noch kein Zug gemacht worden (= Grundstellung)
      if (document.getElementById(hinterlegtesRemisangebotId).innerHTML == "1") {
        // Hier liegt ein Remisangebot vor
        $("#LetzterZugRemis").removeClass("Unsichtbar");
      }
    }
  }
}

//
// Schreibt den Bereich "Kommentar zum letzten Zug"
//
function SchreibeLetztenZugKommentar(zugButtonId)
{
  var zugId = GetZugIdFromComplexId(zugButtonId);
  // zugId enthält jetzt "W15" oder "0"
  if (zugId == "0") {
    // Gundstellung: Hier gibt es keinen Kommentar
    $("#LetzterKommentar_Tabelle").addClass("Unsichtbar");
    $("#LetzterKommentar_Grundstellung").removeClass("Unsichtbar");
    document.getElementById('LetzterKommentarTextBereich').innerHTML = "";
  }
  else {
    // Möglicherweise Kommentar vorhanden
    $("#LetzterKommentar_Grundstellung").addClass("Unsichtbar");
    $("#LetzterKommentar_Tabelle").removeClass("Unsichtbar");
    
    // Notation und Spielername des Zuges für die Überschrift bestimmen
    var farbe = zugId.substr(0, 1);
    if (farbe == "W") {
      var Spielername = document.getElementById('IdSpielernameW').innerHTML;
    }
    else {
      var Spielername = document.getElementById('IdSpielernameS').innerHTML;
    }
    var hinterlegterZugId = "ZugStellungNachZug_" + zugId;
    var hinterlegterZug = document.getElementById(hinterlegterZugId).innerHTML;
    //alert(hinterlegterZug);
    //
    //<table class="VergangeneStellungZugTabelle"><tbody><tr><td>2.</td><td>Sg1-f3</td></tr></tbody></table>
    // oder
    //<table class="VergangeneStellungZugTabelle"><tbody><tr><td>1.</td><td>..</td><td>c7-c5</td></tr></tbody></table>
    //
    // Daraus machen wir das:
    //
    //<tr><td>Kommentar von</td><td>Spielername</td><td>zu</td><td>1.</td><td>..</td><td>c7-c5</td><td>2.</td><td>Sg1-f3</td><td>:</td></tr>
    // oder
    //<tr><td>Kommentar von</td><td>Spielername</td><td>zu</td><td>1.</td><td>..</td><td>c7-c5</td><td>:</td></tr>
    
    // Wir schneiden zunächst den Zugphrasen-Anteil aus: Dieser beginnt beim ersten "<td>"
    var posZugphraseAnfang = hinterlegterZug.indexOf("<td>");
    if (posZugphraseAnfang < 0) {
      // Der IE ist mal wieder zu doof
      posZugphraseAnfang = hinterlegterZug.indexOf("<TD>");
    }
    // ... und endet vor dem ersten "</tr>"
    var posZugphraseEnde = hinterlegterZug.indexOf("</tr>");
    if (posZugphraseEnde < 0) {
      // Der IE ist mal wieder zu doof
      posZugphraseEnde = hinterlegterZug.indexOf("</TR>");
    }
    var zugPhrase = hinterlegterZug.slice(posZugphraseAnfang, posZugphraseEnde);
    
    // Also: Überschrift erzeugen
    var ueberschrift = "<table><tbody><tr><td>"+T_Part_KommentarVonA+"</td><td>" + Spielername + "</td><td>"+T_Part_KommentarVonB+"</td>" + zugPhrase + "<td>:</td></tr></tbody></table>";
    // Und diese ins Doc schreiben
    document.getElementById('LetzterKommentar_Tabelle').innerHTML = ueberschrift;


    // Jetzt den Kommentartext selbst:
    
    // Prüfen ob Kommentar zu diesem Zug vorliegt
    var id = "Kommentar_Text_" + zugId;
    if (document.getElementById(id) != null) {
      // Zu diesem Zug gibt es einen Kommentar
      
      // Daten des Kommentars einlesen
      id = "Kommentar_Text_" + zugId;
      var hinterlegterText = document.getElementById(id).innerHTML;
      document.getElementById('LetzterKommentarTextBereich').innerHTML = hinterlegterText;
    }
    else {
      // Zu diesem Zug gibt es keinen Kommentar: Textfeld leeren
      document.getElementById('LetzterKommentarTextBereich').innerHTML = "";
    }
  }
}

//
// Schaltet das Blinken der Umrandung jedes Feldes beim Überfahren mit der Maus an oder aus:
// Parameter: Aktiviere wenn beide true, sonst deaktivieren.
//
function ActivateFeldUmrandungBlinkenBeiUeberfahren(aktuelleStellungAngewaehlt, betrachterAmZug)
{  
  // Suche alle umrandeten Felder
  for (var i = 0; i < 8; ++i) {
    for (var j = 0; j < 8; ++j) {
      // HTML-Id des zu malenden Feldes bestimmen
      var feldLinie = '';
      switch (j) {
        case 0: feldLinie = 'a'; break;
        case 1: feldLinie = 'b'; break;
        case 2: feldLinie = 'c'; break;
        case 3: feldLinie = 'd'; break;
        case 4: feldLinie = 'e'; break;
        case 5: feldLinie = 'f'; break;
        case 6: feldLinie = 'g'; break;
        case 7: feldLinie = 'h'; break;
        default: break;
      }
      var feldReihe = '';
      switch (i) {
        case 0: feldReihe = '1'; break;
        case 1: feldReihe = '2'; break;
        case 2: feldReihe = '3'; break;
        case 3: feldReihe = '4'; break;
        case 4: feldReihe = '5'; break;
        case 5: feldReihe = '6'; break;
        case 6: feldReihe = '7'; break;
        case 7: feldReihe = '8'; break;
        default: break;
      }
      var feldId = "Feld_" + feldLinie + feldReihe;
      
      // An oder aus schalten
      if (aktuelleStellungAngewaehlt && betrachterAmZug) {
        // An: EventHandler anhängen
        document.getElementById(feldId).onmouseover = function(){ActivateOnMouseOver(this.id);};
        document.getElementById(feldId).onmouseout = function(){ActivateOnMouseOut(this.id);};
      }
      else {
        // Aus: EventHandler abhängen
        document.getElementById(feldId).onmouseover = null;
        document.getElementById(feldId).onmouseout = null;
      }
    }
  }
}

// Merker für das MouseOver - MouseOut
var FeldUmrandungsFarbeBeiMouseOver = "NotInit";
//
// Setzt die Aktion, die beim MouseOver auf dem Feld ausgeführt werden soll:
// Die Hintergrundfarbe wird auf die "MouseOver-Farbe" gesetzt.
//
function ActivateOnMouseOver(feldId)
{
  var elem = document.getElementById(feldId);
  // Wir merken uns die aktuelle Farbe, damit wir diese beim MouseOut wieder herstellen können.
  FeldUmrandungsFarbeBeiMouseOver = elem.style.backgroundColor;
  // Dann die MouseOver-Farbe setzen
  elem.style.backgroundColor = FeldFarbeMausOver;
}

//
// Setzt die Aktion, die beim MouseOut auf dem Feld ausgeführt werden soll:
// Die Hintergrundfarbe wird auf die Feldfarbe oder auf die "Letzter-Zug-Markierungsfarbe" gesetzt.
//
function ActivateOnMouseOut(feldId)
{
  if (FeldUmrandungsFarbeBeiMouseOver != "NotInit") {
    var elem = document.getElementById(feldId);
    // Beim MouseOver gemerkte Farbe wieder herstellen
    elem.style.backgroundColor = FeldUmrandungsFarbeBeiMouseOver;
  }
}

//
// Stellt die Sichtbarkeit der Zeitanzeigen ein.
//
// Parameter:
// TRUE: Die "normale" sichtbar, die "vergangene Stellung" unsichtbar.
// FALSE: Umgekehrt.
//
function MacheZeitanzeigenSichtbar(aktuelleSichtbar)
{
  if (($(".RestZeitAktuelleStellungZeile") != null) &&
      ($(".RestZeitVergangeneStellungZeile") != null)) {
    if (aktuelleSichtbar) {
      // Normale sichtbar machen
      if ($(".RestZeitAktuelleStellungZeile").hasClass("Unsichtbar")) {
        $(".RestZeitAktuelleStellungZeile").removeClass("Unsichtbar");
      }
      // Andere verstecken
      if (!$(".RestZeitVergangeneStellungZeile").hasClass("Unsichtbar")) {
        $(".RestZeitVergangeneStellungZeile").addClass("Unsichtbar");
      }
    }
    else {
      // Normale verstecken
      if (!$(".RestZeitAktuelleStellungZeile").hasClass("Unsichtbar")) {
        $(".RestZeitAktuelleStellungZeile").addClass("Unsichtbar");
      }
      // Andere sichtbar machen
      if ($(".RestZeitVergangeneStellungZeile").hasClass("Unsichtbar")) {
        $(".RestZeitVergangeneStellungZeile").removeClass("Unsichtbar");
      }
    }
  }
}

//
// Macht den Zugeingabe-Bereich unsichtbar bzw. sichtbar
//
// Parameter: Mache sichtbar wenn beide true, sonst unsichtbar.
//
function MacheZugeingabeBereichSichtbar(aktuelleStellungAngewaehlt, betrachterAmZug)
{
  if ($(".ZugEingabeBereich") != null) {
    if (aktuelleStellungAngewaehlt && betrachterAmZug) {
      if ($(".ZugEingabeBereich").hasClass("Unsichtbar")) {
        $(".ZugEingabeBereich").removeClass("Unsichtbar");
      }
    }
    else {
      if (!$(".ZugEingabeBereich").hasClass("Unsichtbar")) {
        $(".ZugEingabeBereich").addClass("Unsichtbar");
      }
    }
  }
}

//
// Malt das Brett mit oder ohne die Feld-Umrandungen "letzter Zug".
//
// Parameter:
// 1) startFeld, zielFeld z.B. "e2", "e4": Zeichne für diese Felder die Umrandung "letzter Zug".
// 2) Falls startFeld, zielFeld == "", "" dann zeichne keine Umrandung "letzter Zug".
//
function ZeichneLetzterZugFelderUmrandung(startFeld, zielFeld)
{
  // Suche alle umrandeten Felder
  for (var i = 0; i < 8; ++i) {
    for (var j = 0; j < 8; ++j) {
      // HTML-Id des zu malenden Feldes bestimmen
      var feldLinie = '';
      switch (j) {
        case 0: feldLinie = 'a'; break;
        case 1: feldLinie = 'b'; break;
        case 2: feldLinie = 'c'; break;
        case 3: feldLinie = 'd'; break;
        case 4: feldLinie = 'e'; break;
        case 5: feldLinie = 'f'; break;
        case 6: feldLinie = 'g'; break;
        case 7: feldLinie = 'h'; break;
        default: break;
      }
      var feldReihe = '';
      switch (i) {
        case 0: feldReihe = '1'; break;
        case 1: feldReihe = '2'; break;
        case 2: feldReihe = '3'; break;
        case 3: feldReihe = '4'; break;
        case 4: feldReihe = '5'; break;
        case 5: feldReihe = '6'; break;
        case 6: feldReihe = '7'; break;
        case 7: feldReihe = '8'; break;
        default: break;
      }
      var feldName = feldLinie + feldReihe;
      var feldId = "Feld_" + feldName;
      
      // Feldfarbe bestimmen: gerade/gerade und ungerade/ungerade sind schwarz
      var feldFarbe = FeldFarbeW;
      if ((((i % 2) == 0) && ((j % 2) == 0)) ||
          (((i % 2) != 0) && ((j % 2) != 0))) {
        feldFarbe = FeldFarbeS;
      }
      else {
        feldFarbe = FeldFarbeW;
      }
      
      // Hintergrundfarbe setzen
      if ((startFeld == feldName) || (zielFeld == feldName)) {
        // Für dieses Feld soll die Markierung gemalt werden: Markierungsfarbe
        var feldObj = document.getElementById(feldId);
        feldObj.style.backgroundColor = FeldFarbeLastZug;
      }
      else {
        // Für dieses Feld soll keine Markierung gemalt werden: Normale Feldfarbe
        var feldObj = document.getElementById(feldId);
        feldObj.style.backgroundColor = feldFarbe;
      }
    }
  }
}

//
// Berechnet die Stellung nach Ausführung des durch "zugButtonId" angegebenen Zuges und zeichnet diese Stellung.
//
// zugButtonId = "IdZugSelected_W15" für 15. Zug von Weiss geklickt.
// zugButtonId = "IdZugSelected_0" für Partieanfang.
//
function ZeichneBrett(zugButtonId)
{
  // Brett malen
  ErstelleAnalyseBrettAusFEN(zugButtonId)
  ZeichneAktuellesBrett();
}

//
// Die Zugzeit des aktuell selektierten Zuges eingeblenden.
//
function ShowZeitDesSelektiertenZuges()
{
  // Id des sichtbar zu machenden Zeit-Feldes bestimmen
  var zugId = GetZugIdFromComplexId(selektierterZugId);
  var zugZeitId = "#nZeit_" + zugId;
  // Alle erst mal unsichtbar schalten
  $(".notationAktuellZeit").addClass("Unsichtbar");
  // Aktuelles einblenden
  $(zugZeitId).removeClass("Unsichtbar");
}

//
// In der Notation wird der aktuell selektierte Zug hervorgehoben.
//
function HighlightSelektiertenZug()
{
  var zugId = GetZugIdFromComplexId(selektierterZugId);
  var zugLinkId = "#IdZugSelected_" + zugId;
  // Alle erst mal enthighlighten
  $(".notationZugW").removeClass("notationAktuell");
  $(".notationZugS").removeClass("notationAktuell");
  // Wir müssen das übergeordnete Element des Zuges (das TD) bearbeiten, d.h highlighten
  $(zugLinkId).parent().addClass("notationAktuell");
}

//
// Gibt aus "ZugDaten_W15" oder "IdZugSelected_W15" die ZugId "W15" zurück.
//
function GetZugIdFromComplexId(complexId)
{
  var trennZeichenPos = complexId.lastIndexOf("_");
  var beginnZugString = trennZeichenPos + 1;
  var result = complexId.substr(beginnZugString);
  return result;
}

//
// Führt den Analyse-Zug auf dem aktuellen Brett aus.
// Analyse-Zug bedeutet, dass wir uns die Veränderungen durch den Zug merken.
// Der Analyse-Zug kann durch AnalyseZugZurueckNehmen() zurück genommen werden.
//
// Params-Format: "d4"
//
function AnalyseZugAusfuehren(startFeldName, zielFeldName)
{
  var startFeldFigur = GetFigurFromFeld(startFeldName);
  // = "kw" oder ""
  var zielFeldFigur = GetFigurFromFeld(zielFeldName);
  // = "kw" oder ""

  var weiterPruefen = true;
  
  // Rochade prüfen  
  if ((startFeldFigur == "kw") && (startFeldName == "e1") && (zielFeldName == "g1")) {
    // Kurze Rochade W
    
    // Alte Felder merken
    analyseFeldNamen[0]   = "e1";
    analyseFeldFiguren[0] = "kw";
    analyseFeldNamen[1]   = "g1";
    analyseFeldFiguren[1] = "";
    analyseFeldNamen[2]   = "h1";
    analyseFeldFiguren[2] = "tw";
    analyseFeldNamen[3]   = "f1";
    analyseFeldFiguren[3] = "";
    
    // Zug auf Brett ausführen
    SetFeld("e1", "");
    SetFeld("g1", "kw");
    SetFeld("h1", "");
    SetFeld("f1", "tw");
    
    weiterPruefen = false;
  }
  else if ((startFeldFigur == "kw") && (startFeldName == "e1") && (zielFeldName == "c1")) {
    // Lange Rochade W
    
    // Alte Felder merken
    analyseFeldNamen[0]   = "e1";
    analyseFeldFiguren[0] = "kw";
    analyseFeldNamen[1]   = "c1";
    analyseFeldFiguren[1] = "";
    analyseFeldNamen[2]   = "a1";
    analyseFeldFiguren[2] = "tw";
    analyseFeldNamen[3]   = "d1";
    analyseFeldFiguren[3] = "";
    
    // Zug auf Brett ausführen
    SetFeld("e1", "");
    SetFeld("c1", "kw");
    SetFeld("a1", "");
    SetFeld("d1", "tw");
    
    weiterPruefen = false;
  }
  else if ((startFeldFigur == "ks") && (startFeldName == "e8") && (zielFeldName == "g8")) {
    // Kurze Rochade S
    
    // Alte Felder merken
    analyseFeldNamen[0]   = "e8";
    analyseFeldFiguren[0] = "ks";
    analyseFeldNamen[1]   = "g8";
    analyseFeldFiguren[1] = "";
    analyseFeldNamen[2]   = "h8";
    analyseFeldFiguren[2] = "ts";
    analyseFeldNamen[3]   = "f8";
    analyseFeldFiguren[3] = "";
    
    // Zug auf Brett ausführen
    SetFeld("e8", "");
    SetFeld("g8", "ks");
    SetFeld("h8", "");
    SetFeld("f8", "ts");
    
    weiterPruefen = false;
  }
  else if ((startFeldFigur == "ks") && (startFeldName == "e8") && (zielFeldName == "c8")) {
    // Lange Rochade S
    
    // Alte Felder merken
    analyseFeldNamen[0]   = "e8";
    analyseFeldFiguren[0] = "ks";
    analyseFeldNamen[1]   = "c8";
    analyseFeldFiguren[1] = "";
    analyseFeldNamen[2]   = "a8";
    analyseFeldFiguren[2] = "ts";
    analyseFeldNamen[3]   = "d8";
    analyseFeldFiguren[3] = "";
    
    // Zug auf Brett ausführen
    SetFeld("e8", "");
    SetFeld("c8", "ks");
    SetFeld("a8", "");
    SetFeld("d8", "ts");
    
    weiterPruefen = false;
  }
  else {
    // Keine Rochade
    weiterPruefen = true;
  }
  
  // Schlagen e.p.
  if (weiterPruefen) {
    var geschlagenerBauerFeldName = IsSchlagenEP(startFeldName, zielFeldName);
    if (geschlagenerBauerFeldName != "") {
      // Das ist ein Schlagen e.p.
    
      // Alte Felder merken
      analyseFeldNamen[0]   = startFeldName;
      analyseFeldFiguren[0] = startFeldFigur;
      analyseFeldNamen[1]   = zielFeldName;
      analyseFeldFiguren[1] = "";
      analyseFeldNamen[2]   = geschlagenerBauerFeldName;
      if (startFeldFigur.substr(1, 1) == "w") {
        // Wenn der schlagende w ist, ist der geschlagene ein s Bauer
        analyseFeldFiguren[2] = "bs";
      }
      else {
        // Wenn der schlagende s ist, ist der geschlagene ein w Bauer
        analyseFeldFiguren[2] = "bw";
      }
    
      // Zug auf Brett ausführen
      SetFeld(startFeldName, "");
      SetFeld(zielFeldName, startFeldFigur);
      SetFeld(geschlagenerBauerFeldName, "");
    
      weiterPruefen = false;
    }
  }
  
  // Normaler Zug oder normales Schlagen
  if (weiterPruefen) {  
    // Alte Felder merken
    analyseFeldNamen[0]   = startFeldName;
    analyseFeldFiguren[0] = startFeldFigur;
    analyseFeldNamen[1]   = zielFeldName;
    analyseFeldFiguren[1] = zielFeldFigur;
  
    // Zug auf Brett ausführen
    SetFeld(startFeldName, "");
    SetFeld(zielFeldName, startFeldFigur);
  }
  
  // Bei Bauer-Umwandlung können wir einen Bauern auf der letzten Reihe stehen lassen.
}

//
// Nimmt den durch AnalyseZugAusfuehren() ausgeführten Zug wieder auf dem Brett zurück.
//
function AnalyseZugZurueckNehmen()
{
  for (var i=0; i<4; i++) {
    if (analyseFeldNamen[i] != "") {
      // den zurück nehmen
      SetFeld(analyseFeldNamen[i], analyseFeldFiguren[i]);
    }
  }
  
  // Alles gemerkte löschen
  for (var i=0; i<4; i++) {
    analyseFeldNamen[i]   = "";
    analyseFeldFiguren[i] = "";
  }
}

//
// Result = FeldName (z.B. "f5") des geschlagenen Bauers, falls der Zug ein Schlagen E.P. ist.
//        = "" falls es sich nicht um ein Schlagen e.p. handelt.
//
// Params-Format: "d4"
//
function IsSchlagenEP(startFeldName, zielFeldName)
{
  var result = "";
  
  var startFeldFigur = GetFigurFromFeld(startFeldName);
  // = "kw" oder ""
  var zielFeldFigur = GetFigurFromFeld(zielFeldName);
  // = "kw" oder ""
  
  if ((startFeldFigur == "bw") || (startFeldFigur == "bs")) {
    // Es zieht ein Bauer
    if (zielFeldFigur == "") {
      // Er zieht auf ein leeres Feld
      if (startFeldName.substr(0, 1) != zielFeldName.substr(0, 1)) {
        // Hat die Linie gewechselt: Das muss Schlagen e.p. sein
        result = GetPerEPGeschlagenerBauerFeld(startFeldName, zielFeldName);
      }
    }
  }
  
  return result;
}

//
// True, falls der Zug ein Bauer-Doppelschritt ist.
//
// Params:
// - figur     = "bw" oder ""
// - startFeld = "e2"
// - zielFeld  = "e4"
//
function IsBauerDoppelschritt(figur, startFeld, zielFeld)
{
  var result = false;
  
  if ((figur == "bw") && (startFeld.substr(1, 1) == "2") && (zielFeld.substr(1, 1) == "4") ||
      (figur == "bs") && (startFeld.substr(1, 1) == "7") && (zielFeld.substr(1, 1) == "5")) {
    result = true;
  }
  
  return result;
}

//
// Gibt das Feld des per E.P. geschlagenen Bauers zurück.
//
// startFeld: Z.B. "e5"
// zielFeld: Z.B. "f6"
//
// Ergebnis ist dann "f5"
//
function GetPerEPGeschlagenerBauerFeld(startFeld, zielFeld)
{
  var linie = zielFeld.substr(0, 1);
  var reihe = startFeld.substr(1, 1);
  var result = linie + reihe;
  return result;
}

//
// Liefert die Figur (z.B. "kw" oder "" für Feld ist leer) auf dem Feld (z.B. "e1").
//
function GetFigurFromFeld(feld)
{
  var linie = feld.substr(0, 1);
  var reihe = feld.substr(1, 1);
  var linieBrettIndex = 0;
  switch (linie) {
    case "a": linieBrettIndex = 0; break;
    case "b": linieBrettIndex = 1; break;
    case "c": linieBrettIndex = 2; break;
    case "d": linieBrettIndex = 3; break;
    case "e": linieBrettIndex = 4; break;
    case "f": linieBrettIndex = 5; break;
    case "g": linieBrettIndex = 6; break;
    case "h": linieBrettIndex = 7; break;
    default: break;
  }
  var reiheBrettIndex = 0;
  switch (reihe) {
    case "1": reiheBrettIndex = 0; break;
    case "2": reiheBrettIndex = 1; break;
    case "3": reiheBrettIndex = 2; break;
    case "4": reiheBrettIndex = 3; break;
    case "5": reiheBrettIndex = 4; break;
    case "6": reiheBrettIndex = 5; break;
    case "7": reiheBrettIndex = 6; break;
    case "8": reiheBrettIndex = 7; break;
    default: break;
  }
  var result = brett[reiheBrettIndex][linieBrettIndex];
  return result;
}

//
// Belegt ein Feld auf dem aktuellen Brett mit einer Figur.
// feld = "g1"
// figur = "kw" oder "" für Feld leeren.
//
function SetFeld(feld, figur)
{
  var linie = feld.substr(0, 1);
  var reihe = feld.substr(1, 1);
  var linieBrettIndex = 0;
  switch (linie) {
    case "a": linieBrettIndex = 0; break;
    case "b": linieBrettIndex = 1; break;
    case "c": linieBrettIndex = 2; break;
    case "d": linieBrettIndex = 3; break;
    case "e": linieBrettIndex = 4; break;
    case "f": linieBrettIndex = 5; break;
    case "g": linieBrettIndex = 6; break;
    case "h": linieBrettIndex = 7; break;
    default: break;
  }
  var reiheBrettIndex = 0;
  switch (reihe) {
    case "1": reiheBrettIndex = 0; break;
    case "2": reiheBrettIndex = 1; break;
    case "3": reiheBrettIndex = 2; break;
    case "4": reiheBrettIndex = 3; break;
    case "5": reiheBrettIndex = 4; break;
    case "6": reiheBrettIndex = 5; break;
    case "7": reiheBrettIndex = 6; break;
    case "8": reiheBrettIndex = 7; break;
    default: break;
  }
  brett[reiheBrettIndex][linieBrettIndex] = figur;
}

//
// Bestimmt aus der halbzugNummer die Id der Zugdaten im Doc.
// Z.B. wird aus 4: "ZugDaten_S2".
//
function GetZugDatenId(halbzugNummer)
{
  var result = "ZugDaten_";
  var zugNummer = 0;
  if ((halbzugNummer % 2) == 0) {
    zugNummer = halbzugNummer / 2;
    result = result + "S" + zugNummer;
  }
  else {
    zugNummer = (halbzugNummer + 1) / 2;
    result = result + "W" + zugNummer;
  }
  return result;
}

//
// Berechnet aus dem Parameter (z.B. "W15"), die Anzahl der Halbzüge, die demnach gemacht wurden.
// Z.B. ergibt "W3" das Ergebnis 5.
// Parameter kann auch "0" sein, dann ist das die Grundstellung und das Ergebnis ist 0.
//
function GetAnzHalbzuege(letzterZugString)
{
  if (letzterZugString == "0") return 0;

  var farbe = letzterZugString.substr(0, 1);
  var nummer = letzterZugString.substr(1);
  nummer *= 1;
  var result = nummer * 2;
  if (farbe == "W") {
    result -= 1;
  }
  return result;
}

//
// Liefert den nächsten oder vorherigen Zug zum vorgegebenen.
//
// Ergebnis:
//        "0" = Partieanfang
//        "W15"
//        false, wenn nicht möglich weil z.B. aus der Grundstellung "vorheriger Zug" oder aus der aktuellen "nächster" gewünscht wird.
//
// Parameter (die ersten beiden haben das Format wie das Ergebnis):
//     - aktuellerZugId
//              relativ zu diesem suchen wir das Ergebnis
//     - letzterZugId
//               das Partieende
//     - nextWanted (bool)
//              true: Der nächste ist gesucht, false: Der vorherige                                   
//
function GetPreviousOrNextMoveId(aktuellerZugId, letzterZugId, nextWanted)
{
  // Fehlerfälle checken
  if ((aktuellerZugId == "0") && !nextWanted) {
    // Wir sind in der Grundstellung und er will den vorherigen
    return false;
  }
  if ((aktuellerZugId == letzterZugId) && nextWanted) {
    // Wir sind in der Endstellung und er will den nächsten
    return false;
  }
  
  // Fehlerfälle behandelt, jetzt rechnen...
  var result;
  
  var farbe = aktuellerZugId.substr(0, 1);
  var nummer = aktuellerZugId.substr(1);
  nummer *= 1;
  
  if (nextWanted) {
    // Zug erhöhen
    if (farbe == "W") {
      farbe = "S";
    }
    else {
      farbe = "W";
      nummer += 1;
    }
  }
  else {
    // Zug erniedrigen
    if (aktuellerZugId == "W1") {
      // Sonderfall: Gehe zur Grundstellung
      result = "0";
      return result;
    }
    else {
      if (farbe == "W") {
        farbe = "S";
        nummer -= 1;
      }
      else {
        farbe = "W";
      }
    }
  }
  result = farbe + nummer;
  return result;
}

//
// Gibt den FeldNamen "e1" des eigenen Königs zurück.
//
// Param: "w" oder "s".
//
function GetEigenerKoenigFeldName(eigenFarbe)
{
  var result = "";
  var unserKoenig = "k" + eigenFarbe;
  for (var i = 0; i < 8; ++i) {
    for (var j = 0; j < 8; ++j) {
      if (brett[i][j] == unserKoenig) {
        result = PartieAnalyseObjekt.GetFeldNameFromInizes(i, j);
        break;
      }
    }
  }
  return result;
}

//
// Zeichnet die Stellung, die in "brett" abgelegt ist ins doc.
//
// Die Felder im doc haben id's: "Feld_a1"...
//
// Dateinamen-Präfix der Figurenbilder:
// "bws" = "Bauer weiss, auf schwarzem Feld".
// "w" = Leeres weisses Feld.
// "s" = Leeres schwarzes Feld.
// "schleier" = Verdecktes Feld (Dark Chess).
//
function ZeichneAktuellesBrett()
{
  for (var i = 0; i < 8; ++i) {
    for (var j = 0; j < 8; ++j) {
      // HTML-Id des zu malenden Feldes bestimmen
      var feldLinie = '';
      switch (j) {
        case 0: feldLinie = 'a'; break;
        case 1: feldLinie = 'b'; break;
        case 2: feldLinie = 'c'; break;
        case 3: feldLinie = 'd'; break;
        case 4: feldLinie = 'e'; break;
        case 5: feldLinie = 'f'; break;
        case 6: feldLinie = 'g'; break;
        case 7: feldLinie = 'h'; break;
        default: break;
      }
      var feldReihe = '';
      switch (i) {
        case 0: feldReihe = '1'; break;
        case 1: feldReihe = '2'; break;
        case 2: feldReihe = '3'; break;
        case 3: feldReihe = '4'; break;
        case 4: feldReihe = '5'; break;
        case 5: feldReihe = '6'; break;
        case 6: feldReihe = '7'; break;
        case 7: feldReihe = '8'; break;
        default: break;
      }
      var feldImgName = "FeldImgName_" + feldLinie + feldReihe;
      var feldTabellenZelleName = "Feld_" + feldLinie + feldReihe;

      if (brettSichtbarkeit[i][j] == 's') {
        // Feld ist sichtbar
        // Figur bestimmen
        var bildIdent = brett[i][j];
        // Feldfarbe bestimmen: gerade/gerade und ungerade/ungerade sind schwarz
        if ((((i % 2) == 0) && ((j % 2) == 0)) ||
            (((i % 2) != 0) && ((j % 2) != 0))) {
          bildIdent = bildIdent + "s";
        }
        else {
          bildIdent = bildIdent + "w";
        }
        // bildIdent ist jetzt z.B. "tws" für Turm weiß auf schwarzem Feld
        // Figur-Datei bestimmen
        var bildDateiName = 'FSTSchach/FST_Bilder/Figuren/png/' + bildIdent + '.png';
      }
      else {
        // Feld ist unsichtbar (Dark Chess)
        var bildDateiName = 'FSTSchach/FST_Bilder/Figuren/png/schleier.png';
      }
      
      // Und Figur malen
      //document.images[feldImgName].src = bildDatei.src;
      var htmlBildDarstellung = "<img name=\"" + feldImgName + "\" class=\"feldImg\" src=\"" + bildDateiName + "\" alt=\"\">";
      document.getElementById(feldTabellenZelleName).innerHTML = htmlBildDarstellung;
    }
  }
}

//
// Berechnet aus der aktuellen Stellung (Array "brett") den FEN.
// Siehe "http://de.wikipedia.org/wiki/Forsyth-Edwards-Notation".
//
function GetFenFromCurrentStellung(zugNummer)
{
  // Beispiel Grundstellung:
  // "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"

  var result = "";
  
  // 1. Gruppe: Figuren auf dem Brett
  for (var i = 7; i >= 0; --i) {
    var anzLeerfelder = 0;
    for (var j = 0; j < 8; ++j) {
      if (brett[i][j] == "") {
        anzLeerfelder++;
      }
      else {
        switch (brett[i][j]) {
          case "ts":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'r';
            break;
          case "ss":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'n';
            break;
          case "ls":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'b';
            break;
          case "ds":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'q';
            break;
          case "ks":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'k';
            break;
          case "bs":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'p';
            break;
          case "tw":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'R';
            break;
          case "sw":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'N';
            break;
          case "lw":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'B';
            break;
          case "dw":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'Q';
            break;
          case "kw":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'K';
            break;
          case "bw":
            if (anzLeerfelder > 0) {
              result += anzLeerfelder;
              anzLeerfelder = 0;
            }
            result += 'P';
            break;
          default:
            break;
        }
      }
    }
    // Reihe zu ende
    if (anzLeerfelder > 0) {
      result += anzLeerfelder;
    }
    if (i > 0) {
      result += '/';
    }
  }
  
  // 2. Gruppe: Anziehender
  result += ' ';
  /*
  if (WeissAmZugAufBrett) {
    result += 'w';
  }
  else {
    result += 'b';
  }
  */
  result += 'w';
  
  // 3. Gruppe: Rochaden
  result += ' ';
  var anyRochadeMoeglich = false;
  if (rochadeWKurzMoeglich) {
    result += 'K';
    anyRochadeMoeglich = true;
  }
  if (rochadeWLangMoeglich) {
    result += 'Q';
    anyRochadeMoeglich = true;
  }
  if (rochadeSKurzMoeglich) {
    result += 'k';
    anyRochadeMoeglich = true;
  }
  if (rochadeSLangMoeglich) {
    result += 'q';
    anyRochadeMoeglich = true;
  }
  
  if (!anyRochadeMoeglich) {
    result += '-';
  }
  
  // 4. Gruppe: En passant
  result += ' ';
  if (bauerDoppelschritt == "") {
    result += '-';
  }
  else {
    // bauerDoppelschritt == "f5" bedeutet: Zuletzt hat der Bauer f7-f5 gezogen
    result += bauerDoppelschritt.substr(0, 1);
    if (bauerDoppelschritt.substr(1, 1) == "5") {
      result += '6';
    }
    else {
      result += '3';
    }
  }
  
  // 5. Gruppe: Anz. Halbzüge für 50-Züge-Regel
  result += ' ';
  // berücksichtigen wir nicht
  result += '0';
  
  // 6. Gruppe: Zugnummer (nächster Zug)
  result += ' ';
  result += zugNummer;
  
  return result;
}

//
// Rückgabe: Die Notation für links neben dem Brett für den letzten Zug.
//
function GetNotationFuerDiesenZug(von, nach)
{
  var result = "";
  var figurZiehend = GetFigurFromFeld(von);
  var figurZiel = GetFigurFromFeld(nach);
  var ziehtOderSchlaegt;
  if (figurZiel == "") {
    ziehtOderSchlaegt = "-";
  }
  else {
    ziehtOderSchlaegt = "x";
  }

  // Normaler Zug
  if (figurZiehend.substr(0, 1) == "k") {
    result = T_Part_Figur_K + von + ziehtOderSchlaegt + nach;
  }
  else if (figurZiehend.substr(0, 1) == "d") {
    result = T_Part_Figur_D + von + ziehtOderSchlaegt + nach;
  }
  else if (figurZiehend.substr(0, 1) == "t") {
    result = T_Part_Figur_T + von + ziehtOderSchlaegt + nach;
  }
  else if (figurZiehend.substr(0, 1) == "l") {
    result = T_Part_Figur_L + von + ziehtOderSchlaegt + nach;
  }
  else if (figurZiehend.substr(0, 1) == "s") {
    result = T_Part_Figur_S + von + ziehtOderSchlaegt + nach;
  }
  else if (figurZiehend.substr(0, 1) == "b") {
    // En passant prüfen
    if ((von.substr(0, 1) != nach.substr(0, 1)) && (figurZiel == "")) {
      result = von + 'x' + nach + 'EP';
    }
    else {
      result = von + ziehtOderSchlaegt + nach;
    }
  }
  else {
  }
  
  // Rochade
  if (figurZiehend.substr(0, 1) == "k") {
    if (((von == "e1") && (nach == "g1")) || ((von == "e8") && (nach == "g8"))) {
      result = "0-0";
    }
    if (((von == "e1") && (nach == "c1")) || ((von == "e8") && (nach == "c8"))) {
      result = "0-0-0";
    }
  }
  
  // Bauerumwandlung müsste so passen
  
  return result;
}

//
// Wird zur Auswertung der Zeichen aus Gruppe 3 (Rochaden) des FEN genutzt.
//
// - zeichen: Das Zeichen aus dem FEN
//
// Die Variablen für Rochade-Status werden befüllt.
//
function VerarbeiteRochadeZeichenAusFEN(zeichen)
{
  switch (zeichen) {
    case '-':
      rochadeWKurzMoeglich = false;
      rochadeWLangMoeglich = false;
      rochadeSKurzMoeglich = false;
      rochadeSLangMoeglich = false;
      break;
    case 'K':
      rochadeWKurzMoeglich = true;
      break;
    case 'Q':
      rochadeWLangMoeglich = true;
      break;
    case 'k':
      rochadeSKurzMoeglich = true;
      break;
    case 'q':
      rochadeSLangMoeglich = true;
      break;
    default:
      break;
  }
}

//
// Wird zur Auswertung der Zeichen aus Gruppe 1 (Figuren) des FEN genutzt.
//
// Parameter arg vom Typ Object:
// - zeichen: Das Zeichen aus dem FEN
// - linie: von brett[reihe][linie]
// - reihe: von brett[reihe][linie]
//
// brett wird entsprechend befüllt.
// linie und reihe in arg werden für Rückgabe befüllt (call by reference).
//
function VerarbeiteFigurZeichenAusFEN(arg)
{
  if (isDigit(arg.zeichen)) {
    // Leere Felder
    arg.zeichen *= 1;
    arg.linie += arg.zeichen;
  }
  else {
    switch (arg.zeichen) {
      case '/':
        arg.reihe = arg.reihe - 1;
        arg.linie = 0;
        break;
      case 'k':
        brett[arg.reihe][arg.linie] = "ks";
        arg.linie++;
        break;
      case 'q':
        brett[arg.reihe][arg.linie] = "ds";
        arg.linie++;
        break;
      case 'r':
        brett[arg.reihe][arg.linie] = "ts";
        arg.linie++;
        break;
      case 'b':
        brett[arg.reihe][arg.linie] = "ls";
        arg.linie++;
        break;
      case 'n':
        brett[arg.reihe][arg.linie] = "ss";
        arg.linie++;
        break;
      case 'p':
        brett[arg.reihe][arg.linie] = "bs";
        arg.linie++;
        break;
      case 'K':
        brett[arg.reihe][arg.linie] = "kw";
        arg.linie++;
        break;
      case 'Q':
        brett[arg.reihe][arg.linie] = "dw";
        arg.linie++;
        break;
      case 'R':
        brett[arg.reihe][arg.linie] = "tw";
        arg.linie++;
        break;
      case 'B':
        brett[arg.reihe][arg.linie] = "lw";
        arg.linie++;
        break;
      case 'N':
        brett[arg.reihe][arg.linie] = "sw";
        arg.linie++;
        break;
      case 'P':
        brett[arg.reihe][arg.linie] = "bw";
        arg.linie++;
        break;
      // Ab hier:
      // Verdeckte Felder. Werden auf dem Analysebrett als freie abgelegt.
      // Auf dem Sichtbarkeitsbrett kennzeichnen.
      case 'c':
        arg.zeichen = 1;
        brettSichtbarkeit[arg.reihe][arg.linie] = 'u';
        arg.linie++;
        break;
      case 'd':
        var bisIndex = arg.linie + 2;
        for (var i = arg.linie; i < bisIndex; ++i) {
          brettSichtbarkeit[arg.reihe][i] = 'u';
          arg.linie++;
        }
        break;
      case 'e':
        var bisIndex = arg.linie + 3;
        for (var i = arg.linie; i < bisIndex; ++i) {
          brettSichtbarkeit[arg.reihe][i] = 'u';
          arg.linie++;
        }
        break;
      case 'f':
        var bisIndex = arg.linie + 4;
        for (var i = arg.linie; i < bisIndex; ++i) {
          brettSichtbarkeit[arg.reihe][i] = 'u';
          arg.linie++;
        }
        break;
      case 'g':
        var bisIndex = arg.linie + 5;
        for (var i = arg.linie; i < bisIndex; ++i) {
          brettSichtbarkeit[arg.reihe][i] = 'u';
          arg.linie++;
        }
        break;
      case 'h':
        var bisIndex = arg.linie + 6;
        for (var i = arg.linie; i < bisIndex; ++i) {
          brettSichtbarkeit[arg.reihe][i] = 'u';
          arg.linie++;
        }
        break;
      case 'i':
        var bisIndex = arg.linie + 7;
        for (var i = arg.linie; i < bisIndex; ++i) {
          brettSichtbarkeit[arg.reihe][i] = 'u';
          arg.linie++;
        }
        break;
      case 'j':
        var bisIndex = arg.linie + 8;
        for (var i = arg.linie; i < bisIndex; ++i) {
          brettSichtbarkeit[arg.reihe][i] = 'u';
          arg.linie++;
        }
        break;
      default:
        break;
    }
  }
}

//
// Erstellt das Analysebrett "var brett" aus dem FEN.
// zugId = "IdZugSelected_0" für Partieanfang.
// zugId = "IdZugSelected_W15" für 15. Zug von Weiss.
//
// Format des FEN: Siehe CPartie->GetFEN() und deren Ableitungen.
//
// Der dazu passende FEN ist unter "IdFEN_0" oder "IdFEN_W15" im Doc abgelegt.
// Falls der entsprechende FEN nicht im Doc hinterlegt ist, muss die Seite neu geladen werden.
//
// Return: True, falls der FEN verfügbar war und das Brett erstellt wurde. False sonst.
//
// Diese Methode ersetzt die früheren
// - InitBrettLeer()
// - SetGrundstellung()
// - MacheZuegeAufAktuellemBrett()
// - MacheZugAufAktuellemBrett()
//
function ErstelleAnalyseBrettAusFEN(zugId)
{
  var IdFEN = "IdFEN_" + GetZugIdFromComplexId(zugId);
  if (document.getElementById(IdFEN) == null) {
    // FEN nicht verfügbar: Seite neu laden
    return false;
  }
  var fen = document.getElementById(IdFEN).innerHTML;
  // fen = "rnbqkbnr/ppp1p1pp/8/3pPp2/8/8/PPPP1PPP/RNBQKBNR w KQkq f6"

  // Frisches Analysebrett erzeugen
  brett = new Array(8);
  for (var i = 0; i < 8; ++i) {
    brett[i] = new Array(8);
  }
  // Felder leer setzen
  for (i = 0; i < 8; ++i) {
    for (var j = 0; j < 8; ++j) {
      brett[i][j] = "";
    }
  }

  // Frisches Sichtbarkeitsbrett erzeugen
  brettSichtbarkeit = new Array(8);
  for (var i = 0; i < 8; ++i) {
    brettSichtbarkeit[i] = new Array(8);
  }
  // Felder sichtbar setzen
  for (i = 0; i < 8; ++i) {
    for (var j = 0; j < 8; ++j) {
      brettSichtbarkeit[i][j] = 's';
    }
  }
  
  // FEN-Auswertung
  
  // Gruppe 1: Stellung auf dem Brett
  var arg = new Object();
  arg.zeichen = ' ';
  arg.linie = 0;
  arg.reihe = 7;
  var p = 0;
  var gruppeBeendet = false;
  while (!gruppeBeendet) {
    arg.zeichen = fen.charAt(p);
    if (arg.zeichen == ' ') {
      // Gruppe beendet
      gruppeBeendet = true;
    }
    else {
      // Gruppe geht weiter. Auswerten...
      VerarbeiteFigurZeichenAusFEN(arg);
    }
    p++;
  }
  
  // Gruppe 2: Anziehender
  // Keine Auswertung notwendig
  gruppeBeendet = false;
  while (!gruppeBeendet) {
    arg.zeichen = fen.charAt(p);
    if (arg.zeichen == ' ') {
      // Gruppe beendet
      gruppeBeendet = true;
    }
    else {
      // Gruppe geht weiter. Auswerten...
      // "w" oder "b"
      //alert('Anziehender: '+arg.zeichen);
    }
    p++;
  }
  
  // Gruppe 3: Rochaden
  rochadeWKurzMoeglich = false;
  rochadeWLangMoeglich = false;
  rochadeSKurzMoeglich = false;
  rochadeSLangMoeglich = false;
  gruppeBeendet = false;
  while (!gruppeBeendet) {
    arg.zeichen = fen.charAt(p);
    if (arg.zeichen == ' ') {
      // Gruppe beendet
      gruppeBeendet = true;
    }
    else {
      // Gruppe geht weiter. Auswerten...
      // "KQkq"
      //alert('Rochaden: '+arg.zeichen);
      VerarbeiteRochadeZeichenAusFEN(arg.zeichen);
    }
    p++;
  }
  
  // Gruppe 4: En passant Feld
  bauerDoppelschritt = "";
  gruppeBeendet = false;
  while (!gruppeBeendet) {
    if (p >= fen.length) {
      // Gruppe beendet
      gruppeBeendet = true;
    }
    else {
      arg.zeichen = fen.charAt(p);
      // Gruppe geht weiter. Auswerten...
      // "f6" oder "-"
      //alert('En passant: '+arg.zeichen);
      if (arg.zeichen != '-') {
        bauerDoppelschritt += arg.zeichen;
      }
    }
    p++;
  }
  if (bauerDoppelschritt.length == 2) {
    var reihe = bauerDoppelschritt.substr(1, 1);
    reihe *= 1;
    bauerDoppelschritt = bauerDoppelschritt.substr(0, 1);
    if (reihe == 3) {
      bauerDoppelschritt += 4;
    }
    else {
      bauerDoppelschritt += 5;
    }
  }
  //alert('bauerDoppelschritt: '+bauerDoppelschritt);

  
  // Brett mit allem drum und dran erstellt
  return true;
}

