// ==UserScript== // @name Google Translator Tooltip // @namespace meh // @description Translates selected text into a tooltip. // @include http://* // @require http://code.jquery.com/jquery-1.7.2.min.js // @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js // ==/UserScript== const HREF_NO = 'javascript:void(0)'; const MAX_Z = 2147483640; var imgLookup; var txtSel; // text selected var currentURL; var languagesGoogle; var timerWindowResize; var initialized = false; var COLOR_BG1, COLOR_BG2, COLOR_TEXT, COLOR_LINK; var colorschemes = [ {name:'Default', bg1:'#FFFF77', bg2:'#FFFFAA', link:'#0000FF', text:'#333333'}, {name:'Dark', bg1:'#333', bg2:'#555', link:'#ddd', text:'#eee'}, // http://www.colorschemer.com/schemes/viewscheme.php?id=9456 {name:'Dark green', bg1:'#284030', bg2:'#5D7350', link:'#FAFCB6', text:'#E2F0A8'}, //http://www.colorschemer.com/schemes/viewscheme.php?id=315 {name:'Dark blue', bg1:'#2D4358', bg2:'#3A5065', link:'#b5cce3', text:'#b5cce3'}, //http://www.colorschemer.com/schemes/viewscheme.php?id=9603 {name:'Dark red', bg1:'#751310', bg2:'#9C1B19', link:'#FAEFE0', text:'#FAEFE0'},//DEB990 //http://www.colorschemer.com/schemes/viewscheme.php?id=158 {name:'Light green', bg1:'#4F724F', bg2:'#649064', link:'#EDF8ED', text:'#EDF8ED'}, //http://www.colorschemer.com/schemes/viewscheme.php?id=158 {name:'Light blue', bg1:'#4D6680', bg2:'#647A90', link:'#EDF2F8', text:'#EDF2F8'} ] //setup events document.addEventListener('mouseup', showLookupIcon, false); document.addEventListener('mousedown', mousedownCleaning, false); window.addEventListener('resize', windowResizeHandler, false); function mousedownCleaning(evt){ var divDic = getId('divDic'); var divLookup = getId('divLookup'); if(divDic) { if(!clickedInsideID(evt.target,'divDic')){ divDic.parentNode.removeChild(divDic); } } if(divLookup) divLookup.parentNode.removeChild(divLookup); } function showLookupIcon(evt){ if(evt.ctrlKey && evt.altKey && (!GM_getValue('ctrl') || !GM_getValue('alt'))) return; //XOR http://www.howtocreate.co.uk/xor.html if(evt.ctrlKey ? !GM_getValue('ctrl') : GM_getValue('ctrl')) return; if(evt.altKey ? !GM_getValue('alt') : GM_getValue('alt')) return; var divDic = getId('divDic'); var divLookup = getId('divLookup'); txtSel = getSelection(evt); //exit if no text is selected if(!txtSel || txtSel=="") { if(divDic) { if(!clickedInsideID(evt.target,'divDic')){ divDic.parentNode.removeChild(divDic); deselect(); } } if(divLookup) divLookup.parentNode.removeChild(divLookup); return; } //possible cleanup if(divDic) { if(!clickedInsideID(evt.target,'divDic')){ divDic.parentNode.removeChild(divDic); deselect(); } return; } //remove div if exists if(divLookup) { divLookup.parentNode.removeChild(divLookup); } if(!initialized){ initialized = true; images(); if( GM_getValue('opt_youtube') == undefined ){ GM_setValue('opt_youtube',true) GM_setValue('opt_youtube_auto',true) GM_setValue('opt_compare',true) } } css(true); //div container divLookup = createElement('div', {id: 'divLookup', style: 'top:'+(evt.clientY+window.pageYOffset+10)+'px; left:'+(evt.clientX + window.pageXOffset + 10) + 'px;'}); divLookup.appendChild(imgLookup.cloneNode(false)); divLookup.addEventListener('mouseover', lookup, false); document.body.appendChild(divLookup); if(GM_getValue('opt_shadow')==true) $(divLookup).addClass('classShadowww') repositionNode($('#divLookup')); } function lookup(evt){ var divResult = null; var divDic = getId('divDic'); var divLookup = getId('divLookup'); var top = divLookup.style.top; var left = divLookup.style.left; //no text selected if(!txtSel || txtSel==""){ if(divDic = getId('divDic')) divDic.parentNode.removeChild(divDic); return; } //cleanup divs if(divDic = getId('divDic')) { divDic.parentNode.removeChild(divDic); } divLookup.parentNode.removeChild(divLookup); //div container divDic = createElement('div', {id:'divDic'}); divDic.style.top = top; divDic.style.left = left; divDic.addEventListener('mousedown', dragHandler, false); document.body.appendChild(divDic); if(GM_getValue('opt_shadow')==true) $(divDic).addClass('classShadowww') //div result divResult = createElement('div', {id:'divResult'}, null, 'Loading...'); divDic.appendChild(divResult); //options link divDic.appendChild(createElement('span', {id:'optionsLink', title:'options', href:HREF_NO}, 'click toggleOptions false', '>>')); //lookup if( txtSel.search(/^\s*https?:\/\//) > -1 ) { divResult.innerHTML = '<a class="gootranslink" href="'+txtSel+'" target="_blank" >'+txtSel+'</a>'; if(GM_getValue('opt_youtube') && isYoutubeLink(txtSel) ) return; } else if( txtSel.search(/^\s*\S+(\.\S+)+/) > -1 ) // site.dom { divResult.innerHTML = '<a class="gootranslink" href="http://'+txtSel+'" target="_blank" >'+txtSel+'</a>'; if(GM_getValue('opt_youtube') && isYoutubeLink(txtSel) ) return; } else { var sl, tl, lang; sl = GM_getValue('from') ? GM_getValue('from') : "auto"; tl = GM_getValue('to') ? GM_getValue('to') : "auto"; lang = sl + "|" + tl; currentURL = "http://www.google.com/translate_t?text=" + txtSel + "&langpair=" + lang; GM_xmlhttpRequest({ method: 'GET', url: currentURL, onload: function(resp) { try{ extractResultFrames(resp); }catch(e){ GM_log(e); } } }); } repositionNode($('#divDic')); //store query as attribute getId('divDic').setAttribute('query', txtSel); //other searches divDic.appendChild(createElement('span',{id:'spanOtherSearches', title:'search other sites'},'mouseover otherSites false','+')); } function quickLookup(){ getId('divResult').innerHTML = 'Loading...' currentURL = "http://www.google.com/translate_t?text=" + $('#divDic').attr('query') + "&langpair=" + getId('optSelLangFrom').value + "|" + getId('optSelLangTo').value; GM_xmlhttpRequest({ method: 'GET', url: currentURL, onload: function(resp) { try{ extractResultFrames(resp); }catch(e){ GM_log(e); } } }); } function otherSites(evt){ var ul, li, query = getId('divDic').getAttribute('query').replace(/\s+$/,'').replace(/^\s+/,''); var sites = [ {name:'Google', href:'http://www.google.com/search?q='+query.replace(/\s+/g,'+')}, {name:'Google Images', href:'http://www.google.com/images?q='+query.replace(/\s+/g,'+')}, {name:'The Free Dictionary', href:'http://www.thefreedictionary.com/'+query.replace(/\s+/g,'+')}, {name:'Urban Dictionary', href:'http://www.urbandictionary.com/define.php?term='+query.replace(/\s+/g,'+')}, {name:'Linguee', href:'http://www.linguee.com/search?query='+query.replace(/\s+/g,'+')}, {name:'Wikipedia', href:'http://www.wikipedia.org/w/index.php?title=Special%3ASearch&search='+query.replace(/\s+/g,'+')}, {name:'IMDb', href:'http://www.imdb.com/find?s=all&q='+query.replace(/\s+/g,'+')}, {name:'Youtube', href:'http://www.youtube.com/results?search_query='+query.replace(/\s+/g,'+')} ]; getId('divDic').appendChild(createElement('br')); getId('divDic').appendChild(document.createTextNode('Search "'+(query.match(/^[\s\S]{15}/) ? query.match(/^[\s\S]{15}/)[0]+'...' : query.match(/^[\s\S]+/)[0] )+'" at:')); ul = getId('divDic').appendChild(createElement('ul')); for(var i=0; i<sites.length; i++){ li = ul.appendChild(createElement('li')); li.appendChild(createElement('a', {class:'gootranslink', target:'_blank', href:sites[i].href}, null, sites[i].name)); } evt.target.parentNode.removeChild(evt.target); repositionNode($('#divDic')); } function extractResultFrames(resp){ //select body and remove some tags var html = resp.responseText.match(/\<body[^\>]*\>([\s\S]+)\<\/body\>/)[1]; html = html.replace(/\<script[^\<]+\<\/script\>/ig, ''); html = html.replace(/\<iframe[^\<]+\<\/iframe\>/ig, ''); //append requested page as hidden iframe var iframe = document.body.appendChild(createElement('iframe', {style:'visibility:hidden;'})); var divExtract = iframe.contentWindow.document.body.appendChild(createElement('div', {id:'divExtract'}, null, html)); divExtract = document.importNode(divExtract, true); iframe.parentNode.removeChild(iframe); //adjust link(s) var arrs = getTag('a',divExtract); for(var i=0; i<arrs.length; i++){ arrs[i].setAttribute('target','_blank'); arrs[i].setAttribute('class','gootranslink'); } //gather info var translation = trim( xp('.//span[@id="result_box"]', divExtract)[0].textContent ); var dict = xp('.//div[@id="gt-res-dict"]', divExtract)[0]; if(dict){ try{ dict.removeChild(getTag('h3',dict)[0]); dict = dict.innerHTML; }catch(e){ dict = null; } } //parse info getId('divResult').innerHTML = '<a class="gootranslink" href="'+currentURL+'" target="_blank">' + translation + '</a>' + '<div id="divCompareee" ' + (GM_getValue('opt_compare')==true ? '' : 'style="display:none;"') + '>' + $('#divDic').attr('query') + '</div>'; if(dict) { getId('divResult').innerHTML += '<br><br><div id="dict">'+dict+'</div>'; } repositionNode($('#divDic')); } function repositionNode(node){ //reposition div if out of bounds var pos = node.offset(); if(pos==null) return; var w = node.width(); var h = node.height(); if(pos.left + w > window.innerWidth+window.pageXOffset){ node.css('left', window.innerWidth+window.pageXOffset - w - 25); } if(pos.top + h > window.innerHeight+window.pageYOffset){ node.css('top', window.innerHeight+window.pageYOffset - h - 25); } } function repositionNodeFixed(node,pad){ //reposition fixed node if out of window var pos = node.offset(); if(pos==null) return; var w = node.width(); var h = node.height(); if(pos.left + w > window.innerWidth+window.pageXOffset){ node.css('left', window.innerWidth- w - (pad?pad:25)); } if(pos.top + h > window.innerHeight+window.pageYOffset){ node.css('top', window.innerHeight - h - (pad?pad:25)); } } function trim(str){ return str.replace(/^\s+/,'').replace(/\s+$/,''); } function getSelection(evt){ var txt = null; //get selected text if(evt && evt.target.nodeName=='TEXTAREA') { //var begin = evt.target.value.substr(0, evt.target.selectionStart); txt = evt.target.value.substr(evt.target.selectionStart, evt.target.selectionEnd - evt.target.selectionStart); //var end = evt.target.value.substr(evt.target.selectionEnd); //myArea.value = begin + text1 + selection + text2 + end; } else if (window.getSelection) { txt = window.getSelection(); } else if (document.getSelection) { txt = document.getSelection(); } else if (document.selection) { txt = document.selection.createRange().text; } try{ return txt.toString(); }catch(e){ return txt; } } //http://stackoverflow.com/questions/6186844/clear-a-selection-in-firefox/6187098#6187098 function deselect(){ try{ window.getSelection().removeAllRanges() }catch(e){ document.selection.empty() } } function isYoutubeLink(txt){ var id, time=null; if(txt.search(/youtube\.com\/watch\?/) > -1) id = txt.match(/[\?\&]v\=([^\&]+)/)[1] else if(txt.search(/youtu.be\//) > -1) id = txt.match(/youtu.be\/([^\?]+)/)[1] else if(txt.search(/youtube\.com\/v\/[^\?]+/) > -1) //embed url id = txt.match(/youtube\.com\/v\/([^\?]+)/)[1] else return false; //if skip to timestamp try{ time = txt.match(/[\?\&\#](t\=[^\&]+)/)[1]; }catch(e){ time = null; } if(time!=null){ //convert to seconds for parameter "start" var h, m, s; try{ h = parseInt(time.match(/(\d+)h/)[1]); }catch(e){ h = 0; } try{ m = parseInt(time.match(/(\d+)m/)[1]); }catch(e){ m = 0; } try{ s = parseInt(time.match(/(\d+)s/)[1]); }catch(e){ s = 0; } time = s + (m*60) + (h*60*60); }else{ //if embed url ( http://www.youtube.com/v/vIdEoIddD?fs=1&autoplay=1&start=34 ) if(txt.search(/[\?\&]start\=\d+/) > -1) time = txt.match(/start\=(\d+)/)[1]; } //clear selection deselect(); //check if video is already opened if( $('.classDivYoutubeeee[ytvid="'+id+'"]').length > 0 ){ var div = $('.classDivYoutubeeee[ytvid="'+id+'"]:first'); if(div.hasClass('classYoutubeMinimizeddd')){ toggleYoutubeSize({target: div.find('.classtoggleSize:first').get(0)}) } div.effect('shake',{times:2}) //remove lookup icon, div dict $('#divDic,#divLookup').remove() return true; } // create video div var auto = GM_getValue('opt_youtube')==true && GM_getValue('opt_youtube_auto')==true ? 1 : 0; var url = 'http://www.youtube.com/v/' + id + '?fs=1&autoplay=' + auto + ( time!=null ? '&start='+time : ''); var pos = $('#divDic').offset(); var div = $('<div>') .attr('ytvid',id) .addClass('classDivYoutubeeee') .css({backgroundColor:COLOR_BG1, position:'fixed', top:Math.abs(window.pageYOffset-pos.top), left:Math.abs(window.pageXOffset-pos.left), zIndex:MAX_Z, padding:'0px 26px', borderRadius:'5px'}) .appendTo(document.body) .append( $('<span title="close">').css({float:'right', cursor:'pointer',color:COLOR_LINK, marginLeft:7}).append('\u24E7').click(function(evt){ $(this).parents('.classDivYoutubeeee:first').remove(); }) ) .append( $('<span class="classtoggleSize" title="toggle size">').css({float:'right', cursor:'pointer',color:COLOR_LINK, marginLeft:7}).append('\u21F2').click(toggleYoutubeSize) ) .append('<br><object><param name="movie" value="'+url+'"</param><param name="allowFullScreen" value="true"></param><embed src="'+url+'" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object><br><br>') .draggable() //add shadow if(GM_getValue('opt_shadow')==true) div.addClass('classShadowww') //position repositionNodeFixed(div); //remove lookup icon, div dict $('#divDic,#divLookup').remove() return true; } function toggleYoutubeSize(evt){ var div = $(evt.target).parents('.classDivYoutubeeee:first'); var ytlink = div.find('a[href*="youtube.com"]'); var pos = div.offset(); if(!div.hasClass('classYoutubeMinimizeddd')){ // minimize ytlink.hide(); div.addClass('classYoutubeMinimizeddd'); //backup div position div.attr({prevlefttt: Math.abs(window.pageXOffset - pos.left), prevtoppp: Math.abs(window.pageYOffset - pos.top)}) //resize div div.find('embed').attr({width:'212.5', height:'172'}) //position div div.css({top:window.innerHeight-div.outerHeight()-7, left:window.innerWidth-div.outerWidth()-13}) if($('.classYoutubeMinimizeddd').length > 1){//distribute minimized divs var len = $('.classYoutubeMinimizeddd').length; var top = div.offset().top; var left = div.offset().left; left -= (div.outerWidth()+7) * (len-1); if(left < 0){ left = div.offset().left; } div.css({left:left}) } //change icon to maximize evt.target.innerHTML = '\u21F1'; }else{ // restore ytlink.show(); div.removeClass('classYoutubeMinimizeddd'); //restore div position div.css({top:div.attr('prevtoppp')+'px', left:div.attr('prevlefttt')+'px'}) //restore div size div.find('embed').attr({width:'425', height:'344'}) //set minimize icon evt.target.innerHTML = '\u21F2'; } } function windowResizeHandler(evt){ clearTimeout(timerWindowResize); timerWindowResize = setTimeout(windowResized,333); } function windowResized(evt){ if($('#divDic,.classDivYoutubeeee').length==0) return; if($('#divDic').length > 0) repositionNodeFixed($('#divDic')); if($('.classDivYoutubeeee').length > 0){ var vids = $('.classDivYoutubeeee'); for(var i=0; i<vids.length; i++) repositionNodeFixed(vids.eq(i),35); } } function toggleOptions(evt){ if(!languagesGoogle){ languagesGoogle = '<option value="auto">Detect language</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-TW">Chinese_TC</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="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="de">German</option><option value="el">Greek</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="id">Indonesian</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mt">Maltese</option><option value="no">Norwegian</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="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="vi">Vietnamese</option>'; } var divOptions = getId('divOpt'); if(!divOptions)//show options { divOptions = createElement('div', {id:'divOpt'}); getId('divDic').appendChild(divOptions); getId('optionsLink').style.visibility = 'hidden'; //from divOptions.appendChild(createElement('span', null, null,'From:')); divOptions.appendChild(createElement('select', {id:'optSelLangFrom'}, null, languagesGoogle)); getId('optSelLangFrom').value = GM_getValue('from') ? GM_getValue('from') : "auto"; getId('optSelLangFrom').addEventListener('change', quickLookup, false); //to divOptions.appendChild(createElement('span', null, null,' To:')); divOptions.appendChild(createElement('select', {id:'optSelLangTo'}, null, languagesGoogle)); getId('optSelLangTo').value = GM_getValue('to') ? GM_getValue('to') : "auto"; getId('optSelLangTo').addEventListener('change', quickLookup, false); //use ctrl divOptions.appendChild(createElement('br')); divOptions.appendChild(createElement('br')); divOptions.appendChild(createElement('input', {id:'checkCtrl', type:'checkbox'})); divOptions.appendChild(createElement('span', null, null,'Use Ctrl key')); getId('checkCtrl').checked = GM_getValue('ctrl'); //use alt divOptions.appendChild(createElement('br')); divOptions.appendChild(createElement('input', {id:'checkAlt', type:'checkbox'})); divOptions.appendChild(createElement('span', null, null,'Use Alt key')); getId('checkAlt').checked = GM_getValue('alt'); //Compare divOptions.appendChild(createElement('br')); divOptions.appendChild(createElement('input', {id:'checkCompare', type:'checkbox'})); divOptions.appendChild(createElement('span', null, null,'Compare translation to original')); getId('checkCompare').checked = GM_getValue('opt_compare'); $('#checkCompare').click(function(evt){ if(this.checked){ $('#divCompareee').show() }else{ $('#divCompareee').hide() } }) //box shadow divOptions.appendChild(createElement('br')); divOptions.appendChild(createElement('input', {id:'checkShadowww', type:'checkbox'})); divOptions.appendChild(createElement('span', null, null,'Show box shadow')); getId('checkShadowww').checked = GM_getValue('opt_shadow'); $('#checkShadowww').click(function(evt){ if(this.checked){ $('#divDic').addClass('classShadowww') }else{ $('.classShadowww').removeClass('classShadowww') } }) //youtube divOptions.appendChild(createElement('br')); divOptions.appendChild(createElement('input', {id:'checkYoutubeee', type:'checkbox'})); divOptions.appendChild(createElement('span', null, null,'Preview Youtube links')); getId('checkYoutubeee').checked = GM_getValue('opt_youtube'); $(divOptions).append( $('<div id="divOptYoutubeee">') .css({display: GM_getValue('opt_youtube')==true?'block':'none'}) //.append('<br>') .append(' <input id="checkYoutubeAutoplayyy" type="checkbox">') .append('autoplay video') ) getId('checkYoutubeAutoplayyy').checked = GM_getValue('opt_youtube_auto'); $('#checkYoutubeee').click(function(evt){ if(this.checked){ $('#divOptYoutubeee').show() }else{ $('#divOptYoutubeee').hide() } }) //colors $(divOptions).append( '<br>' +'<table id="tablecolorrr">' +'<tr><td>Color schemes:</td><td colspan=2><select id="selectColorSchemesss"><option value=""></option></select> <a class="gootranslink" id="spanNewColorSchemeee" statusss="hidden" href="'+HREF_NO+'">customize</span> </td></tr>' +'<tr style="display:none;"> <td>Background 1:</td> <td><input type="text" size="10" id="inputbgcolor111" value="'+COLOR_BG1+'" /></td> <td><input class="simplecolorrr" id="bgcolor111" value="'+COLOR_BG1+'" /></td> </tr>' +'<tr style="display:none;"><td>Background 2:</td> <td><input type="text" size="10" id="inputbgcolor222" value="'+COLOR_BG2+'" /></td> <td><input class="simplecolorrr" id="bgcolor222" value="'+COLOR_BG2+'" /></td> </tr>' +'<tr style="display:none;"><td>Text:</td> <td><input type="text" size="10" id="inputtxttt" value="'+COLOR_TEXT+'" /></td> <td><input class="simplecolorrr" id="textcolorrr" value="'+COLOR_TEXT+'" /></td></tr>' +'<tr style="display:none;"><td>Link:</td> <td><input type="text" size="10" id="inputlinkkk" value="'+COLOR_LINK+'" /></td> <td><input class="simplecolorrr" id="linkcolorrr" value="'+COLOR_LINK+'" /></td></tr>' +'</table>' ) $('.simplecolorrr').simpleColor({boxWidth:'0px', boxHeight:'0px', buttonClass:'classButtonColorrr'}); $('#bgcolor111, #bgcolor222, #linkcolorrr, #textcolorrr').change(optColorPickerChanged); $('#inputbgcolor111, #inputbgcolor222, #inputlinkkk, #inputtxttt').keyup(optColorInputChanged); for(var i=0; i<colorschemes.length; i++){ $('#selectColorSchemesss').append('<option value="'+colorschemes[i].name+'">'+colorschemes[i].name+'</option>') } $('#selectColorSchemesss').change(changeColorScheme) $('#spanNewColorSchemeee').click(function(evt){ if($('#spanNewColorSchemeee').attr('statusss')=='hidden'){ $('#tablecolorrr tr:not(:first-child)').show(); $('#spanNewColorSchemeee').attr('statusss','visible'); }else{ $('#tablecolorrr tr:not(:first-child)').hide(); $('#spanNewColorSchemeee').attr('statusss','hidden'); } }) //save divOptions.appendChild(createElement('br')); divOptions.appendChild(createElement('a', {href:HREF_NO, class:"gootranslink"}, 'click saveOptions false', 'save')); //cancel divOptions.appendChild(createElement('span', null, null,' ')); divOptions.appendChild(createElement('a', {href:HREF_NO, class:"gootranslink"}, 'click toggleOptions false', 'cancel')); repositionNode($('#divDic')); } else//cancel options { divOptions.parentNode.removeChild(divOptions); getId('optionsLink').style.visibility = 'visible'; css(true) } } function changeColorScheme(evt){ var name = this.value; if(name=='') return; var sch = getColorSchemeByName(name); if(sch == null){ return; } COLOR_BG1 = sch.bg1; COLOR_BG2 = sch.bg2; COLOR_TEXT = sch.text; COLOR_LINK = sch.link; css(); $('#inputbgcolor111').val(COLOR_BG1) $('#inputbgcolor222').val(COLOR_BG2) $('#inputtxttt').val(COLOR_TEXT) $('#inputlinkkk').val(COLOR_LINK) } function getColorSchemeByName(name){ for(var i=0; i<colorschemes.length; i++){ if(name == colorschemes[i].name) return colorschemes[i]; } return null; } function optColorInputChanged(evt){ var id, color = evt.target.value; // http://networking.mydesigntool.com/viewtopic.php?tid=415&id=31 if(!isColorValid(color)){ return; } if(color.charAt(0)!='#'){ color = '#'+color; } id = evt.target.getAttribute('id'); if(id=='inputbgcolor111'){ COLOR_BG1 = color; css(); }else if(id=='inputbgcolor222'){ COLOR_BG2 = color; css(); }else if(id=='inputtxttt'){ COLOR_TEXT = color; css(); }else if(id=='inputlinkkk'){ COLOR_LINK = color; css(); } } function isColorValid(color){ return (color.search(/^(#)?([0-9a-fA-F]{3})([0-9a-fA-F]{3})?$/) == 0); } function optColorPickerChanged(evt){ var color = evt.target.value; var id = evt.target.getAttribute('id'); if(id=='bgcolor111'){ COLOR_BG1 = color; $('#inputbgcolor111').val(color) css(); }else if(id=='bgcolor222'){ COLOR_BG2 = color; $('#inputbgcolor222').val(color) css(); }else if(id=='textcolorrr'){ COLOR_TEXT = color; $('#inputtxttt').val(color) css(); }else if(id=='linkcolorrr'){ COLOR_LINK = color; $('#inputlinkkk').val(color) css(); } } function saveOptions(evt){ var from = getId('optSelLangFrom').value; var to = getId('optSelLangTo').value; var ctrl = getId('checkCtrl').checked; var alt = getId('checkAlt').checked; var compare = getId('checkCompare').checked; var shadow = getId('checkShadowww').checked; var yt = getId('checkYoutubeee').checked; var ytauto = getId('checkYoutubeAutoplayyy').checked; GM_setValue('from', from); GM_setValue('to', to); GM_setValue('ctrl', ctrl); GM_setValue('alt', alt); GM_setValue('opt_compare', compare); GM_setValue('opt_shadow', shadow); GM_setValue('opt_youtube', yt); GM_setValue('opt_youtube_auto', ytauto); //colors if(!isColorValid($('#inputbgcolor111').val())){ $('#inputbgcolor111').effect('pulsate'); return; } if(!isColorValid($('#inputbgcolor222').val())){ $('#inputbgcolor222').effect('pulsate'); return; } if(!isColorValid($('#inputtxttt').val())){ $('#inputtxttt').effect('pulsate'); return; } if(!isColorValid($('#inputlinkkk').val())){ $('#inputlinkkk').effect('pulsate'); return; } GM_setValue('opt_color_bg1', $('#inputbgcolor111').val() ) GM_setValue('opt_color_bg2', $('#inputbgcolor222').val() ) GM_setValue('opt_color_text', $('#inputtxttt').val() ) GM_setValue('opt_color_link', $('#inputlinkkk').val() ) css(true) getId('divDic').removeChild(getId('divOpt')); getId('optionsLink').style.visibility = 'visible'; } function css(init){ $('#css_googletranslatortooltip').remove(); if(init==true){ COLOR_BG1 = GM_getValue('opt_color_bg1') != undefined ? GM_getValue('opt_color_bg1') : '#FFFF77' ; COLOR_BG2 = GM_getValue('opt_color_bg2') != undefined ? GM_getValue('opt_color_bg2') : '#FFFFAA'; COLOR_TEXT = GM_getValue('opt_color_text') != undefined ? GM_getValue('opt_color_text') : '#333333'; COLOR_LINK = GM_getValue('opt_color_link') != undefined ? GM_getValue('opt_color_link') : '#0000FF'; if(GM_getValue('opt_shadow')==true) $('#divDic,#divLookup').removeClass('classShadowww').addClass('classShadowww') else $('.classShadowww').removeClass('classShadowww') } var style = createElement('style', {id:'css_googletranslatortooltip', type:"text/css"}, null, '' +'a.gootranslink:link {color: '+COLOR_LINK+' !important; text-decoration: underline !important;}' +'a.gootranslink:visited {color: '+COLOR_LINK+' !important; text-decoration: underline !important;}' +'a.gootranslink:hover {color: '+COLOR_LINK+' !important; text-decoration: underline !important;}' +'a.gootranslink:active {color: '+COLOR_LINK+' !important; text-decoration: underline !important;}' +'#divLookup { background:none !important; color:'+COLOR_TEXT+' !important; position:absolute; z-index:'+MAX_Z+'; border:none !important;}' +'#divLookup img { border:2px solid '+COLOR_BG1+' !important;}' +'#divDic { background-color:'+COLOR_BG1+' !important; color:'+COLOR_TEXT+' !important; position:absolute; min-width:250px; min-height:50px; max-width:50%; padding:5px; font-size:small; text-align:left; z-index:'+MAX_Z+'; border-radius:3px; line-height:1 !important; border:none !important; }' +'#divResult {overflow:auto; padding:3px !important; background-color:'+COLOR_BG1+' !important; color:'+COLOR_TEXT+' !important; border:none !important; margin:0 !important; padding:0 !important; line-height:1 !important;}' +'#divOpt { background-color:'+COLOR_BG2+' !important; position:relative; padding:5px !important; border:none !important; margin:0 !important; line-height:1 !important;}' +'#optionsLink {position:absolute; bottom:3px; right:5px; font-size:small; text-decoration:none; cursor:pointer;}' +'#spanOtherSearches {position:absolute; left:5px; bottom:3px; cursor:pointer; font-size:small;}' +'#dict { background-color:'+COLOR_BG2+' !important; color:'+COLOR_TEXT+' !important; padding:5px; -moz-border-radius:3px; margin-bottom:10px; max-height:180px; overflow-y:auto; overflow-x:hidden; font-size:small;}' //translation comparison div +'#divCompareee {margin-bottom:7px !important;}' //lists +'#divDic ul {margin: 7px 23px !important; list-style: disc outside none !important; padding:0 !important;}'+ +'#dict > ol {list-style: none;}' +'#dict > ol > li {display:table-cell; }' //color options +'#tablecolorrr .simpleColorDisplay {display: none !important;}' +'#tablecolorrr {border:none !important; padding:0 !important; margin:0 !important;}' +'#tablecolorrr td {vertical-align: top !important; color:'+COLOR_TEXT+' !important; border:none !important; padding:0 !important; margin:0 !important;}' +'#tablecolorrr input, #tablecolorrr select {border:none !important; padding:0 !important; margin:0 !important; width:100% !important;}' +'#tablecolorrr td:first-child {text-align:right;}' +'#tablecolorrr .classButtonColorrr {vertical-align: top;}' //shadows +'.classShadowww { box-shadow: 3px 3px 10px #333 !important; }' ); getTag('head')[0].appendChild(style); } function createElement(type, attrArray, evtListener, html) { var node = document.createElement(type); for (var attr in attrArray) if (attrArray.hasOwnProperty(attr)){ node.setAttribute(attr, attrArray[attr]); } if(evtListener){ var a = evtListener.split(' '); node.addEventListener(a[0], eval(a[1]), eval(a[2])); } if(html) node.innerHTML = html; return node; } function getId(id, parent){ if(!parent) return document.getElementById(id); return parent.getElementById(id); } function getTag(name, parent){ if(!parent) return document.getElementsByTagName(name); return parent.getElementsByTagName(name); } function xp(p, context, doc) { if (!context) context = document; if (!doc) doc = document; var i, arr = [], xpr = doc.evaluate(p, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (i = 0; item = xpr.snapshotItem(i); i++) arr.push(item); return arr; } function debug(str) { var d = document.getElementById('debugg'); if(!d){ var div = document.createElement('div'); div.setAttribute('id','divdebug'); div.setAttribute('style', 'background-color:#000000; position:fixed; bottom:3px; left:3px; width:50%; z-index:999999999;'); var closeButton = document.createElement('input'); closeButton.setAttribute('id','closedebug'); closeButton.setAttribute('type', 'button'); closeButton.setAttribute('value', 'close'); closeButton.setAttribute('onClick', 'this.parentNode.parentNode.removeChild(this.parentNode);'); d = document.createElement('textarea'); d.setAttribute('id','debugg'); d.setAttribute('style',"height:150px; width:99%; margin:2px;"); div.appendChild(d); div.appendChild(document.createElement('br')); div.appendChild(closeButton); document.body.appendChild(div); } d.innerHTML += '\n'+str; d.scrollTop = d.scrollHeight; } /* * Drag and drop support adapted fom http://www.hunlock.com/blogs/Javascript_Drag_and_Drop */ var savedTarget=null; // The target layer (effectively vidPane) var orgCursor=null; // The original mouse style so we can restore it var dragOK=false; // True if we're allowed to move the element under mouse var dragXoffset=0; // How much we've moved the element on the horozontal var dragYoffset=0; // How much we've moved the element on the verticle var didDrag=false; //set to true when we do a drag function moveHandler(e){ if (e == null) return;// { e = window.event } if ( e.button<=1 && dragOK ){ savedTarget.style.left = e.clientX - dragXoffset + 'px'; savedTarget.style.top = e.clientY - dragYoffset + 'px'; return false; } } function dragCleanup(e) { document.removeEventListener('mousemove',moveHandler,false); document.removeEventListener('mouseup',dragCleanup,false); savedTarget.style.cursor=orgCursor; dragOK=false; //its been dragged now didDrag=true; } function dragHandler(e){ var htype='-moz-grabbing'; if (e == null) return;//{ e = window.event;} // htype='move';} var target = e.target;// != null ? e.target : e.srcElement; orgCursor=target.style.cursor; if(target.nodeName!='DIV') return; else if(clickedInsideID(target, 'dict')) return; if (target = clickedInsideID(target, 'divDic')) { savedTarget=target; target.style.cursor=htype; dragOK=true; dragXoffset = e.clientX-target.offsetLeft; dragYoffset = e.clientY-target.offsetTop; //set the left before removing the right target.style.left = e.clientX - dragXoffset + 'px'; target.style.right = null; document.addEventListener('mousemove',moveHandler,false); document.addEventListener('mouseup',dragCleanup,false); return false; } } function clickedInsideID(target, id) { if (target.getAttribute('id')==id) return getId(id); if (target.parentNode) { while (target = target.parentNode) { try{ if (target.getAttribute('id')==id) return getId(id); }catch(e){ } } } return null; } //end drag code /* * Images */ function images() { imgLookup = createElement('img',{border:0}); imgLookup.src = 'data:image/gif,GIF89a%12%12%B3%FF%FF%FF%F7%F7%EF%CC%CC%CC%BD%BE%BD%99%99%99ZYZRUR%FE%01%02!%F9%04%04%14%FF%2C%12%12%04X0%C8I%2B%1D8%EB%3D%E4%60(%8A%85%17%0AG*%8C%40%19%7CJ%08%C4%B1%92%26z%C76%FE%02%07%C2%89v%F0%7Dz%C3b%C8u%14%82V5%23o%A7%13%19L%BCY-%25%7D%A6l%DF%D0%F5%C7%02%85%5B%D82%90%CBT%87%D8i7%88Y%A8%DB%EFx%8B%DE%12%01%3B'; } /* * jQuery simple-color plugin * @requires jQuery v1.4.2 or later * * See http://recursive-design.com/projects/jquery-simple-color/ * * Licensed under the MIT license: * http://www.opensource.org/licenses/mit-license.php * * Version: 1.0.1 (201108151520) */ (function(c){c.fn.simpleColor=function(b){var o=["990033","ff3366","cc0033","ff0033","ff9999","cc3366","ffccff","cc6699","993366","660033","cc3399","ff99cc","ff66cc","ff99ff","ff6699","cc0066","ff0066","ff3399","ff0099","ff33cc","ff00cc","ff66ff","ff33ff","ff00ff","cc0099","990066","cc66cc","cc33cc","cc99ff","cc66ff","cc33ff","993399","cc00cc","cc00ff","9900cc","990099","cc99cc","996699","663366","660099","9933cc","660066","9900ff","9933ff","9966cc","330033","663399","6633cc","6600cc","9966ff","330066", "6600ff","6633ff","ccccff","9999ff","9999cc","6666cc","6666ff","666699","333366","333399","330099","3300cc","3300ff","3333ff","3333cc","0066ff","0033ff","3366ff","3366cc","000066","000033","0000ff","000099","0033cc","0000cc","336699","0066cc","99ccff","6699ff","003366","6699cc","006699","3399cc","0099cc","66ccff","3399ff","003399","0099ff","33ccff","00ccff","99ffff","66ffff","33ffff","00ffff","00cccc","009999","669999","99cccc","ccffff","33cccc","66cccc","339999","336666","006666","003333","00ffcc", "33ffcc","33cc99","00cc99","66ffcc","99ffcc","00ff99","339966","006633","336633","669966","66cc66","99ff99","66ff66","339933","99cc99","66ff99","33ff99","33cc66","00cc66","66cc99","009966","009933","33ff66","00ff66","ccffcc","ccff99","99ff66","99ff33","00ff33","33ff33","00cc33","33cc33","66ff33","00ff00","66cc33","006600","003300","009900","33ff00","66ff00","99ff00","66cc00","00cc00","33cc00","339900","99cc66","669933","99cc33","336600","669900","99cc00","ccff66","ccff33","ccff00","999900","cccc00", "cccc33","333300","666600","999933","cccc66","666633","999966","cccc99","ffffcc","ffff99","ffff66","ffff33","ffff00","ffcc00","ffcc66","ffcc33","cc9933","996600","cc9900","ff9900","cc6600","993300","cc6633","663300","ff9966","ff6633","ff9933","ff6600","cc3300","996633","330000","663333","996666","cc9999","993333","cc6666","ffcccc","ff3333","cc3333","ff6666","660000","990000","cc0000","ff0000","ff3300","cc9966","ffcc99","ffffff","cccccc","999999","666666","333333","000000","000000","000000","000000", "000000","000000","000000","000000","000000"];b=c.extend({defaultColor:this.attr("defaultColor")||"#FFF",border:this.attr("border")||"1px solid #000",cellWidth:this.attr("cellWidth")||10,cellHeight:this.attr("cellHeight")||10,cellMargin:this.attr("cellMargin")||1,boxWidth:this.attr("boxWidth")||"115px",boxHeight:this.attr("boxHeight")||"20px",columns:this.attr("columns")||16,insert:this.attr("insert")||"after",buttonClass:this.attr("buttonClass")||"",colors:this.attr("colors")||o,displayColorCode:this.attr("displayColorCode")|| false,colorCodeAlign:this.attr("colorCodeAlign")||"center",colorCodeColor:this.attr("colorCodeColor")||"#FFF"},b||{});this.hide();b.totalWidth=b.columns*(b.cellWidth+2*b.cellMargin);if(c.browser.msie)b.totalWidth+=2;b.totalHeight=Math.ceil(b.colors.length/b.columns)*(b.cellHeight+2*b.cellMargin);c.simpleColorOptions=b;this.each(function(){var a=c.simpleColorOptions,i=c("<div class='simpleColorContainer' />"),l=this.value&&this.value!=""?this.value:a.defaultColor,d=c("<div class='simpleColorDisplay' />"); d.css("backgroundColor",l);d.css("border",a.border);d.css("width",a.boxWidth);d.css("height",a.boxHeight);d.css("cursor","pointer");i.append(d);if(a.displayColorCode){d.text(this.value);d.css("color",a.colorCodeColor);d.css("textAlign",a.colorCodeAlign)}var j=c("<input type='button' value='Select' class='simpleColorSelectButton "+a.buttonClass+"'>");i.append(j);var k=c("<input type='button' value='Cancel' class='simpleColorCancelButton "+a.buttonClass+"'>");i.append(k);k.hide();l=function(e){e.data.select_button.hide(); e.data.cancel_button.show();if(e.data.container.chooser)e.data.container.chooser.show();else{var g=c("<div class='simpleColorChooser'/>");g.css("border",a.border);g.css("margin","0px");g.css("margin-top","3px");g.css("width",a.totalWidth+"px");g.css("height",a.totalHeight+"px");e.data.container.chooser=g;e.data.container.append(g);for(var m=0;m<a.colors.length;m++){var f=c("<div class='simpleColorCell' id='"+a.colors[m]+"'/>");f.css("width",a.cellWidth+"px");f.css("height",a.cellHeight+"px");f.css("margin", a.cellMargin+"px");f.css("cursor","pointer");f.css("lineHeight",a.cellHeight+"px");f.css("fontSize","1px");f.css("float","left");f.css("backgroundColor","#"+a.colors[m]);g.append(f);f.bind("click",{input:e.data.input,chooser:g,select_button:j,cancel_button:k,display_box:d},function(h){h.data.input.value="#"+this.id;c(h.data.input).change();h.data.display_box.css("backgroundColor","#"+this.id);h.data.chooser.hide();h.data.cancel_button.hide();h.data.display_box.show();h.data.select_button.show();a.displayColorCode&& h.data.display_box.text("#"+this.id)})}}};var n={container:i,input:this,cancel_button:k,display_box:d,select_button:j};j.bind("click",n,l);d.bind("click",n,l);k.bind("click",{container:i,select_button:j,display_box:d},function(e){c(this).hide();e.data.container.find(".simpleColorChooser").hide();e.data.display_box.show();e.data.select_button.show()});c(this).after(i)});return this};c.fn.closeSelector=function(){this.each(function(){var b=c(this).parent().find("div.simpleColorContainer");b.find(".simpleColorCancelButton").hide(); b.find(".simpleColorChooser").hide();b.find(".simpleColorDisplay").show();b.find(".simpleColorSelectButton").show()});return this}})(jQuery);
Mozilla add on,User script,Grease Monkey Script, greasemonkey userscripts, updater userscripts mafia wars userscripts mafia wars autoplayer userscripts mafia wars wall userscripts scripts userscripts travian greasemonkey greasemonkey download greasemonkey facebook greasemonkey tutorial greasemonkey youtube greasemonkey travian greasemonkey chrome greasemonkey mafia wars greasemonkey mafia wars autoplayer
Tuesday, September 25, 2012
Google Translator Tooltip
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment