15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var max_sample = 0;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Array.max = function(array) {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Math.max.apply( Math, array );
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Array.min = function(array) {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Math.min.apply( Math, array );
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute the average of an array, removing the min/max.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Array.avg = function(array) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var count = array.length;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var sum = 0;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var min = array[0];
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var max = array[0];
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < count; i++) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sum += array[i];
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (array[i] < min) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      min = array[i];
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (array[i] > max) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max = array[i];
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (count >= 3) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sum = sum - min - max;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count -= 2;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sum / count;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute the sample standard deviation of an array
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Array.stddev = function(array) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var count = array.length;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var mean = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < count; i++) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mean += array[i];
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mean /= count;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var variance = 0;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < count; i++) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var deviation = mean - array[i];
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    variance = variance + deviation * deviation;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  variance = variance / (count - 1);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Math.sqrt(variance);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function handleFileSelect(evt) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var files = evt.target.files;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0, f; f = files[i]; i++) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var reader = new FileReader();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reader.onload = function(evt) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      document.getElementById("testurl").value = evt.target.result;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reader.readAsText(f);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var THTAG = "th";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var TDTAG = "td";
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var NONE_DISPLAY = "none";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var CELL_DISPLAY = "table-cell";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var BRIEF_VIEW = "Show More Details";
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var FULL_VIEW = "Hide Details";
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Expand or shrink the result table.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called when clicking button "Show More Details/Hide Details".
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function expand() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (document.getElementById("expand").value == BRIEF_VIEW) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // From biref view to detailed view.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var headers = document.getElementsByTagName(THTAG);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cells = document.getElementsByTagName(TDTAG);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Display the hidden metrics (both headers and data cells).
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < headers.length; i++) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (headers[i].style.display == NONE_DISPLAY) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        headers[i].style.display = CELL_DISPLAY;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < cells.length; i++) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (cells[i].style.display == NONE_DISPLAY) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cells[i].style.display = CELL_DISPLAY;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("expand").value = FULL_VIEW;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // From detailed view to brief view.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var headers = document.getElementsByTagName(THTAG);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cells = document.getElementsByTagName(TDTAG);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hide some metrics.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < headers.length; i++) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (headers[i].style.display == CELL_DISPLAY) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        headers[i].style.display = NONE_DISPLAY;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < cells.length; i++) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (cells[i].style.display == CELL_DISPLAY) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cells[i].style.display = NONE_DISPLAY;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("expand").value = BRIEF_VIEW;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use cookie to store current expand/hide status.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var lastValue = document.getElementById("expand").value;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.cookie = "lastValue=" + lastValue;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reloading the page causes table to shrink (default original status).
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cookie remembers last status of table (in terms of expanded or shrunk).
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function restoreTable() {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (document.cookie == "lastValue=Hide Details") {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var headers = document.getElementsByTagName(THTAG);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cells = document.getElementsByTagName(TDTAG);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < headers.length; i++) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (headers[i].style.display == NONE_DISPLAY) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        headers[i].style.display = CELL_DISPLAY;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < cells.length; i++) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (cells[i].style.display == NONE_DISPLAY) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cells[i].style.display = CELL_DISPLAY;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("expand").value = FULL_VIEW;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to store the data to plot.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function PData() {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.xAxis = "Iteration(s)";
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.yAxis = "";
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.A = []; // Two data sets for comparison.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.B = [];
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.avgA = [];  // Avg value is plotted as a line.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.avgB = [];
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.maxA = 0;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.maxB = 0;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.countA = 0; // Size of the data sets.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.countB = 0;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.setYAxis = function(str) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.yAxis = str;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.setAvg = function(arr, cha) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cha == 'A') {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var avgA = Array.avg(arr);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 1; i <= this.countA; i++) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.avgA.push([i, avgA]);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (cha == 'B') {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var avgB = Array.avg(arr);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 1; i <= this.countB; i++) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.avgB.push([i, avgB]);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.setMax = function(arr, cha) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cha == 'A') {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.maxA = Array.max(arr);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (cha == 'B') {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.maxB = Array.max(arr);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an entry to the array.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.addArr = function(val, cha) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cha == 'A') {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.countA++;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.A.push([this.countA, val]);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (cha == 'B') {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.countB++;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.B.push([this.countB, val]);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Plot the graph at the specified place.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.plot = function(placeholder) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $.plot(placeholder,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [// Line A
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         data: this.A,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         label: "A's " + this.yAxis + " in " + this.countA + " " + this.xAxis,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         points: {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           show: true
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         },
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         lines: {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           show: true
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       },
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       // Line B
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         data: this.B,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         label: "B's " + this.yAxis + " in " + this.countB + " " + this.xAxis,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         points: {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           show: true
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         },
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         lines: {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           show: true
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       },
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       // Line avgA
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         data: this.avgA,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         label: "A's avg " + this.yAxis,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         dashes: {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           show: true
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       },
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       // Line avgB
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         data: this.avgB,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         label: "B's avg " + this.yAxis,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         dashes: {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           show: true
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       }],
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       // Axis and legend setup.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       { xaxis: {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           max: this.countA > this.countB ? this.countA : this.countB,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           tickSize: 1,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           tickDecimals: 0
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         },
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         yaxis: {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           // Leave some space for legend.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           max: this.maxA > this.maxB ? this.maxA * 1.5 : this.maxB * 1.5
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         },
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         legend: {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           backgroundOpacity: 0
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       });
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compare the selected metric of the two selected data sets.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function compare() {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var checkboxArr = document.getElementsByName("checkboxArr");
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var radioArr = document.getElementsByName("radioArr");
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (checkAmount(checkboxArr) != 2) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alert("please select two rows to compare");
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var rowIndexArr = getSelectedIndex(checkboxArr);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var colIndexArr = getSelectedIndex(radioArr);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To this point, it is for sure that rowIndexArr has two elements
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // while colIndexArr has one.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var selectedRowA = rowIndexArr[0];
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var selectedRowB = rowIndexArr[1];
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var selectedCol = colIndexArr[0];
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var extension = chrome.extension.getBackgroundPage();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var data = extension.results.data;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var selectedA = getSelectedResults(data,selectedRowA,selectedCol);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var selectedB = getSelectedResults(data,selectedRowB,selectedCol);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var yAxis = getMetricName(selectedCol);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicate A and B on selected rows.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkboxArr[selectedRowA].parentElement.firstChild.data = "A";
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkboxArr[selectedRowB].parentElement.firstChild.data = "B";
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plot(selectedA, selectedB, yAxis);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Show the comparison graph.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function plot(A, B, axis) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var plotData = new PData();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plotData.setYAxis(axis);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < A.length; i++) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plotData.addArr(A[i],'A');
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < B.length; i++) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plotData.addArr(B[i],'B');
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plotData.setAvg(A,'A');
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plotData.setAvg(B,'B');
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plotData.setMax(A,'A');
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plotData.setMax(B,'B');
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var placeholder = document.getElementById("placeholder");
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  placeholder.style.display = "";
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plotData.plot(placeholder);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var METRIC = {"STARTLOAD": 0, "COMMITLOAD": 1, "DOCLOAD": 2, "PAINT": 3,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "TOTAL": 4, "REQUESTS": 5, "CONNECTS": 6, "READKB": 7,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "WRITEKB": 8, "READKBPS": 9, "WRITEKBPS": 10};
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Retrieve the metric name from index.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getMetricName(index) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (index) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.STARTLOAD:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Start Load Time";
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.COMMITLOAD:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Commit Load Time";
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.DOCLOAD:
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Doc Load Time";
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.PAINT:
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Paint Time";
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.TOTAL:
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Total Load Time";
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.REQUESTS:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "# Requests";
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.CONNECTS:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "# Connects";
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.READKB:
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Read KB";
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.WRITEKB:
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Write KB";
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.READKBPS:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Read KBps";
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.WRITEKBPS:
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Write KBps";
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "";
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the results with a specific row (data set) and column (metric).
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getSelectedResults(arr, rowIndex, colIndex) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (colIndex) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.STARTLOAD:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].startLoadResults;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.COMMITLOAD:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].commitLoadResults;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.DOCLOAD:
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].docLoadResults;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.PAINT:
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].paintResults;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.TOTAL:
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].totalResults;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.REQUESTS:
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].requests;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.CONNECTS:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].connects;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.READKB:
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].KbytesRead;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.WRITEKB:
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].KbytesWritten;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.READKBPS:
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].readbpsResults;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case METRIC.WRITEKBPS:
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return arr[rowIndex].writebpsResults;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return undefined;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure only two data sets (rows) are selected.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function checkAmount(arr) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var amount = 0;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < arr.length; i++) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (arr[i].checked) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      amount++;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return amount;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the index of selected row or column.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getSelectedIndex(arr) {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var selectedArr = new Array();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < arr.length; i++) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(arr[i].checked) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selectedArr.push(i);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return selectedArr;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Repaint or hide the chart.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function updateChart(caller) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var placeholder = document.getElementById("placeholder");
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (caller.type == "radio") {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Other radio button is clicked.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (placeholder.style.display == "") {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      compare();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Other checkbox or clearing results is clicked.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (placeholder.style.display == "") {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      placeholder.style.display = "none";
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clear indicators besides checkbox.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function clearIndicator() {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var checkboxArr = document.getElementsByName("checkboxArr");
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < checkboxArr.length; i++) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkboxArr[i].parentElement.firstChild.data = "";
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enable/Disable buttons according to checkbox change.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function checkSelected() {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var checkboxArr = document.getElementsByName("checkboxArr");
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (checkAmount(checkboxArr) !=0) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("clearSelected").disabled = false;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("compare").disabled = false;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("clearSelected").disabled = true;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("compare").disabled = true;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Object to summarize everything
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var totals = {};
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute the results for a data set.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function computeDisplayResults(data) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var count = data.data.length;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < count; i++) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var obj = data.data[i];
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayTime = setDisplayTime(obj.timestamp);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var resultList = obj.totalResults;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.mean = Array.avg(resultList);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.stddev = Array.stddev(resultList);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.stderr = obj.stddev / Math.sqrt(obj.iterations);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var ci = 1.96 * obj.stderr;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.cihigh = obj.mean + ci;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.cilow = obj.mean - ci;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.min = Array.min(resultList);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.max = Array.max(resultList);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.readbps = Array.avg(obj.readbpsResults);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.writebps = Array.avg(obj.writebpsResults);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.readKB = Array.avg(obj.KbytesRead);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.writeKB = Array.avg(obj.KbytesWritten);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.paintMean = Array.avg(obj.paintResults);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.startLoadMean = Array.avg(obj.startLoadResults);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.commitLoadMean = Array.avg(obj.commitLoadResults);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.docLoadMean = Array.avg(obj.docLoadResults);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayRequests = Array.avg(obj.requests);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayConnects = Array.avg(obj.connects);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displaySpdySessions = Array.avg(obj.spdySessions);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayDomNum = obj.domNum;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayMaxDepth = obj.maxDepth;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayMinDepth = obj.minDepth;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayAvgDepth = obj.avgDepth;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return count;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert timestamp to readable string.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function setDisplayTime(ts) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var year = ts.getFullYear();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var mon = ts.getMonth()+1;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var date = ts.getDate();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var hrs = ts.getHours();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var mins = ts.getMinutes();
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var secs = ts.getSeconds();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mon = ( mon < 10 ? "0" : "" ) + mon;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  date = ( date < 10 ? "0" : "" ) + date;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mins = ( mins < 10 ? "0" : "" ) + mins;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secs = ( secs < 10 ? "0" : "" ) + secs;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (year + "/" + mon + "/" + date + " " + hrs + ":" + mins + ":" + secs);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subtract the results from two data sets.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function could be smarter about what it subtracts,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for now it just subtracts everything.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if it was able to compare the two data sets.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function subtractData(data, baseline) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var count = data.data.length;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (baseline.data.length != count) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < count; i++) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var obj = data.data[i];
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var obj2 = baseline.data[i];
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The data sets are different.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (obj.url != obj2.url ||
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        obj.iterations != obj2.iterations) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.mean -= obj2.mean;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.stddev -= obj2.stddev;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.min -= obj2.min;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.max -= obj2.max;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.readbps -= obj2.readbps;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.writebps -= obj2.writebps;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.readKB -= obj2.readKB;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.writeKB -= obj2.writeKB;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.paintMean -= obj2.paintMean;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.startLoadMean -= obj2.startLoadMean;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.commitLoadMean -= obj2.commitLoadMean;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.docLoadMean -= obj2.docLoadMean;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayRequests -= obj2.displayRequests;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displayConnects -= obj2.displayConnects;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj.displaySpdySessions -= obj2.displaySpdySessions;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute totals based on a data set.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function computeTotals(data) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var count = data.data.length;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < count; i++) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var obj = data.data[i];
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.mean += obj.mean;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.paintMean += obj.paintMean;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.startLoadMean += obj.startLoadMean;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.commitLoadMean += obj.commitLoadMean;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.docLoadMean += obj.docLoadMean;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compute results for the data with an optional baseline.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |baseline| is undefined, will compute the results of this
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run.  Otherwise, computes the diff between this data and the baseline.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function computeResults(data, baseline) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  totals = {};
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  totals.mean = 0;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  totals.paintMean = 0;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  totals.startLoadMean = 0;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  totals.commitLoadMean = 0;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  totals.docLoadMean = 0;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var count = computeDisplayResults(data);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (baseline) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    computeDisplayResults(baseline);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!subtractData(data, baseline)) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      alert("These data sets are different");
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      document.getElementById("baseline").value = "";
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  computeTotals(data);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  totals.url = "(" + count + " urls)";
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (count > 0) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.mean /= count;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.paintMean /= count;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.startLoadMean /= count;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.commitLoadMean /= count;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totals.docLoadMean /= count;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the biggest average for our bar graph.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  max_sample = 0;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < data.data.length; i++) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data.data[i].max > max_sample) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_sample = data.data[i].mean;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function jsinit() {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var extension = chrome.extension.getBackgroundPage();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the template to show results
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var data = extension.results;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the baseline results
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var elt = document.getElementById("baseline");
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var baseline_json = document.getElementById("baseline").value;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var baseline;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (baseline_json) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      baseline = JSON.parse(baseline_json);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } catch (e) {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      alert("JSON parse error: " + e);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compute
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  computeResults(data, baseline);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var context = new JsEvalContext(data);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.setVariable('$width', 0);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.setVariable('$samples', 0);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var template = document.getElementById("t");
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstProcess(context, template);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the options
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById("iterations").value = extension.iterations;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById("clearconns").checked = extension.clearConnections;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById("clearcache").checked = extension.clearCache;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById("enablespdy").checked = extension.enableSpdy;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setUrl(extension.testUrl);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!baseline) {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var json_data = JSON.stringify(data);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.getElementById("json").value = json_data;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activate loading Urls from local file.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById('files').addEventListener('change',
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    handleFileSelect, false);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getWidth(mean, obj) {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var kMinWidth = 200;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var max_width = obj.offsetWidth;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_width < kMinWidth) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_width = kMinWidth;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Math.floor(max_width * (mean / max_sample));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Apply configuration back to our extension
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function config() {
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var extension = chrome.extension.getBackgroundPage();
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iterations = parseInt(document.getElementById("iterations").value);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var clearConnections = document.getElementById("clearconns").checked;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var clearCache = document.getElementById("clearcache").checked;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var enableSpdy = document.getElementById("enablespdy").checked;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iterations > 0) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension.iterations = iterations;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension.clearConnections = clearConnections;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension.clearCache = clearCache;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension.enableSpdy = enableSpdy;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set the url in the benchmark url box.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function setUrl(url) {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById("testurl").value = url;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Start the benchmark.
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function run() {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chrome.benchmarking) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alert("Warning:  Looks like you forgot to run chrome with " +
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          " --enable-benchmarking set.");
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var extension = chrome.extension.getBackgroundPage();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var testUrl = document.getElementById("testurl").value;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension.testUrl = testUrl;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension.run();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function showConfirm() {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var r = confirm("Are you sure to clear results?");
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (r) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Find out the event source element.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var evtSrc = window.event.srcElement;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (evtSrc.value == "Clear Selected") {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clearSelected();
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (evtSrc.value == "Clear All") {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clearResults();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clear the selected results
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function clearSelected() {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var extension = chrome.extension.getBackgroundPage();
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var checkboxArr = document.getElementsByName("checkboxArr");
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var rowIndexArr = getSelectedIndex(checkboxArr);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var currIndex;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < rowIndexArr.length; i++) {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    currIndex = rowIndexArr[i];
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Update the index of the original row in the modified array.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    currIndex -= i;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension.results.data.splice(currIndex, 1);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.location.reload(true);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateChart(this);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jsinit();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clear all the results
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function clearResults() {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var extension = chrome.extension.getBackgroundPage();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension.results = {};
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension.results.data = new Array();
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById("json").value = "";
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.getElementById("baseline").value = "";
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updateChart(this);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jsinit();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Export html table into CSV format.
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function exportHtml() {
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var checkboxArr = document.getElementsByName("checkboxArr");
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var rowNum = checkboxArr.length + 1; // # of data rows plus total-stats row.
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#t').table2CSV(rowNum);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Toggle display of an element
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function toggle(id) {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var elt = document.getElementById(id);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (elt.style.display == "none") {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elt.style.display = "block";
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elt.style.display = "none";
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener("DOMContentLoaded", function() {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jsinit();
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restoreTable();
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.querySelector('form').addEventListener('click', function() {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config();
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#expand')[0].addEventListener('click', function() { expand(); });
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#clearSelected')[0].addEventListener('click',
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          function() { showConfirm(); });
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#clearAll')[0].addEventListener('click', function() { showConfirm(); });
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#exportCsv')[0].addEventListener('click', function() { exportHtml(); });
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var checkboxArrs = document.getElementsByName('checkboxArr');
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < checkboxArrs.length; ++i) {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkboxArrs[i].addEventListener('click', function() {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      updateChart(this);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clearIndicator();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      checkSelected();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var radioArrs = document.getElementsByName('radioArr');
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < radioArrs.length; ++i) {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radioArrs[i].addEventListener('click', function() { updateChart(this); });
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#compare')[0].addEventListener('click', function() { compare(); });
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#toggle-json')[0].addEventListener('click',
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        function() { toggle('json'); });
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#toggle-baseline')[0].addEventListener('click',
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            function() { toggle('baseline'); });
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#baseline')[0].addEventListener('change', function() { jsinit(); });
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
752