//////////////////////////////////////////////////////////////////////////
// iSchoolbook 2.0                                                      //
// allgemeine Scripte für Schülerverwaltung                             //
//////////////////////////////////////////////////////////////////////////

// SCORM-API
var API = null;

// Daten für Suchroutine SCORM-API
var nFindAPITries = 0;
var maxFindAPITries = 500;

var taskVars = false;
var openedStudentForInputs = false;

var testTimeOfflineOverflowMessageShown = false;

var obBookExt = false;

// sucht im aktuellen Fenster und seinen Elternfenstern nach der SCORM-API
function scanForAPI(win) {
  while((win.API_1484_11 == null) && (win.parent != null) && (win.parent != win)) {
    nFindAPITries++;
    if (nFindAPITries > maxFindAPITries) return null;
    win = win.parent;
  };
  return win.API_1484_11;
};

// sucht die SCORM-API (Startroutine)
function getAPI(win) {
  // evtl. Competence-Listen-Button de-/aktivieren
  if (document.getElementById("compTotalResetButton1")) {
    document.isOriginalCompetenceList();
  };

  // Browser gültig?
  var browserOK = document.isBrowserOK();
  // nicht gültig, also ...
  if (!browserOK) {
    // ... Meldung einblenden und ...
    $("#wrongBrowserMessage").show();
    // ... LoginBtn-Anzeige ändern
    $("#loginbutton #button").attr("src", "pics/screen/btLoginOff.gif");
  };

  if ((win.parent != null) && (win.parent != win)) API = scanForAPI(win.parent);
  if ((API == null) && (win.opener != null)) API = scanForAPI(win.opener);
};

// reagiert auf LogIn-Click
function logIn() {
  if (document.isBrowserOK())
    document.forms.login.submit();
  else {
    var dialog = $("#wrongBrowserDialog").dialog({
      autoOpen: true,
      title: "Hinweis",
      resizable: false,
      draggable: false,
      width:310,
      buttons: { Schließen: function() { $(this).dialog("close"); } },
      modal: true
    });
  };
};



function init() {
  // erweiterndes Buchobjekt erzeugen
  if (document.classBookExt || classBookExt) obBookExt = new classBookExt();

  // Buchobjekt erzeugen
  obBook = new classBook();
  obActionHandler = new classActionHandler();

  // nur auf der Schülertestseite (nur dort gibt es das Element "page_confirm" = Eingabebestätigung bei einer Aufgabe)
  if (document.getElementById("page_confirm")) {
    // soll Aufgabe getestet werden? Direkt öffnen
    if (testTask) {
      if (testTaskURL) obBook.openTask(testTaskURL);
      else obBook.openTask("__testtemp");

    } else
    // Handler aufrufen, um Startseite anzuzeigen
      window.setTimeout('obBook.continueJob("");', 1);
  };

  // evtl. die nächste Offline-Aufgabe öffnen
  if (!document.getElementById("page_confirm") && document.lastInputTask)
    openInputTask("next");
};

//function showCrocoHelp() {
//  if (obBookExt) { obBookExt.showHelp(); };
//};

// Funktion, um einfache Aktionen mit dem Formular id=form zu senden
//    aElement, aValue: der Wert aValue wird in das Formularelement namens aElement eingesetzt
function commonAction(aAction, aElement, aValue, aTarget) {
  var f = document.forms.form;
  // Wert einsetzen
  if (f.elements[aElement]) f.elements[aElement].value = aValue;
  // Action definieren
  f.action.value = aAction;
  // Target setzen
  f.target = aTarget || "";
  // Formular senden
  f.submit();
};

function openInfo(aPage, aTarget, aURL) {
  if (!aTarget) aTarget = "info";
  if (aPage) w = window.open("info.php?action=" + aPage, aTarget);
  else if (aURL) w = window.open(aURL, aTarget);
  w.focus();
};

// hebt ein Element unter dem Cursor hervor (= setzt className=over) bzw. hebt Hervorhebung auf (je nach aHighlight)
//    beim Verlassen wird der className wieder zurückgesetzt
function highlight(aElement, aHighlight, ignorePic) {
  // evtl. className merken
  if (aHighlight && !aElement.defaultClassName) aElement.defaultClassName = aElement.className || "";

  // className setzen
  if (aHighlight) aElement.className = aElement.defaultClassName + "Over";
  else aElement.className = aElement.defaultClassName;

  // evtl. Bild austauschen
  if (!ignorePic) {
    // erstes Button-Bildelement suchen
    var pics = aElement.getElementsByTagName("img");  var pic = null;
    for (var i = 0; i < pics.length; i++) if (!pic && (pics[i].id == "button")) pic = pics[i];
    // falls Button-Bild gefunden
    if (pic) {
      // evtl. srcDefault merken
      if (aHighlight && !pic.getAttribute("srcDefault")) {
        var a = pic.src.split("."); a.pop();
        pic.setAttribute("srcDefault", a.join("."));
      };
      // src setzen
      if (aHighlight) pic.src = pic.getAttribute("srcDefault") + "_over.gif";
      else pic.src = pic.getAttribute("srcDefault") + ".gif";
    };
  };
};

// blendet die Benutzerkennungen ein
function showPassword(aElement) {
  // Div feststellen
  var div = aElement.getElementsByTagName("div")[0];
  if (div.className != "passwordShown")
    div.className = "passwordShown"
  else
    div.className = "passwordHidden";
};

// druckt die Login-Daten der Schüler aus
function printLoginData() {
  window.open("main.php?action=printlogindata", "_blank");
};

// löscht einen Schüler aus einer Klasse
function deleteStudent(aIndex) {
  if (confirm("Soll der Schüler wirklich aus dieser Klasse gelöscht werden? \n\nSie können die Löschung innerhalb von drei Monaten wieder aufheben, ansonsten wird der Schüler endgültig aus der Klasse entfernt und die Diagnosedaten werden unwiderruflich gelöscht."))
    location.href="main.php?action=deletestudent&studentindex=" + aIndex;
};

// weist einem Schüler ein neues Passwort zu
function modifyPassword(aIndex) {
  if (confirm("Soll dem Schüler wirklich ein neues Kennwort zugewiesen werden?"))
    location.href="main.php?action=modifypassword&studentindex=" + aIndex;
};

// öffnet ein Eingabefeld
function openInputField(aElement, aOpen) {
  // Element des Buttons und des Felds feststellen
  var button = document.getElementById(aElement.id + "Button");
  var field = document.getElementById(aElement.id + "Field");
  // je nach aOpen wird Feld angezeigt und Button verborgen oder umgekehrt
  if (aOpen) {
    field.style.display = "";
    button.style.display = "none";
  } else {
    field.style.display = "none";
    button.style.display = "";
  };
};

// ruft die Gruppenimportfuntion auf
// - aGroupId                ZKV_group_id der Klasse
// - aApp                Kürzel der Applikation, in die die Gruppe importiert werden soll
// - aDeleted                = 1, falls die Gruppe bereits importiert und gelöscht wurde. Import wird nur nach Bestätigung durchgeführt
function importGroup(aGroupId, aApp, aDeleted) {
  if (!aDeleted || confirm("Diese Klasse wurde bereits aus der Klassenzentrale importiert und innerhalb der letzten drei Monate gelöscht.\n\n"+
                            "Klicken Sie auf \"OK\", um die Klasse neu zu importieren. Wichtig: Bei der Übernahme der Klasse aus der Klassenverwaltung werden alle gespeicherten Daten (Schülereingaben, Auswertungen usw.) gelöscht.\n\n"+
                           "Wenn Sie diese Daten erhalten (d. h. die Klasse lediglich wiederherstellen) wollen, klicken Sie bitte auf \"Abbrechen\". Anschließend können Sie die Klasse über die Tabelle \"Klasse wiederherstellen\" wiederherstellen."))
    location.href="main.php?action=importgroup&app="+aApp+"&groupid="+aGroupId;
};

// reagiert auf Anklicken einer CheckBox in einer Liste mit einer "Alles-Markieren"-Checkbox
// die id der Checkboxen der Liste müssen mit aName beginnen, die id der "Alles-Markieren"-Checkbox muss aName+"all" sein
function markAllCheckBoxes(aSender, aName) {
  // alle Checkboxen feststellen, die mit aName beginnen und nicht disabled sind
  var checkBoxes = new Array();
  var c = document.getElementsByTagName("input");
  for (var i = c.length - 1; i >= 0; i--)
    if ((c[i].id.indexOf(aName) == 0) && (!c[i].disabled))
      checkBoxes.push(c[i]);

  // Sender = Alles-Markieren-CheckBox?
  if (aSender.id == aName + "all")
    for (var i = 0; i < checkBoxes.length; i++)
      checkBoxes[i].checked = aSender.checked;

  // Sender = normale CheckBox
  else {
    // feststellen, ob alle Checkboxen markiert sind
    var allChecked = true;
    for (var i = 0; i < checkBoxes.length; i++)
      if (checkBoxes[i].id != aName + "all")
        allChecked = allChecked && checkBoxes[i].checked;
    // Alles-Markieren-CheckBox markieren
    document.getElementById(aName + "all").checked = allChecked;
  };
};

// lädt die Ergebnisseite neu mit Filterung nach Studenten und Zeitpunkt/Test
function showHideCompsByDateOrTest() {
  // aktuell angezeigter Student
  var studentToOpen = document.getElementById("showHideResultsByStudent").value;
  // aktuell angezeigter Zeitraum/Test
  var toOpen = document.getElementById("showHideCompsByDateOrTest").value;
  // Seite neu laden
  location.href="main.php?action=results&open=_" + studentToOpen + "_" + toOpen;
};

/*
// blendet die Ergebnisse nur dann ein, wenn sie nach dem Datum aFromDate erhoben worden sind
function showHideResultsByDate() {
  // frühestes Datum feststellen
  var aFromDate = document.getElementById("showHideResultsByDate").value

  // alle Result-TRs feststellen
  var resultTRs = document.getElementsByTagName("tr");

  // alle Result-TRs durchgehen
  for (var i = 0; i < resultTRs.length; i++) {
    // neues Thema?
    if (resultTRs[i].getAttribute("name") == "newThemeTR")
      // Anzahl Results pro Thema auf 0 setzen
      var resultsCount = 0;

    // Result-TR?
    if (resultTRs[i].getAttribute("name") == "resultTR") {
      // Datum neuer?
      if (resultTRs[i].getAttribute("date") >= aFromDate) {
        // TR einblenden
        resultTRs[i].style.display = "";
        // Resultsanzahl hochsetzen
        resultsCount++;
      } else
        // ansonsten: TR ausblenden
        resultTRs[i].style.display = "none";
    };

    // noResultsTR?
    if (resultTRs[i].getAttribute("name") == "noResultsTR")
      // je nach Anzahl von Results ein-/ausblenden
      resultTRs[i].style.display = resultsCount? "none" : "";
  };
};
*/

// blendet die Ergebnisse je nach gewählten Schüler ein/aus
function showHideResultsByStudent() {
  // Student feststellen
  var aStudent = document.getElementById("showHideResultsByStudent").value

  // alle Result-TRs feststellen
  var resultTABLEs = document.getElementsByTagName("table");

  // alle Result-TRs durchgehen
  for (var i = 0; i < resultTABLEs.length; i++)
    if (resultTABLEs[i].id == "student")
      resultTABLEs[i].style.display = (resultTABLEs[i].getAttribute("index") == aStudent) ? "" : "none";

  openedStudentForInputs = aStudent;
};

// verzweigt von der results-Seite zur resultsByCompetence-Seite oder umgekehrt
// und öffnet die aktuelle Kompetenz mit dem aktuellen Einschränkedatum
function deepLinkToResults(aTarget, aValue) {
  // fromDate feststellen
//  if (document.getElementById("showHideCompsByDateOrTest"))
    var aFromDate = document.getElementById("showHideCompsByDateOrTest").value;
//  else
//    var aFromDate = "";
  // Seite öffnen
  location.href = "main.php?action=" + aTarget + "&open=" + aValue + "_" + aFromDate;
};

