// ================================================================================
// PairRate application
// $Id: PairRate.js 3967 2009-11-16 20:47:29Z helmut $

var UNDEF = "undef";

function _setRadio(id, value, index)
{
  // set class of <td>
  // for marking the entire <tr>, add one more ".parentNode"
  var radio = document.getElementById(id);
  // 2009-04-09 HS: radio.parentNode.setAttribute("class", value); does not work in IE6/7
  // cf. http://www.quirksmode.org/dom/classchange.html
  radio.parentNode.className = value // [CLASS]

  var aPair = document._PairSet.at(index);
  if (aPair && aPair.rate != value) {
    aPair.rate = value;
    document._isModified = true;
    _postData();
  }
}

function _ComputeParol(aParol, htmlClass)
{
  var res = "<div class='" + htmlClass + "'>";
  var intro = aParol.getHtmlIL();
  if (intro) {
    res += "<p class='IL'>" + intro + "</p>";
  }
  // replace \n by <br/> (IE6 supports only CSS white-space:nowrap, not pre)
  var s = aParol.getHtmlL().replace(/\n/g, "<br/>\n");
  res += "<p class='L'>" + s + "</p>"
      +  "<p class='SL'>" + aParol.getSL();
  var Ref = new Bible20.Bible.BibleRef().fromParolID(aParol.getID());
  if (Ref.getBook()) {
    var aBibleServerUrl = new Bible20.Bible.BibleServerUrl();
    var url = aBibleServerUrl.get(Ref.getBook(), Ref.getChapterNumber(), Ref.getVerseNumberStart(), "SLT", "de");
    if (url) {
      // 2009-05-14 http://www.bibleserver.com/act.php?help_page=19
      // "Bitte lassen Sie diese Links in einem neuen Browserfenster öffnen."
      // => use target=...
      res += " <a href=" + url + " target='bibleserver' title='Kapitel lesen auf bibleserver.com (neues Fenster)'>...</a>";
    }
  }
  res += "</p></div>";
  return res;
}

function _ComputeRadio(index, value, userValue, sep, checked)
{
  try {
    // <input
    //   type='radio' name='evalradio' value='yes' id="evalradioyes"
    //   onclick='setRadio("_1", "yes");' />
    // <label for='evalradioyes'   >Ja</label><br/>

    var id = value + "_" + index;
    var s =  '<input'
           + ' type="radio"'
           + ' id="' + id + '"'
           + ' name="'  + index +'"'
           + ' value="' + value +'"'
           + (checked ? ' checked="true"' : '')
           + ' onclick="_setRadio(\'' + id + '\', \'' + value + '\', \'' + index + '\');"'
           + '/>'
           + '<label for="' + id + '">' + userValue + '</label>'
           + (sep ? '<br/>' : '');
    return s;
  }
  catch (e) {
    alert("_ComputeRadio: error " + e.name + ": " + e.message);
    throw e;
  }
}

function _ComputeResult(index, value, userValue, sep, checked, rate)
{
  try {
    // "Ja: 4 [x]"<br/>

    var id = value + "_" + index;
    var s = "<span class='result'>" + (rate || "&nbsp;") + "</span>" // 
      + userValue;
    if (sep) s += '<br/>';
    return s;
  }
  catch (e) {
    alert("_ComputeResult: error " + e.name + ": " + e.message);
    throw e;
  }
}

function _InsertPairs(PairsBody, aPairSet)
{
  try {
    for (var i = 0, len = aPairSet.getLength(); i < len; ++i) {
      var aPair = aPairSet.at(i);

      var PairRow  = PairsBody.appendChild(document.createElement("tr"));
      var rate = aPair.rate || UNDEF;
      var RateTD = PairRow.appendChild(document.createElement("td"));
      var s =
          _ComputeRadio(i, "yes",   "Ja",         "br", rate == "yes")
        + _ComputeRadio(i, "maybe", "Vielleicht", "br", rate == "maybe")
        + _ComputeRadio(i, "no",    "Nein",       "br", rate == "no")
        + _ComputeRadio(i, UNDEF,   "WeiÃŸ nicht", null, rate == UNDEF)
      RateTD.innerHTML = s;
      RateTD.className = rate; // [CLASS]

      // var CommentTD = PairRow.appendChild(document.createElement("td"));

      var TD  = PairRow.appendChild(document.createElement("td"));
      var s =
          _ComputeParol(aPair.getFirst(), "first")
        + _ComputeParol(aPair.getSecond(), "second");
      // --- show text (even empty Parol!) ---
      TD.innerHTML = s;

      //var SecondTD = PairRow.appendChild(document.createElement("td"));
      //_InsertParol(SecondTD, aPair.getSecond());
    }
  }
  catch (e) {
    alert("_InsertPairs: error " + e.name + ": " + e.message);
    throw e;
  }
}

function _InsertResultPairs(PairsBody, aPairSet)
{
  try {
    for (var i = 0, len = aPairSet.getLength(); i < len; ++i) {
      var aPair = aPairSet.at(i);

      var PairRow  = PairsBody.appendChild(document.createElement("tr"));
      var rate = aPair.rate || UNDEF;
      var RateTD = PairRow.appendChild(document.createElement("td"));
      var s =
          _ComputeResult(i, "yes",   "Ja",             "br", rate == "yes",   aPair.yes)
        + _ComputeResult(i, "maybe", "Vielleicht",     "br", rate == "maybe", aPair.maybe)
        + _ComputeResult(i, "no",    "Nein",           "br", rate == "no",    aPair.no)
        + _ComputeResult(i, UNDEF,   "WeiÃŸ nicht", null, rate == UNDEF,   aPair.undef)
      RateTD.innerHTML = s;
      RateTD.className = aPair.hint || ""; // [CLASS]

      // var CommentTD = PairRow.appendChild(document.createElement("td"));

      var TD  = PairRow.appendChild(document.createElement("td"));
      var s =
          _ComputeParol(aPair.getFirst(), "first")
        + _ComputeParol(aPair.getSecond(), "second");
      // --- show text (even empty Parol!) ---
      TD.innerHTML = s;

      //var SecondTD = PairRow.appendChild(document.createElement("td"));
      //_InsertParol(SecondTD, aPair.getSecond());
    }
  }
  catch (e) {
    alert("_InsertResultPairs: error " + e.name + ": " + e.message);
    throw e;
  }
}

function LoadCallback()
{
  try {
    document._isModified = false;

    var dom = this.xhr.responseXML;
    if (!dom || !dom.childNodes.length) return; // Post without navigation

    // --- reset data of previous load ---
    document._ParolBox = new Bible20.Parol.ParolBox();
    document._PairSet = new Bible20.Pair.PairSet();

    // --- process Pool ---
    if (!document._ParolBoxReader) {
      document._ParolBoxReader = new Bible20.Parol.ParolBoxReader();
    }
    document._ParolBoxReader.read(document._ParolBox, dom);
    // alert("LoadFunc: #Parol=" + document._ParolBox.getLength());

    // --- process Pairs ---
    if (!document._PairSetDomReader) {
      document._PairSetDomReader = new Bible20.Pair.PairSetDomReader();
      document._PairSetDomReader.readPairProps =
        function(PairElem, aPair) {
          aPair.rate = PairElem.getAttribute("rate");
          // for result:
          aPair.yes  = PairElem.getAttribute("yes");
          aPair.maybe= PairElem.getAttribute("maybe");
          aPair.no   = PairElem.getAttribute("no");
          aPair.hint = PairElem.getAttribute("hint");
        };
    }
    document._PairSetDomReader.read(dom, document._PairSet, document._ParolBox);
    // alert("LoadFunc: #Pairs=" + document._PairSet.getLength());

    var Meta = dom.getElementsByTagName("meta")[0];
    var bIsResult = Meta && Meta.getAttribute("result");

    var PairsBody = document.getElementById("PairsBody");
    // drop previous pairs
    while (PairsBody.firstChild) {
      PairsBody.removeChild(PairsBody.firstChild);
    }
    if (!bIsResult) {
      _InsertPairs(PairsBody, document._PairSet);
    }
    else {
      _InsertResultPairs(PairsBody, document._PairSet);
    }

    // --- process meta ---
    if (Meta) {
      var lastPage = Meta.getAttribute("lastPage") - 0; // force number
      var lastPair = Meta.getAttribute("lastPair") - 0;

      var userPage = dom.documentElement.getAttribute("userPage") - 0;
      var realPage = dom.documentElement.getAttribute("realPage") - 0;
      var userID   = dom.documentElement.getAttribute("key");

      var CurPage = document.getElementById("CurPage");
      var RealPage = document.getElementById("RealPage");
      var UserID   = document.getElementById("Key");
      var LastPage = document.getElementById("LastPage");
      var LastPair = document.getElementById("LastPair");

      if (CurPage) CurPage.innerHTML = (userPage + 1);
      if (RealPage) RealPage.innerHTML = realPage; // 0 based!
      if (UserID)   UserID.innerHTML = userID;
      if (LastPage) LastPage.innerHTML = (lastPage+1);
      if (LastPair) LastPair.innerHTML = (lastPair+1);
    }

    // scroll to top
    window.location.replace("#_top");
  }
  catch (e) {
    alert("Fehler beim Laden der Daten: " + e.name + ": " + e.message);
  }
}

function _getUrl(dir)
{
  // domain: cf. Flanagan p. 301
  var url = "http://" + document.domain + "/service/Pair/PairRate/edit2010";
  if (dir) {
    url += "?nav=" + dir;
  }
  return url;
}

function _getData(dir)
{
  // alert("_getData("+dir+")");
  var ErrFunc = function() {
    alert("Fehler beim Abrufen der Daten (HTTP: "+ this.xhr.status + ")");
  }
  var url = _getUrl(dir);
  var Client = new Http.Client({onLoad: LoadCallback, onError: ErrFunc});
  Client.get(url);
}

function _postData(dir)
{
  if (!document._isModified) {
    return;
  }
  var ErrFunc = function() {
    alert("Fehler beim Hochladen der Daten (HTTP: "+ this.xhr.status + ")");
  }
  if (!document._PairSetXmlWriter) {
    document._PairSetXmlWriter = new Bible20.Pair.PairSetXmlWriter();
    document._PairSetXmlWriter.writePair = function(aPair)
    {
      return "<pair"
        + ' first="'  + aPair.getFirst().getID()  + '"'
        + ' second="' + aPair.getSecond().getID() + '"'
        + ' rate="'   + (aPair.rate || UNDEF) + '"'
        + '/>\n';
    }
  }
  var data = document._PairSetXmlWriter.write(document._PairSet);

  var url = _getUrl(dir);
  var Client = new Http.Client({onLoad: LoadCallback, onError: ErrFunc});
  Client.post(url, data);
}

function navigate(dir)
{
  if (document._isModified) {
    _postData(dir);
  }
  else {
    _getData(dir);
  }
  // hide manual on subsequent page
  showManual(false);
}

function showManual(doShow)
{
  // alert("showManual doShow=" + doShow);
  var VisibleManual = document.getElementById("visibleManual");
  var HiddenManual  = document.getElementById("hiddenManual");
  VisibleManual.style.display = doShow ? "block" : "none";
  HiddenManual .style.display = doShow ? "none"  : "block";
  return false;
}

function init()
{
  // if Javascript is activated, hide the hint
  var jshint = document.getElementById("jshint");
  jshint.style.display = "none";

  _getData();
}
