<html>
<head>
  <title>Gerrit Code Review - Releases</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
  <style>
  #diffy_logo {
    float: left;
    width: 75px;
    height: 70px;
    margin-right: 20px;
  }
  #download_container table {
    border-spacing: 0;
  }
  #download_container td {
    padding-right: 5px;
  }
  .latest-release {
    background-color: lightgreen;
  }
  .rc {
    padding-left: 1em;
    font-style: italic;
  }
  .size {
    text-align: right;
  }
  </style>
</head>
<body>

<h1>Gerrit Code Review - Releases</h1>
<a href="http://code.google.com/p/gerrit">
  <img id="diffy_logo" src="https://gerrit-review.googlesource.com/static/diffy1.cache.png">
</a>

<div id='download_container'>
</div>

<script>
$.getJSON(
'https://www.googleapis.com/storage/v1beta2/b/gerrit-releases/o?projection=noAcl&fields=items(name%2Csize)&callback=?',
function(data) {
  var doc = document;
  var frg = doc.createDocumentFragment();
  var rx = /^gerrit(?:-full)?-([0-9.]+(?:-rc[0-9]+)?)[.]war/;
  var docs = 'https://gerrit-documentation.storage.googleapis.com/';
  var src = 'https://gerrit.googlesource.com/gerrit/+/'

  data.items.sort(function(a,b) {
    var av = rx.exec(a.name);
    var bv = rx.exec(b.name);
    if (!av || !bv) {
      return a.name > b.name ? 1 : -1;
    }

    var an = av[1].replace('-rc', '.rc').split('.')
    var bn = bv[1].replace('-rc', '.rc').split('.')
    while (an.length < bn.length) an.push('0');
    while (an.length > bn.length) bn.push('0');
    for (var i = 0; i < an.length; i++) {
      var ai = an[i].indexOf('rc') == 0
        ? parseInt(an[i].substring(2))
        : 1000 + parseInt(an[i]);

      var bi = bn[i].indexOf('rc') == 0
        ? parseInt(bn[i].substring(2))
        : 1000 + parseInt(bn[i]);

      if (ai != bi) {
        return ai > bi ? -1 : 1;
      }
    }
    return 0;
  });

  var latest = false;
  for (var i = 0; i < data.items.length; i++) {
    var f = data.items[i];
    var v = rx.exec(f.name);

    if ('index.html' == f.name) {
      continue;
    }

    var tr = doc.createElement('tr');
    var td = doc.createElement('td');
    var a = doc.createElement('a');
    a.href = f.name;
    if (v) {
      a.appendChild(doc.createTextNode('Gerrit ' + v[1]));
    } else {
      a.appendChild(doc.createTextNode(f.name));
    }
    if (f.name.indexOf('-rc') > 0) {
      td.className = 'rc';
    } else if (!latest) {
      latest = true;
      tr.className='latest-release';
    }
    td.appendChild(a);
    tr.appendChild(td);

    td = doc.createElement('td');
    td.className = 'size';
    if (f.size/(1024*1024) < 1) {
      sizeText = Math.round(f.size/1024*10)/10 + ' KiB';
    } else {
      sizeText = Math.round(f.size/(1024*1024)*10)/10 + ' MiB';
    }
    td.appendChild(doc.createTextNode(sizeText));
    tr.appendChild(td);

    td_rel = doc.createElement('td');
    td_doc = doc.createElement('td');
    if (v && f.name.indexOf('-rc') < 0) {
      // Release notes link
      a = doc.createElement('a');
      a.href = docs + 'ReleaseNotes/ReleaseNotes-' + v[1] + '.html';
      a.appendChild(doc.createTextNode('Release Notes'));
      td_rel.appendChild(a);

      // Documentation link
      a = doc.createElement('a');
      a.href = docs + 'Documentation/' + v[1] + '/index.html';
      a.appendChild(doc.createTextNode('Documentation'));
      td_doc.appendChild(a);
    }
    tr.appendChild(td_rel);
    tr.appendChild(td_doc);

    td = doc.createElement('td');
    if (v) {
      a = doc.createElement('a');
      a.href = src + 'v' + v[1];
      a.appendChild(doc.createTextNode('src'));
      td.appendChild(a);
    }
    tr.appendChild(td);

    frg.appendChild(tr);
  }

  var tr = doc.createElement('tr');
  var th = doc.createElement('th');
  th.appendChild(doc.createTextNode('File'));
  tr.appendChild(th);

  th = doc.createElement('th');
  th.appendChild(doc.createTextNode('Size'));
  tr.appendChild(th);

  tr.appendChild(doc.createElement('th'));
  tr.appendChild(doc.createElement('th'));

  var table = doc.createElement('table');
  table.appendChild(tr);
  table.appendChild(frg);
  doc.getElementById('download_container').appendChild(table);
});
</script>

</body>
</html>
