Haron_Prime

script.js

Dec 3rd, 2014
644
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name           Google Translator Tooltip Pier's Mod
  3. // @namespace      pier
  4. // @description    Translates selected text into a tooltip.
  5. // @include        http://*
  6. // @include        https://*
  7. // @updateURL      https://userscripts.org/scripts/source/129358.meta.js
  8. // @downloadURL    https://userscripts.org/scripts/source/129358.user.js
  9. // @version        0.3.1
  10. // ==/UserScript==
  11. //Based on the script https://userscripts.org/scripts/show/36898
  12. //Many tanks to the original autor
  13.  
  14. const HREF_NO = 'javascript:void(0)';
  15. var imgLookup, txtSel, currentURL, languagesGoogle;
  16. var initialized = false;
  17. var Upd = false;
  18. //var TLD = "com";//GM_getValue('TLD') ? GM_getValue('TLD') : "com";
  19.  
  20. //setup events
  21. document.addEventListener('mouseup', showLookupIcon, false);
  22. document.addEventListener('mousedown', mousedownCleaning, false);
  23.  
  24. function mousedownCleaning(evt){
  25.  
  26.     var divDic = getId('divDic');
  27.     var divLookup = getId('divLookup');
  28.  
  29.     if(divDic)
  30.     {
  31.         if(!clickedInsideID(evt.target,'divDic'))
  32.             divDic.parentNode.removeChild(divDic);
  33.     }  
  34.     if(divLookup)
  35.     {
  36.         if(!clickedInsideID(evt.target,'divLookup'))
  37.             divLookup.parentNode.removeChild(divLookup);           
  38.            
  39.     }  
  40.        
  41. }
  42.  
  43.  
  44. function showLookupIcon(evt){
  45.  
  46.     if(!evt.ctrlKey && GM_getValue('ctrl'))//ctrl key
  47.         return;
  48.    
  49.     if(evt.button == 2){
  50.         mousedownCleaning(evt)
  51.         return;
  52.     }
  53.    
  54.    
  55.    
  56.     if(!initialized){
  57.         images();
  58.         checkupd();
  59.         css(); 
  60.         initialized = true;
  61.     }
  62.    
  63.     var divDic = getId('divDic');
  64.     var divLookup = getId('divLookup');
  65.         //possible cleanup
  66.     if(divDic)
  67.     {
  68.         if(!clickedInsideID(evt.target,'divDic'))
  69.             divDic.parentNode.removeChild(divDic);
  70.         return;
  71.     }
  72.  
  73.    
  74.     //remove div if exists
  75.     if(divLookup)
  76.     {
  77.         if(!clickedInsideID(evt.target,'divLookup'))
  78.             divLookup.parentNode.removeChild(divLookup);
  79.         return
  80.     }  
  81.     txtSel = getSelection(evt);
  82.    
  83.     //exit if no text is selected
  84.     if(!txtSel || txtSel=="")
  85.     {
  86.         if(divDic)
  87.         {
  88.             if(!clickedInsideID(evt.target,'divDic'))
  89.                 divDic.parentNode.removeChild(divDic);
  90.         }
  91.         if(divLookup)
  92.         {  
  93.             if(!clickedInsideID(evt.target,'divLookup'))
  94.                 divLookup.parentNode.removeChild(divLookup);
  95.         }
  96.         return;
  97.     }
  98.  
  99.  
  100.  
  101.    
  102.     if(!txtSel || txtSel=="")
  103.     {
  104.         if(divLookup)
  105.         {  
  106.             if(!clickedInsideID(evt.target,'divLookup'))
  107.                 divLookup.parentNode.removeChild(divLookup);
  108.         }
  109.         return;
  110.     }
  111.     else{
  112.        
  113.     //div container
  114.     divLookup = createElement('div', {id:'divLookup', style:'background: rgba(0, 0, 0, 0); color:#FFFFFF; position:absolute; top:'+(evt.clientY+window.pageYOffset-35)+'px; left:'+(evt.clientX+window.pageXOffset+35)+'px; padding:0px; width:42px; height:16px; z-index:999999999;'});
  115.    
  116.     var gg = createElement('span');
  117.     //var gURL= ";
  118.     gg.innerHTML = "<a href=\"https://www.google.com/search?q="+encodeURIComponent(txtSel)+" \" > <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMPSURBVHjaJM7La1xVHMDx7++ce2cmk8lrMpMmtLXRRBqULNqIQpAGrLYFn6AUF2oLggqudNttK90IgojQ+sBNLCKICGKQilBbH/iK1hhNoTHNo6ZtOpPOTObee875ufDzF3xQVTKn+uPCkg4fmdbokQ/0tY9n1avTpH5Tz01N6h+CpsaoB/UYbQm6AaqqGO9Qa+H4mTkW2/2EbXdz8vNrXF5rkevqYuKt05Q7i9gQELEgAYBAxD9W1NgIvHNc/DdAqYdgLZtbMR9+vwhYCmN3kUzej0MIxuMQUrWoODSA0QCRRGzrLWDSgCHBiOXiZQfiEAu+q0iGxQaI1GDFkypkxhKJ+b90cLzC+T/XiPJ9hJBgTETAYhJYn5tnZchws6uPOIWBWoPqZkamnujSUo2R28q8cGiU6XNXmL9ap7sjcHRqB4JwauYdjh9sc+XOPVjJ4X2go5Wx59IWT1xYQnY/976eOHofT06NUWtmfPrTCpMjPYzs7OPkzGmO/fAmdrAHguKDBwySCWpipGGR6uEzmiUN9g4XeWBikGPP7ANRvl74mf3vHiaMDkAwICBpDIBmDnExOMGUbUopV+DCQpvXp/9mcb2JquWO8nZGR/ZC0sYEg/ERikOCIsQIoCbFZLXr7OhIeOyeCs8eGqO26VGBnf1DnH/6FAcq+9BWg6ACagkCCgQFshiZ/vJXfWhinP4+g6vPsXFjgdbmKkOjT1EoVcm84/GPXuWLtbNorhu8xWSB4C14EPWqjeuzLHz7En38RhS30MTQyMbYvv8TussjzK8vc+97R7hVTLHOol4ITsCBSUKTv86+yO3Rd+yqthnsLlLpzVOROda/eQXFsLuyi8HOAUgyvCjBQ+xixEGU1tcpuWUKcS+3Gg5xluCh2FHGt1eQrMmW6aTdaILEGJcjSIZXjwbFdPQOk68+SHPDoe0i6nNEUsJvWfJDj6K5Ep/9MsNqfQ3xBvEBtgwhDRByiKrimje0NvsGUf13TNYixAXygwew488zv3qVh99+mWVzDWM6CQioA43RE1/JfwMAPA+EdGeoPOMAAAAASUVORK5CYII=\" style=\" border:1px solid rgba(240,240,255,0.1); \" > </a>";
  119.     divLookup.appendChild(gg);
  120.    
  121.     divLookup.appendChild(imgLookup.cloneNode(false));
  122.     divLookup.lastChild.addEventListener('mouseover', lookup, false);
  123.     document.body.appendChild(divLookup);  
  124.    
  125.     }
  126.  
  127. }
  128.  
  129.  
  130. function lookup(evt){
  131.  
  132.     var divResult = null;
  133.     var divDic = getId('divDic');
  134.     var divLookup = getId('divLookup');
  135.     var top = divLookup.style.top;
  136.     var left = divLookup.style.left;
  137.  
  138.     //no text selected
  139.     if(!txtSel || txtSel=="")
  140.     {
  141.        
  142.         if(divDic = getId('divDic'))
  143.             divDic.parentNode.removeChild(divDic);
  144.         if(divLookup = getId('divLookup'))
  145.             divLookup.parentNode.removeChild(divLookup);
  146.         return;
  147.     }
  148.    
  149.    
  150.     //cleanup divs
  151.     if(divDic = getId('divDic'))
  152.     {
  153.         divDic.parentNode.removeChild(divDic);
  154.     }  
  155.     divLookup.parentNode.removeChild(divLookup);
  156.    
  157.    
  158.     //div container
  159.     divDic = createElement('div', {id:'divDic', style:'background: rgba(0, 0, 0, 0.7); color:#FFFFFF; position:absolute; top:'+top+'; left:'+left+'; min-width:250px; min-height:50px; max-width:50%; padding:5px; font-size:small; text-align:left; z-index:999999999; border-width:2px; border-style:solid; -moz-border-radius:6px;'});
  160.  
  161.  
  162.  
  163.     divDic.addEventListener('mousedown', dragHandler, false);
  164.     document.body.appendChild(divDic);
  165.  
  166.    
  167.     //div result
  168.     divResult = createElement('div', {id:'divResult', style:'overflow:auto; padding:3px;'}, null, 'Loading...');
  169.     divDic.appendChild(divResult); 
  170.    
  171.  
  172.    
  173.     //options link
  174.     divDic.appendChild(createElement('span', {id:'optionsLink', title:'options', href:HREF_NO, style:'position:absolute; bottom:3px; right:5px; font-size:small; text-decoration:none; cursor:pointer;'}, 'click options false', '>>'));
  175.  
  176.     //lookup
  177.     if( (txtSel+" ").search(/^\s*https?:\/\//) > -1 )
  178.     {
  179.         divResult.innerHTML = '<a class="gootranslink" href="'+txtSel+'" target="_blank" >'+txtSel+'</a>';
  180.     }
  181.     else if( (txtSel+" ").search(/^\s*\S+(\.\S+)+/) > -1 ) // site.dom
  182.     {
  183.         divResult.innerHTML = '<a class="gootranslink" href="http://'+txtSel+'" target="_blank" >'+txtSel+'</a>';
  184.     }
  185.     else
  186.     {
  187.         var sl, tl, lang;
  188.         sl = GM_getValue('from') ? GM_getValue('from') : "auto";
  189.         tl = GM_getValue('to') ? GM_getValue('to') : "auto";
  190.         lang = sl + "|" + tl;
  191.         currentURL = "http://translate.google.com/?hl="+tl+"&text=" + encodeURIComponent(txtSel) + "&langpair=" + lang;
  192.         GM_xmlhttpRequest({
  193.             method: 'GET',
  194.             url: currentURL,
  195.             onload: function(resp) {
  196.                 try{
  197.                     extractResult(resp);
  198.  
  199.                 }catch(e){
  200.                     GM_log(e);
  201.                 }
  202.             }
  203.         });
  204.     }
  205.    
  206.    
  207.     //store query as attribute
  208.     getId('divDic').setAttribute('query', txtSel);
  209.    
  210.     if (Upd){
  211.        
  212.         divDic.appendChild(createElement('div',{id:'UpdateGTT', title:'Update', style:'background: rgba(255, 0, 0, 0.4); color:#FFFFFF; text-align: center; padding:5px; border-width:2px; border-style:solid; -moz-border-radius:6px; max-width:300px; overflow-y:auto; overflow-x:hidden; '}, null ,'<a  style="background: none !important; color:#FFFFFF; font-size:13px; "  href="http://userscripts.org/scripts/show/129358" target="_blank" >New version! Click here to install</a>')); 
  213.         divDic.appendChild(createElement('br'));
  214.     }
  215.        
  216.    
  217.     //other searches
  218.     divDic.appendChild(createElement('span',{id:'spanOtherSearches', title:'search other sites', style:'position:absolute; left:5px; bottom:3px; cursor:pointer; font-size:small;'},'mouseover otherSites false','+'));
  219. }
  220.  
  221.  
  222. function quickLookup(){
  223.  
  224.     getId('divResult').innerHTML = 'Loading...'
  225.     var tl = getId('optSelLangTo').value;
  226.     currentURL = "http://translate.google.com/?hl="+tl+"&text=" + encodeURIComponent(document.getElementById('divDic').getAttribute('query',2)) + "&langpair=" + getId('optSelLangFrom').value + "|" + tl;
  227.    
  228.     GM_xmlhttpRequest({
  229.         method: 'GET',
  230.         url: currentURL,
  231.         onload: function(resp) {
  232.             try{
  233.                 extractResult(resp);
  234.  
  235.             }catch(e){
  236.                 GM_log(e);
  237.             }
  238.         }
  239.     });
  240. }
  241.  
  242.  
  243. function otherSites(evt){
  244.  
  245.     var ul, li, query = getId('divDic').getAttribute('query').replace(/\s+$/,'').replace(/^\s+/,'');
  246.  
  247.     var sites = [
  248.    
  249.         {name:'Google Search', href:'http://www.google.com/search?q='+query.replace(/\s+/g,'+')},
  250.        
  251.         {name:'Google Images', href:'http://www.google.com/images?q='+query.replace(/\s+/g,'+')},
  252.        
  253.         {name:'The Free Dictionary', href:'http://www.thefreedictionary.com/'+query.replace(/\s+/g,'+')},
  254.        
  255.         {name:'Urban Dictionary', href:'http://www.urbandictionary.com/define.php?term='+query.replace(/\s+/g,'+')},
  256.        
  257.         {name:'Wikipedia', href:'http://www.wikipedia.org/w/index.php?title=Special%3ASearch&search='+query.replace(/\s+/g,'+')},
  258.        
  259.         {name:'IMDb', href:'http://www.imdb.com/find?s=all&q='+query.replace(/\s+/g,'+')},
  260.        
  261.         {name:'Youtube', href:'http://www.youtube.com/results?search_query='+query.replace(/\s+/g,'+')}
  262.  
  263.     ];
  264.    
  265.     getId('divDic').appendChild(createElement('br'));
  266.     getId('divDic').appendChild(document.createTextNode('Search "'+(query.match(/^[\s\S]{15}/) ? query.match(/^[\s\S]{15}/)[0]+'...' : query.match(/^[\s\S]+/)[0] )+'" at:'));
  267.     ul = getId('divDic').appendChild(createElement('ul'));
  268.    
  269.     for(var i=0; i<sites.length; i++){
  270.         li = ul.appendChild(createElement('li'));
  271.         li.appendChild(createElement('a', {style:'color:#EEEEEE;',target:'_blank', href:sites[i].href}, null, sites[i].name));
  272.     }
  273.    
  274.     evt.target.parentNode.removeChild(evt.target);
  275.  
  276.  
  277. }
  278.  
  279.  
  280. function extractResult(resp){  
  281.  
  282.     //select body and remove some tags
  283.     var html = resp.responseText.match(/\<body[^\>]*\>([\s\S]+)\<\/body\>/)[1];
  284.     html = html.replace(/\<script[^\<]+\<\/script\>/ig, '');
  285.     html = html.replace(/\<iframe[^\<]+\<\/iframe\>/ig, '');
  286.    
  287.     //append requested page as hidden iframe
  288.     var iframe = document.body.appendChild(createElement('iframe', {style:'visibility:hidden;'})); 
  289.     var divExtract = iframe.contentWindow.document.body.appendChild(createElement('div', {id:'divExtract'}, null, html));
  290.     divExtract = document.importNode(divExtract, true);
  291.     iframe.parentNode.removeChild(iframe);
  292.  
  293.     //gather info
  294.     var translation = trim( xp('.//span[@id="result_box"]', divExtract)[0].textContent );
  295.     var dict = xp('.//div[@id="gt-res-dict"]', divExtract)[0];
  296.  
  297.     if(dict){
  298.         try{
  299.             dict = dict.outerHTML.replace(/<div><div>/ig, ": </span><span> ").replace(/<\/div><div>/ig, ", ").replace(/<li>/ig, "<li><span>").replace(/<\/div><\/div>/ig, "</span>");
  300.         }catch(e){
  301.             dict = null;
  302.         }
  303.     }
  304.    
  305.     //parse info
  306.     getId('divResult').innerHTML = '<a class="gootranslink" href="'+currentURL+'" target="_blank">' + translation + '</a><br><br>';
  307.     if ( dict.length > 80 ){
  308.        
  309.         getId('divResult').innerHTML += '<div id="dict" style="background: rgba(0, 0, 0, 0.6); color:#FFFFFF; padding:5px; border-width:2px; border-style:solid; -moz-border-radius:6px; margin-bottom:10px; max-width:300px; overflow-y:auto; overflow-x:hidden; font-size:small;">'+dict+'</div>';
  310.  
  311.     }
  312.     else if(translation == txtSel)
  313.     otherSites({target:getId('spanOtherSearches')});//no translation?
  314.      
  315.    
  316. }
  317.  
  318. function trim(str){
  319.     return str.replace(/^\s+/,'').replace(/\s+$/,'');
  320. }
  321.  
  322.  
  323. function getSelection(evt){
  324.  
  325.     var txt = null;
  326.     //get selected text
  327.     if(evt && evt.target.nodeName=='TEXTAREA')
  328.     {
  329.          //var begin = evt.target.value.substr(0, evt.target.selectionStart);
  330.          txt = evt.target.value.substr(evt.target.selectionStart, evt.target.selectionEnd - evt.target.selectionStart);
  331.          //var end = evt.target.value.substr(evt.target.selectionEnd);
  332.          //myArea.value = begin + text1 + selection + text2 + end;     
  333.     }
  334.     else if (window.getSelection)
  335.     {
  336.         txt = window.getSelection();
  337.     }
  338.     else if (document.getSelection)
  339.     {
  340.         txt = document.getSelection();
  341.     }
  342.     else if (document.selection)
  343.     {
  344.         txt = document.selection.createRange().text;
  345.     }
  346.     //txt = encodeURIComponent(txt);//toString().replace(/\n/ig, '%0D%0A');
  347.     return txt;
  348. }
  349.  
  350.  
  351. function options(evt){
  352.  
  353.     if(!languagesGoogle){
  354.         languagesGoogle = '<option selected value="auto">Detect language</option><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bn">Bengali</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="en">English</option><option value="eo">Esperanto</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option value="de">German</option><option value="el">Greek</option><option value="gu">Gujarati</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="kn">Kannada</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="ta">Tamil</option><option value="te">Telugu</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option>';
  355.     }
  356.        
  357.     var divOptions = getId('divOpt');
  358.    
  359.     if(!divOptions)//show options
  360.     {
  361.         divOptions = createElement('div', {id:'divOpt', style:'background-color:FFFFFF; position:relative; padding:5px;'});
  362.         getId('divDic').appendChild(divOptions);
  363.         getId('optionsLink').style.visibility = 'hidden';
  364.  
  365.        
  366.         //from
  367.         divOptions.appendChild(createElement('span', null, null,'From:'));
  368.         divOptions.appendChild(createElement('select', {id:'optSelLangFrom'}, null, languagesGoogle));
  369.         getId('optSelLangFrom').value = GM_getValue('from') ? GM_getValue('from') : "auto";
  370.         getId('optSelLangFrom').addEventListener('change', quickLookup, false);
  371.        
  372.         //to
  373.         divOptions.appendChild(createElement('span', null, null,' To:'));
  374.         divOptions.appendChild(createElement('select', {id:'optSelLangTo'}, null, languagesGoogle));
  375.         getId('optSelLangTo').value = GM_getValue('to') ? GM_getValue('to') : "en";
  376.         getId('optSelLangTo').addEventListener('change', quickLookup, false);
  377.        
  378.         //tld
  379.         //divOptions.appendChild(createElement('br'));
  380.         //divOptions.appendChild(createElement('span', null, null,'<br> Search on Google.'));
  381.         //divOptions.appendChild(createElement('input', {id:'optSelTLD', type:'text'}, null, null));//http://translate.google.com/?hl=et&tab=wT
  382.         //getId('optSelTLD').value = GM_getValue('TLD') ? GM_getValue('TLD') : "com";
  383.         //getId('optSelTLD').addEventListener('change', quickLookup, false);
  384.        
  385.         //use ctrl
  386.         divOptions.appendChild(createElement('br'));
  387.         divOptions.appendChild(createElement('input', {id:'checkCtrl', type:'checkbox'}));
  388.         divOptions.appendChild(createElement('span', null, null,'Use Ctrl key'));
  389.         getId('checkCtrl').checked = GM_getValue('ctrl');
  390.        
  391.         //save
  392.         //divOptions.appendChild(createElement('br'));
  393.         divOptions.appendChild(createElement('a', {href:HREF_NO, class:"gootranslink"}, 'click saveOptions false', '<br>- SAVE -'));
  394.        
  395.         //cancel
  396.         divOptions.appendChild(createElement('span', null, null,'&nbsp; &nbsp; &nbsp;'));
  397.         divOptions.appendChild(createElement('a', {href:HREF_NO, class:"gootranslink"}, 'click options false', 'Cancel <br>'));
  398.        
  399.  
  400.  
  401.     }
  402.     else//hide options
  403.     {
  404.         divOptions.parentNode.removeChild(divOptions);
  405.         getId('optionsLink').style.visibility = 'visible';
  406.     }
  407. }
  408.  
  409. function saveOptions(evt){
  410.  
  411.     var from = getId('optSelLangFrom').value;
  412.     var to = getId('optSelLangTo').value;
  413.     //TLD = getId('optSelTLD').value;
  414.     var ctrl = getId('checkCtrl').checked;
  415.    
  416.     GM_setValue('from', from);
  417.     GM_setValue('to', to);
  418.     GM_setValue('ctrl', ctrl);
  419.     //GM_setValue('TLD', TLD);
  420.    
  421.     getId('divDic').removeChild(getId('divOpt'));
  422.     getId('optionsLink').style.visibility = 'visible';
  423. }
  424.  
  425.  
  426.  
  427. function css(){
  428.  
  429.     var style = createElement('style',{type:"text/css"},null,""+   
  430.    
  431.         'a.gootranslink:link {color: #CCCCCC !important; text-decoration: underline !important;}'  +  
  432.         'a.gootranslink:visited {color: #CCCCCC !important; text-decoration: underline !important;}'+
  433.         'a.gootranslink:hover {color: #CCCCCC !important; text-decoration: underline !important;}'  +
  434.         'a.gootranslink:active {color: #CCCCCC !important; text-decoration: underline !important;}' +
  435.         '#dict span:first-child {color: #3399FF;}'+
  436.         '#dict h3{ background: none !important; color:#FFFFFF; font-size:13px; margin: 4px 4px 4px 4px;}'+
  437.         '#dict ol{ background: none !important; color:#FFFFFF; font-size:13px;  margin-left: 8px; list-style: none;}'
  438.        
  439.  
  440.  
  441.     );
  442.     getTag('head')[0].appendChild(style);
  443. }
  444.  
  445.  
  446. function createElement(type, attrArray, evtListener, html)
  447. {
  448.     var node = document.createElement(type);
  449.  
  450.     for (var attr in attrArray) if (attrArray.hasOwnProperty(attr)){
  451.         node.setAttribute(attr, attrArray[attr]);
  452.     }
  453.  
  454.     if(evtListener){
  455.         var a = evtListener.split(' ');
  456.         node.addEventListener(a[0], eval(a[1]), eval(a[2]));
  457.     }
  458.  
  459.     if(html)
  460.         node.innerHTML = html;
  461.    
  462.     return node;
  463. }
  464.  
  465. function getId(id, parent){
  466.     if(!parent)
  467.         return document.getElementById(id);
  468.     return parent.getElementById(id);  
  469. }
  470.  
  471. function getTag(name, parent){
  472.     if(!parent)
  473.         return document.getElementsByTagName(name);
  474.     return parent.getElementsByTagName(name);
  475. }
  476.  
  477. function xp(p, context, doc) {
  478.   if (!context)
  479.     context = document;
  480.   if (!doc)
  481.     doc = document;
  482.   var i, arr = [], xpr = doc.evaluate(p, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  483.   for (i = 0; item = xpr.snapshotItem(i); i++)
  484.     arr.push(item);
  485.     return arr;
  486. }
  487.  
  488. function debug(str)
  489. {
  490.    
  491.     var d = document.getElementById('debugg');
  492.     if(!d){
  493.         var div = document.createElement('div');
  494.         div.setAttribute('id','divdebug');
  495.         div.setAttribute('style', 'background-color:#000000; position:fixed; bottom:3px; left:3px; border-width:2px; border-style:solid; width:50%; z-index:999999999;');
  496.        
  497.         var closeButton = document.createElement('input');
  498.         closeButton.setAttribute('id','closedebug');
  499.         closeButton.setAttribute('type', 'button');
  500.         closeButton.setAttribute('value', 'close');
  501.         closeButton.setAttribute('onClick', 'this.parentNode.parentNode.removeChild(this.parentNode);');
  502.        
  503.         d = document.createElement('textarea');
  504.         d.setAttribute('id','debugg');
  505.         d.setAttribute('style',"height:150px; width:99%; margin:2px;");
  506.        
  507.         div.appendChild(d);
  508.         div.appendChild(document.createElement('br'));
  509.         div.appendChild(closeButton);
  510.         document.body.appendChild(div);
  511.     }
  512.     d.innerHTML += '\n'+str;
  513.     d.scrollTop = d.scrollHeight;
  514. }
  515.  
  516.  
  517.  
  518. /*
  519.  * Drag and drop support adapted fom http://www.hunlock.com/blogs/Javascript_Drag_and_Drop
  520.  */
  521.  
  522. var savedTarget=null;                           // The target layer (effectively vidPane)
  523. var orgCursor=null;                             // The original mouse style so we can restore it
  524. var dragOK=false;                               // True if we're allowed to move the element under mouse
  525. var dragXoffset=0;                              // How much we've moved the element on the horozontal
  526. var dragYoffset=0;                              // How much we've moved the element on the verticle
  527.  
  528. var didDrag=false;                              //set to true when we do a drag
  529.    
  530.    
  531. function moveHandler(e){
  532.     if (e == null) return;// { e = window.event }
  533.     if ( e.button<=1 && dragOK ){
  534.         savedTarget.style.left = e.clientX - dragXoffset + 'px';
  535.         savedTarget.style.top = e.clientY - dragYoffset + 'px';
  536.         return false;
  537.     }
  538. }
  539.  
  540. function dragCleanup(e) {
  541.     document.removeEventListener('mousemove',moveHandler,false);
  542.     document.removeEventListener('mouseup',dragCleanup,false);
  543.     savedTarget.style.cursor=orgCursor;
  544.  
  545.     dragOK=false; //its been dragged now
  546.     didDrag=true;
  547.    
  548. }
  549.  
  550. function dragHandler(e){
  551.  
  552.     var htype='-moz-grabbing';
  553.     if (e == null) return;//{ e = window.event;}  // htype='move';}
  554.     var target = e.target;// != null ? e.target : e.srcElement;
  555.     orgCursor=target.style.cursor;
  556.  
  557.     if(target.nodeName!='DIV')
  558.         return;
  559.     else if(clickedInsideID(target, 'dict'))
  560.         return;
  561.  
  562.     if (target = clickedInsideID(target, 'divDic')) {
  563.         savedTarget=target;      
  564.         target.style.cursor=htype;
  565.         dragOK=true;
  566.         dragXoffset = e.clientX-target.offsetLeft;
  567.         dragYoffset = e.clientY-target.offsetTop;
  568.        
  569.         //set the left before removing the right
  570.         target.style.left = e.clientX - dragXoffset + 'px';
  571.         target.style.right = null;
  572.        
  573.        
  574.         document.addEventListener('mousemove',moveHandler,false);
  575.         document.addEventListener('mouseup',dragCleanup,false);
  576.         return false;
  577.     }
  578. }
  579.  
  580. function clickedInsideID(target, id) {
  581.  
  582.     if (target.getAttribute('id')==id)
  583.         return getId(id);
  584.    
  585.     if (target.parentNode) {
  586.         while (target = target.parentNode) {
  587.             try{
  588.                 if (target.getAttribute('id')==id)
  589.                     return getId(id);
  590.             }catch(e){
  591.             }
  592.         }
  593.     }
  594.    
  595.     return null;
  596. }
  597.  
  598. //end drag code
  599.  
  600.  
  601. /*
  602.  * Images
  603.  */
  604. function images()
  605. {
  606.     imgLookup = createElement('img',{style:' border:1px solid rgba(50,50,255,0.3);'});
  607.     imgLookup.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAIkSURBVHjafJPfS5NhFMc/m+9KF6lNZrhVuKRf6kUg3ghJt0IIQVZSN0Ip0U1G9B8IXtRFV9XVKIiaFwUD6SIqcGuji6C6GFQsWbh3YvrOV7e9bu+2p4unvdsbrnN1znnO+Z4f3/M4hBAY+XVBgxhGztLLZpHunhM0EYfz3+RoLMrL8KItalVNNAMQCsCzUIify8sApNUMgGUD3JyeagaA0mik1Qx+X48NqGY3naGQ+y0AviQSPHz0mNnbt/C2u5kLLrJ37K4VmNmBfLHAiunm17YJwMZFF0ptYccDRwBYeBHiaCBA4Nw11Mp/i9O1YOJsdFy9PEFazRD5EEOteGzVp31pZgNZDrkKu+9A38ryfilqS6rJ0D6NQXeOqqgw6mkjprkk3foaStksompbDAc9RC6Ns72p4fX5mdfkzABDPkPSmc1zoTPFPIMWuBNgOCjbPRPy03/yGN52N99ysGK6Aehv04muGLwp9gEw4jEx9DUJ4L9vY5LeB620tDgse9SzQ6Ui+KrBktYKwFTH9zqNQgjhupO0HOa9PpyTYQ6cHwPg7cBnvO1uSmbJitGNMlc+dZNc1+UIVV0eTVXP0HJdLjL76jUjHpOONoWPqyYzcYWZuMKTH7K7iYPZege1JACR02wjJecOMxNXiBbqtL47LTs+G+mUAAC7gewZ7pWL2t9lvVW3N+yn/Dff9iOdk2Gqz8cZeJoiXxL272calp66ccrxZwBv/uuqHYuQPQAAAABJRU5ErkJggg==';
  608. }
  609.  
  610.  
  611. function checkupd(){
  612.     var d = new Date();
  613.     if (GM_getValue('lastcheck') == d.getDate()) {
  614.         return
  615.     }
  616.     GM_setValue('lastcheck',d.getDate());
  617.    
  618.     GM_xmlhttpRequest({
  619.         method:"GET",
  620.         url:'http://userscripts.org/scripts/source/129358.meta.js',
  621.         onload:function(result) {
  622.             if (result.responseText.indexOf('@version        0.3.1') == -1) {
  623.                 Upd = true;
  624.                 imgLookup.src = 'data:image/gif;base64,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';
  625.             }
  626.         }
  627.     });
  628. }
Add Comment
Please, Sign In to add comment