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

//
// Funktionsweise: Siehe "Autoaktualisierung und Partieauflistung Gesamtkonzept.txt".
//

//
// Script-Globale Variablen
//

// Die zu pollende Adresse
var httpRequestURL;
// Aktuelle Versionsnummer der Partie im Hauptfenster
var versionPartie;
// Aktuelle Versionsnummer der Echtgeld-Turnierliste im Hauptfenster
var versionTurniereEcht;
// Aktuelle Versionsnummer der Spielgeld-Turnierliste im Hauptfenster
var versionTurniereSpiel;
// Aktuelle Versionsnummer eines Turniers (Startseite oder Angebot) im Hauptfenster
var versionTurnier;

// Das Http-Request-Objekt
var httpRequestObject = null;

//
// Das Http-Request-Objekt erzeugen
//
function CreateHttpRequestObject()
{
  var http_request = false;

  if (window.XMLHttpRequest) { // Mozilla, Safari,...
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
      http_request.overrideMimeType('text/xml');
      // zu dieser Zeile siehe weiter unten
    }
  } else if (window.ActiveXObject) { // IE
    try {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        http_request = false;
      }
    }
  }
  
  if (!http_request) {
    alert('FEHLER :( Kann keine XMLHTTP-Instanz erzeugen');
  }
  
  return http_request;
}




//httpRequestObject = CreateHttpRequestObject();

// ...to test if the object already exists and to abort any exiting request we can reuse an existing object
// where one already exists and avoid problems with multiple requests to the server. 
if (!httpRequestObject) {
  httpRequestObject = CreateHttpRequestObject();
}
else if (httpRequestObject.readyState != 0) {
  httpRequestObject.abort();
}
// After running this piece of code if doesn't matter whether a prior request existed as the state of the AJAX object
// after running this code is the same regardless of whether the object previously existed or has been newly created. 



//
// Schickt einen Request an die url
// Das Ergebnis wird von HandleResponse() ausgewertet.
//
function MacheRequest()
{
//alert('MacheRequest...');
  if (!httpRequestObject) {
    alert('FEHLER :( Keine XMLHTTP-Instanz vorhanden');
    return false;
  }
  httpRequestObject.onreadystatechange = HandleResponse;

  var url_mitZahl = httpRequestURL + '?versionPartie=' + versionPartie + '&versionTurniereEcht=' + versionTurniereEcht + '&versionTurniereSpiel=' + versionTurniereSpiel + '&versionTurnier=' + versionTurnier + '&cache=' + randGanzzahl(1, 10000);

  //var alert_string = 'Abfrage auf ' + url_mitZahl;
  //alert(alert_string);

  //
  // Zeichensatz einstellen:
  //
  // Evtl. fehlt noch die Verwendung von encodeURIComponent()!?
  //
  //httpRequestObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
  httpRequestObject.open('GET', url_mitZahl, true);
  httpRequestObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  httpRequestObject.send(null);
  
  // Debugging-Ausgabe
  //PrintAjaxDebug('Request abgesetzt');
}

// Nur für debugging
function PrintAjaxDebug(text)
{
  if (document.getElementById('AjaxDebugBereich') != null) {
    var jetzt = new Date();
    var Std = jetzt.getHours();
    var Min = jetzt.getMinutes();
    var Sek = jetzt.getSeconds();
    var Tag = jetzt.getDate();
    var Mon = jetzt.getMonth() + 1;
    var Jahr = jetzt.getFullYear();
    document.getElementById('AjaxDebugBereich').innerHTML += 'AJAX-Debug: ' + Tag + '.' + Mon + '.' + Jahr + ' ' + Std + ':' + Min + ':' + Sek + '  ' + text + '<br />';
  }
}

//
// Erzeugt ganzzahlige Zufallszahl min bis max (einschliesslich)
//
function randGanzzahl(min, max)
{
	return Math.floor(Math.random() * (max - min + 1)) + min;
}

//
// Wertet das Ergebnis von MacheRequest() aus.
//
// Struktur der Antwort: Siehe "Autoaktualisierung Antwortstruktur.txt"
//
function HandleResponse()
{
  var continueRequest = false;
  var continueRequestStoppedByTurnierangebotNoLongerValid = false;
  
  if ((httpRequestObject.readyState == 4) && (httpRequestObject.status == 200)) {
    // Antwort vom Server eingetroffen
    
  // Debugging-Ausgabe
  //PrintAjaxDebug('Antwort eingetroffen');
    
    // Trenne Antwort am Trenner-Tag im Antwort-String
    var responseTeile = httpRequestObject.responseText.split("<AutoAktTrenner>");
    
    // Zunächst prüfen wir auf Sonderfälle
    if ((responseTeile.length > 1) && (responseTeile[1] == "Bisher keine Aenderung")) {
    
      //alert('Antwort vom Server: Bisher keine Aenderung, weiter pollen...');
    
      // Bisher keine Änderung, weiter pollen
      continueRequest = true;
    }
    else if ((responseTeile.length > 1) && (responseTeile[1] == "AutoAkt aus")) {
    
      //alert('Antwort vom Server: AutoAkt aus (generell oder es ist keiner eingeloggt und das ist aus), Pollen abbrechen.');
    
      continueRequest = false;
    }
    else {
      // Kein Sondertext. Antwort auswerten:
      
      if (responseTeile.length > 1) {
/*
PrintAjaxDebug('Irgendwas ersetzen: Länge = ' + responseTeile.length);
if (responseTeile[0].length > 0)
  PrintAjaxDebug(' Länge0 = ' + responseTeile[0].length + ": " + responseTeile[0]);
else
  PrintAjaxDebug(' Länge0 = ' + responseTeile[0].length);
  
if (responseTeile[1].length > 0)
  PrintAjaxDebug(' Länge1 = ' + responseTeile[1].length + ": " + responseTeile[1]);
else
  PrintAjaxDebug(' Länge1 = ' + responseTeile[1].length);
  
if (responseTeile[2].length > 0)
  PrintAjaxDebug(' Länge2 = ' + responseTeile[2].length + ": " + responseTeile[2]);
else
  PrintAjaxDebug(' Länge2 = ' + responseTeile[2].length);
*/
        // Es sind Nutzdaten enthalten: Antwort enthält Partieliste, Partieanzeige, Turnierliste oder mehrere von alle dem.
        // Andernfalls ist der Antwort-String leer oder enthält nur "<ConnTest><ConnTest>...". Dann wäre in beiden Fällen kein Neustart erforderlich
        
        //alert('Antwort vom Server: Partieliste oder Partieanzeige oder Turnierauflistung!!! Dann weiter pollen.');
        
        //
        // Partieliste
        //
        if (responseTeile[1].length > 0) {
//PrintAjaxDebug('Partieliste ersetzen!');
          // Es gibt eine neue Partieliste: Diese anzeigen
          document.getElementById('PartieAuflistung').innerHTML = responseTeile[1];
          
          // Selektierte Partie hervorheben
          ColorSelectedMatch();
        }
        
        //
        // Partieanzeige
        //
        if (responseTeile.length >= 3) {
          if (responseTeile[2].length > 0) {
            // Es gibt eine neue Partieanzeige: In Document einfügen
            document.getElementById('HauptfensterBereich').innerHTML = responseTeile[2];
            
            // In diesem Fall sollte auch die neue Versionsnummer dabei sein
            if ((responseTeile.length > 3) && (responseTeile[3].length > 0)) {
              versionPartie = responseTeile[3];
              versionPartie *= 1;
            }

            //
            // Hier ist die Partieanzeige ausgetauscht. Jetzt die JS-Handler wieder anhängen
            //
            // Initialisiere die Partieanzeige
            InitHilfeDialogejQueryUI();
            InitPartieAnzeige(false);
            InitPartieanzeigeDragDrop(true, false);
            SetNotationScrollbar("unten");
            // Nun noch die lokale Zeitanzeige neu initialisieren
            startZeitanzeigeUpdate();
          }
        }
        
        //
        // Turnierauflistung
        //
        if (responseTeile.length >= 5) {
          if (responseTeile[4].length > 0) {
            // Es gibt eine neue Turnierauflistung: In Document einfügen
            
            // Vorher die aktuelle Sortierung in Cookie schreiben
            SaveCurrentTurnierAngeboteAuswahlUndSortierungToCookie();
            // Jetzt einfügen
            document.getElementById('HauptfensterBereich').innerHTML = responseTeile[4];
            
            // In diesem Fall sollte auch die neue Versionsnummer dabei sein
            if ((responseTeile.length > 5) && (responseTeile[5].length > 0)) {
              if (versionTurniereEcht != -1) {
                // Es ist die Echtgeld-Turnierliste
                versionTurniereEcht = responseTeile[5];
                versionTurniereEcht *= 1;
              }
              else {
                // Es ist die Spielgeld-Turnierliste
                versionTurniereSpiel = responseTeile[5];
                versionTurniereSpiel *= 1;
              }
            }
            
            // Im Falle Turnierauflistung sollten auch die Anzahlen der Turnierangebote gemeldet werden
            if ((responseTeile.length > 7) &&
                (responseTeile[6].length > 0) &&
                (responseTeile[7].length > 0)) {
              var anzFernschachAngebote    = responseTeile[6];
              anzFernschachAngebote *= 1;
              var anzSchnellschachAngebote = responseTeile[7];
              anzSchnellschachAngebote *= 1;
              //
              // Was wir mit diesen Werten anstellen, ist allerdings noch nicht ganz klar...
              // Siehe "Autoaktualisierung Turnierangebote.txt" und "TODO_TurnierAngebote.txt".
              //
            }
            
            // Die Auflistung ist neu...
            if (document.getElementById("IdTurnierListeTable") != null) {
              // EventHandler für Sortierung wieder an die neue Tabelle hängen...
              InitTurnierAngeboteAuswahl();
              // ...und aktuelle Sortierung wieder herstellen
              RestoreTurnierAngeboteAuswahlUndSortierungFromCookie();
            }
          }
        }
        
        //
        // Turnier (Angebot oder Startseite)
        //
        if (responseTeile.length >= 9) {
          if (responseTeile[8].length > 0) {
            // Es gibt eine neue Turnierseite: In Document einfügen
            
            document.getElementById('HauptfensterBereich').innerHTML = responseTeile[8];
            
            // In diesem Fall sollte auch die neue Versionsnummer dabei sein
            if ((responseTeile.length > 9) && (responseTeile[9].length > 0)) {
              versionTurnier = responseTeile[9];
              versionTurnier *= 1;
              
              if ((versionTurnier == -2) || (versionTurnier == -3)) {
                // Das Turnierangebot im Hauptfenster wurde gelöscht oder Turnier ist ohne den User gestartet: Weiteres Pollen unnötig
                continueRequestStoppedByTurnierangebotNoLongerValid = true;
/*
if (versionTurnier == -2) {
  alert('Pollen stoppen. Grund: Turnier gelöscht.');
}
if (versionTurnier == -3) {
  alert('Pollen stoppen. Grund: Turnier ohne uns gestartet.');
}
*/
              }
            }
          }
        }
        InitButtonsjQueryUI();
        
        // Antwort ausgewertet, weiter pollen (aber nur wenn noch sinnvolle Inhalte da)
        if (!continueRequestStoppedByTurnierangebotNoLongerValid) {
          continueRequest = true;
        }
      }
    }
  }
  //else {
  //  var alert_string = 'Komischer Status: ' + httpRequestObject.readyState + " " + httpRequestObject.status;
  //  alert(alert_string);
  // }
  
  // Gleich neu starten
  if (continueRequest && (httpRequestObject.readyState == 4)) {
    MacheRequest();
  }
}

//
// Starten der AutoAktualisierung.
//
function StarteAutoAktualisierung()
{
  var starteAutoAkt = document.getElementById('IdAutoAktStarten').innerHTML;
  starteAutoAkt *= 1;
  if (starteAutoAkt == 1) {
    // Andernfalls soll kein AutoAkt gestartet werden
    
    //alert('AutoAkt starten!');
    
    httpRequestURL = document.getElementById('IdHttpRequestURL').innerHTML;

    versionPartie = document.getElementById('IdVersionPartie').innerHTML;
    versionPartie *= 1;
    
    versionTurniereEcht = document.getElementById('IdVersionTurnierListeEchtgeld').innerHTML;
    versionTurniereEcht *= 1;
    
    versionTurniereSpiel = document.getElementById('IdVersionTurnierListeSpielgeld').innerHTML;
    versionTurniereSpiel *= 1;

    versionTurnier = document.getElementById('IdVersionTurnier').innerHTML;
    versionTurnier *= 1;
    
    MacheRequest();
  }
}

//
// AutoAktualisierung abbrechen, d.h evtl. laufender Request wird abgebrochen.
//
function AbortRequest()
{
  if (httpRequestObject) {
    httpRequestObject.abort();
  }
}