// zeigt auf der edittest-Seite je nach Jahrgangsauswahl Kompetenzen an oder blendet sie aus
function showHideCompsByGrade(gradesToShow) {
  // nach ausgewählten Kompetenzen anzeigen?
  if (document.getElementById("hideUnmarked").checked)
    return showHideCompsByChosenTests(true);

  // anzuzeigende Grades feststellen
  gradesToShow = gradesToShow.split(",");

  // alle TRs durchgehen
  var TRs = document.getElementsByTagName("tr");
  for (var i = 0; i < TRs.length; i++) {
    TRId = TRs[i].id.split("_");
    // Zeile, die eine Kompetenz anzeigt?
    if (TRId[0] == "grades") {
      // Ausgangsannahme: Zeile muss ausgeblendet werden
      var toShow = false;
      // kommt eine der zu zeigenden Grades in TRGrades vor?
      TRGrades = "," + TRId[1] + ",";
      for (j = 0; j < gradesToShow.length; j++)
        if (TRGrades.indexOf("," + gradesToShow[j] + ",") >= 0)
          toShow = true;

      // prüfen, ob mindestens eine Checkbox gesetzt ist -> Zeile anzeigen
      var boxes = TRs[i].getElementsByTagName("input");
      if (boxes[0].checked || boxes[1].checked) toShow = true;

      // Zeile anzeigen oder ausblenden
      TRs[i].style.display = (toShow? "" : "none");
    };
  };
};

// blendet auf der edittest-Seite ggf. alle nicht gewählten Tests aus
function showHideCompsByChosenTests(aValue) {
  // falls aValue = false: Zeilen ja Jahrgang anzeigen
  if (!aValue)
    return showHideCompsByGrade(document.getElementById("showHideComps").value);

  // alle TRs durchgehen
  var TRs = document.getElementsByTagName("tr");
  for (var i = 0; i < TRs.length; i++) {
    TRId = TRs[i].id.split("_");
    // Zeile, die eine Kompetenz anzeigt?
    if (TRId[0] == "grades") {
      // Ausgangsannahme: Zeile muss ausgeblendet werden
      var checked = false;
      // prüfen, ob mindestens eine Checkbox gesetzt ist -> Zeile anzeigen
      var boxes = TRs[i].getElementsByTagName("input");
      if (boxes[0].checked || boxes[1].checked) checked = true;

      // Zeile anzeigen oder ausblenden
      TRs[i].style.display = ((!aValue || checked) ? "" : "none");
    };
  };
};

// berechnet die Gesamtzeit eines Tests und blendet sie auf der edittest-Seite ein
function setTestTimes(aSender) {
  // ggf. äquivalenten Online- bzw. Offline-Test deaktivieren
  if (aSender && aSender.checked) {
    id = aSender.id.split("_");
    id[2] = (id[2] == "offline") ? "online" : "offline";
    id = id.join("_");
    document.getElementById(id).checked = false;
  };

  // Zeitwerte zurücksetzen
  var time_offline = 0;
  var time_online = 0;

  // Klasse feststellen
  var grade = document.getElementById("grade").value;

  // alle TRs durchgehen
  var TRs = document.getElementsByTagName("tr");
  for (var i = 0; i < TRs.length; i++) {
    TRId = TRs[i].id.split("_");
    // Zeile, die eine Kompetenz anzeigt?
    if (TRId[0] == "grades") {
      // Niveau feststellen
      var grade = TRs[i].getElementsByTagName("select")[0].value;
      // Times extrahieren
      var times = TRs[i].getAttribute("times").split("_");
      var boxes = TRs[i].getElementsByTagName("input");
      // Online-Time hinzufügen
      if (boxes[0].checked) time_online = time_online + 1 * (times[0].split(","))[grade - 1];
      // Offline-Time hinzufügen
      if (boxes[1].checked) time_offline = time_offline + 1 * (times[1].split(","))[grade - 1];
    };
  };

  // Zeiten in Minuten eintragen (bei übersteigen der Maximalzeit in rot)
  if (parseInt(time_online / 60 + 0.5) <= testTimeMax[grade]) {
    document.getElementById("time_online").innerHTML = parseInt(time_online / 60 + 0.5);
    document.getElementById("time_online2").innerHTML = "";
  } else {
    document.getElementById("time_online").innerHTML = "<span style='color:red; font-weight:bold;'>"+parseInt(time_online / 60 + 0.5)+"</span>";
    document.getElementById("time_online2").innerHTML = "<br/><span style='color:red; font-weight:bold;'>Die Testdauer überschreitet die maximal empfohlene Dauer von " + testTimeMax[grade] + " min</span>";
    if (!testTimeOfflineOverflowMessageShown)
      alert("Die Testdauer überschreitet die maximal empfohlene Dauer von " + testTimeMax[grade] + " min.\n\nWenn Sie möchten, dass der Test kürzer ist, entfernen Sie bitte Kompetenzen aus dem Test.");
    testTimeOfflineOverflowMessageShown = true;
  };
  document.getElementById("time_offline").innerHTML = parseInt(time_offline / 60 + 0.5);
};

