// maketable.js
// by Erik Selberg <selberg@cs.washington.edu>
// makes a table that allows for dynamic redrawing of sorts on columns
// assumes layers in Netscape 4.0

var sortindex = 0;
var sortdir = 0; // 0 = low -> high, 1 = high -> low
var userAgent = navigator.appName + " " + navigator.appVersion;
var agentInfo= userAgent.substring(0, 12);
var ns40 = (agentInfo == "Netscape 4.0") ? 1 : 0;

var oneshot_stats;
var oneshot_stats_header;
var oneshot_stats_print;

// attaches properties to a layer
function bindLayer(stats, stats_header, stats_print, layername) {
  if (ns40) {
    window.document.layers[layername].stats = stats;
    window.document.layers[layername].stats_header = stats_header;
    window.document.layers[layername].stats_print = stats_print;   
  } else {
    oneshot_stats = stats;
    oneshot_stats_header = stats_header;
    oneshot_stats_print = stats_print;
  }
}


function colCompare(a, b) {
  var rv;
  if (a[sortindex] == b[sortindex])
    rv = 0;
  else 
    rv = (a[sortindex] > b[sortindex]) ? 1 : -1;
  //     alert("Comparing " + a[0] + "(" + a[sortindex] + ")" + " > " + b[0] + "(" + b[sortindex] + ")" + " at " + sortindex + " == " + rv);
  return sortdir ? rv : -rv;
}


function formatString(s, form) {
  if (form == "percent") {
    s *= 100;
    s = Math.round(s);
    return s + "%";
  } else { // "int" "string" "default"
    return s;
  }
}

function totalVal(s, form) {
  if (form == "percent" || 
      form == "string" || 
      form == "int_nototal") {
    return "";
  } else { // "int" or default
    return s;
  }
}


// stats - array of statistics
// stats_header - header for statistics
// stats_print - way to print each column
// doc - the document we're writing to... should be a window
// layername - name for layer we're writing to
// n - column clicked on        
function makeTable(doc, layername, n) {
  var stats;
  var stats_header;
  var stats_print;
  var align;
  var celltype;
  var celldata;

  if (ns40) {
    stats =            window.document.layers[layername].stats;        
    stats_header =     window.document.layers[layername].stats_header; 
    stats_print =      window.document.layers[layername].stats_print;  
  } else {
    stats =            oneshot_stats;        
    stats_header =     oneshot_stats_header; 
    stats_print =      oneshot_stats_print;  
  }

  var totals = new Array(stats_header.length);
  totals[0] = "Total";
  for (j = 1; j < totals.length; j++)
    totals[j] = 0;
  sortdir = (n == sortindex) ? !sortdir : 0;
  sortindex = n;

  doc.write("<center><table border=1 width=\"80%\">\n");
  doc.write("<tr>\n");

  stats.sort(colCompare);
  for (j = 0; j < stats_header.length; j++) {
    doc.write("<th>");
    if (ns40) {
      doc.write("<a href=\"#here\" onClick='return makeTable(window.document.layers[\"", 
		layername, "\"].document, \"", layername, "\", ", j, ");'>", 
		stats_header[j], "</a>");
    } else {
      doc.write(stats_header[j]);
    } 
    doc.write("</th>");
  }
  doc.write("</tr>\n");
  for (i = 0; i < stats.length; i++) {
    doc.write("<tr>\n");
    for (j = 0; j < stats[i].length; j++) {
      align = (j == 0) ? "center" : "right";
      celltype = (j == 0) ? "th" : "td";
      celldata = formatString(stats[i][j], stats_print[j]);
      if (j == n && ns40)
	celldata = "<font color=yellow>" + celldata + "</font>";
      doc.write("<", celltype, " align=", align, ">", celldata,
		"</", celltype, ">\n");
      if (j != 0)
	totals[j] += stats[i][j];
    }
    doc.write("</tr>\n");
  }
  doc.write("<tr>\n");
  for (j = 0; j < totals.length; j++) {
    align = (j == 0) ? "center" : "right";
    celltype = (j == 0) ? "th" : "td";
    celldata = (j == 0) ? "<font color=#8080FF>Total</font>" : totalVal(totals[j], stats_print[j]);
    doc.write("<", celltype, " align=", align, ">", "<font color=#ff8000>", 
	      celldata, "</font>", "</", celltype, ">\n");
  }
  doc.write("</table></center>\n");
  doc.close(); // thanks Rustam!
  // doc.flush();

  return false;
}         

