// Objekt für die Daten des SCORM-Datenmodells
function classValueObject($aValue, $aChanged) {
  this.value = $aValue;
  this.changed = $aChanged;
};

// SCORM-API (mit iSchoolbook-Erweiterungen)
function classAPI_1484_11() {
  this.version = "isb2.1";

  var errorCode = 0;
  var errorString = "";

  var requestResult;

  // assiatives Array
  // Format: data[kennung][0] = wert, data[kennung][1] = true, wenn Wert von SCO verändert
  var data = new Object();

  data["cmi-_version"] = new classValueObject("1.0");
  data["isb-version"] = new classValueObject("2");
  data["isb-subversion"] = new classValueObject("1");

  // setzt die API-Werte auf die Ausgangswerte
  this.reset = function(aStudentID, aSCO, aGroupID, aUserID) {
    data = new Object();
    data["cmi-_version"] = new classValueObject("1.0");
    data["isb-version"] = new classValueObject("2");
    data["isb-subversion"] = new classValueObject("1");
    data["cmi-learner_id"] = new classValueObject(aStudentID);
    data["isb-sco"] = new classValueObject(aSCO);
    data["isb-group_id"] = new classValueObject(aGroupID);
    data["isb-tutor_id"] = new classValueObject(aUserID);
    errorCode = 0;
    errorString = "";
  };

  // Initialize
  this.Initialize = function(aParam) {
    return true;
  };

  // Terminate
  this.Terminate = function(aParam) {
    this.Commit();
    // StudentHome aufrufen
    if (window.frames.length > 0)
      window.frames.isb_content.location.href="user.php?action=studentHome";
    else
      alert("SCO-Terminierung erfolgt.");
  };

  // GetValue
  this.GetValue = function(aParam) {
    aParam = aParam.replace(/\./g,"-");
    if ((aParam != "cmi-_version") &&
        (aParam != "isb-version") &&
        (aParam != "isb-subversion") &&
        (aParam != "cmi-lerner_id") &&
        (aParam != "isb-sco") &&
        (aParam != "isb-group_id") &&
        (aParam != "isb-tutor_id"))
      var v = data[data["isb-sco"].value + "-" + aParam];
    else
      var v = data[aParam];

    if (v) return v.value || 0;
    else return "";
  };

  // SetValue
  this.SetValue = function(aParam1, aParam2) {
    data[data["isb-sco"].value + "-" + aParam1.replace(/\./g,"-")] = new classValueObject(aParam2, true);
    return true;
  };

  // isbSetValue (setzt ohne Änderungskennung, auch schreibgeschützte Werte)
  this.isbSetValue = function(aParam1, aParam2) {
    data[aParam1.replace(/\./g,"-")] = new classValueObject(aParam2);
    return true;
  };

  // Commit
  this.Commit = function(aParam) {
    // feststellen, ob ein Wert geändert wurde
    var changed = false;
    for (var ob in data) changed = changed || data[ob].changed;

    // wenn Werte geändert wurden ...
    if (changed) {
      var param = "action=saveSCOValues&tutor=" + data["isb-tutor_id"].value + "&groupID=" + data["isb-group_id"].value + "&students=" + data["cmi-learner_id"].value + "&isb-sco=" + data["isb-sco"].value;

      // ... geänderte Werte in Parameter zusammenstellen ...
      for (var ob in data)
        if (data[ob].changed) {
          param = param + "&" + ob + "=" + data[ob].value;

          // Änderungszeiger zurücksetzen
          data[ob].changed = false;
        };

      // ... und abspeichern
      r = this.request(param, false, false, null);
      if (r) r = r.split("|"); else r = new Array("", 0);
      errorString = r[0];
      errorCode = r[1];
    };
    return true;
  };

  // GetLastError
  this.GetLastError = function() {
    return errorCode;
  };

  // GetErrorString
  this.GetErrorString = function(aParam) {
    return errorString;
  };

  // GetDiagnostic
  this.GetDiagnostic = function(aParam) {
    return "";
  };

  this.getRequestResult = function() {
    return requestResult;
  };

  this.createObRequest = function() {
    // obRequest-Objekt erzeugen
    var obR = false;
    if (window.XMLHttpRequest) obR = new XMLHttpRequest();
    else if (window.ActiveXObject) {
      try { obR = new ActiveXObject('Msxml2.XMLHTTP'); }
      catch (e) { try { obR = new ActiveXObject('Microsoft.XMLHTTP'); }
      catch (e) { } };
    };
    if (!obR) { alert('Fehler: Konnte Request nicht aufbauen!'); return null; };
    return obR;
  };

  // Request ausführen
    // aParam: Parameter
    // aReturnXML: true, wenn Ergebnis als XML-Data zurückgegeben werden soll
    // aAsychnron: true, wenn Anforderung asynchron bearbeitet werden soll
    // aOnRequestLoaded: Function auf document-Ebene, die bei asynchroner Rückgabe aufgerufen werden soll, wenn Ergebnis vorliegt
  this.request = function(aParam, aReturnXML, aAsynchron, aOnRequestLoaded) {
    // neuen obRequest erzeugen (aus irgendeinem Grund nötig ...)
    document.obAPIRequest = this.createObRequest();

    // ggf. Abbruch-Script abbrechen
    window.clearTimeout(document.APITimeOutId);

    // Funktion definieren für Reaktion auf Request
    if (aAsynchron) document.obAPIRequest.onreadystatechange = function() {
      // Request vollständig und erfolgreich?
      if ((document.obAPIRequest.readyState == 4) && (document.obAPIRequest.status == 200)) {
        // Abbruch-Script abbrechen
        window.clearTimeout(document.APITimeOutId);

        // Request-Ergebnis übernehmen
        if (aReturnXML) requestResult = document.obAPIRequest.responseXML;
        else requestResult = document.obAPIRequest.responseText;
//alert("responseXML: " + document.obAPIRequest.responseXML.xml);
//window.clipboardData.setData('Text',document.obAPIRequest.responseText);
//alert("responseText: " + document.obAPIRequest.responseText);
        // Abfrage abschließen
        document.obAPIRequest.abort();
        // mit Funktion in onrequestloaded fortsetzen (muss in neuem Prozess starten, daher Timeout!)
        document.onrequestloaded && window.setTimeout('document.onrequestloaded();', 1);

      };

      // Daten zurückgeben
      return xmlData;
    };

    // Funktion, mit der auf einen geladenen Request reagiert werden soll, speichern
    document.onrequestloaded = (aOnRequestLoaded || null);

    // Request-Parameter ergänzen, Daten zurücksetzen, Mime-Type überschreiben
    xmlData = null;
    document.obAPIRequest.overrideMimeType && document.obAPIRequest.overrideMimeType('text/xml');

    // Request-Verbindung öffnen, Header setzen
    document.obAPIRequest.open('POST', 'user.php', aAsynchron);
    document.obAPIRequest.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
    document.obAPIRequest.setRequestHeader( 'Content-length', aParam.length );
//alert(aParam);

    // Abbruch-Script einbauen
    document.APITimeOutId = window.setTimeout("document.APITimeOut()", 15000);

    // Daten senden
    document.obAPIRequest.send(aParam);

    // bei synchronem Aufruf: responseText zurückgeben
    if (!aAsynchron) {
      // evtl. "Warten" einblenden ...
      var t1 = new Date(); var t2 = new Date();
      while ((document.obAPIRequest.readyState != 4) && (t2 - t1 < 10000)) {
        alert("Warten auf Serverantwort ...\n\nBitte auf \"OK\" klicken.")
        t2 = new Date();
      };

      // wenn Antwort innerhalb von 10 Sekunden gekommen
      if (document.obAPIRequest.readyState == 4) {
        if (aReturnXML) var r = document.obAPIRequest.responseXML;
        else var r = document.obAPIRequest.responseText;
        document.obAPIRequest.abort();
        return r;
      } else {
      // ansonsten
        alert("Keine Serverantwort");
        document.obAPIRequest.abort();
        return "";
      };
      document.obAPIRequest.abort();
    };
  };

  this.test = function() {
    alert("Test erfolgreich");
  };

  this.clearAPITimeout = function() {
    window.clearTimeout(document.APITimeOutId);
  };
};

document.APITimeOutId = 0;

document.APITimeOut = function() {
  document.obAPIRequest.abort();
  alert("Die Datenübertragung dauert zu lange und wurde abgebrochen. Möglicherweise ist die Internetverbindung überlastet oder zu langsam.\n\nBitte die Funktion noch einmal aufrufen.");
};

document.obAPIRequest = 0;

// SCORM-API initialisieren
API_1484_11 = new classAPI_1484_11();
