Advertisement
Guest User

gdic.js

a guest
Jun 29th, 2011
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var gd12 = {
  2. init : function(evt)
  3. {
  4.    gd12debug.log("gd12.init starts");
  5.  
  6.    gd12.prefs.read();
  7.  
  8.    var appcontent = document.getElementById("appcontent");   // browser
  9.    if (appcontent)
  10.    {
  11.        appcontent.addEventListener("load", gd12.contentLoadHandler, true);
  12.    }
  13.  
  14.    var contextMenu = document.getElementById("contentAreaContextMenu");
  15.    if (contextMenu)
  16.    {
  17.       contextMenu.addEventListener("popupshown",
  18.                   gd12.cmPopupShownHandler, false);
  19.    }
  20.  
  21.    window.addEventListener("keydown", gd12.keydownHandler, true);
  22.  
  23.    gd12debug.log("gd12.init ends");
  24. },
  25.  
  26. contentLoadHandler : function(evt)
  27. {
  28.    gd12debug.log("gd12.contentLoadHandler starts");
  29.  
  30.    var doc = evt.originalTarget;
  31.    if (doc instanceof HTMLDocument)
  32.    {
  33.       // register mouse handlers
  34.       // we register them with content documents only because we
  35.       // do not want the events fired when user click on menues, etc.
  36.       doc.addEventListener("click", gd12.clickHandler, true);
  37.       doc.addEventListener("mousemove", gd12.mousemoveHandler, true);
  38.  
  39.       // redundant. clean the inline translation flag.
  40.       gd12.dicInline.isTranslating = false;
  41.    }
  42.  
  43.    gd12debug.log("gd12.contentLoadHandler ends");
  44. },
  45.  
  46. cmPopupShownHandler : function(evt)
  47. {
  48.    // Google Dictionary menu
  49.    var cmItem = document.getElementById("gd12gdicCM");
  50.  
  51.    if (cmItem)
  52.    {
  53.       if (gd12.prefs.isGDicInContextMenu && !gd12.isInlineDicOff)
  54.       {
  55.          if (gContextMenu.isTextSelected)
  56.             cmItem.hidden = false;
  57.          else
  58.          {
  59.             cmItem.hidden = true;
  60.  
  61.             if (gd12.prefs.isAggressive)
  62.             {
  63.                // Because it takes 0.5 second to capture a hovered word,
  64.                // we need to delay a little bit (0.6 sec) to see whether
  65.                // to show the context menu item for a hovered word.
  66.                window.setTimeout(function() {
  67.                         if (gd12.hover.word && gd12.hover.word.length > 0)
  68.                            cmItem.hidden = false;
  69.                      },
  70.                      600);
  71.             }
  72.          }
  73.       }
  74.       else
  75.       {
  76.          cmItem.hidden = true;
  77.       }
  78.    }
  79.  
  80.    // Translate Page menu
  81.    var cmTItem = document.getElementById("gd12gtrnCM");
  82.  
  83.    if (cmTItem)
  84.    {
  85.       if (gd12.prefs.isGTransInContextMenu)
  86.          cmTItem.hidden = false;
  87.       else
  88.          cmTItem.hidden = true;
  89.    }
  90. },
  91.  
  92. // Context menu oncommand handler
  93. lookupSelectedOrHovered : function()
  94. {
  95.    if (gContextMenu.isTextSelected)
  96.    {
  97.       gd12.select.lookupSelected();
  98.    }
  99.    else if (gd12.prefs.isAggressive &&
  100.             gd12.hover.word && gd12.hover.word.length > 0)
  101.    {
  102.       gd12.hover.translate();
  103.    }
  104. },
  105.  
  106. clickHandler : function(evt)
  107. {
  108.    //gd12debug.log("gd12.clickHandler starts");
  109.  
  110.    if (2 == evt.detail)
  111.    {
  112.       // set for gd12.select.lookupSelected()
  113.       gd12.select.mouseX = evt.screenX;
  114.       gd12.select.mouseY = evt.screenY;
  115.  
  116.       if (gd12.prefs.isDoubleClick)
  117.       {
  118.          gd12.select.lookup(evt);
  119.       }
  120.    }
  121.    else if (1 == evt.detail)
  122.    {
  123.       // set for gd12.select.lookupSelected()
  124.       gd12.select.mouseX = evt.screenX;
  125.       gd12.select.mouseY = evt.screenY;
  126.  
  127.       if (gd12.prefs.isSelect)
  128.       {
  129.          gd12.select.lookup(evt);
  130.       }
  131.    }
  132.  
  133.    //gd12debug.log("gd12.clickHandler ends");
  134. },
  135.  
  136. mousemoveHandler : function(evt)
  137. {
  138.    //gd12debug.log("gd12.mousemoveHandler starts");
  139.  
  140.    // feature: moving mouse away to close the popup.
  141.    if (gd12.prefs.isMouseMoveClosePopup &&
  142.          gd12.dicInline.isTranslating &&
  143.          gd12.popup.popup && gd12.popup.popup.state == "open")
  144.    {
  145.       if (0 == gd12.popup.xWhenPopup && 0 == gd12.popup.yWhenPopup)
  146.       {
  147.          // first mouse movement after popup.
  148.          gd12.popup.xWhenPopup = evt.screenX;
  149.          gd12.popup.yWhenPopup = evt.screenY;
  150.       }
  151.       else
  152.       {
  153.          if (evt.screenX + 100 < gd12.popup.xWhenPopup
  154.                || evt.screenX > gd12.popup.xWhenPopup + 100
  155.                || evt.screenY + 100 < gd12.popup.yWhenPopup
  156.                || evt.screenY > gd12.popup.yWhenPopup + 100)
  157.          {
  158.             // mouse has moved some distance.
  159.             gd12.popup.close();
  160.          }
  161.       }
  162.    }
  163.  
  164.    var isToCapture = false;
  165.    var isToTranslate = false;
  166.  
  167.    if (gd12.prefs.isAggressive)
  168.    {
  169.       isToCapture = true;
  170.    }
  171.  
  172.    if (gd12.prefs.isCtrlHover)
  173.    {
  174.       if (gd12.prefs.isCtrlShiftHover)
  175.       {
  176.          if (evt.ctrlKey && evt.shiftKey && !evt.altKey && !evt.metaKey)
  177.          {
  178.             isToCapture = true;
  179.             isToTranslate = true;
  180.          }
  181.       }
  182.       else if (gd12.prefs.isCtrlAltHover)
  183.       {
  184.          if (evt.ctrlKey && !evt.shiftKey && evt.altKey && !evt.metaKey)
  185.          {
  186.             isToCapture = true;
  187.             isToTranslate = true;
  188.          }
  189.       }
  190.       else
  191.       {
  192.          // Ctrl only + hover
  193.          if (evt.ctrlKey && !evt.shiftKey && !evt.altKey && !evt.metaKey)
  194.          {
  195.             isToCapture = true;
  196.             isToTranslate = true;
  197.          }
  198.       }
  199.    }
  200.  
  201.    if (isToCapture)
  202.       gd12.hover.capture(evt, isToTranslate);
  203.  
  204.    //gd12debug.log("gd12.mousemoveHandler ends");
  205. },
  206.  
  207. keydownHandler : function(evt)
  208. {
  209.    //gd12debug.log("gd12.keydownHandler starts");
  210.  
  211.    if (gd12.prefs.isCtrlHover && gd12.prefs.isAggressive)
  212.    {
  213.       var isToTranslate = false;
  214.  
  215.       if (gd12.prefs.isCtrlShiftHover)
  216.       {
  217.          if ((KeyEvent.DOM_VK_CONTROL == evt.keyCode &&
  218.                        evt.shiftKey && !evt.altKey && !evt.metaKey)
  219.                || (KeyEvent.DOM_VK_SHIFT == evt.keyCode &&
  220.                        evt.ctrlKey && !evt.altKey && !evt.metaKey))
  221.          {
  222.             isToTranslate = true;
  223.          }
  224.       }
  225.       else if (gd12.prefs.isCtrlAltHover)
  226.       {
  227.          if ((KeyEvent.DOM_VK_CONTROL == evt.keyCode &&
  228.                        !evt.shiftKey && evt.altKey && !evt.metaKey)
  229.                || (KeyEvent.DOM_VK_ALT == evt.keyCode &&
  230.                        evt.ctrlKey && !evt.shiftKey && !evt.metaKey))
  231.          {
  232.             isToTranslate = true;
  233.          }
  234.       }
  235.       else
  236.       {
  237.          if (KeyEvent.DOM_VK_CONTROL == evt.keyCode &&
  238.             !evt.shiftKey && !evt.altKey && !evt.metaKey)
  239.          {
  240.             isToTranslate = true;
  241.          }
  242.       }
  243.  
  244.       if (isToTranslate)
  245.       {
  246.          if (gd12.dicInline.isTranslating)
  247.          {
  248.             gd12debug.log("gd12.keydownHandler isTranslating");
  249.          }
  250.          else
  251.          {
  252.             gd12.hover.keydownTimeoutId =
  253.                window.setTimeout(gd12.hover.translate, 500);
  254.          }
  255.       }
  256.       else
  257.       {
  258.          if (gd12.hover.keydownTimeoutId)
  259.          {
  260.             window.clearTimeout(gd12.hover.keydownTimeoutId);
  261.  
  262.             gd12.hover.keydownTimeoutId = null;
  263.          }
  264.  
  265.          gd12.popup.close();
  266.       }
  267.    }
  268.  
  269.    //gd12debug.log("gd12.keydownHandler ends");
  270. },
  271.  
  272. // decode HTML entity in string
  273. // e.g. "&amps;" -> "&"
  274. decodeHtmlEntities: function(str)
  275. {
  276.    if (str.indexOf("&") >= 0)
  277.    {
  278.       var div = getBrowser().contentDocument.createElement("div");
  279.       div.innerHTML = str;
  280.       return div.textContent;
  281.    }
  282.  
  283.    return str;
  284. },
  285.  
  286. select : {
  287. lookup : function(evt)
  288. {
  289.    gd12debug.log("gd12.select.lookup starts");
  290.  
  291.    var myWin = evt.originalTarget.ownerDocument.defaultView;
  292.  
  293.    gd12.select.mouseX = evt.screenX;
  294.    gd12.select.mouseY = evt.screenY;
  295.  
  296.    gd12.select.lookupInWin(myWin);
  297.  
  298.    gd12debug.log("gd12.select.lookup ends");
  299. },
  300.  
  301. lookupSelected : function()
  302. {
  303.    gd12debug.log("gd12.select.lookupSelected starts");
  304.  
  305.    var myWin = window.content;
  306.  
  307.    // gd12.select.mouseX and gd12.select.mouseY were set by
  308.    // gd12.clickHandler()
  309.  
  310.    if (myWin)
  311.       gd12.select.lookupInWin(myWin);
  312.  
  313.    gd12debug.log("gd12.select.lookupSelected ends");
  314. },
  315.  
  316. lookupInWin : function(myWin)
  317. {
  318.    gd12debug.log("gd12.select.lookupInWin starts");
  319.  
  320.    if (myWin.location.protocol == "https:")
  321.       gd12.dicInline.protocol = "https:";
  322.    else
  323.       gd12.dicInline.protocol = "http:";
  324.  
  325.    var selected = myWin.getSelection();
  326.  
  327.    gd12debug.log("gd12.select.lookupInWin selected:" + selected);
  328.  
  329.    if (selected)
  330.    {
  331.       var word = selected.toString();
  332.  
  333.       if (word && word.length > 0)
  334.       {
  335.          gd12debug.log("gd12.select.lookupInWin word:" + word);
  336.  
  337.          gd12.dicInline.translate(word, gd12.select.showPopup);
  338.       }
  339.    }
  340.  
  341.    gd12debug.log("gd12.select.lookupInWin ends");
  342. },
  343.  
  344. showPopup: function()
  345. {
  346.    gd12.popup.open(gd12.select.mouseX, gd12.select.mouseY + 18);
  347. },
  348.  
  349. mouseX : 0,
  350. mouseY : 0,
  351.  
  352. },   // gd12.select
  353.  
  354. hover : {
  355. capture : function(evt, isToTranslate)
  356. {
  357.    //gd12debug.log("gd12.hover.capture starts");
  358.  
  359.    gd12.hover.word = null;
  360.  
  361.    if (gd12.dicInline.isTranslating)
  362.    {
  363.       return;
  364.    }
  365.  
  366.    if (!evt.rangeParent || !evt.rangeParent.nodeType ||
  367.          (evt.rangeParent.nodeType != Node.TEXT_NODE))
  368.    {
  369.       return;
  370.    }
  371.  
  372.    var myWin = evt.originalTarget.ownerDocument.defaultView;
  373.    if (myWin.location.protocol == "https:")
  374.       gd12.dicInline.protocol = "https:";
  375.    else
  376.       gd12.dicInline.protocol = "http:";
  377.  
  378.    gd12.hover.mouseX = evt.screenX;
  379.    gd12.hover.mouseY = evt.screenY;
  380.  
  381.    if (gd12.hover.mousemoveTimeoutId)
  382.       window.clearTimeout(gd12.hover.mousemoveTimeoutId);
  383.  
  384.    gd12.hover.mousemoveTimeoutId = window.setTimeout(
  385.          gd12.hover.getPointedWord,
  386.          500,
  387.          evt.rangeParent,
  388.          evt.rangeOffset,
  389.          gd12.hover.mouseX,
  390.          gd12.hover.mouseY,
  391.          isToTranslate);
  392.  
  393.    //gd12debug.log("gd12.hover.capture ends");
  394. },
  395.  
  396. getPointedWord : function(parnt, offset, x, y, isToTranslate)
  397. {
  398.    gd12debug.log("gd12.hover.getPointedWord starts: offset:" + offset
  399.                  + ", x:" + x + ", y:" + y);
  400.  
  401.    gd12.hover.word = null;
  402.  
  403.    if (gd12.hover.mouseX != x || gd12.hover.mouseY != y)
  404.    {
  405.       gd12debug.log("gd12.hover.getPointedWord Mouse moved away");
  406.       return;
  407.    }
  408.  
  409.    var text = parnt.textContent;
  410.  
  411.    if (text && text.length > 0)
  412.    {
  413.       gd12.hover.word = gd12.hover.getWord(text, offset);
  414.  
  415.       if (isToTranslate)
  416.          gd12.dicInline.translate(gd12.hover.word, gd12.hover.showPopup);
  417.    }
  418.  
  419.    gd12debug.log("gd12.hover.getPointedWord ends");
  420. },
  421.  
  422. getWord: function(text, offset)
  423. {
  424.    gd12debug.log("gd12.hover.getWord starts: text:" + text + ", offset:" + offset);
  425.  
  426.    var ch = text.charAt(offset);
  427.  
  428.    gd12debug.log("gd12.hover.getWord charAt(offset):" + ch);
  429.  
  430.    if (!ch || ch.length == 0 || gd12.hover.isSymbol(ch))
  431.    {
  432.       gd12debug.log("gd12.hover.getWord: no word");
  433.       return null;
  434.    }
  435.  
  436.    var len = text.length;
  437.    var s = offset;
  438.    var e = offset + 1;
  439.  
  440.    while (s > 0)
  441.    {
  442.       s--;
  443.      
  444.       ch = text.charAt(s);
  445.  
  446.       if (gd12.hover.isSymbol(ch))
  447.       {
  448.          // separator
  449.          s++;
  450.          break;
  451.       }
  452.    }
  453.  
  454.    while (e < len)
  455.    {
  456.       ch = text.charAt(e);
  457.  
  458.       if (gd12.hover.isSymbol(ch))
  459.       {
  460.          // separator
  461.          break;
  462.       }
  463.  
  464.       e++;
  465.    }
  466.  
  467.    var word = text.substring(s, e);
  468.  
  469.    gd12debug.log("gd12.hover.getWord returns: " + word);
  470.  
  471.    return word;
  472. },
  473.  
  474. isSymbol: function(ch)
  475. {
  476.    if (ch < 'A' ||
  477.          (ch > 'Z' && ch <'a') ||
  478.          (ch > 'z' && ch <= '\x7f') ||
  479.          (ch >= '\u0080' && ch <= '\u00BF') ||
  480.          (ch >= '\u3000' && ch <= '\u303F') ||
  481.          (ch >= '\uFF01' && ch <= '\uFF20') ||
  482.          (ch >= '\uFF3B' && ch <= '\uFF40') ||
  483.          (ch >= '\uFF5B' && ch <= '\uFF5E'))
  484.    {
  485.       return true;
  486.    }
  487.    else
  488.       return false;
  489. },
  490.  
  491. showPopup: function()
  492. {
  493.    // gd12.hover.showPopup
  494.  
  495.    gd12.popup.open(gd12.hover.mouseX, gd12.hover.mouseY + 18);
  496. },
  497.  
  498. translate: function()
  499. {
  500.    // gd12.hover.translate
  501.    // after 500ms delay. we need to check the isTranslating flag again.
  502.  
  503.    if (!gd12.dicInline.isTranslating)
  504.    {
  505.       gd12.dicInline.translate(gd12.hover.word, gd12.hover.showPopup);
  506.    }
  507. },
  508.  
  509. mouseX : 0,
  510. mouseY : 0,
  511. mousemoveTimeoutId : null,
  512.  
  513. keydownTimeoutId : null,
  514.  
  515. word : null,
  516. },   // gd12.hover
  517.  
  518. dicInline : {
  519. translate: function(word, callback)
  520. {
  521.    gd12debug.log("gd12.dicInline.translate starts");
  522.  
  523.    if (gd12.isInlineDicOff)
  524.       return;
  525.  
  526.    // reset
  527.    gd12.resp.isTranslated = false;
  528.    gd12.dicInline.word = null;
  529.    gd12.dicInline.pendingReqCount = 0;
  530.  
  531.    if (word && word.length > 0)
  532.    {
  533.       word = word.replace(/^\s+|\s+$/g, "");  // trim spaces.
  534.  
  535.       gd12.dicInline.word = word;
  536.  
  537.       callback();   // ...showPopup()
  538.  
  539.       var ori = document.getElementById("gd12popupOrig");
  540.       ori.textContent = gd12.dicInline.word;
  541.  
  542.       if (gd12.prefs.isDetectLangDisabled)
  543.       {
  544.          if (gd12.lang.isSupportedByGDic(gd12.prefs.srcLang, gd12.prefs.yourLang))
  545.          {
  546.             gd12.dicInline.lookupGDic(gd12.prefs.srcLang);
  547.             gd12.dicInline.pendingReqCount++;
  548.  
  549.             if (gd12.prefs.srcLang != gd12.prefs.yourLang)
  550.             {
  551.                gd12.dicInline.lookupGTran(gd12.prefs.srcLang);
  552.                gd12.dicInline.pendingReqCount++;
  553.             }
  554.          }
  555.          else
  556.          {
  557.             gd12.dicInline.lookupGTran(gd12.prefs.srcLang);
  558.             gd12.dicInline.pendingReqCount++;
  559.          }
  560.       }
  561.       else
  562.       {
  563.          if (gd12.lang.isSupportedByGDic(gd12.prefs.yourLang, gd12.prefs.yourLang))
  564.          {
  565.             gd12.dicInline.lookupGDic(gd12.prefs.yourLang);
  566.             gd12.dicInline.pendingReqCount++;
  567.          }
  568.  
  569.          gd12.dicInline.lookupGTran("");  // use auto-detection.
  570.          gd12.dicInline.pendingReqCount++;
  571.       }
  572.    }
  573.  
  574.    gd12debug.log("gd12.dicInline.translate ends");
  575. },
  576.  
  577. lookupGTran : function(srcLang)
  578. {
  579.    var url = gd12.dicInline.protocol
  580.              + gd12.dicInline.urlGtrnPrefix
  581.              + gd12.dicInline.word;
  582.  
  583.    url = url.replace("GD12_YOUR_LANG", gd12.prefs.yourLang);
  584.    url = url.replace("GD12_SRC_LANG", srcLang);
  585.  
  586.    gd12debug.log("gd12.dicInline.lookupGTran url: " + url);
  587.  
  588.    var req = XMLHttpRequest();
  589.    req.open("GET", url, true);
  590.    req.onreadystatechange = function () {
  591.       if (req.readyState == 4)
  592.       {
  593.          gd12.dicInline.processRespGTran(req.responseText);
  594.       }
  595.    };
  596.    req.send(null);
  597. },
  598.  
  599. processRespGTran : function(respText)
  600. {
  601.    gd12.resp.parse(respText);
  602.  
  603.    gd12.popup.write();
  604.  
  605.    // Go query Google Dictionary for details.
  606.    if (gd12.resp.src && gd12.resp.src.length > 0 &&
  607.          gd12.resp.src != gd12.prefs.yourLang &&
  608.          gd12.lang.isSupportedByGDic(gd12.resp.src, gd12.prefs.yourLang))
  609.    {
  610.       gd12.dicInline.lookupGDic(gd12.resp.src);
  611.    }
  612.    else
  613.    {
  614.       // this task is done.
  615.       gd12.dicInline.pendingReqCount--;
  616.    }
  617.  
  618.    gd12.dicInline.updatePopupHint();
  619. },
  620.  
  621. lookupGDic : function(srcLang)
  622. {
  623.    var url = gd12.dicInline.protocol
  624.              + gd12.dicInline.urlGdicPrefix
  625.              + gd12.dicInline.word;
  626.  
  627.    url = url.replace("GD12_YOUR_LANG", gd12.prefs.yourLang);
  628.    url = url.replace("GD12_SRC_LANG", srcLang);
  629.  
  630.    gd12debug.log("gd12.dicInline.lookupGDic url: " + url);
  631.  
  632.    var gotResult = false;
  633.    var req = XMLHttpRequest();
  634.    req.open("GET", url, true);
  635.    req.onreadystatechange = function () {
  636.       if (gotResult)
  637.          return;
  638.  
  639.       if (req.readyState == 3)   // downloading
  640.       {
  641.          gotResult = gd12.dicInline.processRespGDic(req.responseText);
  642.  
  643.          if (gotResult)
  644.          {
  645.             req.abort();
  646.  
  647.             gd12.dicInline.pendingReqCount--;
  648.             gd12.dicInline.updatePopupHint();
  649.          }
  650.       }
  651.       else if (req.readyState == 4)   // done
  652.       {
  653.          gotResult = gd12.dicInline.processRespGDic(req.responseText);
  654.  
  655.          gd12.dicInline.pendingReqCount--;
  656.          gd12.dicInline.updatePopupHint();
  657.       }
  658.    };
  659.    req.send(null);
  660. },
  661.  
  662. processRespGDic : function(respText)
  663. {
  664.    var hasResult = false;
  665.  
  666.    gd12debug.log("gd12.dicInline.processRespGDic resp len: " + respText.length);
  667.  
  668.    if (respText && respText.length > 0)
  669.    {
  670.       // extract lookup result from the response.
  671.       // only when the response strictly matches the format:
  672.       // meta name="description" content="<the meaning> - Google..."
  673.  
  674.       var ss = 'meta name="description" content="';
  675.       var i1 = respText.indexOf(ss);
  676.       if (i1 > 0)
  677.       {
  678.          i1 += ss.length;
  679.  
  680.          var i2 = respText.indexOf('"', i1);
  681.  
  682.          if (i2 > 0)
  683.          {
  684.             // found <meta name="description" content="........">
  685.             // set the return value.
  686.             hasResult = true;
  687.  
  688.             var subs = respText.substring(i1, i2);
  689.  
  690.             var i3 = subs.indexOf(" - Google");
  691.             if (i3 > 0)
  692.             {
  693.                subs = subs.substring(0, i3);
  694.  
  695.                subs = subs.replace(/^\s+|\s+$/g, "");  // trim spaces.
  696.  
  697.                if (subs.length > 0)
  698.                {
  699.                   // append to the details field in the popup.
  700.                   var det = document.getElementById("gd12popupDetails");
  701.                   var curText = det.textContent;
  702.  
  703.                   if (curText && curText.length > 0)
  704.                   {
  705.                      det.textContent = curText + "\n"
  706.                                        + gd12.decodeHtmlEntities(subs);
  707.                   }
  708.                   else
  709.                      det.textContent = gd12.decodeHtmlEntities(subs);
  710.  
  711.                   gd12debug.log("gd12.dicInline.processRespGDic details:"
  712.                         + det.textContent);
  713.  
  714.                   // clean the translate field if it is just
  715.                   // the duplicate of the original word,
  716.                   // or error("??")
  717.                   var tra = document.getElementById("gd12popupTrans");
  718.                   if (tra.textContent == gd12.dicInline.word ||
  719.                         tra.textContent == gd12.STR_ERROR)
  720.                   {
  721.                      tra.textContent = "";
  722.                   }
  723.                }
  724.             }
  725.          }
  726.       }
  727.    }
  728.  
  729.    gd12debug.log("gd12.dicInline.processRespGDic ends: " + hasResult);
  730.  
  731.    return hasResult;
  732. },
  733.  
  734. buildMoreUrlAfterLangDetect : function()
  735. {
  736.    var url = null
  737.  
  738.    if (gd12.resp.src && gd12.resp.src.length > 0 &&
  739.          gd12.lang.isSupportedByGDic(gd12.resp.src, gd12.prefs.yourLang))
  740.    {
  741.       url = gd12.dicInline.protocol
  742.                 + gd12.dicInline.urlGdicPrefix
  743.                 + gd12.dicInline.word;
  744.  
  745.       url = url.replace("GD12_YOUR_LANG", gd12.prefs.yourLang);
  746.       url = url.replace("GD12_SRC_LANG", gd12.resp.src);
  747.    }
  748.    else if (gd12.dicInline.protocol == "http:")
  749.    {
  750.       url = gd12.dicInline.urlMoreGtrnPrefix + gd12.dicInline.word;
  751.  
  752.       url = url.replace("GD12_YOUR_LANG", gd12.prefs.yourLang);
  753.  
  754.       if (gd12.prefs.isDetectLangDisabled)
  755.          url = url.replace("GD12_SRC_LANG", gd12.prefs.srcLang);
  756.       else
  757.          url = url.replace("GD12_SRC_LANG", "auto");
  758.    }
  759.  
  760.    return url;
  761. },
  762.  
  763. buildMoreUrlInit : function()
  764. {
  765.    var url = null;
  766.  
  767.    if (gd12.dicInline.word &&
  768.          gd12.prefs.isDetectLangDisabled &&
  769.          gd12.lang.isSupportedByGDic(gd12.prefs.srcLang, gd12.prefs.yourLang))
  770.    {
  771.       url = gd12.dicInline.protocol
  772.                 + gd12.dicInline.urlGdicPrefix
  773.                 + gd12.dicInline.word;
  774.  
  775.       url = url.replace("GD12_YOUR_LANG", gd12.prefs.yourLang);
  776.       url = url.replace("GD12_SRC_LANG", gd12.prefs.srcLang);
  777.    }
  778.    else
  779.    {
  780.       // translate.google.com does not support https yet.
  781.       if (gd12.dicInline.protocol == "http:" && gd12.dicInline.word)
  782.       {
  783.          url = gd12.dicInline.urlMoreGtrnPrefix + gd12.dicInline.word;
  784.  
  785.          url = url.replace("GD12_YOUR_LANG", gd12.prefs.yourLang);
  786.  
  787.          if (gd12.prefs.isDetectLangDisabled)
  788.             url = url.replace("GD12_SRC_LANG", gd12.prefs.srcLang);
  789.          else
  790.             url = url.replace("GD12_SRC_LANG", "auto");
  791.       }
  792.    }
  793.  
  794.    return url;
  795. },
  796.  
  797. updatePopupHint : function()
  798. {
  799.    if (gd12.dicInline.pendingReqCount <= 0)
  800.    {
  801.       // All queries are done.
  802.       // Clean the string "Googling ..."
  803.       var hnt = document.getElementById("gd12popupHint");
  804.       hnt.textContent = "";
  805.    }
  806. },
  807.  
  808. urlGtrnPrefix : "//ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=GD12_SRC_LANG%7CGD12_YOUR_LANG&q=",
  809. urlGdicPrefix : "//www.google.com/dictionary?aq=f&langpair=GD12_SRC_LANG%7CGD12_YOUR_LANG&q=",
  810. urlMoreGtrnPrefix : "http://translate.google.com/#GD12_SRC_LANG%7CGD12_YOUR_LANG%7C",  // https not supported
  811.  
  812. isTranslating : false,
  813.  
  814. pendingReqCount : 0,
  815.  
  816. protocol : "http:",
  817.  
  818. word : null,
  819.  
  820. },   // gd12.dicInline
  821.  
  822. popup : {
  823. open : function(x, y)
  824. {
  825.    gd12debug.log("gd12.popup.open starts");
  826.  
  827.    if (!gd12.popup.popup)
  828.       gd12.popup.popup = document.getElementById("gd12popup");
  829.  
  830.    if (gd12.popup.popup)
  831.    {
  832.       // clean up.
  833.       var ori = document.getElementById("gd12popupOrig");
  834.       ori.textContent = "";
  835.  
  836.       var tra = document.getElementById("gd12popupTrans");
  837.       tra.textContent = "";
  838.  
  839.       var puMore = document.getElementById("gd12popupMore");
  840.       var url = gd12.dicInline.buildMoreUrlInit();
  841.       if (url)
  842.       {
  843.          var onclk = "gd12.popup.close();" +
  844.             "gBrowser.selectedTab = gBrowser.addTab('" + url + "');";
  845.  
  846.          gd12debug.log("gd12.popup.open onclk:" + onclk);
  847.  
  848.          puMore.setAttribute("class", "gDicClassPopupMore");
  849.          puMore.setAttribute("onclick", onclk);
  850.       }
  851.       else
  852.       {
  853.          puMore.setAttribute("class", "gDicClassPopupMoreDisabled");
  854.          if (puMore.hasAttribute("onclick"))
  855.             puMore.removeAttribute("onclick");
  856.       }
  857.  
  858.       var det = document.getElementById("gd12popupDetails");
  859.       det.textContent = "";
  860.  
  861.       var hnt = document.getElementById("gd12popupHint");
  862.       hnt.textContent = gd12.STR_SEARCH;
  863.  
  864.       gd12.popup.popup.openPopupAtScreen(x, y, false);
  865.    }
  866.  
  867.    gd12debug.log("gd12.popup.open ends.");
  868. },
  869.  
  870. close : function()
  871. {
  872.    gd12debug.log("gd12.popup.close starts");
  873.  
  874.    if (gd12.popup.popup)
  875.    {
  876.       if (gd12.popup.popup.state == "open")
  877.          gd12.popup.popup.hidePopup();
  878.    }
  879.  
  880.    gd12debug.log("gd12.popup.close ends");
  881. },
  882.  
  883. on : function()
  884. {
  885.    gd12debug.log("gd12.popup.on starts");
  886.  
  887.    // if popup is open, stop new translation.
  888.    // if we want to change this behavior, remember to change off() too
  889.    gd12.dicInline.isTranslating = true;
  890.  
  891.    gd12.popup.xWhenPopup = 0;
  892.    gd12.popup.yWhenPopup = 0;
  893.  
  894.    gd12debug.log("gd12.popup.on ends");
  895. },
  896.  
  897. off : function()
  898. {
  899.    gd12debug.log("gd12.popup.off starts");
  900.  
  901.    gd12.dicInline.isTranslating = false;
  902.  
  903.    gd12debug.log("gd12.popup.off ends");
  904. },
  905.  
  906. write : function()
  907. {
  908.    gd12debug.log("gd12.popup.write starts");
  909.  
  910.    if (gd12.resp.isTranslated)
  911.    {
  912.       var ori = document.getElementById("gd12popupOrig");
  913.       ori.textContent = gd12.dicInline.word;
  914.  
  915.       var tra = document.getElementById("gd12popupTrans");
  916.       tra.textContent = gd12.decodeHtmlEntities(gd12.resp.trans);
  917.  
  918.       if (gd12.resp.src)
  919.       {
  920.          // the link of "more"
  921.  
  922.          var url = gd12.dicInline.buildMoreUrlAfterLangDetect();
  923.  
  924.          if (url)
  925.          {
  926.             var onclk = "gd12.popup.close();" +
  927.                "gBrowser.selectedTab = gBrowser.addTab('" + url + "');";
  928.  
  929.             gd12debug.log("gd12.popup.write onclk:" + onclk);
  930.  
  931.             var puMore = document.getElementById("gd12popupMore");
  932.             if (puMore)
  933.             {
  934.                puMore.setAttribute("class", "gDicClassPopupMore");
  935.                puMore.setAttribute("onclick", onclk);
  936.             }
  937.          }
  938.       }
  939.    }
  940.    else
  941.    {
  942.       // JSON.parse error or any errors in inline translation respone.
  943.  
  944.       var ori = document.getElementById("gd12popupOrig");
  945.       ori.textContent = gd12.dicInline.word;
  946.  
  947.       var tra = document.getElementById("gd12popupTrans");
  948.       tra.textContent = gd12.STR_ERROR;
  949.    }
  950.  
  951.    gd12debug.log("gd12.popup.write ends");
  952. },
  953.  
  954. popup : null,
  955.  
  956. xWhenPopup : 0,
  957. yWhenPopup : 0,
  958.  
  959. },  // gd12.popup
  960.  
  961. resp : {
  962. parse : function(jsonResp)
  963. {
  964.    gd12debug.log("gd12.resp.parse starts: " + jsonResp);
  965.  
  966.    gd12.resp.src = null,
  967.    gd12.resp.trans = null,
  968.    gd12.resp.isTranslated = false;
  969.  
  970.    var jrsp;
  971.    
  972.    try
  973.    {
  974.       jrsp = JSON.parse(jsonResp);
  975.    }
  976.    catch (e)
  977.    {
  978.       gd12debug.log("gd12.resp.parse exception");
  979.       return;
  980.    }
  981.  
  982.    if (jrsp)
  983.    {
  984.       if (jrsp.responseStatus && jrsp.responseStatus == 200)
  985.       {
  986.          // good response.
  987.  
  988.          if (jrsp.responseData)
  989.          {
  990.             if (jrsp.responseData.translatedText)
  991.             {
  992.                gd12.resp.trans = jrsp.responseData.translatedText;
  993.  
  994.                gd12.resp.isTranslated = true;
  995.             }
  996.  
  997.             if (jrsp.responseData.detectedSourceLanguage)
  998.             {
  999.                gd12.resp.src = jrsp.responseData.detectedSourceLanguage;
  1000.             }
  1001.          }
  1002.       }
  1003.    }
  1004.  
  1005.    gd12debug.log("gd12.resp.parse ends: isTranslated: " + gd12.resp.isTranslated);
  1006. },
  1007.  
  1008. src : null,   // detected source language
  1009. trans : null,
  1010.  
  1011. isTranslated : false,
  1012. },   // gd12.resp
  1013.  
  1014. translatePage : {
  1015. run : function()
  1016. {
  1017.    gd12debug.log("gd12.translatePage.run starts");
  1018.  
  1019.    var doc = getBrowser().contentDocument;
  1020.  
  1021.    var s1 = doc.createElement("script");
  1022.    s1.type = "text/javascript";
  1023.  
  1024.    s1.innerHTML = gd12.translatePage.func.replace(
  1025.          "GD12_YOUR_LANG", gd12.prefs.yourLang);
  1026.  
  1027.    var s2 = doc.createElement("script");
  1028.    s2.type = "text/javascript";
  1029.  
  1030.    s2.src = gd12.translatePage.url.replace(
  1031.          "GD12_YOUR_LANG", gd12.prefs.yourLang);
  1032.  
  1033.    var elm = doc.getElementsByTagName("head")[0];
  1034.  
  1035.    if (elm)
  1036.    {
  1037.       elm.appendChild(s1);
  1038.       elm.appendChild(s2);
  1039.    }
  1040.  
  1041.    gd12debug.log("gd12.translatePage.run ends");
  1042. },
  1043.  
  1044. func : "function googleTranslateElementInit() { var tElem = new google.translate.TranslateElement({ autoDisplay: false, pageLanguage: 'auto', includedLanguages: 'GD12_YOUR_LANG' }); setTimeout(function() { tElem.showBanner(true); }, 100);}",   // showBanner(autoTrans=true)
  1045. url : "//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit&hl=GD12_YOUR_LANG",
  1046. },   // gd12.translatePage
  1047.  
  1048. prefs : {
  1049. read : function()
  1050. {
  1051.    gd12debug.log("gd12.prefs.read starts");
  1052.  
  1053.    var prefs = Components.classes["@mozilla.org/preferences-service;1"]
  1054.                .getService(Components.interfaces.nsIPrefService);
  1055.    var myprefs = prefs.getBranch("extensions.gdic_gtrans.");
  1056.  
  1057.    gd12.prefs.yourLang = myprefs.getCharPref("yourLanguage");
  1058.    gd12.prefs.isSelect = myprefs.getBoolPref("enableSelect");
  1059.    gd12.prefs.isDoubleClick = myprefs.getBoolPref("enableDoubleClick");
  1060.  
  1061.    gd12.prefs.isCtrlHover = myprefs.getBoolPref("enableCtrlHover");
  1062.    gd12.prefs.isCtrlShiftHover = gd12.prefs.isCtrlHover && myprefs.getBoolPref("isCtrlShiftHover");
  1063.    gd12.prefs.isCtrlAltHover = gd12.prefs.isCtrlHover && myprefs.getBoolPref("isCtrlAltHover");
  1064.  
  1065.    gd12.prefs.isAggressive = myprefs.getBoolPref("aggressiveMode");
  1066.    gd12.prefs.isMouseMoveClosePopup = myprefs.getBoolPref("mouseMoveClosePopup");
  1067.    gd12.prefs.isGDicInContextMenu = myprefs.getBoolPref("gdicInContextMenu");
  1068.    gd12.prefs.isGTransInContextMenu = myprefs.getBoolPref("gtransInContextMenu");
  1069.  
  1070.    gd12.prefs.isDetectLangDisabled = myprefs.getBoolPref("disableAutoDetectLanguage");
  1071.    gd12.prefs.srcLang = myprefs.getCharPref("srcLanguage");
  1072.  
  1073.    gd12.prefs.isMyStyle = myprefs.getBoolPref("enableMyStyle");
  1074.    gd12.prefs.myStyle = myprefs.getCharPref("myStyle");
  1075.  
  1076.    if (gd12.prefs.yourLang.length == 0)
  1077.    {
  1078.       // try to set as the browser's language.
  1079.       var gprefs = prefs.getBranch("general.useragent.");
  1080.       if (gprefs)
  1081.       {
  1082.          var browserLang = gprefs.getCharPref("locale");
  1083.  
  1084.          if (browserLang)
  1085.          {
  1086.             if (browserLang == "zh-CN" || browserLang == "zh-TW")
  1087.             {
  1088.                gd12.prefs.yourLang = browserLang;
  1089.             }
  1090.             else
  1091.             {
  1092.                if (browserLang.length > 2 && browserLang.charAt(2) == "-")
  1093.                {
  1094.                   // google dictionary/translate does not
  1095.                   // recognize sub-categories.
  1096.                   gd12.prefs.yourLang = browserLang.substr(0, 2);
  1097.                }
  1098.                else
  1099.                {
  1100.                   gd12.prefs.yourLang = browserLang;
  1101.                }
  1102.             }
  1103.  
  1104.             gd12debug.log("gd12.prefs.read browser lang:" +
  1105.                   gd12.prefs.yourLang);
  1106.  
  1107.          }
  1108.       }
  1109.  
  1110.       // set language to english if we don't support the locale.
  1111.       if (gd12.prefs.yourLang.length < 2 ||
  1112.             !gd12.lang.isSupportedByGTran(gd12.prefs.yourLang))
  1113.       {
  1114.          gd12.prefs.yourLang = "en";
  1115.       }
  1116.  
  1117.       // write it to prefs so that we don't need to auto-set it again.
  1118.       myprefs.setCharPref("yourLanguage", gd12.prefs.yourLang);
  1119.    }
  1120.  
  1121.    gd12.prefs.applyUserStyle();
  1122.  
  1123.    gd12debug.log("gd12.prefs.read ends");
  1124. },
  1125.  
  1126. applyUserStyle : function()
  1127. {
  1128.    gd12debug.log("gd12.prefs.applyUserStyle starts");
  1129.  
  1130.    var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
  1131.                        .getService(Components.interfaces.nsIStyleSheetService);
  1132.  
  1133.    var ios = Components.classes["@mozilla.org/network/io-service;1"]
  1134.                        .getService(Components.interfaces.nsIIOService);
  1135.  
  1136.    if (gd12.prefs.isMyStyle)
  1137.    {
  1138.       // try apply user style
  1139.  
  1140.       if (gd12.prefs.myRegisteredStyle == gd12.prefs.myStyle)
  1141.       {
  1142.          gd12debug.log("gd12.prefs.applyUserStyle already regsitered");
  1143.          return;
  1144.       }
  1145.  
  1146.       // unregister the old user style
  1147.       if (gd12.prefs.myRegisteredStyle.length > 0)
  1148.       {
  1149.          var uri = ios.newURI(
  1150.                gd12.prefs.buildCssString(gd12.prefs.myRegisteredStyle),
  1151.                null, null);
  1152.  
  1153.          if(sss.sheetRegistered(uri, sss.USER_SHEET))
  1154.             sss.unregisterSheet(uri, sss.USER_SHEET);
  1155.  
  1156.          gd12.prefs.myRegisteredStyle = "";
  1157.       }
  1158.  
  1159.       // register the new user style
  1160.       if (gd12.prefs.myStyle.length > 0)
  1161.       {
  1162.          var uri = ios.newURI(
  1163.                gd12.prefs.buildCssString(gd12.prefs.myStyle),
  1164.                null, null);
  1165.  
  1166.          if(!sss.sheetRegistered(uri, sss.USER_SHEET))
  1167.             sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
  1168.  
  1169.          gd12.prefs.myRegisteredStyle = gd12.prefs.myStyle;
  1170.       }
  1171.  
  1172.    }
  1173.    else
  1174.    {
  1175.       // remove user style
  1176.  
  1177.       if (gd12.prefs.myRegisteredStyle.length > 0)
  1178.       {
  1179.          var uri = ios.newURI(
  1180.                gd12.prefs.buildCssString(gd12.prefs.myRegisteredStyle),
  1181.                null, null);
  1182.  
  1183.          if(sss.sheetRegistered(uri, sss.USER_SHEET))
  1184.             sss.unregisterSheet(uri, sss.USER_SHEET);
  1185.  
  1186.          gd12.prefs.myRegisteredStyle = "";
  1187.       }
  1188.    }
  1189.  
  1190.    gd12debug.log("gd12.prefs.applyUserStyle ends");
  1191. },
  1192.  
  1193. buildCssString : function(styleStr)
  1194. {
  1195.    var cssStr = "data:text/css," +
  1196.                 "@-moz-document url-prefix(chrome://) {" +
  1197.                 encodeURIComponent(styleStr) +
  1198.                 "}";
  1199.  
  1200.    return cssStr;
  1201. },
  1202.  
  1203. yourLang : "",
  1204. isSelect : false,
  1205. isDoubleClick : true,
  1206. isCtrlHover : true,
  1207. isCtrlShiftHover : false,
  1208. isCtrlAltHover : false,
  1209. isAggressive : true,
  1210. isMouseMoveClosePopup : false,
  1211. isDetectLangDisabled : false,
  1212. srcLang : "en",
  1213.  
  1214. isMyStyle : false,
  1215. myStyle : "",
  1216. myRegisteredStyle : "",
  1217.  
  1218. isGDicInContextMenu : true,
  1219. isGTransInContextMenu : true,
  1220.  
  1221. },   // gd12.prefs
  1222.  
  1223. lang : {
  1224. // Whether google dic supports the translation between lang1 and lang2
  1225. isSupportedByGDic : function(lang1, lang2)
  1226. {
  1227.    gd12debug.log("gd12.lang.isSupportedByGDic starts");
  1228.  
  1229.    var res = false;
  1230.  
  1231.    for (var i = 0; i < gd12.lang.gdicSupported.length; i++)
  1232.    {
  1233.       if ((lang1 == gd12.lang.gdicSupported[i][0] &&
  1234.            lang2 == gd12.lang.gdicSupported[i][1])
  1235.           ||
  1236.           (lang1 == gd12.lang.gdicSupported[i][1] &&
  1237.            lang2 == gd12.lang.gdicSupported[i][0]))
  1238.       {
  1239.          res = true;
  1240.          break;
  1241.       }
  1242.    }
  1243.  
  1244.    gd12debug.log("gd12.lang.isSupportedByGDic ends: " + res);
  1245.  
  1246.    return res;
  1247. },
  1248.  
  1249. isSupportedByGTran : function(lang)
  1250. {
  1251.    gd12debug.log("gd12.lang.isSupportedByGTran starts");
  1252.  
  1253.    var res = false;
  1254.  
  1255.    for (var i = 0; i < gd12.lang.gtranSupported.length; i++)
  1256.    {
  1257.       if (lang == gd12.lang.gtranSupported[i])
  1258.       {
  1259.          res = true;
  1260.          break;
  1261.       }
  1262.    }
  1263.  
  1264.    gd12debug.log("gd12.lang.isSupportedByGTran ends: " + res);
  1265.  
  1266.    return res;
  1267. },
  1268.  
  1269. gdicSupported : [
  1270.                  ["ar", "en"],
  1271.                  ["bg", "en"],
  1272.                  ["zh-CN", "en"],
  1273.                  ["zh-CN", "zh-CN"],
  1274.                  ["zh-TW", "en"],
  1275.                  ["zh-TW", "zh-TW"],
  1276.                  ["hr", "en"],
  1277.                  ["cs", "en"],
  1278.                  ["cs", "cs"],
  1279.                  ["nl", "nl"],
  1280.                  ["en", "en"],
  1281.                  ["fi", "en"],
  1282.                  ["fr", "en"],
  1283.                  ["fr", "fr"],
  1284.                  ["de", "en"],
  1285.                  ["de", "de"],
  1286.                  ["el", "en"],
  1287.                  ["iw", "en"],
  1288.                  ["hi", "en"],
  1289.                  ["it", "en"],
  1290.                  ["it", "it"],
  1291.                  ["ko", "en"],
  1292.                  ["ko", "ko"],
  1293.                  ["pt", "en"],
  1294.                  ["pt", "pt"],
  1295.                  ["ru", "en"],
  1296.                  ["ru", "ru"],
  1297.                  ["sr", "en"],
  1298.                  ["es", "en"],
  1299.                  ["es", "es"],
  1300.                  ["th", "en"]
  1301.                 ],
  1302.  
  1303. gtranSupported : [
  1304.                    "ar",
  1305.                    "bg",
  1306.                    "zh-CN",
  1307.                    "zh-TW",
  1308.                    "hr",
  1309.                    "cs",
  1310.                    "nl",
  1311.                    "en",
  1312.                    "fi",
  1313.                    "fr",
  1314.                    "de",
  1315.                    "el",
  1316.                    "iw",
  1317.                    "hi",
  1318.                    "it",
  1319.                    "ko",
  1320.                    "pt",
  1321.                    "ru",
  1322.                    "sr",
  1323.                    "es",
  1324.                    "th",
  1325.  
  1326.                    "af",
  1327.                    "sq",
  1328.                    "be",
  1329.                    "ca",
  1330.                    "da",
  1331.                    "et",
  1332.                    "tl",
  1333.                    "gl",
  1334.                    "ht",
  1335.                    "hu",
  1336.                    "is",
  1337.                    "id",
  1338.                    "ga",
  1339.                    "ja",
  1340.                    "lv",
  1341.                    "lt",
  1342.                    "mk",
  1343.                    "ms",
  1344.                    "mt",
  1345.                    "no",
  1346.                    "fa",
  1347.                    "pl",
  1348.                    "ro",
  1349.                    "sk",
  1350.                    "sl",
  1351.                    "sw",
  1352.                    "sv",
  1353.                    "tr",
  1354.                    "uk",
  1355.                    "vi",
  1356.                    "cy",
  1357.                    "yi"
  1358.                 ],
  1359. },
  1360.  
  1361. gdButton : {
  1362. clickHandler: function()
  1363. {
  1364.    if (gd12.gdButton.singleClickTimer)
  1365.    {
  1366.       // this is the second click of a double click.
  1367.       // cancel the handling of the first onclick event.
  1368.       clearTimeout(gd12.gdButton.singleClickTimer);
  1369.       gd12.gdButton.singleClickTimer = null;
  1370.    }
  1371.    else
  1372.    {
  1373.       // delay a little to see whether it is the first click of a double click.
  1374.       gd12.gdButton.singleClickTimer = setTimeout(function() {
  1375.                gd12.gdButton.singleClickTimer = null;
  1376.                gd12.select.lookupSelected();
  1377.             }, 500);
  1378.    }
  1379. },
  1380.  
  1381. doubleClickHandler: function()
  1382. {
  1383.    // toggle inline dic on/off
  1384.  
  1385.    gd12.isInlineDicOff = !gd12.isInlineDicOff;
  1386.  
  1387.    var gdbutton = document.getElementById("gd12gdbutton");
  1388.  
  1389.    if (gdbutton)
  1390.    {
  1391.       if (gd12.isInlineDicOff)
  1392.       {
  1393.          gdbutton.setAttribute("class",
  1394.                "toolbarbutton-1 gd12gdbuttondisabled");
  1395.       }
  1396.       else
  1397.       {
  1398.          gdbutton.setAttribute("class",
  1399.               "toolbarbutton-1 gd12gdbuttonactive");
  1400.       }
  1401.    }
  1402. },
  1403.  
  1404. singleClickTimer : null,
  1405.  
  1406. },  // gdButton
  1407.  
  1408.  
  1409. STR_ERROR : "??",
  1410. STR_SEARCH : "Googling ...",
  1411.  
  1412. isInlineDicOff : false,   // temporary off
  1413.  
  1414. };
  1415.  
  1416. window.addEventListener("load", gd12.init, false);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement