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

//
// Funktionen für die Turniererstellung.
//

// Min/Max-Einsätze, die bei der gewählten Turnierkombination gelten
// Abhängig von Fernschach/Schnellschach und Spielgeld/Echtgeld
var turnierEinsatzSollMin = 0;
var turnierEinsatzSollMax = 0;

//
// Wenn Seite geladen wird.
//
function InitTurnierErstellung()
{
  if (document.NeuesTurnier != null) {
    // Das Turnier-Erstellen-Formular ist in der Anzeige

    //
    // JavaScript-Anteile initialisieren: EventHandler an Elemente hängen
    //
    // Spielart-Auswahl
    $('#SpielartSelector').change(function() {
      TurnierErstellungOnSpielartChanged();
    });
    // Spielform-Auswahl
    $('#SpielformSelector').change(function() {
      TurnierErstellungOnSpielformChanged();
    });
    // Spieler-Anzahl
    $('#SpielerAnzSelektor').change(function() {
      TurnierErstellungOnSpieleranzahlOderRundenzahlChanged();
    });
    // Runden-Anzahl
    /*
    $('#RundenZahlSelektor').change(function() {
      TurnierErstellungOnSpieleranzahlOderRundenzahlChanged();
    });
    */
    // Gewinnverteilung
    /*
    $('#GewinnverteilungSelector').change(function() {
      TurnierErstellungOnGewinnverteilungChanged();
    });
    */
    // Spieleinsatz
    $('#EinsatzSelektor').change(function() {
      TurnierErstellungOnEinsatzChanged();
    });
    
    // Hinweistext je nach Auswahl einblenden
    TurnierErstellungOnSpielartChanged();
    
    // Selectbox für die Farbverteilung korrigieren
    //TurnierErstellungSetFarbverteilungsWerte();
    
    // Hier wird die initiale Sichtbarkeit der Select-Boxen gesteuert
    TurnierErstellungOnSpielformChanged();
  }
}

//
// Wird aufgerufen, wenn die Auswahl der Spielart geändert wird.
//
function TurnierErstellungOnSpielartChanged()
{
  // Zunächst einfach alle unsichtbar setzen
  $("#IdTurnierErstellArtNormal").addClass("Unsichtbar");
  $("#IdTurnierErstellArtRaeuberschach").addClass("Unsichtbar");
  $("#IdTurnierErstellArtDarkChess").addClass("Unsichtbar");
  $("#IdTurnierErstellArtSchlagschach").addClass("Unsichtbar");
  // Dann die ausgewählte Spielform sichtbar
  switch (document.NeuesTurnier.Spielart.selectedIndex) {
    case 0:
      $("#IdTurnierErstellArtNormal").removeClass("Unsichtbar");
      break;
    case 1:
      $("#IdTurnierErstellArtRaeuberschach").removeClass("Unsichtbar");
      break;
    case 2:
      $("#IdTurnierErstellArtDarkChess").removeClass("Unsichtbar");
      break;
    case 3:
      $("#IdTurnierErstellArtSchlagschach").removeClass("Unsichtbar");
      break;
    default:
      break;
  }
}

//
// Setzt die Werte in der Auswahlbox "Farbverteilung" korrekt.
//
function TurnierErstellungSetFarbverteilungsWerte()
{
  // Da nur bei 2 Spielern und einrundig die Auswahlbox erscheint, setzen wir hier den Wert entsprechend
  // Für Spieler ohne JavaScript ist die Auswahl schwieriger, weil dann noch "Zufällig bzw. Jeder hat gleich oft W/S" drin steht.
  
  // Vorher sollten wir aber noch die aktuelle Auswahl ermitteln um sie nach der Änderung wieder herzustellen
  var currentSelection = document.NeuesTurnier.FarbverteilungId.selectedIndex;
  
  NeuerEintrag = new Option(T_TErst_Zufall, 0, false, true);
  document.NeuesTurnier.FarbverteilungId.options[0] = NeuerEintrag;
  
  // Und jetzt die ursprüngliche Selektion wieder einstellen
  document.NeuesTurnier.FarbverteilungId.selectedIndex = currentSelection;
}

//
// Wird aufgerufen, wenn die Auswahl der Spielform geändert wird.
//
function TurnierErstellungOnSpielformChanged()
{
  // Prüfe ausgewählte Spielform
  if (document.NeuesTurnier.Spielform.selectedIndex == 0) {
    //alert('Fernschach gewählt');
    
    // Zeitgutschrift fest auf 0 (als Text)
    document.NeuesTurnier.Zeitgutschrift.style.display          = "none";
    document.getElementById("ZeitgutschriftText").style.display = "inline";
    // und trotzdem in der select-box den Wert auf 0 setzen, damit die Auswertung korrekt arbeiten kann.
    document.NeuesTurnier.Zeitgutschrift.selectedIndex = 0;
    
    // Spieleranzahl für Auswahl frei geben
    document.getElementById("SpielerAnzahlText").style.display = "none";
    document.NeuesTurnier.SpielerAnzahl.style.display          = "inline";
    
    // Rundenanzahl für Auswahl frei geben
    /*
    document.getElementById("RundenAnzahlText").style.display = "none";
    document.NeuesTurnier.RundenAnzahl.style.display          = "inline";
    */
    
    // Select-Box-Werte für Bedenkzeitauswahl anpassen
    // Zuerst löschen wir alle Einträge
    for (var i = document.NeuesTurnier.BedenkzeitSystem.length; i > 0; i--) {
      document.NeuesTurnier.BedenkzeitSystem.options[i - 1] = null;
    }
    // Dann befüllen wir die zulässigen Werte
    // Text = Text in der Auswahlliste, Value = Id der Bedenkzeit
    NeuerEintrag = new Option(T_TErst_ZehnFuerZehn, 1, false, true);
    document.NeuesTurnier.BedenkzeitSystem.options[document.NeuesTurnier.BedenkzeitSystem.length] = NeuerEintrag;
    NeuerEintrag = new Option(T_TErst_ZwanzigFuerZehn, 2, false, false);
    document.NeuesTurnier.BedenkzeitSystem.options[document.NeuesTurnier.BedenkzeitSystem.length] = NeuerEintrag;
    NeuerEintrag = new Option(T_TErst_DreissigFuerZehn, 3, false, false);
    document.NeuesTurnier.BedenkzeitSystem.options[document.NeuesTurnier.BedenkzeitSystem.length] = NeuerEintrag;
  }
  else {
    //alert('Schnellschach gewählt');
    
    // Zeitgutschrift für Auswahl frei geben
    document.getElementById("ZeitgutschriftText").style.display = "none";
    document.NeuesTurnier.Zeitgutschrift.style.display          = "inline";
    
    // Spieleranzahl fest auf 2 (als Text)
    document.NeuesTurnier.SpielerAnzahl.style.display          = "none";
    document.getElementById("SpielerAnzahlText").style.display = "inline";
    // und trotzdem in der select-box den Wert auf 2 setzen, damit die Auswertung korrekt arbeiten kann.
    document.NeuesTurnier.SpielerAnzahl.selectedIndex = 0;
    
    // Rundenanzahl fest auf 1 (als Text)
    /*
    document.NeuesTurnier.RundenAnzahl.style.display          = "none";
    document.getElementById("RundenAnzahlText").style.display = "inline";
    // und trotzdem in der select-box den Wert auf 1 setzen, damit die Auswertung korrekt arbeiten kann.
    document.NeuesTurnier.RundenAnzahl.selectedIndex = 0;
    */
    
    // Select-Box-Werte für Bedenkzeitauswahl anpassen
    // Zuerst löschen wir alle Einträge
    for (var i = document.NeuesTurnier.BedenkzeitSystem.length; i > 0; i--) {
      document.NeuesTurnier.BedenkzeitSystem.options[i - 1] = null;
    }
    // Dann befüllen wir die zulässigen Werte
    // Text = Text in der Auswhlliste, Value = Id der Bedenkzeit
    NeuerEintrag = new Option(T_TErst_FuenfMin, 4, false, false);
    document.NeuesTurnier.BedenkzeitSystem.options[document.NeuesTurnier.BedenkzeitSystem.length] = NeuerEintrag;
    NeuerEintrag = new Option(T_TErst_ZehnMin, 5, false, true);
    document.NeuesTurnier.BedenkzeitSystem.options[document.NeuesTurnier.BedenkzeitSystem.length] = NeuerEintrag;
    NeuerEintrag = new Option(T_TErst_ZwanzigMin, 6, false, false);
    document.NeuesTurnier.BedenkzeitSystem.options[document.NeuesTurnier.BedenkzeitSystem.length] = NeuerEintrag;
    NeuerEintrag = new Option(T_TErst_DreissigMin, 7, false, false);
    document.NeuesTurnier.BedenkzeitSystem.options[document.NeuesTurnier.BedenkzeitSystem.length] = NeuerEintrag;
  }
  
  // Nun noch die anderen Felder aktualisieren
  TurnierErstellungOnSpieleranzahlOderRundenzahlChanged();
}

//
// Wird aufgerufen, wenn die Auswahl der Spieleranzahl oder die Anzahl der Runden geändert wird.
//
function TurnierErstellungOnSpieleranzahlOderRundenzahlChanged()
{
  // Prüfe ausgewählte Spieleranzahl
  if (document.NeuesTurnier.SpielerAnzahl.selectedIndex == 0) {
    // 2 Spieler gewählt
        
    // Gewinnverteilung fest auf "Winner takes it all" (als Text)
    /*
    document.NeuesTurnier.GewinnVerteilung.style.display          = "none";
    document.getElementById("GewinnVerteilungText").style.display = "inline";
    // und trotzdem in der select-box den Wert auf "Winner takes it all" setzen, damit die Auswertung korrekt arbeiten kann.
    document.NeuesTurnier.GewinnVerteilung.selectedIndex = 0;
    */
    /*
    // Farbverteilung hängt bei 2 Spielern noch von der Rundenzahl ab
    if (document.NeuesTurnier.RundenAnzahl.selectedIndex == 0) {
      // Einrundig
      
      // 2 Spieler und einrundig: Farbverteilung für Auswahl frei geben
      document.getElementById("FarbverteilungIdText").style.display = "none";
      document.NeuesTurnier.FarbverteilungId.style.display          = "inline";
    }
    else {
      // Doppelrundig
      
      // Farbverteilung ist bei Doppelrundig fest
      document.NeuesTurnier.FarbverteilungId.style.display          = "none";
      document.getElementById("FarbverteilungIdText").style.display = "inline";
      // und trotzdem in der select-box den Wert auf "Jeder gleich oft W/S" setzen, damit die Auswertung korrekt arbeiten kann.
      document.NeuesTurnier.FarbverteilungId.selectedIndex = 0;
    }
    */
  }
  else {
    // Mehr als 2 Spieler gewählt
    /*
    // Gewinnverteilung für Auswahl frei geben
    document.getElementById("GewinnVerteilungText").style.display = "none";
    document.NeuesTurnier.GewinnVerteilung.style.display          = "inline";
    
    // Farbverteilung ist bei mehr als 2 Spielern fest
    document.NeuesTurnier.FarbverteilungId.style.display          = "none";
    document.getElementById("FarbverteilungIdText").style.display = "inline";
    // und trotzdem in der select-box den Wert auf "Jeder gleich oft W/S" setzen, damit die Auswertung korrekt arbeiten kann.
    document.NeuesTurnier.FarbverteilungId.selectedIndex = 0;
    */
  }
  
  if (!TurnierErstellungCheckEinsatz()) {
    HandleUnerlaubtenSpieleinsatz();
  }
  else {
    // Gewinn neu berechnen
    TurnierErstellungSchreibeGewinn(0);
  }
}

//
// Wird aufgerufen, wenn die Auswahl der Gewinnverteilung geändert wird.
//
function TurnierErstellungOnGewinnverteilungChanged()
{
  if (!TurnierErstellungCheckEinsatz()) {
    HandleUnerlaubtenSpieleinsatz();
  }
  else {
    // Gewinn neu berechnen
    TurnierErstellungSchreibeGewinn(0);
  }
}

//
// Wird aufgerufen, wenn der Spieleinsatz geändert wird.
//
function TurnierErstellungOnEinsatzChanged()
{
  // Prüfe Wert (ToDo "Turniere - Erstellung: Einsatz mit JS prüfen")
  if (!TurnierErstellungCheckEinsatz()) {
    HandleUnerlaubtenSpieleinsatz();
  }
  else {
    // Gewinn neu berechnen
    TurnierErstellungSchreibeGewinn(0);
  }
}

