/* <script language="JavaScript"> */

  var _strDefaultTableName = "myTable"; // default table name
  var _strDateColName = "Date";
  var _strSubscribersColName = "Subscribers";
  var _strGraphColName = _strSubscribersColName;
  var _cHeaderRows = 1;
  var _cFooterRows = 1;
  var _hNotifySortHandler = NotifySortProgress;

  function NotifySortProgress( iPercent )
  {
    if (arguments.length < 1) return alert("NotifySortProgress: insufficient arguments.");

    var strMessage = "Sorting ";
    strMessage += (iPercent+1) + "% complete.";
    if (iPercent >= 90) strMessage = "";
    window.status = strMessage;
  }

  function FillGraphs( strTableName, strGraphColumnName )
  {
    if (arguments.length < 2) strGraphColumnName = _strSubscribersColName;
    if (arguments.length < 1) strTableName = _strDefaultTableName;

    var oTable = document.all(strTableName);
    var cRows = oTable.rows.length;
    var iGraphCol = GetColumnNumberFromColumnName(strTableName, strGraphColumnName);
    if (iGraphCol == -1)
      alert("Can't figure out which column number '" + strGraphColumnName + "' is.");
    // for each row of the table (except the header row)
    for (var i = _cHeaderRows; i < cRows-_cFooterRows; i++)
    {
      var oRow = oTable.rows(i);
      // find the column to graph (iGraphCol)
      // then in-place insert a bar with width proportional to the cell's value
      var oGraphCell = oRow.cells(iGraphCol);
      var iValues = new Number(oGraphCell.innerText);
      var strHTML = " <nobr> ";
      strHTML += " <img alt='' height='10'";
      strHTML += " width='" + iValues / 5 + "'> " + iValues;
      strHTML += " </nobr> ";
      oGraphCell.innerHTML = strHTML;
    }
  }

  function SetOnClicks( strTableName )
  {
    if (arguments.length < 1) strTableName = _strDefaultTableName;

    var oTable = document.all(strTableName);
    var cColumns = oTable.rows(0).cells.length;
    for (var i = 0; i < cColumns; i++)
    {
      oTable.rows(0).cells(i).onclick = SortByColumn;
      oTable.rows(0).cells(i).style.cursor = "hand";
      oTable.rows(0).cells(i).title = "Click to sort this column.";
    }
  }

  function GetColumnNumberFromColumnName( strTableName, strColumnName )
  {
    if (arguments.length < 2) return alert("GetColumnNumberFromColumnName: insufficient arguments.");
    if (arguments.length < 1) strTableName = _strDefaultTableName;

    var iResult = -1;

    // get the table object
    var oTable = document.all(strTableName);

    // get the header row object
    var oRow = oTable.rows(0);

    // count the number of columns in the header row
    var cCols = oRow.cells.length;

    for (var i = 0; i < cCols && iResult == -1; i++)
    {
      var strCellName = Trim(oRow.cells(i).innerText);
      if (strCellName == strColumnName)
      {
        iResult = i;
      }
    }
    return iResult;
  }

  function FindExtremes( strTableName, strColumnName )
  {
    if (arguments.length < 2) strColumnName = _strSubscribersColName;
    if (arguments.length < 1) strTableName = _strDefaultTableName;

    var oTable = document.all(strTableName);
    var cRows = oTable.rows.length;
    var iCol = GetColumnNumberFromColumnName(strTableName, strColumnName);
    var iLeastRow = _cHeaderRows;
    var iLeastValue = parseInt(Trim(oTable.rows(iLeastRow).cells(iCol).innerText));
    var iGreatestRow = iLeastRow;
    var iGreatestValue = iLeastValue;
    for (var i = _cHeaderRows; i < cRows-_cFooterRows; i++)
    {
      var iTestValue = parseInt(Trim(oTable.rows(i).cells(iCol).innerText));
      if (iTestValue < iLeastValue)
      {
        iLeastValue = iTestValue;
        iLeastRow = i;
      }
      if (iTestValue > iGreatestValue)
      {
        iGreatestValue = iTestValue;
        iGreatestRow = i;
      }
    }
    // now that the row with the least and greatest values have been found,
    // tag them with the correct style name
    // NEW: use a loop to tag all rows equal to the greatest and least
    for (var i = _cHeaderRows; i < cRows-_cFooterRows; i++)
    {
      var iTestValue = Trim(oTable.rows(i).cells(iCol).innerText);
      if (iTestValue == iLeastValue) oTable.rows(i).className = "least";
      if (iTestValue == iGreatestValue) oTable.rows(i).className = "greatest";
    }
  }

  function ApplyNOBRToDate( strTableName )
  {
    if (arguments.length < 1) strTableName = _strDefaultTableName;

    var oTable = document.all(strTableName);
    var cRows = oTable.rows.length;
    var iDateCol = GetColumnNumberFromColumnName(strTableName, _strDateColName);

    for (var i = _cHeaderRows+1; i < cRows-_cFooterRows; i++)
    {
      // for each row of the table (except the header row),
      var oRow = oTable.rows(i);
      // find the Date column (iDateCol) then wrap its value with NOBR tags
      var oDateCell = oRow.cells(iDateCol);
      var htmlDate = oRow.cells(iDateCol).innerHTML;
      var strHTML = " <nobr> ";
      strHTML += htmlDate;
      strHTML += " </nobr> ";
      oDateCell.innerHTML = strHTML;
    }
  }

  function WindowOnLoad()
  {
    Init_SortTable(_hNotifySortHandler, _cHeaderRows, _cFooterRows);

    var fAscending = false;
    var fForce = true;

    SortByColumn("myTable", "Date", fAscending, fForce);
    // Too slow; don't sort table2 until user asks
    // SortByColumn("myTable2", "Date", fAscending, fForce);
    SetOnClicks("myTable");
    SetOnClicks("myTable2");
    FindExtremes("myTable", _strSubscribersColName);
    FindExtremes("myTable2", _strSubscribersColName);
    FillGraphs("myTable");
    FillGraphs("myTable2");
    ApplyNOBRToDate("myTable");
    ApplyNOBRToDate("myTable2");
  }
  window.onload = WindowOnLoad;

/* </script> */