// blendet auf der inputs-Seite Testbögen des aktuellen Schülers aus
function showHideTasks(aSender, aValue) {
  // Optionen zurücksetzen
  document.getElementById("assigned").checked = false;
  document.getElementById("noinputs").checked = false;

  // übergeordneten Table-Tag finden
  while (aSender.tagName.toLowerCase() != "table")
    aSender = aSender.parentNode;

  // aValue um nichtalphanumerische Zeichen bereinigen und kleinschreiben
  aValue = aValue.replace(/\W/g, "").toLowerCase();

  // alle TRs durchgehen
  var TRs = aSender.getElementsByTagName("tr");
  for (var i = 0; i < TRs.length; i++) {
    TRId = TRs[i].id.split("_");
    // Zeile, die eine Kompetenz anzeigt?
    if (TRId[0] == "task")
      // stimmt aValue mit Taskanfang überein
      TRs[i].style.display = (TRId[1].indexOf(aValue) === 0) ? "" : "none";
  };
};

// zeigt ein Eingabeformular auf der Seite inputs an
function openInputTask(aElement) {

  // Level-Abfrage immer schließen
  document.getElementById("page_level").style.display = "none";

  // letztes Eingabefeld schließen
  if (document.lastInputTask && (document.lastInputTask && (aElement != document.lastInputTask))) {
    document.lastInputTask.setAttribute("isopen", true);
    openInputTask(document.lastInputTask);
    var image = document.lastInputTask.getElementsByTagName("img"); image = image[0];
    image.src = "pics/screen/arrow1.gif";
  };

  // ggf. darunterliegendes Element suchen
  if (aElement == "next") {
    // zunächst annehmen, dass kein neues aElement gefunden wurde
    aElement = false;
  };

  if (!aElement) return 0;

  // bereits offen?
  var isOpen = aElement.getAttribute("isopen");

  // Tabellenzeile des Buttons feststellen
  var row = document.getElementById(aElement.id + "_row");

  // Image-Element feststellen
  var image = aElement.getElementsByTagName("img"); image = image[0];

  // Zustand umkehren
  isOpen = ((isOpen === "true") || (isOpen === true))? false : true;

  aElement.setAttribute("isopen", isOpen);

  // je nach isOpen wird das Eingabefeld angezeigt/verborgen
  if (isOpen) {
    row.style.display = "";
    image.srcDefault = "pics/screen/arrow1a";
    image.src = "pics/screen/arrow1a_over.gif";
    // iFrame setzen
    document.getElementById(aElement.id + "_frame").appendChild(document.getElementById("input_page_tasks"));
    document.lastInputTask = aElement;
    // Aufgabe laden
    var file = aElement.id.split("_"); file = file[2];

    taskVars = row.getAttribute("vars");

    if (file != "")
      obBook.openTask(file, true);

  } else {
    row.style.display = "none";
    image.srcDefault = "pics/screen/arrow1";
    image.src = "pics/screen/arrow1_over.gif";
//    document.lastInputTask = false;
  };
};

// blendet je nach Option die Testbögen ein
function showHideTasksByInputs() {
  // Optionen feststellen
  var assigned = document.getElementById("assigned").checked;
  var noInputs = document.getElementById("noinputs").checked;

  // alle TRs durchgehen
  var TRs = document.getElementsByTagName("tr");
  for (var i = 0; i < TRs.length; i++) {
    TRId = TRs[i].id.split("_");
    // Zeile, die eine Kompetenz anzeigt?
    if (TRId[0] == "task") {
      // stimmt aValue mit Taskanfang überein
      display = (noInputs ? !TRs[i].getAttribute("inputs") : true) &&
                (assigned ? TRs[i].getAttribute("assigned") : true);
      // Zeile ein- bzw. ausblenden
      TRs[i].style.display = display? "" : "none";
    };
  };
};

