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)/* Counter accessor for Name Node. */
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getCounterNameFromCounterNode(node) {
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node.childNodes[1];
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counter accessor for Value Node. */
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getCounterValueFromCounterNode(node) {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node.childNodes[3];
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counter accessor for Delta Node. */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getCounterDeltaFromCounterNode(node) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node.childNodes[5];
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Name Node. */
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerNameFromTimerNode(node) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node.childNodes[1];
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Value Node. */
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerValueFromTimerNode(node) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node.childNodes[3];
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Time Node. */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerTimeFromTimerNode(node) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node.childNodes[5];
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Average Time Node. */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerAvgTimeFromTimerNode(node) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node.childNodes[7];
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Do the filter work.  Hide all nodes matching node.*/
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function filterMatching(text, nodelist, functionToGetNameNode) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var showAll = text.length == 0;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0, node; node = nodelist[i]; i++) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var name = functionToGetNameNode(node).innerHTML.toLowerCase();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (showAll || name.indexOf(text) >= 0)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      node.style.display = 'table-row';
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      node.style.display = 'none';
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Hides or shows counters based on the user's current filter selection. */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function doFilter() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var filter = $('filter');
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var text = filter.value.toLowerCase();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var nodes = document.getElementsByName('counter');
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filterMatching(text, nodes, getCounterNameFromCounterNode);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var nodes = document.getElementsByName('timer');
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filterMatching(text, nodes, getTimerNameFromTimerNode);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Colors the counters based on increasing or decreasing value. */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function doColor() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var nodes = document.getElementsByName('counter');
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0, node; node = nodes[i]; i++) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var child = getCounterDeltaFromCounterNode(node);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var delta = child.innerHTML;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delta > 0)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child.style.color = 'Green';
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (delta == 0)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child.style.color = 'Black';
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child.style.color = 'Red';
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counters with no values are null. Remove them. */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function removeNullValues() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var nodes = document.getElementsByName('counter');
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = nodes.length - 1; i >= 0; i--) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var node = nodes[i];
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var value = getCounterValueFromCounterNode(node).innerHTML;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == 'null')
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      node.parentNode.removeChild(node);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var nodes = document.getElementsByName('timer');
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0, node; node = nodes[i]; i++) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var valueNode = getTimerValueFromTimerNode(node);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (valueNode.innerHTML == 'null')
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      valueNode.innerHTML = '';
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Compute the average time for timers */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function computeTimes() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var nodes = document.getElementsByName('timer');
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0, node; node = nodes[i]; i++) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var count = getTimerValueFromTimerNode(node).innerHTML;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count.length > 0) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var time = getTimerTimeFromTimerNode(node).innerHTML;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var avg = getTimerAvgTimeFromTimerNode(node);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avg.innerHTML = Math.round(time / count * 100) / 100;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* All the work we do onload. */
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function onLoadWork() {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the javascript code that processes the template:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var input = new JsEvalContext(templateData);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var output = $('t');
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstProcess(input, output);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add handlers to dynamically created HTML elements.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var elements = document.getElementsByName('string-sort');
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < elements.length; ++i)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    elements[i].onclick = function() { sortTable('string'); };
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elements = document.getElementsByName('number-sort');
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < elements.length; ++i)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    elements[i].onclick = function() { sortTable('number'); };
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  doColor();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  removeNullValues();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  computeTimes();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var filter = $('filter');
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filter.onkeyup = doFilter;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filter.focus();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The function should only be used as the event handler
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on a table cell element. To use it, put it in a <td> element:
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  <td onclick="sort('string')" ...>
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The function sorts rows after the row with onclick event handler.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type: the data type, 'string', 'number'
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function sortTable(type) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cell = event.target;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cnum = cell.cellIndex;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var row = cell.parentNode;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var startIndex = row.rowIndex + 1;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var tbody = row.parentNode;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var table = tbody.parentNode;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var rows = new Array();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var indexes = new Array();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // skip the first row
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (var i = startIndex; i < table.rows.length; i++)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rows.push(table.rows[i]);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a, b are strings
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  function compareStrings(a, b) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (a == b) return 0;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (a < b) return -1;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a, b are numbers
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  function compareNumbers(a, b) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var x = isNaN(a) ? 0 : a;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var y = isNaN(b) ? 0 : b;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return x - y;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var sortFunc;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type === 'string') {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sortFunc = function(a, b) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var x = a.cells[cnum].innerText;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var y = b.cells[cnum].innerText;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return compareStrings(x, y);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type === 'number') {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sortFunc = function(a, b) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var x = parseFloat(a.cells[cnum].innerText);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var y = parseFloat(b.cells[cnum].innerText);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return compareNumbers(x, y);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rows.sort(sortFunc);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change tables
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cell._reverse) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = rows.length - 1; i >= 0; i--)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tbody.appendChild(rows[i]);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cell._reverse = false;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < rows.length; i++)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tbody.appendChild(rows[i]);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cell._reverse = true;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener('DOMContentLoaded', onLoadWork);
201