//
// Wird aufgerufen wenn der eingegebene Spieleinsatz ungültig ist,
// z.B. Falsche Zeichen, zu hoch, zu niedrig.
//
function HandleUnerlaubtenSpieleinsatz()
{
  document.getElementById('IdGewinnWert_1').innerHTML = 'ungültig';
  document.getElementById('IdGewinnWert_2').innerHTML = 'ungültig';
  alert(T_TErst_EinsatzA + turnierEinsatzSollMin + T_TErst_EinsatzB + turnierEinsatzSollMax + T_TErst_EinsatzC);
}

//
// Prüft den Spieleinsatz.
//
// Return: true, falls OK, sonst false.
//
// Identische Prüfung in "CTurnierErstellungEingabePruefung.php::CheckSpieleinsatzString()".
//
function TurnierErstellungCheckEinsatz()
{
  var result = false;

  var CurrentEinsatz = document.NeuesTurnier.Spieleinsatz.value;
  
  // Prüfen ob die Eingabe syntaktisch OK ist
  if (EinsatzSyntaktischOk(CurrentEinsatz)) {
    // Wenn bis hier OK, prüfe nun auf Min- Max-Einsätze
    var TurnierArt = document.getElementById('IdGewaehlteTurnierArt').innerHTML; // "Echtgeld" oder "Spielgeld"
    var Echtgeld = false;
    if (TurnierArt == "Echtgeld") {
      Echtgeld = true;
    }
    
    // Werte sind bereits im Doc hinterlegt: "IdEinsatzGrundDatenFernEchtMin" usw.
    if (document.NeuesTurnier.Spielform.selectedIndex == 0) {
      if (Echtgeld) {
        // Fernschach und Echtgeld
        turnierEinsatzSollMin = document.getElementById('IdEinsatzGrundDatenFernEchtMin').innerHTML;
        turnierEinsatzSollMax = document.getElementById('IdEinsatzGrundDatenFernEchtMax').innerHTML;
      }
      else {
        // Fernschach und Spielgeld
        turnierEinsatzSollMin = document.getElementById('IdEinsatzGrundDatenFernSpielMin').innerHTML;
        turnierEinsatzSollMax = document.getElementById('IdEinsatzGrundDatenFernSpielMax').innerHTML;
      }
    }
    else {
      if (Echtgeld) {
        // Schnellschach und Echtgeld
        turnierEinsatzSollMin = document.getElementById('IdEinsatzGrundDatenSchnellEchtMin').innerHTML;
        turnierEinsatzSollMax = document.getElementById('IdEinsatzGrundDatenSchnellEchtMax').innerHTML;
      }
      else {
        // Schnellschach und Spielgeld
        turnierEinsatzSollMin = document.getElementById('IdEinsatzGrundDatenSchnellSpielMin').innerHTML;
        turnierEinsatzSollMax = document.getElementById('IdEinsatzGrundDatenSchnellSpielMax').innerHTML;
      }
    }
    // Eingabe gegen Min und Max prüfen
    turnierEinsatzSollMin *= 1;
    turnierEinsatzSollMax *= 1;
    CurrentEinsatz *= 1;
    if ((turnierEinsatzSollMin <= CurrentEinsatz) && (CurrentEinsatz <= turnierEinsatzSollMax)) {
      result = true;
    }
  }
  
  return result;
}

//
// True, wenn der Einsatz-String (der Parameter) syntaktisch korrekt ist.
// D.h.:
// - Lämge > 0
// - Enthält nur Ziffern
// - Keine führende Nullen
//
function EinsatzSyntaktischOk(theString)
{
  var result = false;
  
  var len = theString.length;
  var fehlerGefunden = false;
  if (len <= 0) {
    fehlerGefunden = true;
  }
  
  var NullerErlaubt = false;
  for (var i=0; i<len; i++) {
    if (!isDigit(theString.charAt(i))) {
      fehlerGefunden = true;
      break;
    }
    // Es ist also eine Ziffer
    if (!NullerErlaubt && (theString.charAt(i) == '0')) {
      fehlerGefunden = true;
      break;
    }
    // Es ist eine Ziffer und keine führende Null
    NullerErlaubt = true;
  }
  
  if (!fehlerGefunden) {
    result = true;
  }
  
  return result;
}

//
// Ob das Zeichen eine Ziffer ist.
//
function isDigit(theChar)
{
  var result = false;
  if ((theChar == '0') ||
      (theChar == '1') ||
      (theChar == '2') ||
      (theChar == '3') ||
      (theChar == '4') ||
      (theChar == '5') ||
      (theChar == '6') ||
      (theChar == '7') ||
      (theChar == '8') ||
      (theChar == '9')) {
    result = true;
  }
  return result;
}

//
// Berechnet den Gewinn neu, der unten angezeigt wird.
// Wird aufgerufen, wenn sich einer der folgenden Werte ändert:
// - Einsatz
// - Spieleranzahl
// - Gewinnverteilung
//
// Parameter:
// UnitTest = 0: Kein UnitTest, Produktiv-Aufruf
// UnitTest = >0, = Nummer des UnitTest, alert() ob berechnetes Ergebnis OK oder nicht.
//
function TurnierErstellungSchreibeGewinn(UnitTest)
{
  // Alle Parameter aus dem Doc und den Eingabefeldern holen
  // Grunddaten aus dem Doc (DB)
  var RakeGrundDatenMaxRake;
  var RakeGrundDatenProzent;
  // Aktuell eingestellte Werte in den Eingabe-Feldern
  var CurrentEinsatz;
  var CurrentSpieleranzahl;
  var CurrentGewinnverteilungWinnerAll;
  // MaxRake
  RakeGrundDatenMaxRake = document.getElementById('IdRakeGrundDatenMaxRake').innerHTML;
  RakeGrundDatenMaxRake *= 1;
  // Rake-Prozente
  RakeGrundDatenProzent = document.getElementById('IdRakeGrundDatenProzent').innerHTML;
  RakeGrundDatenProzent *= 1;
  // Spieler-Anzahl
  CurrentSpieleranzahl = document.NeuesTurnier.SpielerAnzahl.options[document.NeuesTurnier.SpielerAnzahl.selectedIndex].value;
  CurrentSpieleranzahl *= 1;
  // Gewinnverteilung: 1 = 100, 2 = 75/25
  var CurrentGewinnverteilungIndex = 1;
  CurrentGewinnverteilungWinnerAll = true;
  /*
  var CurrentGewinnverteilungIndex = document.NeuesTurnier.GewinnVerteilung.options[document.NeuesTurnier.GewinnVerteilung.selectedIndex].value;
  CurrentGewinnverteilungIndex *= 1;
  if (CurrentGewinnverteilungIndex == 1) {
    CurrentGewinnverteilungWinnerAll = true;
  }
  else {
    CurrentGewinnverteilungWinnerAll = false;
  }
  */
  // Einsatz
  CurrentEinsatz = document.NeuesTurnier.Spieleinsatz.value;
  CurrentEinsatz *= 1;
  
  //
  // Beginn der Berechnung (Vorgehen: Siehe ToDo "UnitTests-CGewinnBerechnung")
  //
  var Result;
  if (CurrentGewinnverteilungWinnerAll) {
    Result = new Array(1);
  }
  else {
    Result = new Array(2);
  }
  // Gesammte Geldmenge
  var GesamtSumme = CurrentEinsatz * CurrentSpieleranzahl;
  // Einzel-Rake
  var EinzelRake = CurrentEinsatz * RakeGrundDatenProzent / 100;
  if (EinzelRake > RakeGrundDatenMaxRake) {
    EinzelRake = RakeGrundDatenMaxRake;
  }
  // Gesamt-Rake
  var GesamtRake = EinzelRake * CurrentSpieleranzahl;
  // Gewinn-Ausschüttung
  var GewinnAusschuettung = GesamtSumme - GesamtRake;
  // Gewinn auf Ergebnis verteilen
  if (CurrentGewinnverteilungWinnerAll) {
    Result[0] = CutNachkommaCent(GewinnAusschuettung);
    Result[0] = ConvertToGeldString(Result[0]);
  }
  else {
    Result[0] = CutNachkommaCent(GewinnAusschuettung * 3 / 4);
    Result[0] = ConvertToGeldString(Result[0]);
    Result[1] = CutNachkommaCent(GewinnAusschuettung / 4);
    Result[1] = ConvertToGeldString(Result[1]);
  }
  
  // Ausgabe ins Doc
  document.getElementById('IdGewinnWert_1').innerHTML = Result[0];
  if (!CurrentGewinnverteilungWinnerAll) {
    // Es sind zwei Werte anzuzeigen
    // 2. Zeile sichtbar machen
    if ($("#IdZeileZweiterGewinner").hasClass("Unsichtbar")) {
      $("#IdZeileZweiterGewinner").removeClass("Unsichtbar");
    }
    // Wert eintragen
    document.getElementById('IdGewinnWert_2').innerHTML = Result[1];
  }
  else {
    // Nur einen Wert anzeigen: 2. Zeile verbergen
    if (!$("#IdZeileZweiterGewinner").hasClass("Unsichtbar")) {
      $("#IdZeileZweiterGewinner").addClass("Unsichtbar");
    }
  }
  
  //
  // Falls UnitTest: Prüfe Ergebnis und gib es ins Doc aus.
  // A C H T U N G: Geprüft wird gegen die Zahlen (keine Strings)
  //
  if (UnitTest > 0) {
    UnitTestSchreibeGewinnTestAuswertung(UnitTest, Result);
  }
}

