/* This bit of Javascript is meant to be used with Ubiquity, see 
   http://labs.mozilla.com/2008/08/introducing-ubiquity/
*/
noun_type_tempunit = new CmdUtils.NounType( "Unit",
  ["C", "F", "K", "Celsius", "Farenheit", "Kelvin"] 
  );


CmdUtils.CreateCommand({
  names: ["temp"],
  author: { name: "Jean-Philippe Martin", email: "pandamail@fastmail.fm"},
  contributors: ["JP Martin"],
  license: "BSD",
  description: "temperature converter",
  homepage: "http://www.jpemartin.com/ubiq/temp.html",
  help: "try 25C",

  //takes: {"temperature": noun_arb_text},
  //modifiers: {"in": noun_type_tempunit},

  arguments: [{role: 'object', nountype: noun_arb_text, label: 'temperature'},
              {role: 'format', nountype: noun_arb_text, label: 'unit'}],



  preview: function( pblock, args ) {
    var v = this._conv(args)
    // image thanks to the Open Clipart Library, based on art from "twb"
    if (v[1].length>1) {
      v[1]=' = '+v[1] 
      var data = "iVBORw0KGgoAAAANSUhEUgAAAAsAAAAaCAYAAABhJqYYAAAAAXNSR0IArs4c6QAAAAZiS0dE\n"
+"AP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gIHhclJ+afj/YAAAAZ\n"
+"dEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAABXUlEQVQ4y43TQUtUURjG8d/c\n"
+"q42YoDhlUISbQXTdrn2QubGNBi1a5iK/Tx+gDESxIaSoteRCpNqE0k5CpJkbg1hTw8xtMQ3c\n"
+"uZ7ReeDAy3v+PLzvczj0agazLlO5XH60tbXZqlRet+bmZp9cCK+sPF1PkmqaJNV0dfVZJcQM\n"
+"dYsoiuJu3Wj8uYa7OXZ3KOQQx/Ff1HLtNAgXi1fOcNB3jNOXa47evgM/arVx3ME+0nNwu17X\n"
+"rNdBk2GU+jpnNUoV7weCW2HnJAg3mAxEtx2Er3KCN/l+FILbxBgbCP7NFO7n7/uNcYyNgdJI\n"
+"KegkklUzCJ9xE8u59loQHuM7Xgy0YD914dGY6cwit0PRgXu82iHd+38+ks6zGXK+/oClYqY5\n"
+"jAUe4lYenhwPzD7Ria+Uh7994SgPf+o8zNee74b0kM8lFqcZaeMDp895/IvDLFzI1DcmWCgQ\n"
+"/WRbx7lH/wBJDFmOvG90hQAAAABJRU5ErkJggg=="
      pblock.innerHTML = '<img src="data:image/png;base64,'+data+'"> '+v[0]+v[1]+".";
    } else {
      pblock.innerHTML = '';
    }
  },
  execute: function( args ) {
    var v = this._conv( args )
    var lret = v[0]+" = "+v[1]+".";
    
    if (CmdUtils.getSelection().length>0) {
       CmdUtils.setSelection( v[1] );
       lret += '<br/>(changed page body)'
    }
    displayMessage( lret );

  },

  _conv:function(args) {
     var txt = args.object.text;
     var mods = '';
     if (null!=args.format) mods = args.format.text;
     var ending = /[0-9] ?(C|F|K|c|f|k)[ ]*(to C|to F|to K|to c|to f|to k)?$/;
     var beginning = /^[0-9]+ ?(C|F|K|c|f|k)/;
     var num = parseFloat(txt)
     var unit = null
     var destUnit = 'x'
     var v = txt.match(ending);
     if (null==v) {
        // no match, try another way to get the unit
        v = txt.match(beginning);
     }
     if (null!=v) {
        num = parseFloat( txt.substring(0,txt.length-1) )
        unit=v[1].toUpperCase()
     }
     destUnit = mods.in.text
     if (destUnit=='' || destUnit==' ') destUnit=null;
     if (null!=destUnit && destUnit!='') destUnit = destUnit.substring(0,1).toUpperCase()

     if (destUnit==null && null!=v && v.length>2) { 
        var vv=v[2];
        if (null!=vv) destUnit = vv.substr(vv.length-1,1).toUpperCase()
     }
     if (destUnit!=null && ['C','F','K'].indexOf(destUnit)<0) destUnit=null;
     if (null==destUnit && unit!=null) {
        destUnit = (unit=='C'?'F':'C')
     }
     if (destUnit!=null && unit==null) {
        if (destUnit=='C') unit='F'
        else if (destUnit=='F') unit='C'
        else if (destUnit=='K') unit='C'
     }
     if (unit==null && num!=null) {
        // return [txt,"?"];
        // guess at the unit!
        if (num<-50) { unit='K'; destUnit='C'; }
        else if (num<50) { unit='C'; destUnit='F'; }
        else { unit='F'; destUnit='C'; }
     }

     var k;
     if (unit=='C') k = num+273.15;
     else if (unit=='F') k = (num+459.67)*5/9.0;
     else k = num

     var res=0
     if (destUnit=='C') res = k-273.15;
     else if (destUnit=='F') res = (k*9/5.0)-459.67;
     else { res = k; destUnit='K'; }

     if (isNaN(num)) return [this.help,'']
     return [num+" "+unit, res.toFixed(2)+" "+destUnit]
  }
})
