var noun_type_searchengine = {
  _name: "search-engine",
  suggest: function(fragment) {
    var searchService = Components.classes["@mozilla.org/browser/search-service;1"]
      .getService(Components.interfaces.nsIBrowserSearchService);
    var engines = searchService.getVisibleEngines({});
    
    if (!fragment) {
      return engines.map(function(engine) {
        return CmdUtils.makeSugg(engine.name, null, engine);
      });
    }
    
    fragment = fragment.toLowerCase();
    var suggestions = [];
    
    for(var i = 0; i < engines.length; i++) {
      if(engines[i].name.toLowerCase().indexOf(fragment) > -1) {
        suggestions.push(CmdUtils.makeSugg(engines[i].name, null, engines[i]));
      }
    }
    
    return suggestions;
  },
  getDefault: function() {
    return Components.classes["@mozilla.org/browser/search-service;1"]
      .getService(Components.interfaces.nsIBrowserSearchService)
      .defaultEngine;
  }
};


CmdUtils.CreateCommand({
  name: "search",
  takes: {query: noun_arb_text},
  modifiers: {"with": noun_type_searchengine},
  preview: function(previewBlock, inputObject, queryModifiers) {
    var searchEngine = queryModifiers["with"].data;
    if(!searchEngine)
      searchEngine = noun_type_searchengine.getDefault();
    
    var previewTemplate = "Search using <b>${engine}</b> for:<br /><b>${query}</b>";
    var previewData = {
      engine: searchEngine.name,
      query: inputObject.text
    };
    previewBlock.innerHTML = CmdUtils.renderTemplate(previewTemplate, previewData);
  },
  execute: function(inputObject, queryModifiers) {
    var searchEngine = queryModifiers["with"].data;
    if(!searchEngine)
      searchEngine = noun_type_searchengine.getDefault();
    
    var searchSubmission = searchEngine.getSubmission(inputObject.text, null);
    openUrl(searchSubmission.uri.spec, searchSubmission.postData);
  }
});



function openUrl(urlString, postData) {
  var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"]
    .getService(Components.interfaces.nsIWindowMediator);
  var browserWindow = windowManager.getMostRecentWindow("navigator:browser");
  var browser = browserWindow.getBrowser();
  
  if(browser.mCurrentBrowser.currentURI.spec == "about:blank")
    browserWindow.loadURI(urlString, null, postData, false);
  else
    browser.loadOneTab(urlString, null, null, postData, false, false);
};