/* this would be nice, but it doesn't work right
var noun_cust_country = {
  _name: "country name",

  suggest: function( text, html ) {
         
    var suggestions  = [];
    var i=0;
    if (null!=flag_verb_cached_countries)
      for (i=0;i<flag_verb_cached_countries.length;i++) {
        var name = flag_verb_cached_countries[i];
        if (name.match(text, "i"))
	   suggestions.push( CmdUtils.makeSugg(name) );
      }

    // Return a list of input objects, limited to at most five:
    suggestions = suggestions.splice(0, 6);
    // if we don't return at least one suggestion, the verb doesn't work.
    // that's too bad, because I really want to just wait until we've loaded stuff
    if (suggestions.length<1) suggestions.push( CmdUtils.makeSugg(text) );
    return suggestions;
  }
};
*/

var flag_verb_cached_countries = null;

CmdUtils.CreateCommand({
  names: ["flag"],
  author: { name: "Jean-Philippe Martin", email: "pandamail@fastmail.fm"},
  contributors: ["JP Martin"],
  license: "BSD",
  description: "Country -&gt; its flag",
  homepage: "http://www.jpemartin.com/ubiq/",

  //takes: {"country":noun_arb_text},
  //takes: {"country":noun_cust_country},
  arguments: [{role: 'object', nountype: noun_arb_text}],

  _cachedK: null,
  _cachedV: null,
  _page: null,

  preview: function( pblock, args ) {
    var arg = args.object
    if (null==arg || null==arg.text || arg.text.length<1) {
       pblock.innerHTML='';
       return;
    }
    var baseUrl = "http://www.flags.net/index"+arg.text[0].toLowerCase()+'.htm';   
    pblock.innerHTML='Looking for flag for '+arg.text+'... <div id="result" style="display:none">...</div>'
    if (this._cachedK==null || this._cachedK!=baseUrl) {
       this._loadIndex(baseUrl,pblock,arg.text,this);
    } else {
       this._pageLoaded(pblock,arg.text,this);
    }
  },

/* can't load the flag div without pblock :(
  execute: function(arg) {
    this._pageLoaded(null,arg.text,this);
    if (null!=this._page)
      Application.activeWindow.open(Utils.url(this._page));
    else
      displayMessage('Flag not found; page='+this._page);
  },
*/

  _stripVowelAccent:function(str) {
    var s=str;

    var rExps=[ /[\xC0-\xC2]/g, /[\xE0-\xE2]/g,
      /[\xC8-\xCA]/g, /[\xE8-\xEB]/g,
      /[\xCC-\xCE]/g, /[\xEC-\xEE]/g,
      /[\xD2-\xD4]/g, /[\xF2-\xF4]/g,
      /[\xD9-\xDB]/g, /[\xF9-\xFB]/g ];

    var repChar=['A','a','E','e','I','i','O','o','U','u'];

    for(var i=0; i<rExps.length; i++)
      s=s.replace(rExps[i],repChar[i]);

    return s;
  },

  _pageLoaded:function(pblock, name, zis) {
      //displayMessage('pageLoaded')
      var res = pblock.getElementsByTagName('div');
      res.item(0).innerHTML=this._cachedV;
      var r2 = res.item(0).getElementsByTagName('img');
      //displayMessage('there are '+r2.length+' images');
      var i=0;
      var ret = null;
      var flagDesc = '';
      flag_verb_cached_countries = new Array();
      for (i=0;i<r2.length;i++) {
        var x = r2[i].alt;
        var boo='Flag of';
        if (x!=null && x.length>boo.length && x.substr(0,boo.length)==boo) x=x.substring(boo.length,x.length)
        x=x.replace('>','&gt;');
        x=x.replace('<','&lt;');
        if (null!=x && x.substr(0,1).toLowerCase()==name[0].toLowerCase())
           flag_verb_cached_countries.push(x); 
        if (this._stripVowelAccent(r2[i].alt.toUpperCase()).indexOf(this._stripVowelAccent(name.toUpperCase()))>=0) {
           flagDesc = r2[i].alt;
           //displayMessage('found');
           //displayMessage(r2[i].src);
           ret = r2[i].src;
        }
      }
      var ret2=null;
      // now search for links, for the action
      var r2 = res.item(0).getElementsByTagName('a');
      for (i=0;i<r2.length;i++) {
        var x = r2[i].title;
        if (this._stripVowelAccent(x.toUpperCase()).indexOf(this._stripVowelAccent(name.toUpperCase()))>=0) {
           ret2 = r2[i].href;
           ret2 = ret2.replace('chrome://ubiquity/content/','')
           ret2 = 'http://www.flags.net/'+ret2;                            
        }
      }
      this._page = ret2;
      if (null!=ret2) flagDesc = '<a href="'+ret2+'">'+flagDesc+'</a>'
      if (null!=ret) {
         var prefix='chrome://ubiquity/content/'
         if (ret.length>prefix.length && ret.substring(0,prefix.length)==prefix) ret = ret.substring(prefix.length, ret.length);
         //displayMessage('Final: '+ret)
         if (null!=pblock) pblock.innerHTML=flagDesc+' <img src="http://www.flags.net/'+ret+'"/> <br/>image courtesy of http://www.flags.net/';
      } else {
         if (null1=pblock) pblock.innerHTML+='Sorry, no flag found for '+name;
      }
  },

  _loadIndex:function(url, pblock, name, zis) {
    //displayMessage('loadIndex('+url+')')
    jQuery.get( url, {}, function( page ) {
      //displayMessage("page loaded");
      zis._cachedV=page;
      zis._cachedK=url;
      zis._pageLoaded(pblock, name, zis);
    });
  },

})
