function millis(s) {
  // 2007-08-21T10:02:03.521Z
  var match;
  if(match = s.match(/(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+).(\d+)Z/)) {
    return Date.UTC(match[1], match[2]-1, match[3], match[4], match[5], match[6], match[7]);
  } else {
    throw("Bad date: " + s);
  }
}

function buildTable(json) {
  //<--
  document.getElementById('info').innerHTML = "Updated by " + json.feed.author[0].name.$t + " on " + new Date(millis(json.feed.updated.$t));

  var table = document.createElement('table');
  table.setAttribute('id', 'output');
  var tbody = document.createElement('tbody');
  var tr;
  for (var i=0; i < json.feed.entry.length; i++) {
    var entry = json.feed.entry[i];
    if (entry.gs$cell.col == '1') {
      if (tr != null) {
        tbody.appendChild(tr);
      }
      tr = document.createElement('tr');
    }
    var td = document.createElement('td');
    var text = render(entry.content.$t);
    td.innerHTML = text;
    tr.appendChild(td);
  }
  tbody.appendChild(tr);
  table.appendChild(tbody);
  document.getElementById('data').appendChild(table);
}

var link1 = new RegExp('"\\b(.+?)\\(\\b(.+?)\\b\\)":([^\\s]+)','g');
var link2 = new RegExp('"\\b(.+?)\\b":([^\\s]+)','g');

function render(text) {
  text = text.replace(link1,'<a href="$3" title="$2">$1</a>').replace(link2,'<a href="$2">$1</a>');
  text = text.replace(/^\(y\)/, '<img src="images/check.gif"/>')
  text = text.replace(/^\(n\)/, '<img src="images/error.gif"/>')
  return text == '' ? 'XXX' : text;
}
