<html>
<head>
<style>
.discarded {
  color: #C0C0C0;
}
</style>
<h2>Summary</h2>
<dl>
<script src="head.js"></script>
<script>
var __results = true;
var cycles = 0;
var s = document.location.search.substring(1);
var params = s.split('&');
var iterations, pages, totalTime, fudgeTime;
for (var i = 0; i < params.length; ++i) {
  var f = params[i].split('=');
  switch (f[0]) {
  case 'n':
    iterations = (f[1] - 0);
    break;
  case 'i':
    cycle = (f[1] - 0);
    break;
  case 'td':
    totalTime = (f[1] - 0);
    break;
  case 'tf':
    fudgeTime = (f[1] - 0);
    break;
  }
}
var pages = cycle / iterations;
document.write("<table border=1>");
document.write("<tr><td>iterations</td><td>" + iterations + "</td></tr>");
document.write("<tr><td>pages</td><td>" + pages + "</td></tr>");
document.write("<tr><td>milliseconds</td><td>" + totalTime + "</td></tr>");
document.write("<tr><td>mean per set</td><td>" + (totalTime / iterations).toFixed(2) + "</td></tr>");
document.write("<tr><td>mean per page</td><td>" + (totalTime / iterations / pages).toFixed(2) + "</td></tr>");
document.write("<tr><td>timer lag</td><td>" + (fudgeTime).toFixed(2) + "</td></tr>");
document.write("<tr><td>timer lag per page</td><td>" + (fudgeTime / iterations / pages).toFixed(2) + "</td></tr>");
document.write("</table>");

  // returns an object with the following properties:
  //   min  : min value of array elements
  //   max  : max value of array elements
  //   mean : mean value of array elements
  //   vari : variance computation
  //   stdd : standard deviation, sqrt(vari)
  //   indexOfMax : index of max element (the element that is
  //                removed from the mean computation)
  function getArrayStats(ary) {
    var r = {};
    r.min = ary[0];
    r.max = ary[0];
    r.indexOfMax = 0;
    var sum = 0;
    for (var i = 0; i < ary.length; ++i) {
      if (ary[i] < r.min) {
        r.min = ary[i];
      } else if (ary[i] > r.max) {
        r.max = ary[i];
        r.indexOfMax = i;
      }
      sum = sum + ary[i];
    }

    // ignore max value when computing mean and stddev
    r.mean = (sum - r.max) / (ary.length - 1);

    r.vari = 0;
    for (var i = 0; i < ary.length; ++i) {
      if (i == r.indexOfMax)
        continue;
      var d = r.mean - ary[i];
      r.vari = r.vari + d * d;
    }

    r.vari = r.vari / (ary.length - 1);
    r.stdd = Math.sqrt(r.vari);
    r.errp = r.stdd / Math.sqrt((ary.length - 1) / 2) / r.mean * 100;
    return r;
  }

  function appendTableCol(tr, text, linkify) {
    var doc = tr.ownerDocument;
    var td = doc.createElement("TD");
    
    if (linkify) {
      var anchor = doc.createElement("A");
      if (text.indexOf('http://localhost:') == 0 ||
          text.indexOf('file://') == 0) {
        // URLs for page cycler HTTP and file tests.
        anchor.href = text + "/index.html?skip=true";
      } else {
        // For Web Page Replay, URLs are same as recorded pages.
        anchor.href = text;
      }
      anchor.appendChild(doc.createTextNode(text));
      td.appendChild(anchor);
    }
    else 
      td.appendChild(doc.createTextNode(text));
    tr.appendChild(td);
    return td;
  }
  
  function getTimeVals() {
    var rawData = __get_timings().split(",");
    var timeVals = [];
    for (var i = 0; i < iterations; ++i) {
      for (var j = 0; j < pages; ++j) {
        if (!timeVals[j])
          timeVals[j] = [];
        timeVals[j].push(parseInt(rawData[j + i*pages]));
      }
    }
    return timeVals;
  }

  function showReport() {
    var tbody = document.getElementById("tbody");
    var colsums = [0,0,0,0,0];
    var timeVals = getTimeVals();
    for (var i = 0; i < timeVals.length; ++i) {
      var tr = document.createElement("TR");

      appendTableCol(tr, __pages()[i], true);

      var r = getArrayStats(timeVals[i]);
      appendTableCol(tr, r.min.toFixed(2));
      appendTableCol(tr, r.max.toFixed(2));
      appendTableCol(tr, r.mean.toFixed(2));
      appendTableCol(tr, r.stdd.toFixed(2));
      appendTableCol(tr, r.errp.toFixed(2));
      //appendTableCol(tr, r.chi2.toFixed(2));

      for (var j = 0; j < timeVals[i].length; ++j) {
        var tv = timeVals[i][j];
        var td = appendTableCol(tr, tv);
        if (j == r.indexOfMax)
          td.setAttribute("class", "discarded");
      }

      colsums[0] = colsums[0] + r.min;
      colsums[1] = colsums[1] + r.max;
      colsums[2] = colsums[2] + r.mean;
      colsums[3] = colsums[3] + r.stdd;
      colsums[4] = colsums[4] + r.errp;

      tbody.appendChild(tr);
    }

    var tr = document.createElement("TR");
    appendTableCol(tr, "totals:");
    for (var k = 0; k < colsums.length; ++k)
      appendTableCol(tr, colsums[k].toFixed(2));
    tbody.appendChild(tr);
  }
  window.onload = showReport;

</script>
</dl>
</head>
<body>
<h2>Complete Statistics</h2>
<table border="1">
<thead>
<tr>
  <th>Site</th>
  <th>Min</th>
  <th>Max</th>
  <th>Mean</th>
  <th>Std.d</th>
  <th>Err %</th>
  <th colspan="10">Runs</th>
</tr>
</thead>
<tbody id="tbody"></tbody>
</table>
</body>
</html>
