ALC Search Popup

By Shinya Last update Sep 9, 2007 — Installed 2,053 times. Daily Installs: 1, 0, 0, 1, 2, 0, 1, 1, 0, 0, 0, 1, 2, 1, 1, 1, 1, 2, 1, 0, 1, 0, 3, 0, 2, 0, 1, 0, 0, 1, 2, 0

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name           ALC Search Popup
// @version        0.3.1
// @description    Search a selection in SPACE ALC and do popup of results.
// @author         Shinya
// @namespace      http://www.code-404.net/
// @compatibility  Firefox 2.0 3.0
// @include        *
// @Note           Can't move popup area if the page's MIME type is "application/xhtml+xml". X-<
// ==/UserScript==

(function(){
  var searchALC = {
    
    // == Key config ==========
    useCtrl:  false,
    useShift: false,
    useAlt:   true,
    startKey: "w",
    // == Key config end ======
    
    term: "",
    popupX: -1,
    popupY: -1,
    
    init: function(){
      document.addEventListener("keydown", searchALC.keyCheck, false);
      document.addEventListener("mouseup", searchALC.isToggle, false);
    },
    
    keyCheck: function(event){
      if(!(event.ctrlKey == searchALC.useCtrl &&
        event.shiftKey == searchALC.useShift &&
        event.altKey == searchALC.useAlt &&
        String.fromCharCode(event.keyCode).toLowerCase() == searchALC.startKey.toLowerCase())) return;
      var word = searchALC.wordCheck();
      if(!word) return;
      searchALC.request(event, word);
      event.preventDefault();
    },
    
    isToggle: function(event){
      if(event.button != 0) return;
      var toggle = GM_getValue("toggle", false);
      if(toggle) return;
      var word = searchALC.wordCheck();
      if(!word || !word.match(/^[\w\.\!\' -]+$/)) return;
      searchALC.request(event, word);
    },
    
    wordCheck: function(){
      var word = window.getSelection().toString();
      word = word.replace(/\u3000/g, " "); // Multi-byte space
      word = word.replace(/^ +/, "");
      word = word.replace(/ +$/, "");
      if (!word || word == "" || word.toLowerCase() == searchALC.term.toLowerCase()) return null;
      return word;
    },
    
    request: function(event, word){
      searchALC.term = word;
      
      areaElement.createPopup(word);
      areaElement.loading(true, document.getElementById("alc-search-popup"));
      
      GM_xmlhttpRequest({
        method: "GET",
        url: "http://eow.alc.co.jp/" + encodeURIComponent(word) + "/UTF-8/",
        onload: function(response){
          var popup = document.getElementById("alc-search-result");
          if(!popup){
            areaElement.createPopup(word);
            areaElement.loading(true, document.getElementById("alc-search-popup"));
            popup = document.getElementById("alc-search-result");
          }
          
          var temp = document.createElement("div");
          try{
            temp.innerHTML = unescape(escape(response.responseText).match(/%3Cul%3E.*%3C\/ul%3E/i));
          }
          catch(error){
          }
          
          var result;
          if(temp.firstChild == null){
            result = document.createElement("p");
            var invalidLink = document.createElement("a");
            invalidLink.setAttribute("href", "http://eow.alc.co.jp/" + encodeURIComponent(word) + "/UTF-8/");
            invalidLink.appendChild(document.createTextNode(word));
            result.appendChild(invalidLink);
            result.appendChild(document.createTextNode(": Invalid Page."));
          }
          else if($X(".//x:ul[1]/x:ul", temp)[0] != null){
            result = document.createElement("p");
            result.appendChild(document.createTextNode(word + ": Not Found."));
          }
          else {
            result = $X(".//x:ul[1]", temp)[0];
            var external = $X(".//x:a[@target]", result);
            for(var i = 0, l = external.length; i < l; i++){
              external[i].removeAttribute("target");
            }
            var fullLink = $X(".//x:a[starts-with(@href, 'javascript')]", result);
            for(var i = 0, l = fullLink.length; i < l; i++){
              // javascript:goFullText("MB000625", "1700035")
              var query = fullLink[i].getAttribute("href").match(/goFullText\(\"([\w-]+)\"\, \"(\d+)\"\)/);
              if(query != null){
                fullLink[i].setAttribute(
                  "href",
                  "http://eow.alc.co.jp/" + encodeURIComponent(word) + "/UTF-8/?ref=ex&exp="
                  + query[1] + "&dn=" + query[2] + "&dk=EJ"
                );
              }
            }
          }
          
          if(popup.firstChild.id == "alc-search-powered"){
            try{
              popup.insertBefore(result, popup.firstChild);
            }
            catch(error){
              areaElement.removePopup();
              return;
            }
          }
          else {
            popup.replaceChild(result, popup.firstChild);
          }
          
          if(popup.scrollHeight > 400){
            popup.scrollTop = 0;
          }
          
          areaElement.loading(false, document.getElementById("alc-search-popup"));
        },
      });
    },
  }
  
  var areaElement = {
    createPopup: function(word){
      var showing = document.getElementById("alc-search-popup");
      if(showing == null){
        // CSS
        var css = document.createElement("link");
        css.setAttribute("id", "alc-search-css");
        css.setAttribute("rel", "stylesheet");
        css.setAttribute("type", "text/css");
        css.setAttribute("href", "data:text/css;base64,QGNoYXJzZXQgInV0Zi04IjsKCiNhbGMtc2VhcmNoLXBvcHVwIHsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDA7Cglib3JkZXI6IDFweCBkb3R0ZWQgIzAwMDsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwoJY29sb3I6ICMwMDA7Cglmb250LWZhbWlseTogIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCAiTVMgVUkgR290aGljIiwgQXJpYWwsICKCbIJyIIJvg1ODVoNig04iLCBPc2FrYSwgc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMTAwJTsKCWxpbmUtaGVpZ2h0OiAxOwoJbGV0dGVyLXNwYWNpbmc6IDFweDsKCW92ZXJmbG93OiBoaWRkZW47Cglwb3NpdGlvbjogZml4ZWQ7Cgl0b3A6IDVweDsKCXJpZ2h0OiA1cHg7Cgl3aWR0aDogNDAwcHg7CgltYXgtd2lkdGg6IDQwMHB4OwoJbWluLXdpZHRoOiA0MDBweDsKCWhlaWdodDogNDIxcHg7Cgl6LWluZGV4OiAxMDAwMDsKfQoKI2FsYy1zZWFyY2gtdGl0bGUgewoJbWFyZ2luOiAwOwoJcGFkZGluZzogMDsKCWJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgIzAwMDsKCWJhY2tncm91bmQ6ICNlZWU7Cgljb2xvcjogIzAwMDsKCXRleHQtYWxpZ246IGxlZnQ7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJY3Vyc29yOiBtb3ZlOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMHB4OwoJbGVmdDogMHB4OwoJd2lkdGg6IDEwMCU7CgloZWlnaHQ6IDIwcHg7Cgl6LWluZGV4OiAxMDAwMTsKCW9wYWNpdHk6IDAuOTsKfQoKI2FsYy1zZWFyY2gtdGV4dCB7CgltYXJnaW46IC00LjVwdCAwcHQgMHB0IDBwdDsKCXBhZGRpbmc6IDA7Cglib3JkZXI6IDAgbm9uZTsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwoJY29sb3I6ICMwMDA7Cglmb250LXNpemU6IDlwdDsKCWxpbmUtaGVpZ2h0OiAxOwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl0ZXh0LWFsaWduOiBsZWZ0OwoJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNTAlOwoJbGVmdDogMTBweDsKCXotaW5kZXg6IDEwMDAyOwp9CgojYWxjLXNlYXJjaC1jbG9zZSB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7CgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKCWNvbG9yOiAjMDAwOwoJY3Vyc29yOiBwb2ludGVyOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCXJpZ2h0OiAxMHB4OwoJd2lkdGg6IDIwcHg7CgltYXgtd2lkdGg6IDIwcHg7CgltaW4td2lkdGg6IDIwcHg7CgloZWlnaHQ6IDE1cHg7Cgl6LWluZGV4OiAxMDAwMzsKfQoKI2FsYy1zZWFyY2gtYnV0dG9uIHsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDA7Cglib3JkZXI6IDAgbm9uZTsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwoJY29sb3I6ICMwMDA7Cglmb250LXNpemU6IDEwMCU7CglsaW5lLWhlaWdodDogMTsKCXZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KCiNhbGMtc2VhcmNoLXJlc3VsdCB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7CgliYWNrZ3JvdW5kOiAjZmZmOwoJdGV4dC1hbGlnbjogbGVmdDsKCWNvbG9yOiAjMDAwOwoJZm9udC1zaXplOiAxMnB0OwoJbGluZS1oZWlnaHQ6IDEuNTsKCW92ZXJmbG93OiBhdXRvOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAyMXB4OwoJbGVmdDogMHB4OwoJd2lkdGg6IDEwMCU7CgloZWlnaHQ6IDQwMHB4OwoJei1pbmRleDogMTAwMDM7CglvcGFjaXR5OiAwLjk7Cn0KCiNhbGMtc2VhcmNoLXJlc3VsdCB1bCB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7CgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKCWNvbG9yOiAjMDAwOwoJZm9udC1zaXplOiAxMDAlOwoJbGluZS1oZWlnaHQ6IDEuNTsKfQoKI2FsYy1zZWFyY2gtcmVzdWx0IHVsIGxpIHsKCW1hcmdpbjogLjdlbSAuN2VtIC43ZW0gMS41ZW07CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7CgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKCWNvbG9yOiAjMDAwOwoJZm9udC1zaXplOiAxMDAlOwoJbGluZS1oZWlnaHQ6IDEuNTsKCWxpc3Qtc3R5bGU6IGRpc2Mgb3V0c2lkZTsKfQoKI2FsYy1zZWFyY2gtcmVzdWx0IHAgewoJbWFyZ2luOiAuN2VtOwoJcGFkZGluZzogMDsKCWJvcmRlcjogMCBub25lOwoJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cgljb2xvcjogIzAwMDsKCWZvbnQtc2l6ZTogMTAwJTsKCWxpbmUtaGVpZ2h0OiAxLjU7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCiNhbGMtc2VhcmNoLXJlc3VsdCBmb250LAojYWxjLXNlYXJjaC1yZXN1bHQgc3BhbiwKI2FsYy1zZWFyY2gtcmVzdWx0IHN0cm9uZyB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7Cglmb250LXNpemU6IDEwMCU7CglsaW5lLWhlaWdodDogMTsKfQoKI2FsYy1zZWFyY2gtcmVzdWx0IHN0cm9uZyB7Cglmb250LXdlaWdodDogYm9sZDsKfQoKI2FsYy1zZWFyY2gtcmVzdWx0IHVsIGxpIHNwYW4ubWlkYXNoaSB7CgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKCWNvbG9yOiAjMDAwMDhCOwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCiNhbGMtc2VhcmNoLXJlc3VsdCB1bCBsaSBmb250LnNlYXJjaHdvcmRmb250IHsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwoJY29sb3I6ICNiZjAwMDA7Cn0KCiNhbGMtc2VhcmNoLXJlc3VsdCB1bCBsaSBkaXYgewoJbWFyZ2luOiAwZW0gMGVtIDBlbSAuNWVtOwoJcGFkZGluZzogMDsKCWJvcmRlcjogMCBub25lOwoJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cgljb2xvcjogIzAwMDsKCWZvbnQtc2l6ZTogMTAwJTsKCWxpbmUtaGVpZ2h0OiAxLjU7Cn0KCiNhbGMtc2VhcmNoLXJlc3VsdCBvbCB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7CgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKCWNvbG9yOiAjMDAwOwoJZm9udC1zaXplOiAxMDAlOwoJbGluZS1oZWlnaHQ6IDEuNTsKfQoKI2FsYy1zZWFyY2gtcmVzdWx0IG9sIGxpIHsKCW1hcmdpbjogLjNlbSAwZW0gLjNlbSAxLjVlbTsKCXBhZGRpbmc6IDA7Cglib3JkZXI6IDAgbm9uZTsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwoJY29sb3I6ICMwMDA7Cglmb250LXNpemU6IDEwMCU7CglsaW5lLWhlaWdodDogMS41OwoJbGlzdC1zdHlsZTogZGVjaW1hbCBvdXRzaWRlOwp9CgojYWxjLXNlYXJjaC1yZXN1bHQgYSB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7Cglmb250LXNpemU6IDEwMCU7CglsaW5lLWhlaWdodDogMTsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwoJY3Vyc29yOiBwb2ludGVyOwp9CgojYWxjLXNlYXJjaC1yZXN1bHQgYTo6YmVmb3JlLAojYWxjLXNlYXJjaC1yZXN1bHQgYTo6YWZ0ZXIgewoJY29udGVudDogIiI7Cn0KCiNhbGMtc2VhcmNoLXJlc3VsdCBhOmxpbmsgewoJY29sb3I6ICMzMGY7CgliYWNrZ3JvdW5kOiBub25lOwp9CgojYWxjLXNlYXJjaC1yZXN1bHQgYTp2aXNpdGVkIHsKCWNvbG9yOiAjOTBjOwoJYmFja2dyb3VuZDogbm9uZTsKfQoKI2FsYy1zZWFyY2gtcG93ZXJlZCB7CgltYXJnaW46IC43ZW07CglwYWRkaW5nOiAwOwoJYm9yZGVyOiAwIG5vbmU7CgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKCWNvbG9yOiAjMDAwOwoJZm9udC1zaXplOiA5cHQ7CglsaW5lLWhlaWdodDogMTsKCWZvbnQtc3R5bGU6IG5vcm1hbDsKCXRleHQtYWxpZ246IHJpZ2h0Owp9CgojYWxjLXNlYXJjaC1sb2FkaW5nIHsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDA7CgliYWNrZ3JvdW5kOiAjMDAwIHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhJQUFnQVBVQUFQJTJGJTJGJTJGd0FBQVByNiUyQnNURXhPam82UER3OE5EUTBINSUyQmZwcWFtdmIyOXVibTV2ejglMkZKS1Nrb2FHaHVMaTRyaTR1S0Nnb096czdLNnVydHpjM0Q0JTJCUGxaV1ZtQmdZSHg4Zktpb3FPN3U3a3BLU214c2JBd01EQUFBQU03T3pzakl5TmpZMkN3c0xGNWVYaDRlSGt4TVRMQ3dzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSCUyRkMwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCUyRmhwRGNtVmhkR1ZrSUhkcGRHZ2dZV3BoZUd4dllXUXVhVzVtYndBaCUyQlFRSkNnQUFBQ3dBQUFBQUlBQWdBQUFHJTJGMENBY0Vna0ZqZ2NSM0hKSkU0U3hFR25NeWdLbWt3SnhSS2RWb2NGQlJSTGZGQW9qNkdVT2hRb0ZBVnlzVUxSak5kZlFGZ2hMeHJPREVKNFFtNWlmVVVYWndRQWd3QnZFWElHQmtVRVp4dU1YZ0FKYjFkRUNXTUFCQWNIREVwREVHY1RCUU1EQlF0dmNXMFJid3VFQ0tNSEVMRUpGNU5GQ3htMUFBdDdjSDROdUFPZGNzVVJ5MFFDRDdnWWZjV2dUUVVRQjZaa3I2NkhvZURDU3dJRjV1Y0Z6M0lDN08wQ0M2eng4WXVIaFclMkYzQ3ZMeWZQWDQlMkJPWG96S25Ec3NCZHUzRyUyRnhJSFRwR0FnT1VQclppbUFKQ2ZEUFlmRGluMlRRJTJCeGVCbldiSGkzN1NDNFlJWWtRaGR5N0Z2TGRwd1d2akEwSnlVJTJGSVN5SXg0eFM2c2dma05TNG1lMnJ0VktrZ3cwSkNiOFlNWmRqd3FNUTJuSVk4QmJjVVFOVkNQN0c0TVFxMUtSaXZSN3RpREV1RUZyZ2dBQ0g1QkFrS0FBQUFMQUFBQUFBZ0FDQUFBQWIlMkZRSUJ3U0NRbU5CcENjY2trRWdSRUE0VmlLQTZhek04QkVaMVdoNkxPQmxzMEhBNWZnSlE2SEhRNkluS1JjV2hBMWQ1aHFNTXB5SWtPWnc5Q2ExOFFid2QlMkZSUmhuZm9VQUJSd2RJM0lFU2tRRlp4QjRiQWR2VjBZSlF3a0RBeDklMkJiV2NFQ1FZR0NRNXZGRVFDRVFvS0MwSUxIcVVEQm5jQ0dBNUxCaUhDQUFzRnRncW9Rd1M4QXc2NGY4bTJFWGRGQ3hPOElOUEtvbVFDQmdQTVdBdkwwbiUyRmZmJTJCallBdTd2QXV4eThPJTJGbXl2Zlg4JTJGZjclMkZBcnElMkJ2MFcwSE1ucjl6QWVFMEtKbFFrSklHQ2ZFMEUlMkJQdERxOXFmRE1vZ0RrR21ySUJDYk5RVVpJRG9zTnExa1VzRVpKQlcwZFklMkZiMFpzTFZpUUlNRk1XJTJCUktLZ2pGenA0Zk5va1BJZGtpJTJCWThKTlZ4QTc5akt3SEFJMEc5Skd3NXRDcURXVGlGUmhWaHRtaFZBMTZjTUpUSjFPblZJTW8xY3kxS1ZJNU5oRUFBaCUyQlFRSkNnQUFBQ3dBQUFBQUlBQWdBQUFHJTJGMENBY0Vna0NocU5RbkhKSkNZV1JNZmg0Q2dhbWt6RndCT2RWb2NOQ2dOYkpBd0doS0dVT2pSUUtBMXk4WE9HQXRaZmdJV2lTY2lKQldjVFFuaENEMjhRZjBVZ1p3SjNYZ0FKR2hRVmNnS09SbWRYaFJCdlYwUU1ZMElMQ2dvUm1JUm5DUUlPRGdJRWJ4dEVKU01kSFo4QUdhVUtCWFlMSUVwRkV4WnBBRzYySFJSRkFyc0tmbjhGSXNnamlVd0p1OEZrSkxZY0I5bE1Dd1VLcUZnR0hTSjVjblolMkZ1RVVMbCUyRkNYNjMlMkZ4OEtUTnUlMkJSa3pQajl6YyUyRjAlMkZDbDRWMCUyRkFQRElFNngwY3NyQkp3eWJYOURGaEJoQ0xnQWlsSXZ6UlZVcmlLSEdsZXYwSnR5dUR2bXNaVVpsY0lpQ0RuWXU3S3NaMFVtckJnZ1JQN24xRHFjREpFemNpT2dId2N3VHlaRVVtSUtFTUZWSXFneUlqcFo0dGpkVHhxUkNNUFlWTUJZRFY2dGF2VVo4eWN6cGtLd0J4SHNWV3RhcW81dE1nQUNINUJBa0tBQUFBTEFBQUFBQWdBQ0FBQUFiJTJGUUlCd1NDUXVCZ05CY2NrMEZndklRdEhSWkNZVUdTSjBJQjJXRG85cVVhQlFLSVhiTHNCeE9KVEV4VWg1bUI0aURvMHpYRWhXSk5CUlFnWnRBM3RQWlFzQWRRSU5Cd3h3QW5wQ0MyVlNkUU50VkVRU0VrT1VDaEdTVndvTEN3VUZwbTBRUkFNVkZCUVRReGxsQ3FoMGtrSUVDRjBURzY4VUcyTzBmb1lKRGI4VllWYTBhbFVYcnhvUWYxV21abnNURkEwRWhnQ0pockZNQzVIamtkNTdXMGpwRHNQRHVGVURIZkh5SFJ6c3ROTjc4UFB4SE9MazVkd2NwQnVvYVlrNU9BZmhYSEczaEF5JTJCS2dMa2dOb3pxd3pEYmdXWUpReVhzVXdHWEtOQTZmbllNSU8zaVBlSXBCd3lxbFNDQktVcUVRazVFNllSbVgyVWRBVDVrRW5IS2tRNWhYamtOcVRQdEtBQVJsMXNJckdveFNGTnVTRUZNTldvVkN4RXBpcXlSbFFZMTY1d0VIRUxBZ0FoJTJCUVFKQ2dBQUFDd0FBQUFBSUFBZ0FBQUclMkYwQ0FjRWdzS2hTTG9uSkpUQklGUjBHeHdGd21GSmxubEFnYVRLcEZxRUlxRkpNQmhjRUFCQzVHamtQejBLTjJ0c3ZIQkg0c0pLZ2RkMU5IU1hJTGFoOXRBbWRDQzBkVWNnNXFWRVFmaUl4SEVZdFhTQUNLbldvR1hBd0hCd1JER1VjS0JYWUZpMElKSG1RRUVLUUhFR0dwQ25wM0FpVzFES0ZXcVpOZ0dLUU5BNjVGQ3dWOGJRUUhKY1J0ZHM5TUM0clppdFZnQ1FiZjRBWUV1Ym5LVEFZVTZlb1VHdVNwdTNmbzYlMkJrYTJOcmJnUUFFNGVDbVM5eFZBT1c3WXE3SWdBNEhwaTBSOEVaQmhEc2hPblRnY090Zk0wY0FsVGlnSUxGRGlBRkZOams4azBHWmdBeE9Cb3pvdUlISU95S2JGaXhJa0VDbUl5SUhPRWlFV2JQSlRUUTVGeGNWT01DZ3pVVkNXd0FjeVpKdnp5NDVBRFlWWk5Jd1RsSUFWZk5CN1hSVkRMeEVXTFE0RTlKc0txJTJCclRkc015aGNFQUNINUJBa0tBQUFBTEFBQUFBQWdBQ0FBQUFiJTJGUUlCd1NDd3FGSXVpY2tsTUVnVkhRVkhLVkNZVW1XZVVXRkFrcXRPdEVLcWdBc2dGY0RGeUhKTE5tYlphNngyTHlkODU5NWg4QzQ4UmFnSm1RZ3RIYVg1WFpVWUtRNFlLRVlTS2ZWS1BhVU1aSHdNRGVRQnhoMDRBQllTRkdVNEpCcHNEQm1GSGRYTUxJS29mQkV5S0NwZGdzcHNPb1VzTFhhUkxDUU1nd2t5JTJCWUoxRkM0UE9nOGxWQWc3VTFRNWRydG5IU3c0SDN0OEhEZG5aeTJEZDRONE56YyUyRlFlcUxXMWJuTTdyWHVWOXRFQmhRUTVVb0NiSkRtV0tCQVFjTURaTmh3UlZOQ1lBTkJDaFpZRWJrVkNaT3dBU0VjQ0RGUTRTRURJcTZXVFZxUUlNRUNCeDA2aUNBQ1FRUEJpU2FiSERxelJVVEtBUk1oU0ZDRHJjJTJCV05RSWNPb1J3NSUyQlpJSGo4QURxU0VRQlFBd0tLTGhJem93RUVlR0tRMG93SVlrUEtqSGloWm9CS2kwS0ZFMDFiNHpnN2g0eTRJQUNINUJBa0tBQUFBTEFBQUFBQWdBQ0FBQUFiJTJGUUlCd1NDd3FGSXVpY2tsTUVnVkhRVkhLVkNZVW1XZVVXRkFrcXRPdEVLcWdBc2dGY0RGeUhKTE5tYlphNngyTHlkODU5NWg4QzQ4UmFnSm1RZ3RIYVg1WFpVVUplUUNHQ2hHRWluMVNrR2x1YkVoRGNZZE9BQVdFaFJsT0MxMkhZVWQxZXFlUm9rT0tDcGhnclk1TXBvdHFoZ1dmdW5xUHQ0UENnNzFncGdYSXlXU3FxcTlNQlFQUjB0SE16TTVMME5QU0M4UEN4VlVDeWVMWDM4JTJCJTJGQUZmWFJBNEhBJTJCcGptb0ZxQ0FjSERRYTNyYnh6QlJEMUJ3Z2NNRklsaWRNckF4WUlDSEhBNE44RElxcHNVV0ozd0FFQkNoUWFFQm5Rb0I2UlJyMHVBUmpRb2NNQUFBMHc0bk16NElPYVUwbElta1NuZ1lLRmMzWld5VHdKQUFMR0s0Zm5OQTNaT2FRQ0JRMjJ3UGdSUWxTSUFZd1Nma0hKTXJRa1R5RWJLRnpGeWRRcTE1Y2NPQWpVRXdRQUlma0VDUW9BQUFBc0FBQUFBQ0FBSUFBQUJ2OUFnSEJJTENvVWk2SnlTVXdTQlVkQlVjcFVKaFNaWjVSWVVDU3EwNjBRcXFBQ3lBVndNWElja3MyWnRscnJIWXZKM3puM21Id0xqeEZxQW1aQ0MwZHBmbGRsUlFsNUFJWUtFWVNLZlZLUWFXNXNTRU54aDA0QUJZU0ZHVTRMWFlkaFIzVjZwNUdpUTRvS21HQ3Rqa3ltaTJxR0JaJTJCNmVvJTJCM2c4S0R2WUxEeEtySnVYTmt5czZxcjB6Tnlndkh4TCUyRlYxc1ZEMjlLJTJGQUZmUlJRVUREdDFQbW9GcUhnUHRCTGV0dk13RzdRTWVzMEt4a2tJRklRTktEaEJnS3ZDaDNnUWlxbXh0Nk5EQkFBRUlFQWdVT0hDZ0JCRUg5WWcwNnVXQUlRVUFCaWhRTUFDZ0JFVUhUUndvVUVPQkljcVFJODgwT0lEZ201QUJEQThJZ1VrU3dBQXlpajElMkZqZWpBQVJQUElRd09OQkNuQkFKRENFT09DbkZBOGNPdkVoMUNFSkVxQk1JQkVEYUxjQTNMSklFR0RlJTJGMEJBRUFJZmtFQ1FvQUFBQXNBQUFBQUNBQUlBQUFCdjlBZ0hCSUxDb1VpNkp5U1V3U0JVZEJVY3BVSmhTWlo1UllVQ1NxMDYwUXFxQUN5QVZ3TVhJY2tzMlp0bHJySFl2SjN6bjNtSHdManhGcUFtWkNDMGRwZmxkbFJRbDVBSVlLRVlTS2ZWS1FhVzVzU0VOeGgwNEFCWVNGR1U0TFhZZGhSM1Y2cDVHaVE0b0ttR0N0amt5bWkycUdCWiUyQjZlbyUyQjNnOEtEdllMRHhLckp1WE5reXM2cXIwek55Z3ZIeEwlMkZWMXNWRER0aSUyRkJRY2NBOHlyWUJBakhSMGpjNTNMUlFZVTZSMFVCbk80UnhtaUclMkZJakpVSUpGdW9WS2VDQmlnQk41UUNrNDNCZ0ZnTUtGQ1lVR0RBZ0ZFVVFSR0lSWWJDaDJ4QUNFRGNBY0hEZ1FEY1FGR2Y5czdWa0EwUUNJMHQyVzBEUnc2OGg4Q2hBRUVMU0pFOHhpakJ2VnFDZ0lVOVBqd0ElMkJVTnpHNUFIRUI5eGtEcGs0UU1HdkFSUXNFRGxLeE1DQUxEZUxjQTBycUVFRGxXQ0NBQUFoJTJCUVFKQ2dBQUFDd0FBQUFBSUFBZ0FBQUclMkYwQ0FjRWdzS2hTTG9uSkpUQklGUjBGUnlsUW1GSmxubEZoUUpLclRyUkNxb0FMSUJYQXhjaHlTelptMld1c2RpOG5mT2ZlWWZBdVBFV29DWmtJTFIybCUyQlYyVkZDWGtBaGdvUmhJcDlVcEJwYm14SVEzR0hUZ0FGaElVWlRndGRoMkZIZFhxbmthSkRpZ3FZWUsyT1RLYUxhb1lGbjdwNmowd09BOFBFQXc2JTJGWjRQS1Vod2R6czhkRUw5a3Fxck4wTTdTZXRUVkNzTEZ3OGQ2Qzh2S3ZVUUV2JTJCZFZDUkFhQm5OUXRrd1BGUlFVRlhPZHVVb1RHJTJGY1VOa3lZZyUyQnRJQmxFTUFGWVlNQWFCdUNla3htaGFKZVNlQmdpT0hodzRRRUNBQXdjQ0xoR0pSVVFDZzNSRENteVVWbUJZbWxPaUdxbUJzUEdseXo5WWtBbHhzSkVocUN1YkFCUzlBc1BnUUFNcUxRZk0wb1RNd0VaNFFwTE93dk1MeEFFRVhJQkc1YWN6cXRhdXQ0WU5YUklFQUNINUJBa0tBQUFBTEFBQUFBQWdBQ0FBQUFiJTJGUUlCd1NDd3FGSXVpY2tsTUVnVkhRVkhLVkNZVW1XZVVXRkFrcXRPdEVLcWdBc2dGY0RGeUhKTE5tYlphNngyTHlkODU5NWg4QzQ4UmFoQVFSUXRIYVg1WFpVVUplUUFHSFIwakEwU0tmVktHQ21sdWJFaENCU0dSSFNRT1F3Vm1Rd3NaVGd0ZGgwVVFIS0lIbTJxdUNoR29waHVpSkhPM2prd09GQjJVYW9ZRlRuTUdlZ0RLUlFRRzB0TUdCTTFuQXRuYUFCb1UzdDhVRDgxa1IlMkJVSzNlRGU0bnJrNWdyUjFOTFdlZ3ZhOXM5Y3pmaFZBZ01OcFdxZ0JHTmlnTUdCQXd6bXhCR2poQUNFZ3djZ3pBUFRxbHdHWFE4Z01nQWhaSUdIV201V2plbFVaOGpCQmdQTVRCZ3dJTUdDUmdzeWdWU2tnTWlIQnlEN0RXRG14NVd1TWtacURMQ1U0Z2ZBcTJzQUNyQUVXRlNSTGpVZldEb3BDcURUTlFJc0oxTEYweXpEQUE5MFVIVjVlbzBxVWpCOG1nVUJBQ0g1QkFrS0FBQUFMQUFBQUFBZ0FDQUFBQWIlMkZRSUJ3U0N3cUZJdWlja2swRklpQ282QTRaU29ablJCVVNpd29FdFlpcE5PQkRLT0tLZ0Q5REJOSEhVNGJyYzRjM2NVQmVTT2s5NDlnZUVRVVpBNXJYQUJIRVc0UEQwVU9aQlNIYVFBSmlFTUpnUUFURkJRVkJrUUhaS0FDVXd0SGJYMFJSMG1WRnAwVUZ3UkNCU1FEU2dzWnJRdGVxRVVQR3JBUW1tRzlDaEZxUkFrTXNCZDR4c1JMQkJzVW9HNm5CYTE0RTRJQTJrVUZEdUxqRHFsNHBlaWxBQTBIN2U0SDF1ZEg4JTJGUHM3JTJCM3hibWowcU9UajVtRVdwRVAzRFVxM2dsWVdPQmdBY0VtVWFOSSUyQkRCandBWSUyQmRTMFVTR0pnNHdBQkVYTVl5Sk52RThVT0dJU0tWQ05DbGFoNHhqZzYwV1VLeUlOT0NVd3JNelZSQVJNR0VOV1E0biUyRmpwTlRLVG0xNUolMkZDVEsyZTBNb0QlMkJVS21IRXM0b25WRFZWbXlxZHBBYk5SNGNLVGpxTlNvdHMwN0VqenpKaDFTMElBRHNBQUFBQUFBQUFBQUElM0QpIG5vLXJlcGVhdCA1MCUgNTAlOwoJcG9zaXRpb246IGFic29sdXRlOwoJd2lkdGg6IDQwMHB4OwoJaGVpZ2h0OiA0MjFweDsKCXotaW5kZXg6IDEwMDA1OwoJb3BhY2l0eTogMC41Owp9");
        css.setAttribute("media", "screen, tv, projection");
        var head = document.getElementsByTagName("head")[0];
        if(head == null){
          head = document.createElement("head");
          var html = document.getElementsByTagName("html")[0];
          html.insertBefore(head, html.firstChild);
        }
        head.appendChild(css);
        
        
        // HTML
        var popupArea = document.createElement("div");
        popupArea.setAttribute("id", "alc-search-popup");
        
        var titleBar = document.createElement("div");
        titleBar.setAttribute("id", "alc-search-title");
        var titleText = document.createElement("span");
        titleText.setAttribute("id", "alc-search-text")
        titleText.appendChild(document.createTextNode("ALC Search: " + word));
        titleBar.appendChild(titleText);
        titleBar.addEventListener("mousedown", areaElement.setMove, false);
        
        var closeButton = document.createElement("div");
        closeButton.setAttribute("id", "alc-search-close");
        var closeImg = document.createElement("img");
        closeImg.setAttribute("id", "alc-search-button");
        closeImg.setAttribute("width", 20);
        closeImg.setAttribute("height", 15);
        closeImg.setAttribute("alt", "Close");
        closeImg.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwwAADsMBx2%2BoZAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIFYzLjA4pLOz5QAAAOpJREFUOE9jYGBg%2BA%2FE1AJgs%2BhmoDHQMhBWQ3I%2BiA0Tx%2BYrvC6cA3X9LSAtCcQOUD5IUzeOMMJrIMgQkGEgRSDD10HZh%2FEEOMEwzEZyFUgxCPtRYiBIL8hFMMPwuQ4ewfhiOQaLC0FhiQvg9TIPUhiCwg%2FmUoJh%2BBeHdeixDAo7mNercOj5CRK%2FDsQaaApAaQ3kEhBGTiIgS2DiIB8gAwEg5zlIABQm%2B%2FGEC7FS84EKE2CK24GMBmJ1YlEHMmg5sjgHkAOyYTsQS5BgMMibIH3rgRhkBgbwgIbDeyANiwBcNEgNKMzg3gSZBgBymlArpNbh0gAAAABJRU5ErkJggg%3D%3D");
        closeImg.addEventListener("click", areaElement.removePopup, false);
        closeButton.appendChild(closeImg);
        
        var resultArea = document.createElement("div");
        resultArea.setAttribute("id", "alc-search-result");
        var powered = document.createElement("address");
        powered.setAttribute("id", "alc-search-powered");
        powered.appendChild(document.createTextNode("Powered by "));
        powered.appendChild(document.createElement("a"));
        powered.lastChild.setAttribute("href", "http://www.alc.co.jp/");
        powered.lastChild.appendChild(document.createTextNode("SPACE ALC"));
        powered.appendChild(document.createTextNode("."));
        resultArea.appendChild(powered);
        
        popupArea.appendChild(titleBar);
        popupArea.appendChild(closeButton);
        popupArea.appendChild(resultArea);
        
        if(searchALC.popupX != -1 && searchALC.popupY != -1){
          with(popupArea.style){
            left = searchALC.popupX;
            top = searchALC.popupY;
          }
        }
        
        document.body.appendChild(popupArea);
        
        popupArea.addEventListener("click", function(event){
          event.stopPropagation();
        }, false);
        
        document.addEventListener("keydown", areaElement.removePopup, false);
        document.addEventListener("click", areaElement.removePopup, false);
      }
      else {
        var titleText = document.getElementById("alc-search-text");
        titleText.replaceChild(document.createTextNode("ALC Search: " + word), titleText.firstChild);
      }
    },
    
    removePopup: function(event){
      if(event && event.type == "keydown"){
        // X marks the spot or ESC
        if(String.fromCharCode(event.keyCode).toLowerCase() == "x" || event.keyCode == "27"){
          event.preventDefault();
        }
        else{
          return;
        }
      }
      else if(event && event.type == "click" && event.button != 0){
        return;
      }
      
      searchALC.term = "";
      
      // HTML
      document.body.removeChild(document.getElementById("alc-search-popup"));
      
      // CSS
      document.getElementsByTagName("head")[0].removeChild(document.getElementById("alc-search-css"));
      
      document.removeEventListener("keydown", areaElement.removePopup, false);
      document.removeEventListener("click", areaElement.removePopup, false);
    },
    
    loading: function(boolean, parent){
      if(boolean){
        var div = document.createElement("div");
        div.setAttribute("id", "alc-search-loading");
        parent.appendChild(div);
      }
      else{
        parent.removeChild(parent.lastChild);
      }
    },
    
    setMove: function(event){
      var popup = document.getElementById("alc-search-popup");
      
      searchALC.popupX = event.clientX - popup.offsetLeft;
      searchALC.popupY = event.clientY - popup.offsetTop;
      
      var bar = document.getElementById("alc-search-title");
      
      bar.addEventListener("mousemove", areaElement.movePopup, false);
      bar.addEventListener("mouseup", areaElement.removeMove, false);
      bar.addEventListener("mouseout", areaElement.removeMove, false);
    },
    
    removeMove: function(event){
      var bar = document.getElementById("alc-search-title");
      
      with(bar.parentNode.style){
        searchALC.popupX = left;
        searchALC.popupY = top;
      }
      
      bar.removeEventListener("mousemove", areaElement.movePopup, false);
      bar.removeEventListener("mouseup", areaElement.removeMove, false);
      bar.removeEventListener("mouseout", areaElement.removeMove, false);
    },
    
    movePopup: function(event){
      var popup = document.getElementById("alc-search-popup");
      
      with(popup.style){
        left = event.clientX - searchALC.popupX;
        top = event.clientY - searchALC.popupY;
      }
    },
  }
  
  GM_registerMenuCommand("ALC Search Popup - Toggle Fast", function(){
    var toggle = GM_getValue("toggle", false);
    GM_setValue("toggle", !toggle);
  });
  
  /*
   * $X function from nulog
   * http://lowreal.net/logs/2006/03/16/1
   *
   * Thanks, cho45.
   */
  function $X (exp, context) {
    if (!context) context = document;
    var resolver = function(prefix){
      var o = document.createNSResolver(context)(prefix);
      return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
    }
    var exp = document.createExpression(exp, resolver);
    
    var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
    switch(result.resultType){
      case XPathResult.STRING_TYPE : return result.stringValue;
      case XPathResult.NUMBER_TYPE : return result.numberValue;
      case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
      case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
        result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        var ret = [];
        for(var i = 0, len = result.snapshotLength; i < len ; i++){
          ret.push(result.snapshotItem(i));
        }
        return ret;
      }
    }
    return null;
  }
  
  if(document.body) searchALC.init();
})();