<html>
  <head>
    <title>Chromium Memory Dashboard</title>
    <script src="ui/js/common.js"></script>
    <script language="javascript">
      var perf_url = DirName(DirName(window.location.href));
      function DisplayGraph(name, graph) {
        document.write('<td><iframe scrolling="no" height="250" width="400" src="' + perf_url);
        document.write('/' + name + '/report.html?history=50');
        var params = ParseParams();
        if (typeof graph == 'undefined') {
          if ('graph' in params) {
            graph = escape(params.graph);
          }
        } else if (graph != null) {
          document.write('&header=');
          document.write(graph);
        }
        if (graph != null) {
          document.write('&graph=');
          document.write(graph);
        }
        document.write('&lookout=1"></iframe></td>');
      }
    </script>
  </head>
  <body>
    <center>
      <script language="javascript">
        document.write('<h1><a href="' + window.location.pathname + '">'
                       + 'Chromium Memory Dashboard</a></h1>');
        var params = ParseParams();
        var builder_map = {
            'Linux Memory': 'linux-release-memory',
            'Mac Memory': 'mac-release-memory',
            'XP Memory': 'xp-release-memory',
        };
        var test_map = {
            'memory': 'Memory',
            // 'TBD': 'TBD_test',
        };
        if ('builder' in params) {
          builder_list = params.builder.split(',');
        } else {
          builder_list = Keys(builder_map);
        }
        if ('test' in params) {
          test_list = params.test.split(',');
        } else {
          test_list = Keys(test_map);
        }
        function write_table() {
          document.write('<table>');
          document.write('<tr><th>&nbsp;</th>');
          for (var bindex=0; bindex < builder_list.length; bindex++) {
            builder = builder_list[bindex];
            url = MakeURL({'builder':escape(builder)});
            document.write('<th align="center"><a href="' + url + '">'
                           + escape(builder).replace('%20', ' ') + '</a></th>');
          }
          document.write('</tr>');
          for (var tindex=0; tindex < test_list.length; tindex++) {
            test = escape(test_list[tindex]);
            test_name = test_map[test];
            document.write('<tr>');
            url = MakeURL({'test':test});
            document.write('<th valign="center"><a href="' + url + '">'
                           + test + '</a></th>');
            for (var bindex=0; bindex < builder_list.length; bindex++) {
              builder = builder_list[bindex];
              builder_id = builder_map[builder];
              if (1) {        // TODO(sgk):  replace with real test
                DisplayGraph(builder_id + '/' + test);
              } else {
                msg = test_name + ' is not built on ' + builder_id;
                document.write('<td align="center" valign="center">'
                               + msg + '</td>');
              }
            }
            document.write('</tr>');
          }
        }
        write_table();
      </script>
    </center>
  </body>
</html>
