<!DOCTYPE html>
<!-- much of this is stolen from omahaproxy.appspot.com/viewer -->
<html>
  <head>
    <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
    <title>NaCl SDK Manifest Viewer</title>
  </head>
  <style type="text/css" media="screen">
    body {
      font-family: monospace;
      font-size: 10pt;
    }

    table {
      border-collapse: collapse;
      border-color: rgb(100, 100, 100);
      border-style: solid;
      border-width: 1px 0px 1px 0px;
    }

    table td {
      padding: 3px;
      border-color: rgb(100, 100, 100);
      border-style: solid;
      border-width: 0px 1px 0px 1px;
    }

    thead {
      background-color: lightblue;
      font-weight: bold;
      border-style: solid;
      border-color: rgb(100, 100, 100);
      border-width: 0px 0px 2px 0px;
      text-align: center;
    }

    tbody tr:nth-child(odd) {
      background-color: rgb(230, 230, 230);
    }

    tbody tr:hover {
      background-color: orange;
    }

    td a {
      padding: 3px;
    }
  </style>
  <body>
    <h1>NaCl SDK Manifest Viewer</h1>
    <table>
      <thead id="columns">
      </thead>
      <tbody id="rows">
      </tbody>
    </table>
    <h2>Most recent upload log:</h2>
    <pre id="log">
    </pre>
    <script type="application/javascript">
      function loadText(url, callback) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.onreadystatechange = function (e) {
          if (xhr.readyState == 4) {
            if (xhr.status == 200) {
              callback(xhr.responseText);
            } else {
              alert("Failed to load: error " + xhr.status);
            }
          }
        }
        xhr.send(null);
      }

      function loadJson(url, callback) {
        loadText(url, function (text) {
          callback(JSON.parse(text));
        });
      }

      function removeAllChildren(elm) {
        while (elm.childNodes.length) {
          elm.removeChild(elm.firstChild);
        }
      }

      function display(data) {
        data = data.bundles;

        var columnsElm = document.getElementById('columns');
        var rowsElm = document.getElementById('rows');
        removeAllChildren(columnsElm);
        removeAllChildren(rowsElm);

        // Create the column headers.
        var tr = document.createElement('tr');
        var columns = [
          'name', 'version', 'revision', 'win', 'mac', 'linux', 'all'
        ];
        for (var i = 0; i < columns.length; ++i) {
          var td = document.createElement('td');
          var text = document.createTextNode(columns[i]);
          td.appendChild(text);
          tr.appendChild(td);
        }
        columnsElm.appendChild(tr);

        var platforms = ['win', 'mac', 'linux', 'all'];

        for (var i = 0; i < data.length; ++i) {
          var tr = document.createElement('tr');
          for (var j = 0; j < columns.length; ++j) {
            var td = document.createElement('td');
            var node;
            if (platforms.indexOf(columns[j]) != -1) {
              var archives = data[i].archives;
              for (var k = 0; k < archives.length; ++k) {
                if (columns[j] == archives[k].host_os) {
                  var url = archives[k].url;
                  var lastSlash = url.lastIndexOf('/');
                  var nextDot = url.indexOf('.', lastSlash);
                  name = url.substr(lastSlash + 1, nextDot - lastSlash - 1);
                  node = document.createElement('a');
                  node.setAttribute('href', url);
                  node.appendChild(document.createTextNode(name));
                  td.appendChild(node);
                }
              }
            } else {
              node = document.createTextNode(data[i][columns[j]]);
              td.appendChild(node);
            }
            tr.appendChild(td);
          }
          rowsElm.appendChild(tr);
        }
      }

      function displayLog(text) {
        document.getElementById('log').textContent = text;
      }

      loadJson('naclsdk_manifest2.json', display);
      loadText('naclsdk_manifest2.json.log', displayLog);
    </script>
  </body>
</html>