// blendet das Auswahlfeld für die Tasks einer Kompetenz ein
function showPreviewEditTest(aTasks, aSender, aEvent, aApp) {
  var d = document.getElementById("previewedittest");
  // MI
  if (document.all) {
    d.style.top = event.clientY + document.body.scrollTop + 14 + "px";
    d.style.left = event.clientX + document.body.scrollLeft + 20 + "px";
  } else {
  // FF
    d.style.top = aEvent.pageY + 14 + "px";
    d.style.left = aEvent.pageX + 20 + "px";
  };
  d.style.display = "";

  // Tabelle
  var table = document.getElementById("previewedittesttable").getElementsByTagName("tbody")[0];

  // Tabelleninhalt leeren
  while (table.hasChildNodes()) table.removeChild(table.childNodes[0]);

  // Kopfzeile setzen
  tr = document.createElement("tr");
  th = document.createElement("th"); th.appendChild(document.createTextNode("")); tr.appendChild(th);
  th = document.createElement("th"); th.appendChild(document.createTextNode("Online-Aufgabe")); tr.appendChild(th);
  th = document.createElement("th"); th.appendChild(document.createTextNode("Offline-Aufgabe")); tr.appendChild(th);
//  table.appendChild(tr);

  aTasks = aTasks.split("|");

  // Tabellenzeilen
  for (var i = 0; i < aTasks.length; i++) {
    tr = document.createElement("tr");
    if (aTasks[i] == aTasks[i+2]) {
      // falls Task für alle drei Jahrgänge identisch sind
      td = document.createElement("td"); td.appendChild(document.createTextNode("Klasse "+(i+2)+" bis "+(i+4)+":")); tr.appendChild(td);
      i++;i++;
    } else if (aTasks[i] == aTasks[i+1]) {
      // falls Task mit dem Task des nächsten Jahrgangs übereinstimmt
      td = document.createElement("td"); td.appendChild(document.createTextNode("Klasse "+(i+2)+" und "+(i+3)+":")); tr.appendChild(td);
      i++;
    } else {
      // Task nur für diese Jahrgangsstufe
      td = document.createElement("td"); td.appendChild(document.createTextNode("Klasse "+(i+2)+":")); tr.appendChild(td);
    };
    // Link zu Online-Aufgabe
    a = document.createElement("a"); img = document.createElement("img"); img.className = "button"; img.id = "button"; img.src = "pics/screen/arrow2.gif"; a.appendChild(img);
    a.className = "button"; a.onmouseover = function() { highlight(this,1,0); }; a.onmouseout = function() { highlight(this,0,0); };
    a.setAttribute("task", aTasks[i]+"@" + aApp);
    a.onclick = function() { testTask(this.getAttribute("task")); };
    a.appendChild(document.createTextNode("Online-Aufgabe anzeigen"));
    td = document.createElement("td"); td.appendChild(a); tr.appendChild(td);
    // Link zu Offline-Aufgabe
    a = document.createElement("a"); img = document.createElement("img"); img.className = "button"; img.id = "button"; img.src = "pics/screen/arrow2.gif"; a.appendChild(img);
    a.className = "button"; a.onmouseover = function() { highlight(this,1,0); }; a.onmouseout = function() { highlight(this,0,0); };
    a.setAttribute("task", aTasks[i]+"@" + aApp);
    a.appendChild(document.createTextNode("Offline-Aufgabenblatt anzeigen"));
    a.onclick = function() { testTaskSheet(this.getAttribute("task")); };
    td = document.createElement("td"); td.appendChild(a); tr.appendChild(td);
    // Zeile einfügen
    table.appendChild(tr);
  };

  // Timeout setzen
  setPreviewEditTestTimeout();
};

// blendet das Auswahlfeld aus
function hidePreviewEditTest() {
  document.getElementById("previewedittest").style.display = "none";
};

// setzt den Timeout für das Auswahlfeld
var previewEditTestTimeout = false;
function setPreviewEditTestTimeout() {
  if (previewEditTestTimeout) window.clearTimeout(previewEditTestTimeout);
  previewEditTestTimeout = window.setTimeout("hidePreviewEditTest()", 1500);
};

// spielt in einem neuen Fenster die Aufgabe ab
function testTask(aExercise) {
  document.forms.previewtask.url.value = aExercise;
  document.forms.previewtask.action.value = "previewtask";
  var newWindow = window.open("blank.html", "previewtask", "width=1020,height=700,resizable=yes,scrollbars=yes");
  document.forms.previewtask.submit();
  newWindow.focus();
};

// lädt in einem neuen Fenster einen Testbogenab
function testTaskSheet(aExercise) {
  var newWindow = window.open("main.php?action=previewtasksheet&url="+aExercise, "previewtask", "width=400,height=400,resizable=yes,scrollbars=yes");
  newWindow.focus();
};

