<!DOCTYPE html>
<html>
<head>
    <title>Skia Performance Monitoring | Compare Verticals</title>

    {{template "header.html" .}}

    <link href="/res/imp/compare.html" rel="import" />
</head>
<body>
  <scaffold-sk responsiveWidth="700px">
    {{template "titlebar.html" .}}
    <div id="container">
      <section id=compare>
        <h2>Compare Results</h2>
        <div id=vInput>
          Vertical to compare:
          <input type="radio" name="vertical" value="arch">arch</input>
          <input type="radio" name="vertical" value="config" checked>config</input>
          <input type="radio" name="vertical" value="os">os</input>
          <input type="radio" name="vertical" value="scale">scale</input>
        </div>
        </p>
        <div id="sk-query"></div>
        <query-sk></query-sk>
        <button id="start" type="submit">Compare</button>

        Use latest results up to: <select id="commitSel"></select>
        <div id="compStatus"></div>
        <div id="skCompare"></div>
      </section>
    </div>
  </scaffold-sk>
  <script type="text/javascript" charset="utf-8">
    (function() {
      /**
        * beginCompare starts an XHR request to populate variables used by
        * sk.Compare.display(), then calls it to display compare results.
        *
        * compare: the sk.Compare object.
        * vertical: the trace param criterion we are comparing in, e.g., "config".
        * selections: the query selection result as url fragment.
        *
        * commit: string of commit hash. If invalid or not found, will use latest
        * available data.
        *
        * See query and compare modules for more details.
        */
      function beginCompare(compare, vertical, selections, commit) {
        // The pair of vertical values to compare against.
        var pair = [
          /*
           "8888", "gpu",
           */
          ];
        // List of table columns.
        var cols = [
          /*
           "x86:ANGLE:HD2000:ShuttleA:Win7",
           "x86:GTX660:ShuttleA:Ubuntu12",
           */
          ];
        // cells contains data for the table cells, keyed by test name as row name.
        // Within each row, keys are the corresponding column indices in the cols
        // array above and values are the bench values corresponding to the pair of
        // verticals above.
        var cells = {
          /*
            "Deque_Push_640_480": {
              "0": [0.9, 1.3],
              "2": [1.1, 0.8],
              ...
            },
            "Another_Test": {
              "1": [0, 0.7],
              ...
            }
           */
          };

        document.body.style.cursor = 'wait';
        var re = new RegExp(vertical + '=', 'g');
        var inparam = selections.match(re);
        if (!inparam || inparam.length != 2) {
          alert("Please select EXACTLY two elements from " + vertical);
          document.body.style.cursor = 'auto';
          return;
        }
        var col_params = ['arch', 'config', 'extra_config', 'gpu', 'model', 'os'];
        sk.get('/single/' + commit + '?' + selections).then(JSON.parse).then(function(json) {
          json.traces.forEach(function(tr) {
            var params = tr['params'];
            if (pair.indexOf(params[vertical]) < 0) {
              pair.push(params[vertical]);
            }
            // Constructs the column string.
            var col = col_params.map(function(key) {
              if (key != vertical) {
                return params[key];
              } else {
                return '';
              }
            }).filter(function(v) {
              return (v && v.length > 0);
            }).join(':');
            if (cols.indexOf(col) < 0) {
              cols.push(col);
            }
            // Records new data.
            var row = params['test'];
            if (!(row in cells)) {
              cells[row] = {};
            }
            var colIdxStr = cols.indexOf(col).toString();
            if (!(colIdxStr in cells[row])) {
              cells[row][colIdxStr] = [0, 0];
            }
            var pairIdx = pair.indexOf(params[vertical]);
            if (cells[row][colIdxStr][pairIdx] !== 0) {
              // row/col combination not unique: something wrong with the data.
              alert('Duplicate data for ' + row + ':' + col);
              document.body.style.cursor = 'auto';
              return;
            }
            // Records the latest value.
            cells[row][colIdxStr][pairIdx] = tr['val'];
          });

          if (cols.length == 0 || pair.length != 2) {
            $$$('#compStatus').innerText = 'No data row or column.';
            sk.clearChildren(compare.resultsContainer_);
          } else {
            $$$('#compStatus').innerText = 'Comparing "' + vertical + '", ratio ' +
                pair[1] + ' / ' + pair[0] + ':';
            compare.display(cols, cells);
          }
          document.body.style.cursor = 'auto';
        }).catch(function(e){
          alert(e);
          document.body.style.cursor = 'auto';
        });
      }

      /**
       * populateAndSetCommits populates latest commit info into the select DOM.
       *
       * selectDom: a given <select> DOM.
       *
       * options are sorted by latest commits first. Option's value is the commit's
       * hash in the tile commit data.
       *
       * TODO: move to a common file?
       */
      function populateAndSetCommits(selectDom, beginHash, endHash) {
        if (selectDom.nodeName != 'SELECT') {
          alert('Cannot populate non-SELECT DOM!');
          return;
        }
        sk.clearChildren(selectDom);
        sk.get('/shortcommits/?begin=' + beginHash + '&end=' + endHash).then(JSON.parse).then(function(json){
          for (var i = 0; i < json.Commits.length; i++) {
            var c = json.Commits[i];
            var opt = document.createElement('OPTION');
            opt.value = c.Hash;
            opt.innerText = [c.Hash.substring(0, 7), c.Author,
                c.Subject.substr(0, 80)].join(':');
            selectDom.insertBefore(opt, selectDom.firstChild);
          }
        });
      }

      function onLoad() {
        var compare = new sk.Compare();
        compare.attach();

        sk.get('/tiles/0/-1/').then(JSON.parse).then(function(json){
          var endCommit = "";
          $$$('query-sk').setParamSet(json.paramset);
          for (i = json.commits.length - 1; i >= 0; i--) {
            if (json.commits[i].hash.length > 0) {
              endCommit = json.commits[i].hash;
              break;
            }
          }
          populateAndSetCommits($$$('#commitSel'), json.commits[0].hash, endCommit);
        });

        $$$('#start').addEventListener('click', function(){
          beginCompare(compare, $$$('input[name="vertical"]:checked').value, $$$('query-sk').currentQuery, $$$('#commitSel').value);
        });

        $$$('#commitSel').addEventListener('change', function(){
          beginCompare(compare, $$$('input[name="vertical"]:checked').value, $$$('query-sk').currentQuery, $$$('#commitSel').value);
        });
      };

      sk.DomReady.then(onLoad);

    })();
  </script>
</body>
</html>