//
// Beispiele:
// 12 -> 12,00
// 12.3 -> 12,30
// 12.34 -> 12,34
//
function ConvertToGeldString(ori)
{
  var result = "";
  var oriString = ori.toString();
  var punktIndex = oriString.indexOf(".");
  if (punktIndex == -1) {
    // Keine Nachkommastellen
    result = oriString + ",00";
  }
  else {
    // Vorkommastellen kopieren
    result = oriString.substr(0, punktIndex);
    // Komma anhängen
    result += ",";
    // Nachkommstellen kopieren
    result += oriString.substr(punktIndex+1);
    // Ggf. eine Null auffüllen
    if (punktIndex+2 == oriString.length) {
      result += "0";
    }
  }
  return result;
}

function CutNachkommaCent(x)
{
  // Runde nur, wenn überhaupt notwendig
  var notwendig = false;
  var xString = x.toString();
  var DezimalPunktPos = xString.indexOf('.');
  if (DezimalPunktPos != -1) {
    // Punkt vorhanden, jetzt Anz Nachkommastellen prüfen
    var lenAbPunkt = xString.length - DezimalPunktPos;
    if (lenAbPunkt > 3) {
      // Runden ist notwendig
      notwendig = true;
    }
  }
  
  if (notwendig) {
    var k = (Math.floor(x * 100) / 100).toString();
    k += (k.indexOf('.') == -1)? '.00' : '00';
    return k.substring(0, k.indexOf('.') + 3);
  }
  else {
    return x;
  }
}

//
// Prüft das Turnier-Erstell-Formular vor dem Absenden.
//
// Wir prüfen nur die Felder, die keine SelectBox sind.
// Wir orientieren uns hier an den Prüfungen in "CTurnierErstellungEingabePruefung.php"!
//
// Das Formular heisst "NeuesTurnier".
//
// Vorhandene Eingabefelder:
// - TurnierName
// - Spielform         (SelectBox, wird nicht geprüft)
// - BedenkzeitSystem  (SelectBox, wird nicht geprüft)
// - Zeitgutschrift    (SelectBox, wird nicht geprüft)
// - Spieleinsatz      (wird bereits beim Verlassen des Feldes geprüft)
// - GewinnVerteilung  (SelectBox, wird nicht geprüft)
// - SpielerAnzahl     (SelectBox, wird nicht geprüft)
// - RundenAnzahl      (SelectBox, wird nicht geprüft)
// - FarbverteilungId  (SelectBox, wird nicht geprüft)
//
function checkTurnierErstellFormular()
{
  //
  // Turniername
  //
  if (document.NeuesTurnier.TurnierName.value.length < 3) {
    alert(T_TErst_Name);
    document.NeuesTurnier.TurnierName.focus();
    return false;
  }
  if (document.NeuesTurnier.TurnierName.value.length > 20) {
    alert(T_TErst_Name);
    document.NeuesTurnier.TurnierName.focus();
    return false;
  }


  //
  // Alle Checks OK  
  return true;
}