// öffnet eine Seite, um Ergebnisse auszudrucken
function printResults(aId) {
  var d = document.getElementById("resultsforprint_"+aId);
  if (d) {
    document.forms.printresults.results.value = d.getAttribute("value");
    document.forms.printresults.submit();
  };
};

// umkleidet Wörter und Leerzeichen aller Texte eines Nodes mit A-Tags
function makeTextMarkable(node, aAllWordsMarkable, aAllSpacesMarkable) {
  for (var i = 0; i < node.childNodes.length; i++) {
    var child = node.childNodes[i];

    // falls Child Kindnodes hat und selbst kein Anker ist ...
    if (child.hasChildNodes() && (child.nodeName.toUpperCase() != "A")) {
      // ... Kindnode markierbar machen
      makeTextMarkable(child, aAllWordsMarkable, aAllSpacesMarkable);

    // falls child Textknoten ist ...
    } else if (child.nodeType == 3) {
      // ... Text des Knotens feststellen ...
      var childText = $(child).text();
      // ... ggf. Wörter und Satzzeichen mit A-Tags maskieren ...
      if (aAllWordsMarkable) {
        childText = childText.replace(/(\S+)/g, '<a>$1</a>');
        // nicht maskierte Leerzeichen am Beginn gegen &nbsp; tauschen (im IE werden sie sonst verschluckt)
        childText = childText.replace(/(^ +)/g, '&nbsp;');
      };
      // ... Leerzeichen usw. mit A-Tags maskieren ...
      if (aAllSpacesMarkable) childText = childText.replace(/(\s+)/g, '<a>$1</a>');
      // ... und Child ersetzen (der span-Tag dient dazu, einen gültigen Node zu erzeugen)
      $(child).replaceWith($('<span>'+childText+'</span>'));
    };
  };
};

// macht das Feld aNode aktiv für Textmarker
// aScope ist optional. Mit aScope kann die Funktionsweise des Textmarkers auf ein Feld eingeschränkt werden
// notwendig ist: Vorhandensein von makeTextMarkable()
var textMarkerColor = "yellow";
var textMarkerColorActiv = "transparent";
function makeTextMarkerAktiv(aNode, aScope) {
  // Wörter und Leerstellen aktivieren
  makeTextMarkable(aNode, true, false);

  // ggf. aScope setzen
  if (!aScope) aScope = "textmarker";

  // Wörter/Leerstellen startfähig machen
  $(aNode).find("a").draggable({
    helper: "clone",
    scope: aScope,
    // Helper ausblenden
    start: function(event, ui) { 
      ui.helper.css({ display: "none" }); 
    }
  });

  // auf Start reagieren
  $(aNode).find("a").mousedown( function() {
    // nächste Markierfarbe feststellen
    //textMarkerColorActiv = ($(this).css("backgroundColor") != "transparent")? "" : textMarkerColor;
    // Startelement markieren
    //$(this).css({"backgroundColor": textMarkerColorActiv });
    $(this).toggleClass('textmarked');
  });

  // überstrichene Wörter/Leerstellen markieren
  $(aNode).find("a").droppable({
    scope: aScope,
    over: function(event, ui) { 
      //$(this).css({"backgroundColor": textMarkerColorActiv }); 
      $(this).toggleClass('textmarked');
    }
  });

};

// Browser gültig?
document.isBrowserOK = function() {
  // Internet Explorer
  if ($.browser.msie && $.browser.version.substr(0,1) >= 7) {
    return true;
  }
  // Firefox
  else if ($.browser.mozilla && (navigator.userAgent.toLowerCase().indexOf('firefox') != -1)) {
    // FF > 3?
    if ($.browser.version.substr(0,1) >= 2) return true;
    // FF3?
    else if ($.browser.version.substr(0,3) == "1.9") return true;
    // FF 2?
    else if ($.browser.version.substr(0,5) == "1.8.1") return true;
    // FF 10.x
    else if ($.browser.version.substr(0,3) == "10.") return true;
  }
  // Webkit (Chrome, Safari, Konqueror, etc)
  else if ($.browser.webkit) {
    return true;
  }
  // Opera
  else if ($.browser.opera) {
    return true;
  }
  
  else return false;

};

