google.load('search', '1', {language : "en"});

var simpleMode = true;
var keyToResults = new Object();
var keyToCallbacks = new Object();
var noMoreResults = new Object();
var rawSearchControl;

function RawSearchControl() { }

RawSearchControl.prototype.searchComplete = function(qsid, query, year,
                                                     searcher) {
  var success = false;
  for (var i = 0; i < searcher.results.length; ++i) {
    success |= formatAndAdd(qsid, query, year, searcher.results[i].content,
                   searcher.results[i].publishedDate,
                   searcher.results[i].publisher,
                   searcher.results[i].unescapedUrl,
                   searcher.results[i].publishedData);
  }
  var key = [qsid, query, year].join(':');
  if (keyToCallbacks[key]) {
    for (var i = 0; i < keyToCallbacks[key].length; ++i) {
      keyToCallbacks[key][i](!success);
    }
    delete keyToCallbacks[key];
  }
};
rawSearchControl = new RawSearchControl();

function StartSearch(qsid, query, year, callback) {
  var key = [qsid, query, year].join(':');
  var sentNextRequest = false;
  if (keyToResults[key] && !noMoreResults[key] && !keyToCallbacks[key]) {
    var cursor = keyToResults[key].cursor;
    if (cursor) {
      if (cursor.currentPageIndex + 1 < cursor.pages.length) {
        keyToResults[key].gotoPage(cursor.currentPageIndex + 1);
        sentNextRequest = true;
      }
    }
  } else if (!noMoreResults[key]) {
    if (!keyToCallbacks[key]) {
      keyToCallbacks[key] = new Array();
      var searcher = new GnewsSearch();
      searcher.setNoHtmlGeneration();
      searcher.setResultSetSize(GSearch.LARGE_RESULTSET);
      var min_year = '2003';
      var max_year = '2010';
      if (year != '0') {
        min_year = year;
        max_year = year;
      }
      searcher.setRestriction(google.search.Search.RESTRICT_EXTENDED_ARGS,
          {'qsid' : qsid,
           'as_maxd': '31',
           'as_maxm': '12',
           'as_maxy': max_year,
           'as_miny': min_year,
           'as_minm': '1',
           'as_mind': '1'});


      searcher.setSearchCompleteCallback(rawSearchControl,
                                         RawSearchControl.prototype.searchComplete,
                                         [qsid, query, year, searcher]);
      keyToResults[key] = searcher;
      keyToCallbacks[key].push(callback);
      searcher.execute(query);
    } else {
      keyToCallbacks[key].push(callback);
    }
    sentNextRequest = true;
  }
  if (!sentNextRequest) {
    noMoreResults[key] = true;
    callback(true);
  }
}

function methodClosure(object, method, opt_argArray) {
  return function() {
    return method.apply(object, opt_argArray);
  }
}
