AjaMyAjax Site

AjaMyXML.js source listing

/***
 **  AjaMyAjax --> XML functions library
 **  use with the core AJAX lib routines in ajaMyCore.js.
 **
 **  This software provided "AS IS," but is FREE to use and share.
 **  For details see the as-is doc and Creative Commons license:
 **  http://creativecommons.org/licenses/by-sa/3.0/
 **
 **  See doc.txt or examples.html for syntax and more info at
 **  http://AjaMyAjax.com, (c) Mark Omohundro
 */

pbXMLLibReady = true; // notifies core that lib is available

var pbXMLLibHeader = "[AjaMyAjax XML Lib]";

this.processXML = function() {
  var xmlDoc = (arguments[0]) ? arguments[0] : null;
  var strurl = (arguments[1]) ? arguments[1] : null;
  var strcontainer = (arguments[2]) ? arguments[2] : null;
  var stroutputFormat = (arguments[3]) ? arguments[3] : null;
  var strSearchElement = (arguments[4]) ? arguments[4] : null;

  var allnodes = null, rootname = null;

  if (!xmlDoc || !strcontainer) {
    return;
  }

  if (strSearchElement) {
    // all nodes by default, or set by user parameter
    allnodes = xmlDoc.getElementsByTagName(strSearchElement).item(0);
    if (allnodes) {
      // start with parent to list all in that node
      allnodes = allnodes.parentNode;
    }
  }
  else {
    allnodes = xmlDoc.getElementsByTagName('*').item(0);
  }

  if (!allnodes) {
    aja_empty(strcontainer);
    if (pbshowAlertMsgs) {
      aja_alertMsg(pbXMLLibHeader, "Sorry, cannot retrieve data requested for " + strurl);
    }
    return;
  }

  if (stroutputFormat === "NODETEXT") {
    // node text listing and return
    var nodetext = aja_getXmlNodeText(allnodes);
    // note: no \r\n between IE6 node text values, only a space.
    // if your xml is simple enough, this replace should work:
    if (!window.XMLHttpRequest) {
      nodetext = nodetext.replace(/\s/g, "<br\>");
    }
    else {
      // Firefox, Opera support this
      nodetext = nodetext.replace(/\r|\n|\r\n/g, "<br\>");
    }
    aja_fill(strcontainer, nodetext);
    nodetext = null;
    return;
  }

  if (!strSearchElement) {
    // find first valid root name to exclude from header
    rootname = xml_getRootName(allnodes.childNodes);
  }

  // node processing with private variables used to form output
  // note: code and functions localized to increase speed

  var htable = "", namestr = "", namecnt = 0, namearray = [], parentarray = [];
  var valuearray = [], origval = "", foundrowdata = false;
  var reglist = "<table id='myTableID'><tr id='myRowID'>";

  // call embedded function below; recursive use processes all child nodes (if *)
  listNodes(allnodes);

  function listNodes(allnodes) {
    for (var i=0; i < allnodes.childNodes.length; i++) {
      var node = allnodes.childNodes[i];

      if (node.nodeType == 1 && node.nodeName !== rootname) {
        // Element node
        if (stroutputFormat !== "CDATA") {
          reglist += "<th id='myHeaderID'>" + node.nodeName + "</th>";
          namearray.push("<th id='myHeaderID'>" + node.nodeName + "</th>");

          if (namestr.indexOf(node.nodeName) == -1) {
            // add only unique names to header string
            namestr += "<th id='myHeaderID'>" + node.nodeName + "</th>";
           namecnt++;
          }
        }
      }

      // trim node for null string comparison
      var nodetemp = node.nodeValue;
      if (nodetemp) {
        nodetemp = nodetemp.replace(/^\s+|\s+$/g,'');
      }

      if (node.nodeType == 3 && nodetemp !== "") {
        // Text node
        if (stroutputFormat !== "CDATA") {
          var valuetmp = origval = node.nodeValue;

          valuetmp = valuetmp.toLowerCase();
          var linkstart = valuetmp.indexOf("http://");
          if (linkstart != -1) {
            // add anchor if appropriate
            valuetmp = xml_addAnchorTag(valuetmp, origval, linkstart);
          }
          else {
            // no anchor, restore case
            valuetmp = origval;
          }
          valuetmp = "<td>" + valuetmp + "</td>";

          reglist += valuetmp;
          valuearray.push(valuetmp);
          valuetmp = null;
          foundrowdata = true;
        }
      }

      if (node.nodeType == 4) {
        // CDATA section
        // this parameter-set option excludes all other output
        var valuetmp = node.nodeValue;

        reglist += valuetmp;
        valuearray.push(valuetmp);
        valuetmp = null;
        foundrowdata = true;
      }

      if (node.hasChildNodes()) {
        listNodes(node);
      }
      else if (node.nodeType == 3 && foundrowdata) {
        if (stroutputFormat !== "CDATA") {
          reglist += "</tr><tr id='myRowID'>";
          parentarray.push("<th id='myHeaderID'>" + node.parentNode.nodeName + "</th>");
          foundrowdata = false;
        }
      }
    }
  }  // end of listNodes
  reglist += "</tr></table>";

  if (stroutputFormat === "HTABLE") {
    // horizontal table output
    // header cells from name string or array if needed
    if (namearray.length == parentarray.length || namecnt < 3) {
      namecnt--; // adjust for zero loop counter below
      htable = "<table id='myTableID'><tr id='myRowID'>" + namestr + "</tr>";
    }
    else {
      // unequal header array means nested elements
      namecnt = parentarray.length;
      htable = "<table id='myTableID'>";
      for (var i=0; i < namecnt; i++) {
        htable += parentarray[i];
      }
    }

    // format output in conventional horizontal table style
    // add row elements up to number displayed in header
    var valuecnt = 0, valuelen = valuearray.length;
    for (var i=0; i < valuelen; i++) {
      if (valuecnt == 0) {
        htable += "<tr id='myRowID'>";
      }

      // node value data here
      htable += valuearray[i];
      if (valuecnt == namecnt) {
        htable += "</tr>";
        valuecnt = 0;
      }
      else {
        valuecnt++;
      }
    }

    htable += "</table>";
    aja_fill(strcontainer, htable);
  }
  else {
    if (stroutputFormat === "ULIST") {
      // transform into a basic unordered list
      reglist = reglist.replace(/(\<table>|\<\/table>)/gi, "");
      reglist = reglist.replace(/(\<th id='myHeaderID'>)/gi, "<th>");
      reglist = reglist.replace(/(\<tr id='myRowID'>)/gi, "<tr>");
      reglist = reglist.replace(/(th>|tr>|td>)/gi, "li>");
      reglist = reglist.replace(/\<li\>\<\li\>/gi, "<li>");
      reglist = reglist.replace(/\<\/li\>\<\/li\>/gi, "</li>");
      reglist = reglist.replace(/\<li\>\<\/li\>/gi, "");
    }
    aja_fill(strcontainer, reglist);
  }

  // clean up after:
  try {
    if (strurl) strurl = null;
    if (strcontainer) strcontainer = null;
    if (stroutputFormat) stroutputFormat = null;
    if (strSearchElement) strSearchElement = null;

    listNodes = null;
    allnodes = null;
    rootname = null;
    htable = null;
    namestr = null;
    namecnt = null;
    namearray = null;
    parentarray = null;
    valuearray = null;
    origval = null;
    foundrowdata = null;
    reglist = null;
  }
  finally {
    xmlDoc = null;
  }
}

xml_addAnchorTag = function(strmod, strbase, linkstart) {
  if (strmod && strbase) {
    if (linkstart > 0) {
      // if any text before the hypertext,
      // remove link and display that text

      var srchtmp = strbase.substr(0, linkstart);
      var origsubstr = srchtmp;
      srchtmp = srchtmp.toLowerCase();
      if (srchtmp.indexOf("href") == -1) {
        strbase = origsubstr;
        strmod = strmod.replace(srchtmp, "");
      }
    }
    strmod = "<a href='" + strmod + "'>" + strbase + "</a>";
    srchtmp = null;
    origsubstr = null;
  }
  return strmod;
}

xml_getRootName = function(xmlnode) {
  var getrootname = null;
  for (var i=0; i < xmlnode.length; i++) {
    getrootname = xmlnode[i].nodeName;
    if (getrootname.indexOf("#") == -1) {
      break;
    }
  }
  return getrootname;
}

[eof]

More Resources from AjaMyAjax.com