// JScript File
//----------------------------------------------------------------------------------
// Tony Phipps - author

var xmlDoc;                              // the xml doc for traversing nodes

// numerous variables for arrays, counters, and data output
var chart = new Array();                 //xml chart
var chartData = new Array();            //xml chart chartdata
var row = new Array();                   //xml chart chartdata row
var stringDescription = new Array();    //string entries from xml
var numberData = new Array();            //number entries from xml
var numberDataRow = new Array();        //number of specific number data rows
var chartType;                          //identify for horizontal chart
var t;                                  //write to page
var scoring;                            //how are we scoring the data: higher is better/lower is better

// write table or error message
function writeTable(xmlFile) {

  var xhr;
  try
  {
    xhr = new XMLHttpRequest();
  }
  catch (e)
  {
    try
    {
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e)
    {
      try
      {
        xhr = new ActiveXObject("MSXML2.XMLHTTP.3.0");
      }
      catch (e)
      {
        try
        {
          xhr = new ActiveXObject("MSXML2.XMLHTTP");
        }
        catch (e)
        {
          document.write("<p>Your browser does not support this functionality.</p>");
          return;
        }
      }
    }
  }

  xhr.open("GET", xmlFile, false);
  xhr.send();
  xmlDoc = xhr.responseXML;

  t = "";  // reset t for writing table
  var xItem = xmlDoc.getElementsByTagName("chart")[0].getElementsByTagName("chart_data")[0].getElementsByTagName("row");  //returns an array of all xml rows
  var xItemCnt = xItem.length-1;   //loop counter for xml rows
  var numberItem = xmlDoc.getElementsByTagName("chart")[0].getElementsByTagName("chart_data")[0].getElementsByTagName("row")[1].getElementsByTagName("number");  // returns an array of all xml numbers
  var numberItemCnt = numberItem.length-1;  //loop counter for xml numbers
  var chartType = xmlDoc.getElementsByTagName("chart")[0].getElementsByTagName("chart_type")[0];  // check for horizontal chart
  var j=0;  // counter for creating arrays

  // Select chart value text rows
  var chartValueTextNodes = xmlDoc.getElementsByTagName("chart")[0].getElementsByTagName("chart_value_text");
  if (chartValueTextNodes.length > 0)
  {
    var chartValueTextRowNodes = chartValueTextNodes[0].getElementsByTagName("row");
  }

  //create sub arrays table content
  for (j=0;j<=numberItemCnt;j++) {
    stringDescription[j] = new Array(); //string description either test or product
    numberData[j] = new Array();  //data point numbers
  }

  var z = 0; //counter for second loop of data points
  var y = 0; //counter for array enumeration

  //loops through data points array
  for(z=0;z<=numberItemCnt;z++) {

    //loops through xml list
    for (i=0; i<=xItemCnt; i++) {

      //build all the content arrays
      numberData[z][y] = null;
      if ((xItem[i].childNodes[1].nodeName == "string" && !is_ie) ||
          (xItem[i].childNodes[1].nodeName == "number" && is_ie))
      {
        var usedTextValue = false;
        if (chartValueTextRowNodes && chartValueTextRowNodes[i])
        {
          var chartValueTextNumberNodes = chartValueTextRowNodes[i].getElementsByTagName("number");
          if (chartValueTextNumberNodes[z] && chartValueTextNumberNodes[z].childNodes[0])
          {
            numberData[z][y] = chartValueTextNumberNodes[z].childNodes[0].nodeValue;
            usedTextValue = true;
          }
        }

        if ( ! usedTextValue)
        {
          numberData[z][y] = xItem[i].getElementsByTagName("number")[z].childNodes[0].nodeValue;
        }
      }

      // horizontal chart gets title from elsewhere
      if ((chartType)&&(i==0)) {
        stringDescription[z][y] = xmlDoc.getElementsByTagName("chart")[0].getElementsByTagName("draw")[0].getElementsByTagName("text")[1].childNodes[0].nodeValue;
      } else {
        // title
        if ((xItem[i].childNodes[1].nodeName == "string" && !is_ie)||(xItem[i].childNodes[1].nodeName == "number" && is_ie)) {
          stringDescription[z][y] = xItem[i].getElementsByTagName("string")[0].childNodes[0].nodeValue;

          // column heading
        } else {
          stringDescription[z][y] = xItem[i].getElementsByTagName("string")[z].childNodes[0].nodeValue;
        }
      }
      y = y + 1;
    }
    y = 0;
  }
  // get what is better
  scoring = xmlDoc.getElementsByTagName("chart")[0].getElementsByTagName("draw")[0].getElementsByTagName("text")[0].childNodes[0].nodeValue;


  // write structured table while iterating through the arrays.
  t = t + "<table width=\"100%\" summary=\"Feature Comparison\" cellspacing=\"0\" class=\"arc spec-chart\">";
  t = t + "<tr class=\"colhead\" valign=\"top\">";
  i = 0;
  z = 0;
  for (i=0; i<=xItemCnt; i++) {
//    if (numberData[z][i] != null) {
    if (i != 0) {
      t = t + "<th scope=\"col\">";
      t = t + stringDescription[z][i].replace(/\\r/g, "\n");
      t = t + "</th>";
    } else {
      t = t + "<th scope=\"col\" class=\"data-first-cell\">";
      t = t  + scoring.replace(/\\r/g, "\n");
      t = t + "</th>";
    }
  }
  t = t + "</tr>";
  t = t + "<tr valign=\"top\">";
  i = 0;
  z = 0;
  for(z=0;z<=numberItemCnt;z++) {
    for (i=0; i<=xItemCnt; i++) {
      if (numberData[z][i] != null) {
        if(i==xItemCnt) {
          t = t + "<td class=\"data-last-cell\">";
        } else {
            t = t + "<td>";
        }
          t = t  + String(numberData[z][i]).replace(/\\r/g, "\n");
          t = t + "</td>";
      } else {
          t = t + "<th scope=\"row\" class=\"data-first-cell\">";
          t = t  + stringDescription[z][i].replace(/\\r/g, "\n");
          t = t + "</th>";
      }
    }
    t = t + "</tr>";
  }
  i = 0;

  y = y + 1;

  t = t + "</table>";

  //write table to html
  document.write(t);

}
