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


var Bible20;
if (!Bible20) {
  Bible20 = {};
}
else if (typeof Bible20 != "object") {
  throw new Error("Bible20 already exists and is not an object");
}

if (!Bible20.Parol) {
  Bible20.Parol = {};
}
else if (typeof Bible20.Parol != "object") {
  throw new Error("Bible20.Parol already exists and is not an object");
}

Bible20.Parol.ParolBoxReader = function()
{
  this._NS = "http://bible2.net/service/Parol/ParolBoxList";
}

Bible20.Parol.ParolBoxReader.prototype._flatten = function(node)
{
  try {
  //TODO high TOBI
    // value as from file may contain "<em>...</em>"
    var s = "";
    while (node) {
      if (node.nodeType == 1) { // Node.ELEMENT_NODE not available in IE6
        var childText = node.firstChild.data;
        if (node.nodeName == "em") {
          s += "<em>" + childText + "</em>"; // surround by delimiters
        }
        else {
          s += childText; // just flatten
        }
      }
      else if (node.nodeType == 3) { // Node.TEXT_NODE not available in IE6
        s += node.data;
      }
      // else: ignore all node types except element and text
      node = node.nextSibling;
    }
    return s;
  }
  catch (e) {
    alert("ParolBoxReader._flatten: " + e);
  }
}

Bible20.Parol.ParolBoxReader.prototype.readParol = function(aParol, entry)
{
  try {
    aParol.setTitle  (entry.getElementsByTagName("title"  )[0].firstChild.data);
    aParol.setID     (entry.getElementsByTagName("id"     )[0].firstChild.data);
    aParol.setUpdated(entry.getElementsByTagName("updated")[0].firstChild.data);
    // === setup references to IL, L, SL

    var div = entry.getElementsByTagName("div")[0];
    if (div) {
      var pArr = div.getElementsByTagName("p");
      // process all div.P elements
      for (var i = 0; i < pArr.length; ++i) {
        var p = pArr[i];
        if (p.firstChild) {
          // 2009-04-07 HS: IE6 sucks (for HTML in XML at least, some may work in pure HTML):
          //   p.className                 => undefined
          //   p.attributes['class'].value => "Null oder kein Objekt"
          //   p.getAttribute("class")     => ok
          // All three work in Firefox 2!
          aParol["set" + p.getAttribute("class")].call(aParol, this._flatten(p.firstChild)); // setup reference to IL, L, SL
        }
      }
    }
    return this;
  }
  catch (e) {
    alert("ParolBoxReader.readParol: " + e.name + ": " + e.message);
  }
}

Bible20.Parol.ParolBoxReader.prototype.readEntries = function(aParolBox, xmlDoc, adaptFunc)
{
  try {
    if (!xmlDoc) throw new Error("ParolBoxReader.read - no xmlDoc");

    var entries = xmlDoc.getElementsByTagName("entry");
    //alert("Bible20.Parol.ParolBoxReader.prototype.readFromDom: read " + entries.length + " entries");
    for (var r = 0; r < entries.length; ++r) {
      var entry = entries[r];
      var aParol = new Bible20.Parol.Parol();
      this.readParol(aParol, entry);
      if (adaptFunc) { // allow e.g. pre-computing string representation for searches
        adaptFunc(aParol);
      }
      aParolBox.append(aParol);
      //alert("ParolBoxReader.read: adding id " + aParol.getID());
    }
  }
  catch (e) {
    alert("ParolBoxReader.readEntries: " + e);
  }
}

// read(aParolBox, xmlDoc, adaptFunc)
// xmlDoc may be ancestor of "feed" node or "feed" node itself
// Puts data into aParolBox.
// Calls adaptFunc (if given) for each Parol.

Bible20.Parol.ParolBoxReader.prototype.read = function(aParolBox, xmlDoc, adaptFunc, bWithNamespaces)
{
  try {
    if (!xmlDoc) throw new Error("ParolBoxReader.read - no xmlDoc");

    var updated = xmlDoc.getElementsByTagName("updated")[0];
    aParolBox.setUpdated(updated ? updated.firstChild.data : "");

    var feed = (xmlDoc.nodeName == "feed" && xmlDoc) || xmlDoc.getElementsByTagName("feed")[0];
    aParolBox.setLang(feed && feed.attributes["xml:lang"] ? feed.attributes["xml:lang"].value : "");

    var id1 = xmlDoc.getElementsByTagName("id")[0];
    aParolBox.setParolBoxID( (id1 && id1.firstChild) ? id1.firstChild.data : "");

    if (bWithNamespaces) {
      // 2009-04-07 HS:
      // getElementsByTagNameNS is not supported by IE 6 (at least),
      // see http://www.zachleat.com/web/2008/05/10/selecting-xml-with-javascript/
      // who proposes
      //   oDoc.setProperty("SelectionNamespaces", "xmlns:whatever='http://example.com/'");
      //   var oDocEl = oDoc.documentElement;
      //   var correctForCase3A = oDocEl.selectNodes('whatever:child');
      //   var correctForCase3B = oDocEl.selectSingleNode('whatever:child');

//TODO low 2008-08-14 HS - centralize "b20:..." handling (cf. StartEdit.js)
      var user       = xmlDoc.getElementsByTagNameNS(this._NS, "reservedby")[0];
      var targetDate = xmlDoc.getElementsByTagNameNS(this._NS, "reserveduntil")[0];
      aParolBox.setReserved(
          user       ? user      .firstChild.data : null,
          targetDate ? targetDate.firstChild.data : null
        );
      //alert("ParolBoxReader.read: user=" + this.getReservedBy() + ", targetDate=" + this.getReservedUntil());
    }
    this.readEntries(aParolBox, xmlDoc, adaptFunc);
  }
  catch (e) {
    alert("ParolBoxReader.read: " + e.name + ": " + e.message);
  }
}
