<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/+/'

  var items = data.items.filter(function(i) {
    return i.name.indexOf('gerrit-snapshot-') != 0;
  });


  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 < items.length; i++) {
    var f = 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>
