// Modified version of the Blair McBride's wikipedia command to search in all languages

function fetchWikipediaArticle(previewBlock, articleTitle, lang) {
  var apiUrl = "http://" + lang + ".wikipedia.org/w/api.php";
  var apiParams = {
    format: "json",
    action: "parse",
    page: articleTitle
  };

  jQuery.ajax({
    type: "GET",
    url: apiUrl,
    data: apiParams,
    datatype: "string",
    error: function() {
      previewBlock.innerHTML = "<i>Error retreiving summary.</i>";
    },
    success: function(responseData) {
      responseData = Utils.decodeJson(responseData);

      var tempElement = CmdUtils.getHiddenWindow().document.createElementNS("http://www.w3.org/1999/xhtml", "div");
      tempElement.innerHTML = responseData.parse.text["*"];

      //take only the text from summary because links won't work either way
      var articleSummary = jQuery(tempElement).find('p').eq(0).text();
      //remove citations [3], [citation needed], etc.
      //TODO: also remove audio links (.audiolink & .audiolinkinfo)
      articleSummary = articleSummary.replace(/\[([^\]]+)\]/g,"");

      //TODO: remove "may refer to" summaries

      var articleImageSrc = jQuery(tempElement).find(".infobox img").attr("src") ||
      jQuery(tempElement).find(".thumbimage").attr("src");

      var previewTemplate = "<img src=\"${img}\" style=\"float: left; max-width: 80px; max-height: 80px; background-color: white;\" />" +
      "<span class=\"wikisummary\">${summary}</span>";

      var previewData = {
        img: articleImageSrc,
        summary: articleSummary
      };

      previewBlock.innerHTML = CmdUtils.renderTemplate(previewTemplate, previewData);
    }
  });
}

CmdUtils.CreateCommand({
  name: "wikipedia",
  takes: {search: noun_arb_text},
  modifiers: {in: noun_arb_text},
  homepage: "http://ubiquity.nosecret.ru/wikipedia-lang",
  author: {name: "Viktor Pyatkovka", email: "info@nosecret.ru"},
  license: "MPL",
  icon: "http://en.wikipedia.org/favicon.ico",
  description: "Searches Wikipedia for your words in all languages.",
  preview: function(previewBlock, directObject, mods) {
  	var lang = mods.in.text || "en";
    var apiUrl = "http://" + lang + ".wikipedia.org/w/api.php";

    var searchText = jQuery.trim(directObject.text);
    if(searchText.length < 1) {
      previewBlock.innerHTML = "Searches Wikipedia";
      return;
    }

    var previewTemplate = "Searching Wikipedia for <b>${query}</b> ...";
    var previewData = {query: searchText};
    previewBlock.innerHTML = CmdUtils.renderTemplate(previewTemplate, previewData);

    var apiParams = {
      format: "json",
      action: "query",
      list: "search",
      srlimit: 5, // is this a good limit?
      srwhat: "text",
      srsearch: searchText
    };

    jQuery.ajax({
      type: "GET",
      url: apiUrl,
      data: apiParams,
      datatype: "string",
      error: function() {
        previewBlock.innerHTML = "Error searching Wikipedia";
      },
      success: function(searchReponse) {
        searchReponse = Utils.decodeJson(searchReponse);

        if(!("query" in searchReponse && "search" in searchReponse.query)) {
          previewBlock.innerHTML = "Error searching Wikipedia";
          return;
        }

        function generateWikipediaLink(title) {
          var wikipediaUrl = "http://" + lang + ".wikipedia.org/wiki/";
          return wikipediaUrl + title.replace(/ /g, "_");
        }

        previewData = {
          query: searchText,
          results: searchReponse.query.search,
          _MODIFIERS: {wikilink: generateWikipediaLink}
        };

        previewBlock.innerHTML = CmdUtils.renderTemplate({file:"wikipedia.html"}, previewData);

        jQuery(previewBlock).find("div[wikiarticle]").each(function() {
          var article = jQuery(this).attr("wikiarticle");
          fetchWikipediaArticle(this, article, lang);
        });

      }
    });
  },
  execute: function(directObject, mods) {
  	var lang = mods.in.text || "en";
    var searchUrl = "http://" + lang + ".wikipedia.org/wiki/Special:Search";
    var searchParams = {search: directObject.text};
    openUrl(searchUrl + Utils.paramsToString(searchParams));
  }
});