// aktiviert den Zurücksetzen-Button auf der Kompetenzlistenseite
document.activateCompResetButton = function() {
  $("#compResetButton1 img").attr("src", "pics/screen/btUndoChanges.gif");
  $("#compResetButton2 img").attr("src", "pics/screen/btUndoChanges.gif");
  $("#compResetButton1 img").attr("srcDefault", "pics/screen/btUndoChanges");
  $("#compResetButton2 img").attr("srcDefault", "pics/screen/btUndoChanges");
  document.isOriginalCompetenceList();
/*  $("#compTotalResetButton1 img").attr("src", "pics/screen/btZurueckZurKomeptenzliste.gif");
  $("#compTotalResetButton2 img").attr("src", "pics/screen/btZurueckZurKomeptenzliste.gif");
  $("#compTotalResetButton1 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzliste");
  $("#compTotalResetButton2 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzliste");*/
};

document.resetCompetenceList = function() {
  document.forms.savecompetencelist.reset()
  $("#compResetButton1 img").attr("src", "pics/screen/btUndoChangesOff.gif");
  $("#compResetButton2 img").attr("src", "pics/screen/btUndoChangesOff.gif");
  $("#compResetButton1 img").attr("srcDefault", "pics/screen/btUndoChangesOff");
  $("#compResetButton2 img").attr("srcDefault", "pics/screen/btUndoChangesOff");
  document.isOriginalCompetenceList();
/*  $("#compTotalResetButton1 img").attr("src", "pics/screen/btZurueckZurKomeptenzliste.gif");
  $("#compTotalResetButton2 img").attr("src", "pics/screen/btZurueckZurKomeptenzliste.gif");
  $("#compTotalResetButton1 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzliste");
  $("#compTotalResetButton2 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzliste");*/
};

document.isOriginalCompetenceList = function() {
  $r = true;
  $("input[raw]").each(function(index) {
    if (($(this).attr("raw") == "on") && !$(this).attr("checked"))
      $r = false;
    if (($(this).attr("raw") == "off") && $(this).attr("checked"))
      $r = false;
  });;
  if ($r) {
    $("#compTotalResetButton1 img").attr("src", "pics/screen/btZurueckZurKomeptenzlisteOff_over.gif");
    $("#compTotalResetButton2 img").attr("src", "pics/screen/btZurueckZurKomeptenzlisteOff_over.gif");
    $("#compTotalResetButton1 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzlisteOff");
    $("#compTotalResetButton2 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzlisteOff");
  } else {
    $("#compTotalResetButton1 img").attr("src", "pics/screen/btZurueckZurKomeptenzliste.gif");
    $("#compTotalResetButton2 img").attr("src", "pics/screen/btZurueckZurKomeptenzliste.gif");
    $("#compTotalResetButton1 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzliste");
    $("#compTotalResetButton2 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzliste");
  };

  return $r;
};

document.totalResetCompetenceList = function() {
  // aktiv?
  if ($("#compTotalResetButton1 img:first").attr("src").indexOf("Off") == -1) {

    $("input[raw]").each(function(index) {
      if (($(this).attr("raw") == "on") && !$(this).attr("checked"))
        $(this).click();
      else if (($(this).attr("raw") == "off") && $(this).attr("checked"))
        $(this).click();
    });;

/*    $("#compResetButton1 img").attr("src", "pics/screen/btUndoChanges.gif");
    $("#compResetButton2 img").attr("src", "pics/screen/btUndoChanges.gif");
    $("#compResetButton1 img").attr("srcDefault", "pics/screen/btUndoChanges");
    $("#compResetButton2 img").attr("srcDefault", "pics/screen/btUndoChanges");
    document.isOriginalCompetenceList();
*/
    document.forms.savecompetencelist.submit();
  };

/*  $("#compTotalResetButton1 img").attr("src", "pics/screen/btZurueckZurKomeptenzlisteOff_over.gif");
  $("#compTotalResetButton2 img").attr("src", "pics/screen/btZurueckZurKomeptenzlisteOff_over.gif");
  $("#compTotalResetButton1 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzlisteOff");
  $("#compTotalResetButton2 img").attr("srcDefault", "pics/screen/btZurueckZurKomeptenzlisteOff");
*/
};

document.showCompetenceSaveField = function() {
  document.getElementById("confirmDiv").style.display="";
  var newTop = 310 + $("body").scrollTop();
  $("#confirmDiv").offset({ top: newTop });
};

