function TermExtractedSearch(container, options) {
  this.resultSize = 'large';
  this.container = container;
  if (options) {
    if (options.callback) this.callback = options.callback;
    if (options.resultSize) this.resultSize = options.resultSize;
    if (options.siteRestrict) this.siteRestrict = options.siteRestrict;
  }
  this.setup_();
}

TermExtractedSearch.RawSearchComplete = function(context, result) {
  TermExtractedSearch.jsonCompletionMap_[context](result);
};

TermExtractedSearch.jsonCompletionMap_ = [];

TermExtractedSearch.prototype.searchComplete_ = function(context) {
  return function(result) {
    var theirCallback = context.callback;
    var results = result.responseData.results;
    var outputHTML = '<div class="tes-titlebar">Relevant Links</div>';
    for (var i=0; i < results.length && i < 3; i++) {
      var title = results[i].titleNoFormatting;
      var url = results[i].unescapedUrl;
      var escapedUrl = results[i].url;
      var description = results[i].content;
      var visibleUrl = results[i].visibleUrl;
      outputHTML += '<table class="tes-entry" cellpadding=0 cellspacing=0><tbody><tr>';
      outputHTML += '<td valign="top"><div class="tes-favicon"><img src="http://www.google.com/s2/favicons?domain=' + visibleUrl + '"></div></td>';
      outputHTML += '<td><div class="tes-content">';
      outputHTML += '<div class="tes-title"><a href="'+url+'">' + title + '</a></div><div class="tes-snippet">' + description + '</div>';
      outputHTML += '<div class="tes-short-url">' + visibleUrl + "</div>";
      outputHTML += '</div></td>';
      outputHTML += '</tr></tbody></table>';
    }
    outputHTML += '<table class="tes-footer" cellpadding=0 cellspacing=0><tbody><tr>';
    outputHTML += '<td class="tes-footer-links"><a href="#">&laquo; Previous</a>&nbsp;&nbsp;&nbsp;<a href="#">Next &raquo;</a></td><td class="tes-poweredby"><img class="tes-poweredby-link" src="http://termextractedsearch.appspot.com/powered_by.png"></td>';
    outputHTML += '</tr></tbody></table>';
    context.resultsDiv.innerHTML = outputHTML;
    context.resultsDiv.className = 'tes-container';
    if (theirCallback) theirCallback(result);
  }
};

TermExtractedSearch.prototype.setup_ = function() {
  this.resultsDiv = document.createElement('div');
  this.container.appendChild(this.resultsDiv);
  this.search_();
};

TermExtractedSearch.prototype.search_ = function() {
  // <script src="http://172.31.152.220:8084/ExtractTerms?callback=rawr" type="text/javascript" charset="utf-8"></script>
  var script = document.createElement('script');
  var src = 'http://termextractedsearch.appspot.com/ExtractTerms';
  var query = [];
  var cblen = TermExtractedSearch.jsonCompletionMap_.length;
  var me = this;
  TermExtractedSearch.jsonCompletionMap_[cblen] = this.searchComplete_(me);

  query.push('callback=TermExtractedSearch.RawSearchComplete');
  query.push('query=' + encodeURIComponent(document.title));
  query.push('context=' + cblen);
  if (this.siteRestrict) query.push('siterestrict=' + encodeURIComponent(this.siteRestrict));

  script.src = src + '?' + query.join('&');
  document.getElementsByTagName("head")[0].appendChild(script);
  script.type = 'text/javascript';
};
