translate.google tooltip

Translates selected text into a `tooltip' via Google translate

当前为 2017-12-31 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name translate.google tooltip
  3. // @namespace trespassersW
  4. // @author trespassersW
  5. // @copyright trespassersW
  6. // @license MIT
  7. // @description Translates selected text into a `tooltip' via Google translate
  8. // @include *
  9. // about:config -> greasemonkey.fileIsGreaseable <- true
  10. // /homepahe https://github.com/trespassersW/UserScripts/blob/master/show/translate.google_tooltip.md
  11. // @version 17.12.31
  12. //* This is a descendant of lazyttrick's http://userscripts.org/scripts/show/36898.
  13. // 17.12.30 +* TTS button for source text
  14. // 17.03.11 + keep text formatting
  15. // 16.10.26 + phonetic transcription
  16. // 16.09.01 + 'previous translation' button; [*] top of tooltip at top of client window
  17. // 16.08.26 + option for left/right tooltip position; keeps tooltip position after dragging
  18. // 16.08.16 + Word Definition is shown when source_language == target_language
  19. // 16.03.09 + bookmarlets interface -- javascript:postMessage('tgtooltip/auto/fr','*')
  20. // 16.01.17-2 *+ translation from input/textarea fields
  21. // 16.01.16.1 + alternative translation
  22. // 3.7.2 2015-04-20 * TTS: alt-select text inside tooltip and [ctrl/shift]-click language icon below
  23. // * [shift] tts window in IFRAME
  24. // * [ctrl] tts window in new tab
  25. // 3.0.0 - national flags icons -- from www.senojflags.com
  26. // 2.3 - new editable 'source text' field
  27. // 2.2.2 - backward translation - select text inside tooltip and click the icon under your selection.
  28. // 2.2.1 - Ctrl-Alt-click removes item from the history of translations
  29. // - Ability to change translation in the history -
  30. // select desired translation in the tooltip window using ctrl or alt -
  31. // which one is checked in your settings - then click on the icon below the selection.
  32. // 2.0.0c Alt key option added
  33. // If something goes wrong:
  34. // Tools->SQLite manager-> Database-> Connect_database->
  35. // %YourBrowserProfile%\gm_scripts\translate.google_tooltip.db ->
  36. // scriptvals-> alt/ctrl <- false
  37. // 2.0.0b
  38. // - exit by ESC
  39. // - 1k letters limit -- don't strain your Google
  40. //*/
  41. // /require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
  42. // @grant GM_info
  43. // @grant GM_getValue
  44. // @grant GM_openInTab
  45. // @grant GM_setValue
  46. // @grant GM_xmlhttpRequest
  47. // @grant GM_registerMenuCommand
  48. // @grant GM_setClipboard
  49. // @connect translate.google.com
  50. // @connect cdn.rawgit.com
  51. // @icon data:image/jpg;base64, R0lGODlhIAARALP/AAAAAP///xMYfAqf////Zv/qDuCeH8VmB8DAwAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAgALAAAAAAgABEAQASdEMlJgb00awkMKQZYjB8RBsE4AtLQvtt0sXHcEcT1pbxK0hsXRmYIGUUgA3DiQjQtssInRAjglMsa4ibtlqSGgECQymmaAwDYUhSFfKoQDQ3LdA6Hoh6qbW4sJHpFWTUAOEA3Vj1WZjF+HQU9X18oPxl0Wx4kXoFiZF1zMEJgbW8qJnAHoU4takocpW5IIISYGh1HRlh9hRZ4eIRaEQA7
  52. //
  53. // ==/UserScript==
  54.  
  55. if(document.body){
  56.  
  57. var main = function (){ "use strict";
  58.  
  59. var GTsuffix=".com"; // ".fr" ".de" ".ru" ".com"
  60. //{[ hacks
  61. var UA = navigator.userAgent;
  62. 0 && (UA="Mozilla/5.0 (Windows NT 5.1; rv:39.0) Gecko/20100101 Firefox/39.0");
  63. //]}
  64. var isChrome= (navigator.userAgent.indexOf("AppleWebKit")>0);
  65. var moz=isChrome? "-webkit-": "-moz-";
  66.  
  67. var GTurl= "https://translate.google"+GTsuffix+"/?";
  68. //var dictURL= "https://translate.google"+GTsuffix+"/translate_a/t?client=t";
  69. var dictURL= "https://translate.google"+GTsuffix+"/translate_a/single?client=t";
  70. var ttsURL= "https://translate.google.com/translate_tts?client=t";
  71.  
  72. var HREF_NO = 'javascript:void(0)';
  73.  
  74. var llii=0, _log = function(){ /* *
  75. for (var s=++llii +':', li=arguments.length, i = 0; i<li; i++)
  76. s+=' ' + arguments[i];
  77. console.log(s)
  78. /* */
  79. },_i=function(){};
  80. //_log=console.log.bind(console);
  81. _i=console.info.bind(console);
  82. _i("tgtt..");
  83. var URL='*'; var tURL;
  84. var GT_tl='auto';
  85. var body;
  86.  
  87. // http://www.senojflags.com/
  88. var senop="https://cdn.rawgit.com",
  89. seno="/trespassersW/UserScripts/master/Flags/",
  90. senox="index.html?gtrantoltip#",
  91. senoj=senop+seno+senox,
  92. senojflags = [seno, "http://lh/Flags/" ],
  93. senoext=".png";
  94. //
  95.  
  96. var res_dict='gt-res-dict'; //'gt_res_dict';
  97. var languagesGoogle, isInited=false;
  98. var rtl_langs="ar fa iw ur";
  99. var inTextArea= null;
  100. var maxHT=20, maxWC=3;
  101. var sourceBH = 3, sourceDP =10;
  102. var ht=null; // history table,
  103.  
  104. var imgForw,imgBack,imgSay,imgSwap,imgUse,imgSave,imgFlags,imgForwSrc,imgBackSrc,imgClip,imgGoGo,imgWayBack,imgFmt;
  105. var saySrc, sayDst;
  106. var txtSel,txtSelO; // text selected
  107. var currentURL, Qtxt='***'; var e6 =999999;
  108. var TKK;// = Math.round(Math.random()*e6)+"."+Math.round(Math.random()*e6);
  109. var gt_sl_gms, gt_tl_gms, gt_sl, gt_tl;
  110. var formatted;
  111. var sT;
  112. var noMup=0;
  113. var _G = (isChrome?'':moz)+"linear-gradient",_T='transparent';
  114. var G_ ='rgba(0,0,0,.1)',W_='rgba(255,255,255,.1)';
  115. var FG={
  116. t: ['#000' ,'#000' ,'#000' ,'#000' ,'#eec' ,'#000' ,'#000' ], // text
  117. l: ['#047' ,'#047' ,'#047' ,'#052' ,'#7CF' ,'#047' ,'#670000'], // links
  118. g: ['#404040','#404040' ,'#404040','#404040','#ccb' ,'#404040','#404040'] // greyed txt
  119. };
  120.  
  121. var BG={
  122. t: ["yellow" ,"grey" ,"blue" ,"green" ,"dark" ,"striped", "pink" ], // titles
  123. C: ['#FFFFE1','#D1D1D1' ,'#D3ECEC','#C4FFC4','#333' , // bg Color
  124. _G+'(-45deg, #DDD, #AAA )' ,'#FFE6E6'], /* */
  125. A: ['#DFDFAE','#BBB' ,'#9ED4D5','#82f381' ,'#666' , // bg Color 4 alt tran
  126. _G+'(45deg, #DDD, #AAA )' ,'#FFCBCC'],/* */
  127. T: [_G+"(to right,#FFFFE1,#DDDDAA)", _G+"(to right,#D1D1D1,#A0A097)", // buttons
  128. _G+"(to right,#D3ECED,#8CCCCE)", _G+"(to right,#C4FFC4,#6BEF69)",
  129. _G+"(to right,#777,#373737)" , _G+"(to right,#CCC, #888)",
  130. _G+"(to right,#FFE6E6,#FFC6C8)" ],
  131. H: [_T,_T,_T,_T,_T, // dictionary items
  132. _G+'(to bottom ,rgba(127,127,127,.0),rgba(127,127,127,.15))', _T],
  133. F: [G_,G_,G_,G_,W_,G_,G_], // historic phrases
  134. E: ['#F4F4E8','#EEEEEE','#E8E8F4','#E8F4E8','#777777','#DDDDDD','#FFF2F2'] // Edit box
  135. }
  136.  
  137. function bgClick(e){
  138. css(e.target.paletteN);
  139. }
  140.  
  141. function mousedownCleaning(evt){
  142. var divDic = getId('divDic');
  143. var divLookup = getId('divLookup');
  144. var dU = getId('divUse');
  145. var t=evt.target;
  146. noMup=0; // patch :/
  147. if(divDic) {
  148. if(!clickedInsideID(evt.target,'divDic')){
  149. evt.preventDefault(),evt.stopPropagation();
  150. if(dU && clickedInsideID(t,'divUse')){
  151. if(clickedInsideID(t,'divGetback')) forwLookup(evt); else
  152. if(clickedInsideID(t,'divGetforw')) backLookup(evt); else
  153. if(clickedInsideID(t,'imgUse')) useClick(evt); else
  154. _log('x3 click');
  155. return;
  156. }
  157. else
  158. cleanUp('MC');
  159. } else killId(dU);
  160. }
  161. killId(divLookup);
  162. }
  163.  
  164. var documentcontentEditable=false;
  165. var documentdesignMode = '';
  166. var divExtract;
  167.  
  168. var escHnd;
  169. function setEscHnd(){
  170. if(!escHnd) escHnd=
  171. document.addEventListener('keydown', escCleanup, false);
  172. }
  173.  
  174. function cleanUp(s){
  175. _log(s);
  176. var d=getId('divSourcetext');
  177. if(d) sT= d.value;
  178. killId('divDic');
  179. killId('divExtract');
  180. killId('divLookup');
  181. killId('divUse');
  182. killId('divBack');
  183. killId('divSelflag');
  184. killId('divTtsIfr');
  185.  
  186. // finally fixed :/
  187. if(documentcontentEditable)
  188. document.contentEditable=documentcontentEditable,
  189. documentcontentEditable = false;
  190. if(documentdesignMode == 'on')
  191. document.designMode='on',
  192. documentdesignMode=null;
  193. }
  194.  
  195. function useClick(e){
  196. killId('divUse');
  197. if(e.shiftKey) ht[0][1] += '\n'+txtSel;
  198. else ht[0][1] = txtSel;
  199. GM_setValue('hist',JSON.stringify(ht));
  200. if(getId('divHist')){
  201. killId('divHist');
  202. history();
  203. }
  204. }
  205. var last_tl, last_sl,_l_="/";
  206. function backLookup(e){
  207. if(e.shiftKey || e.ctrlKey) {
  208. noMup=1;
  209. ttsRequest(txtSel,gt_tl, e.ctrlKey!=0);
  210. return;
  211. }
  212. killId('divUse');
  213. gtRequest(txtSel,gt_sl,gt_tl);
  214. currentURL = GTurl + "/" + gt_sl + _l_ + gt_tl + _l_ + escAp(txtSel);
  215. }
  216. //GET https://translate.google.com/?langpair=en|ru&text=Varnish
  217. //POST https://translate.google.com/translate_a/t?client=t&hl=ru&sl=en&tl=ru&text=Varnish
  218. function forwLookup(e){
  219. if(e.shiftKey || e.ctrlKey) {
  220. noMup=1;
  221. ttsRequest(txtSel,gt_sl, e.ctrlKey!=0);
  222. return;
  223. }
  224. killId('divUse');
  225. var t=gt_tl; gt_tl=gt_sl; gt_sl=t;
  226. gtRequest(txtSel,gt_sl,gt_tl);
  227. currentURL = GTurl + "/" + gt_sl + _l_ + gt_tl + _l_ + escAp(txtSel);
  228. }
  229. var Gctrl, Galt;
  230. Gctrl=GM_getValue('ctrl',false), Galt=GM_getValue('alt',true);
  231. var sayTip="\n[shift / ctrl] listen (";
  232. function showLookupIcon(evt){
  233. if((!evt.ctrlKey && Gctrl)
  234. ||(!evt.altKey && Galt)
  235. // to avoid collision
  236. ||(evt.ctrlKey && !Gctrl)
  237. ||(evt.altKey && !Galt)
  238. ||(evt.button!==0) // * 2016-01-03
  239. ) return;
  240. evt.preventDefault(),evt.stopPropagation();
  241.  
  242. var divDic = getId('divDic');
  243. var divLookup = getId('divLookup');
  244. txtSel = getSelection(evt.target)+'';
  245.  
  246. if(txtSel.length>1024){
  247. return;
  248. }
  249. //exit if no text is selected
  250. if(!txtSel || txtSel===""){
  251. _log('S:notext ')
  252. if(divDic) {
  253. if(!clickedInsideID(evt.target,'divDic'))
  254. cleanUp('no sel');
  255. }
  256. if(divLookup){
  257. killId(divLookup);
  258. }
  259. return;
  260. }
  261. //possible cleanup
  262. if(divDic){
  263. if(!clickedInsideID(evt.target,'divDic'))
  264. {cleanUp('!divdic'); return; }
  265. // inside divDic:
  266. var dU=getId('divUse');
  267. if(dU){
  268. if(!clickedInsideId('divUse')){
  269. killId(dU);
  270. } return;
  271. }
  272. try{
  273. var p= belowCursor(evt,10,10,'r');
  274. var divUse= buildEl('div', {id:'divUse',
  275. style:'z-index:110000; border: none'+
  276. ';top:' + p.t +';left:' + p.l +';right:' + p.r +';bottom: auto;'
  277. }, null, null );
  278.  
  279. var iTo = getFlagSrc(gt_tl,'to');
  280. var divForw=buildEl('span', {id:'divGetforw', // 'class': 'gootranslink', href: HREF_NO,
  281. //border: 0, src: iTo,
  282. title: gt_sl_gms + '\u2192 '+gt_tl_gms +sayTip+gt_tl+')'},
  283. null, imgH+iTo+imgT);
  284. // ['mousedown', forwLookup], imgH+iTo+imgT);
  285. divUse.appendChild(divForw);
  286. var iFrom = getFlagSrc(gt_sl,'from');
  287. var divBack=buildEl('span', {id:'divGetback', //'class': 'gootranslink', href: HREF_NO,
  288. //border: 0, src: iFrom,
  289. title: gt_tl_gms + '\u2192 '+gt_sl_gms +sayTip+gt_sl+')'},
  290. null, imgH+iFrom+imgT);
  291. // ['mousedown', backLookup], imgH+iFrom+imgT);
  292. if(gt_sl!='auto' && gt_sl!=gt_tl) divUse.appendChild(divBack);
  293.  
  294. addEl(divUse,'img',{id: 'imgUse', border: 0,
  295. title: 'use in history\n[shift] add to history', src: imgUse},
  296. null,null);
  297.  
  298. body.appendChild(divUse);
  299. }catch(e){console.log('use hist\n'+e)}
  300. return;
  301. }
  302. // inside page
  303. if(!isInited) {css(-1); isInited=true; }
  304. //remove div if exists
  305. if(divLookup)
  306. killId(divLookup);
  307. //div container
  308. p = belowCursor(evt,10,10);
  309. divLookup = buildEl('div', {id:'divLookup', style: 'z-index:100000'+
  310. ';border: none;' +
  311. ';top:' + p.t +';left:' + p.l +';right:' + p.r +';bottom: auto'
  312. }, null, null);
  313.  
  314. iTo = getFlagSrc(GM_getValue('to'),'to');
  315. var iForw=buildEl('img', {'border':0, id:"imgLookForw", style: 'padding-left: 5px',
  316. src: iTo}, ['mouseover', lookup],null);
  317. var sl=GM_getValue('from','auto'),tl=GM_getValue('to','auto');
  318. iFrom = getFlagSrc(sl,'from');
  319. var iBack=buildEl('img', {'border':0, id:"imgLookBack", style: 'padding-left: 5px',
  320. src: iFrom},
  321. ['mouseover', lookup], null);
  322. if(p.r == 'auto' ){ // left half
  323. divLookup.appendChild(iForw);
  324. if(sl != 'auto' && (sl!=tl)) divLookup.appendChild(iBack);
  325. }else{ // right half
  326. if(sl != 'auto' && (sl!=tl)) divLookup.appendChild(iBack);
  327. divLookup.appendChild(iForw);
  328. }
  329. body.appendChild(divLookup);
  330. }
  331. function escCleanup(e){
  332. if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode==27 ){
  333. cleanUp('esc');
  334. document.removeEventListener('keydown', escCleanup,false);
  335. escHnd=null;
  336. }
  337. }
  338.  
  339. function lookup(evt,aS,aT){
  340. var divResult = null;
  341. var divDic = getId('divDic');
  342. var divLookup = getId('divLookup');
  343. var top = divLookup.style.top;
  344. var left = divLookup.style.left;
  345. var rite = divLookup.style.right;
  346. var txtS = txtSel; // 2012-08-20
  347. if(evt) txtSel = getSelection(inTextArea? inTextArea: evt.target)+'';
  348. if(!txtSel) txtSel = txtS;
  349. if(txtSel.length>1024){
  350. return;
  351. }
  352. //exit if no text is selected
  353. if(!txtSel || txtSel==""){
  354. _log('L:notext')
  355. if(divDic) {
  356. if(!clickedInsideID(evt.target,'divDic'))
  357. killId(divDic);
  358. }
  359. killId('divLookup');
  360. killId('divDic');
  361. return;
  362. }
  363. //cleanup divs
  364. killId('divDic');
  365. killId('divLookup');
  366. //div container document.body.clientHeight/Width
  367. divDic = buildEl('div',
  368. {id:'divDic', style: 'top:'+top+';left:'+left+';right:'+rite+
  369. ';position:absolute!important;z-index:110000!important;'
  370. });
  371. divDic.addEventListener('mousedown', dragHandler, false);
  372. setEscHnd();
  373. body.appendChild(divDic);
  374. // patch gmail
  375.  
  376. if(document.contentEditable)
  377. documentcontentEditable = document.contentEditable,
  378. document.contentEditable = false;
  379. if(document.designMode == 'on')
  380. documentdesignMode='on',
  381. document.designMode='off';
  382.  
  383. //div result
  384. divResult = buildEl('div',
  385. {id:'divResult'}, null, 'Loading...');
  386. divDic.appendChild(divResult);
  387. /**/
  388. // history
  389. var divBottom = buildEl('div',{id:'divBottom', align: 'bottom'},null,null);
  390. addEl(divBottom,'a',
  391. {'class':"gootransbutt gootranslink gtlPassive", id:'historyLink', title: 'Translation history',
  392. align: 'left', href:HREF_NO},
  393. ['click', history], 'History');
  394. addEl(divBottom,'a',
  395. {'class':"gootransbutt gootranslink gtlPassive", id:'sourceLink', title: 'Source', href:HREF_NO},
  396. ['click', source],'Source');
  397. //options link
  398. addEl(divBottom,'a',
  399. {'class':"gootransbutt gootranslink gtlPassive", id:'optionsLink', title: 'Settings', href:HREF_NO},
  400. ['click', options], 'Options');
  401. divDic.appendChild(divBottom);
  402. /**/
  403. //lookup
  404. gt_sl = GM_getValue('from', 'auto');
  405. GT_tl = (gt_tl = GM_getValue('to',GT_tl));
  406. if( evt && evt.target.id== 'imgLookBack' ){
  407. var t=gt_tl; gt_tl=gt_sl; gt_sl=t;
  408. }
  409. if(aT){gt_tl=aT; gt_sl=aS;}
  410. gtRequest(txtSel,gt_sl,gt_tl);
  411. }
  412.  
  413. var IFR;
  414. function eStop(e){e.preventDefault(),e.stopPropagation()}
  415. function openInFrame(url){
  416. killId('divTtsIfr');
  417. var dD=getId('divDic');
  418. var IFR=buildEl('div',{id:'divTtsIfr'},null,null);
  419. var IFH=addEl(IFR,'div',{id:'divTtsIfh'},null,null);
  420. addEl(IFH, 'span',{'class':"gootransbutt gootranslink",style: 'color:red!important;'},
  421. ['click', function(e){killId('divTtsIfr')}],'&#x2716;');
  422. addEl(IFH, 'a',{'class':"gootransbutt gootranslink", id: 'divTtsLnk',
  423. href: url, target:"_blank", title: 'play in tab'},
  424. ['click',
  425. function(e)
  426. {eStop(e);GM_openInTab(e.target.href)}
  427. ],
  428. '');
  429. addEl(IFH, 'span', {},[],deURI(url));
  430. // addEl(IFR, 'br');
  431. var BFR=
  432. addEl(IFR, 'iframe',{
  433. width: "100%", height: "48", frameborder: "0",scrolling:"auto", marginheight:"0", marginwidth:"0",
  434. style:'padding-top:3px;overflow-x:hidden;',
  435. src: 'about:blank'
  436. },
  437. null,null);
  438. insAfter(IFR,getId('divBottom'));
  439. BFR.contentWindow.location.href=url;
  440. /*
  441. */
  442. }
  443. var soundSL=null,dictSL=null;
  444. function ttsRequest(txt,t,e){
  445. //
  446. txt=txt.split(' ').slice(0,19).join(' ');
  447. var tk=googleTK(txt,soundSL);
  448. soundSL=tk.SL;
  449. var etxt = escAp(txt);
  450. etxt=ttsURL + "&ie=utf-8&tl=" + t + "&tk="+tk.tk+ "&q=" + etxt;
  451. _log('tts> '+etxt);
  452. if(e)
  453. GM_openInTab(etxt);
  454. else
  455. openInFrame(etxt);
  456. //GM_openInTab(etxt);
  457. // sorry, firefox' decodeAudioData() does NOT support mp3
  458. }
  459. //
  460. function squashTxt(t,n){
  461. t=escAp(t); n=n || 10;
  462. t=t.split(/%20|\s|\.|;|,/).slice(0,n).join('%20');
  463. return t.substr(0,(n*110));
  464. }
  465. function stayOnTop(){ /*160901*/
  466. var divDic = getId('divDic');
  467. if(!divDic) return;
  468. var yo=parseInt(divDic.style.top);
  469. if(divDic && (yo < pageYOffset)) {
  470. divDic.style.top=(pageYOffset+5)+'px';
  471. }}
  472.  
  473. function gtRequest(txt,s,t){
  474. if( !wayBack[1] || (wayBack[1].t!=s || wayBack[1].t!=t || wayBack[1].txt!=txt))
  475. wayBack[0]=wayBack[1], wayBack[1]={txt:txt,s:s,t:t};
  476. var etxt = squashTxt(txt);
  477.  
  478. etxt=GTurl + "#" + s + _l_ + t + _l_ + etxt;
  479. currentURL = etxt ;
  480.  
  481. if(!divExtract){
  482. divExtract = '';
  483. Request(etxt);
  484. }else{
  485. extractResult(null);
  486. }
  487. last_sl = s; last_tl = t;
  488. }
  489. function Request(url,cb){
  490. var Url=url, meth=(1 && cb)? 'POST': 'GET';
  491. var Data='';
  492. var Hdr= {
  493. "User-Agent": UA
  494. ,"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  495. ,"Accept-Encoding": "gzip, deflate"
  496. //,"Host": "www.google.com"
  497. }
  498. if(1 && cb){
  499. var Q=url.split('&q=');
  500. Url=Q[0];
  501. Data='&q='+Q[1];
  502. Hdr["Content-Length"]=Data.length+'';
  503. Hdr["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8"
  504. }
  505.  
  506. GM_xmlhttpRequest({
  507. method: meth,
  508. url: Url,
  509. data: Data,
  510. headers: Hdr,
  511. synchronous: false, /* 17.11.30 */
  512. onload: function(resp) {
  513. if(cb)
  514. cb(resp.responseText)
  515. else
  516. extractResult(resp.responseText);
  517. }
  518. });
  519. }
  520.  
  521. function quickLookup(){
  522. gt_sl=getId('optSelLangFrom').value;
  523. gt_tl=getId('optSelLangTo').value;
  524. GT_tl=gt_tl;
  525. saveIt();
  526. gtRequest(txtSel,gt_sl,gt_tl);
  527. }
  528. function histLookup(e){
  529. try{
  530. var txt=e.target.textContent, ix=-1;
  531. //.innerHTML??
  532. e.preventDefault();
  533. var ha = getTag('a',getId('divHist'));
  534. // ix=ha.indexOf(e.target);
  535. /**/
  536. for(var i=0,l=ha.length; i<l; i++)
  537. if(e.target == ha[i]){ ix=i; break; }
  538. /**/
  539. if(ix<0) return;
  540. if(e.ctrlKey && e.altKey){ //remove itemm
  541. if(ix==0) return;
  542. killId('divHist');
  543. ht.splice(ix,1);
  544. GM_setValue('hist',JSON.stringify(ht));
  545. history();
  546. return;
  547. }
  548. var lang = ht[ix][2].match(/([a-zA-Z-]+)[\|\/]([a-zA-Z-]+)/);
  549. gt_sl=lang[1]; gt_tl=lang[2];
  550. txtSelO=txtSel = txt;
  551. getId('divResult').innerHTML = 'Loading...';
  552. gtRequest(txtSel,gt_sl,gt_tl);
  553. } catch(e){console.log('broken history\n'+e)}
  554. }
  555.  
  556. function fastSwap(){
  557. if(gt_sl != 'auto' && gt_sl != gt_tl ){
  558. var t= gt_sl; gt_sl=gt_tl; gt_tl=t;
  559. gtRequest(txtSel,gt_sl,gt_tl);
  560. }
  561. }
  562.  
  563. function badResponce(html,e){
  564. var dr=getId('divResult')
  565. dr.innerHTML = '';
  566. var br=addEl(dr,'a',{'class':'gootranslink'},null,'Bad Google response- '+(e?e:'?!1'));
  567. br.href=currentURL.substr(0,100);
  568. var m=html.match(/\<title\>[\s\S]*?\<\/title\>/);
  569. if(m && m[1])
  570. addEl(dr,'p',{},null,m[1]);
  571. //id="captcha"
  572. m=html.match(/(<img\s.*?\>)/);
  573. if(m && m[1])
  574. addEl(dr,'p',{},null,m[1]);
  575. //_log(html);
  576. return;
  577. }
  578. function goGoogle(e){
  579. e.preventDefault(), e.stopPropagation();
  580. var q=GTurl + "#" + last_sl + _l_ + last_tl + _l_ + squashTxt(txtSel,22);
  581. GM_openInTab(q);
  582. }
  583. function toggleFormat(e){
  584. e.preventDefault(), e.stopPropagation();
  585. formatted= !formatted;
  586. GM_setValue('formatted', formatted);
  587. gtRequest(formatted?txtSelO:txtSel,gt_sl,gt_tl);
  588. }
  589. var wayBack =[null,null];
  590. function goBack(e){
  591. e.preventDefault(), e.stopPropagation();
  592. if(wayBack[0]){
  593. killId('divUse');
  594. gtRequest(txtSel=wayBack[0].txt,gt_sl=wayBack[0].s,gt_tl=wayBack[0].t);
  595. }
  596. }
  597.  
  598. var ex_sl , ex_tl;
  599. function extractResult(html){
  600. if(html){
  601. var html2 = html.match(/\<body[^\>]*\>([\s\S]+)\<\/body\>/);//[1];//select body content
  602. if(!html2){ // too many lettters!!!11
  603. badResponce(html); return;
  604. }
  605. //-----------------------------------------------------------------------------------
  606. // TKK=eval('((function(){var a\x3d4264492758;var b\x3d-1857761911;return 406375+\x27.\x27+(a+b)})())');
  607. var res = /;TKK=(.*?\'\));/i.exec(html);
  608. if (res != null) {
  609. var res2 = /var a=(.*?);.*?var b=(.*?);.*?return (\d+)/i.exec(res[1].replace(/\\x3d/g, '='));
  610. if (res2 != null) {
  611. TKK = Number(res2[3]) + '.' + (Number(res2[1]) + Number(res2[2]));
  612. }
  613. }
  614.  
  615. //-----------------------------------------------------------------------------------
  616. html2 = html2[1].replace(/\<script[^\<]+\<\/script\>/g, '');//remove script tags...
  617. killId('divExtract');
  618. divExtract = (new DOMParser()).parseFromString(html2, "text/html");
  619.  
  620. ex_sl= gt_sl, ex_tl=gt_tl;
  621. }
  622. try{ //gather info
  623. // 2013-10-20
  624. var _sl = detectedLang(gt_sl);
  625. var _tl = detectedLang(gt_tl);
  626. /* ?!11 150415 _log('**',_sl+'>'+_tl) */
  627. if( 1 || ex_sl !== gt_sl )
  628. gt_sl_gms = _sl, gt_tl_gms =_tl;
  629. else
  630. gt_sl_gms = _tl, gt_tl_gms = _sl; /* ?!11 */
  631. getId('divBottom').removeChild(getId('optionsLink'));
  632. var oL= buildEl('div', {id:'optionsLink', title: 'Settings', 'class':''},
  633. null, null);
  634. addEl(oL,'a',{id:'gtplaySrc','class':'gootransbutt gootranslink', title: 'TTS'},
  635. ['mousedown', saySrc] , imgSay);
  636. addEl(oL,'a',{id:'optionsFrom','class':'gootransbutt gootranslink'},
  637. ['click', options], gt_sl_gms +' ');
  638. addEl(oL,'a',{id:'optionsFast','class':'gootransbutt gootranslink',
  639. title: 'swap languages'}, ['click', fastSwap], imgSwap);
  640. addEl(oL,'a',{id:'optionsTo','class':'gootransbutt gootranslink ' + (getId('divOpt') ? 'gtlActive':'gtlPassive')},
  641. ['click', options], gt_tl_gms );
  642. // addEl(oL,'a',{id:'gtpsaySrc','class':'gootransbutt gootranslink'},
  643. // ['click', sayDst] , imgSay);
  644. if(wayBack[0])
  645. addEl(oL,'a',{id: 'gtpGoBack','class':'gootransbutt gootranslink',
  646. title: 'previous translation', style: 'margin-left:9px;'
  647. }, ['click', goBack], imgWayBack);
  648. // addEl(oL,'a',{id: 'gtpFormat','class':'gootransbutt gootranslink',
  649. // title: 'format on/off', style: 'margin-left:6px;'
  650. // }, ['click', toggleFormat],
  651. // "<img border=0 style="+'"margin: 0 0 -3px 0;opacity:'+
  652. // (GM_getValue('formatted',false)?'1':'0.33')+'!important;"'+
  653. // "src='data:image/png;base64,"+imgFmt+"'>")
  654. ;
  655. addEl(oL,'a',{id: 'gtpGoogle','class':'gootransbutt gootranslink',
  656. title: GTurl+'#'+gt_sl + _l_ + gt_tl +'/ %s', style: 'margin-left:12px;'
  657. }, ['click', goGoogle], imgGoGo);
  658. getId('divBottom').appendChild(oL);
  659. }catch(e){ console.log('gather\n'+e); }
  660. // var translation = getXId("result_box").textContent;
  661. // first run: resolve tl = auto
  662. if(GT_tl == 'auto')try{
  663. GT_tl=getXId("gt-tl").value;
  664. if(GT_tl) GM_setValue('to', GT_tl);
  665. else GT_tl='en';
  666. gt_tl=GT_tl;
  667. }catch(e){console.log('auto?\n'+e)}
  668.  
  669. //parse info
  670. stayOnTop();
  671. var dR=getId('divResult');
  672. var tx='translating..';
  673. try{
  674. tx=getXId("result_box").textContent
  675.  
  676. }catch(e){tx=e;console.log("result_box\n"+e)}
  677. dR.innerHTML = '<div id=gdptrantxt>'+
  678. (tx||'Reading...') + '</div>';
  679. setTxtDir(dR,GT_tl);
  680. dict();
  681. }
  682. function setTxtDir(dR,tl){
  683. dR.style.textAlign = rtl_langs.indexOf(tl) < 0? 'left':'right';
  684. dR.style.direction = rtl_langs.indexOf(tl) < 0? 'ltr' : 'rtl';
  685. dR.lang=tl;
  686. }
  687. function getSelection(t){
  688. var txt = '';
  689. if (window.getSelection){
  690. txt = window.getSelection();
  691. }else if (document.getSelection) {
  692. txt = document.getSelection();
  693. }else if (document.selection) {
  694. txt = document.selection.createRange().text;
  695. }
  696. if(!t)
  697. t= document.activeElement;
  698. inTextArea= ( t&& t.type&& (/^(text|search)/i).test(t.type)) ? t : null;
  699. if(inTextArea){
  700. txt=t.value.substr(t.selectionStart,t.selectionEnd-t.selectionStart);
  701. }
  702. txtSel=ltAmp(txt+'');
  703. txtSelO=txtSel;
  704. return txtSel;
  705. }
  706. function swapLang(){
  707. var to=getId('optSelLangTo').value,from=getId('optSelLangFrom').value;
  708. // if(from!='auto'){
  709. getId('optSelLangTo').value = from;
  710. getId('optSelLangFrom').value = to;
  711. quickLookup();
  712. // }
  713. }
  714.  
  715. function saveIt(){
  716. var bs =getId('gtp-save');
  717. bs && (bs.className ='gootranslink goounsaved');
  718. }
  719.  
  720. function options(evt){
  721. var dO = getId('divOpt');
  722. if(!dO){//show options
  723. dO = buildEl('div', {id:'divOpt' });
  724. var oL=getId('optionsLink');
  725. oL.title='Hide settings';
  726. //
  727. var dA=getId('divHist');
  728. if(dA){
  729. insAfter(dO,dA);
  730. }else if(( dA=getId('divSourceshow')) ){
  731. insAfter(dO,dA);
  732. }else{
  733. insAfter(dO,getId('divResult'));
  734. }
  735. //from
  736. addEl(dO,'a',{'class':'gootransbutt gootranslink',
  737. target:'_blank', href:senoj, title: 'choose country flag icon'},
  738. ['click',function(e){
  739. e.preventDefault(); GM_openInTab(senoj); cleanUp(); return false;}],
  740. imgH+imgFlags['AN']+imgT);
  741. addEl(dO,'span', null, null,' From: ');
  742. var gt_slist = getXId("gt-sl");
  743. gt_slist= gt_slist ? gt_slist.innerHTML+'' : languagesGoogle;
  744.  
  745. var oF =dO.appendChild(buildEl('select', {id:'optSelLangFrom'}, null, gt_slist));
  746. oF.value = GM_getValue('from', "auto");
  747. oF.addEventListener('change', quickLookup, false);
  748. // swap
  749. addEl(dO,'span', null, null,'&nbsp');
  750. addEl(dO,'a', {id:'opSelectLangSwap',href:HREF_NO, 'class':"gootranslink",
  751. title:'Swap languages',}, ['click', swapLang], imgSwap);
  752. //to
  753. addEl(dO,'span', null, null,' To:');
  754. var gt_tlist = getXId("gt-tl");
  755. gt_tlist= gt_tlist ? gt_tlist.innerHTML+'' : languagesGoogle;
  756. var oT =dO.appendChild(buildEl('select', {id:'optSelLangTo'}, null, gt_tlist));
  757. oT.value = GM_getValue('to', "auto");
  758. oT.addEventListener('change', quickLookup, false);
  759. //use ctrl
  760. addEl(dO,'br');
  761. addEl(dO,'span', null, null,'Use with: ');
  762. var d=addEl(dO,'input', {id:'checkCtrl', type:'checkbox'},
  763. ['change', saveIt], null );
  764. addEl(dO,'span', null, null,' Ctrl &nbsp;&nbsp; ');
  765. d.checked = GM_getValue('ctrl',false);
  766. // use alt
  767. d=addEl(dO,'input', {id:'checkAlt', type:'checkbox',
  768. title:'using Alt is highly recommended'},
  769. ['change', saveIt], null);
  770. addEl(dO,'span', null,
  771. null,' Alt &nbsp;&nbsp;&nbsp; History:&nbsp;');
  772. d.checked = GM_getValue('alt',true);
  773. // history depth
  774. d=addEl(dO,'input', {id:'histSize', type:'textbox', maxlength: 2,
  775. style: "width:2em; ", title: "set to 0 to clear history"});
  776. addEl(dO,'span', null, null,' items &nbsp; of ');
  777. d.value = maxHT;
  778. // max # words in phrase
  779. d=addEl(dO,'input', {id:'histWc', type:'textbox', maxlength: 1,
  780. style: "width:1em; ", title: "max # of words in phrase"});
  781. addEl(dO,'span', null, null,' words');
  782. d.value = maxWC;
  783. //save
  784. var oS=
  785. addEl(dO,'span', {id:'gtp-save', 'class':'gootranslink gootransbutt',
  786. title: "save changes"},
  787. ['click', saveOptions], 'save');
  788. if(!GM_getValue('from'))
  789. saveIt();
  790. // source box params
  791. addEl(dO,'br');
  792. addEl(dO,'span', null, null,'Source box: &nbsp;');
  793. d=addEl(dO,'input', {id:'sourceBH', type:'textbox', maxlength: 1,
  794. style: "width:1em; ", title: "box height"});
  795. d.value = sourceBH;
  796.  
  797. addEl(dO,'span', null, null,' height &nbsp; ');
  798.  
  799. d=addEl(dO,'input', {id:'sourceDP', type:'textbox', maxlength: 2,
  800. style: "width:2em; ", title: "# of lines to keep"});
  801. addEl(dO,'span', null, null,' depth &nbsp; ');
  802. d.value = sourceDP;
  803.  
  804. addEl(dO,'span', null, null," No flags:");
  805. d=addEl(dO,'input', {id:'checkNoflags', type:'checkbox',
  806. title: "don't show country flag icons"});
  807. d.checked = GM_getValue('noFlags');
  808. // colours
  809. for(var b,li=BG.C.length,ii=0;ii<li;ii++){
  810. b=addEl(dO,'span',{'class':'gtBGColor', title:BG.t[ii],
  811. style: 'background:'+ BG.C[ii]+'!important;' +
  812. (ii==0?'margin-left:6px' :'')
  813. }, null,'&nbsp;');
  814. b.paletteN=ii;
  815. b.addEventListener('click',bgClick,false);
  816. }
  817. /* 160826 */
  818. b=addEl(dO,'label');
  819. d=addEl(b,'input',{id:"gtpwPos", type:"checkbox", style:"display:none"},['change',
  820. function(e){GM_setValue('gtpwPos',e.target.checked)}], null);
  821. addEl(b,'span',{'class':"gtptogl",title:"position of tooltip window"});
  822. d.checked=GM_getValue('gtpwPos',false);
  823. getId('optionsTo').className='gootransbutt gootranslink gtlActive';
  824. //cancel
  825. }
  826. else{//hide options
  827. killId(dO);
  828. getId('optionsLink').title = 'Settings';
  829. var oTL = getId('optionsTo');
  830. oTL.className='gootransbutt gootranslink gtlPassive';
  831. }
  832. }
  833. function showTrans(){
  834. try{
  835. var hOs = GM_getValue('showTrans',false) !== true;
  836. var shhi = hOs?'gtp-trans gtp-block':'gtp-trans gtp-hide';
  837. var tds= document.getElementsByClassName('gtp-trans');
  838. for(var i=0, il=tds.length; i<il; i++){
  839. tds[i].className=shhi;
  840. }
  841. getId('gtp_transOnOff').innerHTML = hOs?"&laquo;&laquo;":"&raquo;&raquo;";
  842. GM_setValue('showTrans',hOs)
  843. } catch(e){console.log('showTrans\n'+e)}
  844. }
  845.  
  846. function detectedLang(da){
  847. if(!da) return '';
  848. var gt_slist = getXId("gt-sl");
  849.  
  850. gt_slist= gt_slist ? gt_slist.innerHTML+'' : languagesGoogle;
  851. var re= new RegExp('ion value="'+da+'">(.*?)<\/opt');
  852. var ma= gt_slist.match(re);
  853. if(ma && ma[1]) return ma[1]; return da;
  854. }
  855. var txr;
  856. function ltAmp(s){
  857. //s=s.replace(/\s(\s*)/g,'\n$1');
  858. return s.replace(/&/g,'\u00E6').replace(/</g,'\u227A').replace(/\+/g,'\u271B');
  859. }
  860. function altListClick(e){
  861. e.preventDefault, e.stopPropagation;
  862. var t=e.target;
  863. if(t.nodeName && t.nodeName==='LI') try{
  864. var o=outerNode(t,'SPAN').childNodes[0];
  865. if(o.textContent==t.textContent) return;
  866. o.textContent=t.textContent;
  867. // addSource??? addHist???
  868. var a=outerNode(o,'DIV').getElementsByTagName('I');
  869. txr='';
  870. for(var i=0,il=a.length;i<il;i++)
  871. txr+=(i?' ':'')+a[i].textContent;
  872. }catch(e){console.warn('aLC err:\n'+e);}
  873. }
  874. function txtClip(e){
  875. if(txr) GM_setClipboard(txr);
  876. }
  877. function extractDict(txt){
  878.  
  879. var i,j,k,il,jl,kl,tr,sr,tx,sx,sp;
  880. try{
  881. if(!txt) return;
  882. if(txt.substr(0,1) !== '[')
  883. throw 'Bad Google responce!!1' +'\n' +txt;
  884. txt=txt.replace(/,(?=,)/g,',""');
  885. txt=txt.replace(/\[(?=,)/g,'[""');
  886.  
  887. var dA=JSON.parse(txt);
  888. var dL='';
  889. var punctRE=/^[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]+$/;
  890. //translation
  891. var A= dA[5];
  892. sp='',sx='', tx='', txr="", tr="";
  893. formatted=GM_getValue('formatted',true);
  894. try{
  895. if(A) {
  896. // console.log(JSON.stringify(A));
  897. for( j=0,jl=A.length; j<jl; j++){
  898. if( !A[j][2] || !A[j][2][0] ){
  899. tr+=A[j][0].replace('\n','<br>').replace('\s','&nbsp;');
  900. continue;
  901. }
  902. tx=A[j][2][0][0],sx=A[j][0];
  903. if((kl=A[j][2].length)<1) throw 'No Datta!!1';
  904. // tx=ltAmp(tx); sx=ltAmp(tx);
  905. txr+=sp+tx;
  906. if(kl==1 && punctRE.test(tx)){
  907. tr+=sp+'<i>'+tx+'</i> ';
  908. }else{
  909. tr+=sp+'<span><i>'+tx+'</i><ul>';
  910. for( k=1; k<kl; k++){
  911. tr+='<li>'+ A[j][2][k][0]+'</li>';
  912. }
  913. tr+='<li>'+ tx + '</li><li class=gtpcmmt>'+sx+'</l></ul></span> ';
  914. sp=' ';
  915. }} //for
  916.  
  917. }
  918. else // !A
  919. tr=txr=dA[0][0][0];
  920. }catch(e){console.warn(e+'\nBAD RESP\n'+txt); throw 'BAD RESP!!1';};
  921. var puRE=/\s+([.,?!;:])/g;
  922. if(!formatted)
  923. tr=tr.replace(puRE,"$1"),
  924. txr=txr.replace(puRE,"$1");
  925. if(!txr) { getId('divResult').innerHTML='Google returns nothing!'; return; }
  926. var dR=getId('divResult');
  927. dR.childNodes[0].innerHTML=tr;
  928. dR.childNodes[0].addEventListener('click',altListClick,false);
  929. var LtR=rtl_langs.indexOf(gt_tl)<0;
  930. dR.style.textAlign = LtR? 'left':'right';
  931. dR.style.direction = LtR? 'ltr' : 'rtl';
  932. dR.lang=GT_tl;
  933. addHistory(txtSel,txr);
  934. killId('gtptxtClip');
  935. addEl(getId('divDic'),'img',
  936. {id:'gtptxtClip',src: imgClip,'class': 'gootransbutt', style:
  937. 'position:absolute;right:1px;top:0;cursor:pointer',
  938. title: 'copy translation','z-index':'100505'
  939. },
  940. ['click',txtClip],'');
  941. // detected lang
  942. if(gt_sl=='auto' && dA[2]){
  943. var oF = getId("optionsFrom");
  944. oF.textContent= oF.textContent+' - '+detectedLang(dA[2]) +' ';
  945. }
  946. var da,db, dc, dfn, t;
  947. if(dA && dA[1] && dA[1][0])
  948. da=dA[1];
  949. else if(dA && dA[12] && dA[12][0])
  950. da=dA[12],dfn=1,db=dA[11];
  951. if(da){
  952. dL=buildEl('div',{id: 'gtp_dict'});
  953. var dT=addEl(dL,'table');
  954. var dB=addEl(dT,'tbody');
  955. var showT = 'gtp-trans gtp-hide',showI = "&raquo;&raquo;"
  956. if(GM_getValue('showTrans',false) === true)
  957. showT = 'gtp-trans gtp-block', showI = "&laquo;&laquo;"
  958. var trs = dA[0][1];
  959. if(trs && trs[3]){
  960. trs = trs[3] + (trs[2]? '&nbsp; &#x25B9; ' + trs[2]: '');
  961. tr=addEl(dB,'tr');
  962. addEl(tr,'td',{'class': 'gtp-pos gtp-trs', colspan:2}, null, trs);
  963. }
  964. for( i=0,il=da.length; i<il; i++){
  965. tr=addEl(dB,'tr');
  966. addEl(tr,'td',{'class': 'gtp-pos', colspan:2}, null, da[i][0]);
  967. var d2=dfn? da[i][1]: da[i][2];
  968. for(var td,j=0,jl=d2.length; j<jl; j++){
  969. td=addEl(dB,'tr');
  970. var d2t=d2[j][0];
  971. if(dfn && d2[j][2]) d2t+='<br><i>"'+d2[j][2]+'"</i>';
  972.  
  973. // if(j==0&&dfn&&(t=db[i])&&(t=t[1])&&(t=t[0])&&(t=t[0])&&t[0])// && dc[1][0])
  974. if(dfn && db && (t=db[i])&&(t=t[1])&&(t=t[j])&&(t=t[0])&&t[0])// && dc[1][0])
  975. d2t+='<br><i><span>synonyms:</span> '+t.join(", ")+'</i>';
  976. addEl(td,'td',{'class': 'gtp-word'}, null, d2t);
  977. !dfn && d2[j][1] &&
  978. addEl(td,'td',{'class': showT}, null, d2[j][1].join(', '));
  979. }
  980. }
  981. var gtdir = (getId('divResult').style.direction=='rtl') ? 'left' : 'right';
  982. addEl(dL,'a',{'class': 'gootransbutt gootranslink', id: 'gtp_transOnOff',
  983. style: 'position: absolute; top: -.5em; '+gtdir+': 1px;'
  984. },['click', showTrans],showI);
  985. killId('gtp_dict');
  986. if(dL) getId('divResult').appendChild(dL);
  987. }
  988.  
  989. killId('divSourceshow');
  990. killId('divHist');
  991.  
  992. if(GM_getValue('sourceShow',true))
  993. source();
  994. if(GM_getValue('histShow',false))
  995. history();
  996. if(!GM_getValue('histWc') && !getId('divOpt')) // no settings?
  997. options(); // show options
  998. } catch(e){ console.warn('errexDict: '+e+'\n'); badResponce(txt,e);}
  999. }
  1000. //
  1001. function onTimerDict(){
  1002. formatted=GM_getValue("formatted",false);
  1003. var tx=txtSel,
  1004. tk=googleTK(tx,dictSL);
  1005. dictSL=tk.SL;
  1006. var q = dictURL +
  1007. "&hl="+ GM_getValue('to','auto') +
  1008. "&sl=" + gt_sl + "&tl=" + gt_tl +
  1009. "&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&otf=2&trs=1&inputm=1&ssel=0&tsel=0&source=btn&kc=3"+
  1010. "&tk="+tk.tk+
  1011. "&q="+ tx;
  1012. _log('?dict');
  1013. Request(q, extractDict);
  1014. }
  1015.  
  1016. function dict(){
  1017. // var dR=getId('divResult');
  1018. killId('gtp_dict');
  1019. // var dD=buildEl('div',{id:"gtp_dict"},null,dict)
  1020. // dR.appendChild(dD);
  1021. setZeroTimeout(onTimerDict);
  1022. }
  1023.  
  1024. function saveSource(){
  1025. try{
  1026. sT = getId('divSourcetext').value;
  1027. GM_setValue('sourceText',JSON.stringify(sT));
  1028. }catch(e){console.log('saveSource\n'+e)}
  1029. }
  1030.  
  1031. function source(){
  1032. var divSource = getId('divSourceshow');
  1033. try{
  1034. if(divSource){
  1035. killId(divSource);
  1036. var sL = getId('sourceLink');
  1037. sL.innerHTML = 'Source';
  1038. sL.className = 'gootransbutt gootranslink gtlPassive'
  1039. sL.title = 'Show source';
  1040. killId('imgSourcesave');
  1041. GM_setValue('sourceShow',false);
  1042. return;
  1043. }
  1044. GM_setValue('sourceShow',true);
  1045. divSource= buildEl('form', {id:'divSourceshow'}, null, null);
  1046.  
  1047. var tS= txtSel + ' \u2192 ' + trim(txr);
  1048. if(sT){
  1049. var sTa= sT.split('\n');
  1050. if(tS != sTa[0]){
  1051. while(sTa.length >= sourceDP) sTa.pop();
  1052. sT= tS + '\n' + sTa.join('\n');
  1053. }
  1054. }else sT=tS;
  1055. if(!getId('imgSourcesave'))
  1056. insAfter(
  1057. buildEl('img',{id: 'imgSourcesave', title: 'save source', src: imgSave,
  1058. style: 'margin-bottom: -3px;'},
  1059. ['click', saveSource], null)
  1060. ,getId('sourceLink'));
  1061. addEl(divSource,'textarea',
  1062. { id:'divSourcetext', rows: sourceDP,
  1063. style: "font-family: Tahoma,sans-serif !important; height:"
  1064. +(sourceBH+1)+"em;"
  1065. }, null, sT),
  1066. getId('divBottom');
  1067. sL=getId('sourceLink');
  1068. sL.innerHTML = 'Source';
  1069. sL.className= 'gootransbutt gootranslink gtlActive';
  1070. sL.title = 'Hide source';
  1071. }catch(e){console.log('Sourceshow\n'+e)};
  1072. insAfter(divSource,getId('divResult'));
  1073. }
  1074. // ht: [from, to, langpair, hitCount]
  1075.  
  1076. function history(){
  1077. var divHist = getId('divHist');
  1078. try{
  1079. if(divHist){
  1080. killId(divHist);
  1081. var hL = getId('historyLink');
  1082. hL.innerHTML = 'History'; hL.className= 'gootransbutt gootranslink gtlPassive';
  1083. hL.title = 'Translation history';
  1084. GM_setValue('histShow',false);
  1085. return;
  1086. }
  1087. if(!maxHT) return;
  1088. GM_setValue('histShow',true);
  1089. divHist = buildEl('div', {id:'divHist'},['click', histLookup], null );
  1090. //
  1091. for(var i=0, l=ht.length; i<l; i++){
  1092. var bkg = ht[i][0].indexOf(' ')>0 ? ' goohistlink' : '';
  1093. addEl(divHist,'a', {href:HREF_NO, 'class': 'gootranslink'+bkg, 'titel': ht[i][1]+
  1094. ((ht[i][3]>1) ? '\u00A0'+ '['+ht[i][3]+']' : '')},
  1095. null, ht[i][0]);
  1096. if(i < l-1)
  1097. divHist.appendChild(document.createTextNode(' '));
  1098. }
  1099. //addEl(divHist,'span',null,null,'<br>&nbsp;');
  1100. if(getId('divSourceshow'))
  1101. insAfter(divHist,getId('divSourceshow'));
  1102. else
  1103. insAfter(divHist,getId('divResult'));
  1104. hL=getId('historyLink')
  1105. // hl.textContent = 'X';
  1106. hL.title= 'Hide history';
  1107. hL.innerHTML = 'History'; hL.className = 'gootransbutt gootranslink gtlActive';
  1108. }catch(e){console.log('hist problem\n'+e)}
  1109. }
  1110.  
  1111. function saveOptions(evt){
  1112. try{
  1113. var from = getId('optSelLangFrom').value;
  1114. var to = getId('optSelLangTo').value;
  1115. var ctrl = getId('checkCtrl').checked;
  1116. var alt = getId('checkAlt').checked;
  1117. var mh = parseInt(getId('histSize').value);
  1118. var wc = parseInt(getId('histWc').value);
  1119. var nf = getId('checkNoflags').checked;
  1120. if(0<= mh && mh <=99 && mh<maxHT){
  1121. while(ht && ht.length>mh) ht.pop();
  1122. GM_setValue('hist',ht? JSON.stringify(ht):'');
  1123. if(getId('divHist')){
  1124. killId('divHist');
  1125. history();
  1126. }
  1127. }
  1128. maxHT=mh;
  1129. var bh = parseInt(getId('sourceBH').value);
  1130. if( 0< bh && bh <10) sourceBH = bh;
  1131. var dp = parseInt(getId('sourceDP').value);
  1132. if( 0< dp && dp <100) sourceDP = dp;
  1133. if(1<= wc && wc <=9) maxWC=wc;
  1134. GM_setValue('histSize',maxHT)
  1135. GM_setValue('histWc',maxWC);
  1136. GM_setValue('from', from);
  1137. GM_setValue('to', to);
  1138. GM_setValue('ctrl', Gctrl=ctrl);
  1139. GM_setValue('alt', Galt=alt);
  1140. GM_setValue('sourceBH', sourceBH);
  1141. GM_setValue('sourceDP', sourceDP);
  1142. GM_setValue('noFlags',nf);
  1143. getId('divDic').removeChild(getId('divOpt'));
  1144. getId('optionsLink').title='Settings';
  1145. return;
  1146. }catch(e){console.log('saveOpnions\n'+e);}
  1147. }
  1148.  
  1149. function addHistory(src,trt){
  1150. if (!maxHT) return;
  1151. try{
  1152. var hts=GM_getValue("hist");
  1153. if( !hts ){
  1154. ht=[["google translator","Der Ubersetzer","en|de",0]];
  1155. hts=JSON.stringify(ht);
  1156. }
  1157. ht=JSON.parse(hts);
  1158. var st=trim(src+''); var tt = trim(trt+'');
  1159. var wc = (st.split(' ')).length;
  1160. if(wc>maxWC) return;
  1161. //var lang=currentURL.match(/langpair=([a-zA-Z-\|]+)/)[1];
  1162. var lang=last_sl+_l_+last_tl;
  1163. var ix=-1; // find word in hist
  1164. for(var i=0, l=ht.length; i<l; i++)
  1165. if(st==ht[i][0]){ ix=i; break; }
  1166. //if(ix==0) return; // nothing to do
  1167. var hits=0;
  1168. if(ix>=0){
  1169. hits=ht[ix][3];
  1170. if( (gt_sl+'|'+gt_tl) == ht[ix][2] && tt != ht[ix][1]) {
  1171. tt = ht[ix][1]; // don't touch my translasion
  1172. }
  1173. ht.splice(ix,1);
  1174. }
  1175. // if(hits<4)
  1176. hits++; // delete it by your own hands
  1177. if (ht.length>maxHT){
  1178. var minHit=99999; // which item shoud i remove?
  1179. for(i=ht.length-1;i>0;i--)
  1180. if(minHit>ht[i][3]) minHit=ht[i][3]
  1181. ix=ht.length-1;
  1182. for(var i=ix; i>0; i--)
  1183. if(minHit==ht[i][3]){ ix=i; break; }
  1184. ht.splice(ix,1);
  1185. }
  1186. ht.unshift([st,tt,lang,hits]);
  1187. GM_setValue('hist',JSON.stringify(ht));
  1188. } catch(e){console.log('addHist\n'+e);}
  1189. }
  1190. var senFlag = '';
  1191. function selFlag(e){
  1192. if(!isInited) {css(-1); isInited=true; }
  1193. killId('divSelflag');
  1194. setEscHnd();
  1195. var p = belowCursor(e,10,10);
  1196. var dsf = buildEl('div',{id:'divSelflag', style:
  1197. ';top:'+p.t+';left:'+p.l+';right:'+p.r +';bottom: auto'});
  1198. var sel=addEl(dsf,'select',{id: 'optSelFlag'},
  1199. null,languagesGoogle);
  1200. sel.value = GM_getValue('to',' en');
  1201. addEl(dsf,'span',null,null,'<br><br>');
  1202. addEl(dsf,'a', {href:HREF_NO, style:'padding: 3px 12px; margin-right: 2em;',
  1203. 'class':'gootransbutt gootranslink', title: "use icon"},
  1204. ['click', function(){saveFlag(true)}], '<b>OK</b>');
  1205. addEl(dsf,'a', {href:HREF_NO, style:'padding: 3px 4px;',
  1206. 'class':'gootransbutt gootranslink'},
  1207. ['click', function(){saveFlag(false)}],
  1208. '<b>Cancel</b>');
  1209. //
  1210. senFlag = e.target.src+'';
  1211. var sm = senFlag.match(/.+\/(.+)\.png/);
  1212. if(sm && sm[1]) senFlag= sm[1];
  1213. _log(senFlag);
  1214. if(senFlag) body.appendChild(dsf);
  1215. }
  1216. function saveFlag(tf){
  1217. if(tf && senFlag){
  1218. var s= 'l-'+getId('optSelFlag').value;
  1219. GM_setValue(s,senFlag);
  1220. _log(s+': '+senFlag );
  1221. }else _log('cant save flags' );
  1222. killId('divSelflag'); return;
  1223. }
  1224. var fCSS;
  1225. function flagClick(e){
  1226. e.preventDefault();
  1227. if(e.target.nodeName == 'IMG'){
  1228. _log('hit on: ' + e.target.alt);
  1229. selFlag(e);
  1230. }else (killId('divSelflag'));
  1231. }
  1232. function belowCursor(evt,ho,vo,lr){
  1233. var p={t:'', l:'auto', r:'auto'};
  1234. p.t=(evt.clientY+window.pageYOffset+vo)+'px';
  1235. var l=(evt.clientX+window.pageXOffset+ho)+'px';
  1236. if(lr && lr=='r')
  1237. { p.l=l; return p; }
  1238. var w = window.innerWidth;
  1239. var r=(w-(evt.clientX+window.pageXOffset)+ho);
  1240. // Q: How to detect visibility & thickess of vertical scrollbar?
  1241. r-=8; //
  1242. if(r<0) r= w/4;
  1243. r+='px';
  1244. if(lr && lr=='l')
  1245. { p.r=r; return p; }
  1246. if(evt.clientX < w/2)
  1247. p.l=l;
  1248. else
  1249. p.r=r;
  1250. return p;
  1251. }
  1252. var flagLang;
  1253. function getFlagSrc(lng, where){
  1254. if(!where) where = 'to';
  1255. if(GM_getValue('noFlags')) return imgFlags[where];
  1256. var fl='l-'+lng;
  1257. var flag = GM_getValue(fl,'');
  1258. if(!flag){
  1259. flag=imgFlags[lng];
  1260. if(!flag) return flag = imgFlags[where];
  1261. }
  1262. if(flag.indexOf('http')==0
  1263. //flag.indexOf('file') ==0
  1264. ||flag.indexOf('data:') ==0)
  1265. return flag;
  1266. flagLang=fl;
  1267. // flag= 'http .. /Flags/Panama.png;'
  1268. flag= senop+seno+flag+senoext;
  1269. flagRequest(flag);
  1270. return flag;
  1271. }
  1272. function flagRequest(f){
  1273. _log('load '+f);
  1274. GM_xmlhttpRequest({
  1275. method: 'GET',
  1276. url: f,
  1277. //binary: true,
  1278. overrideMimeType: "text/plain; charset=x-user-defined",
  1279. synchronous: false, /* 17.11.30 */
  1280. headers: {
  1281. "User-Agent": UA
  1282. ,"Accept": "image/png,image/*;q=0.8,*/*;q=0.5"
  1283. ,"Accept-Encoding": "gzip, deflate"
  1284. },
  1285. onload: function(resp) {
  1286. try{
  1287. flagStore(resp.responseText,f);
  1288. }catch(e){console.log('FlagRqst\n'+e);}
  1289. }
  1290. });
  1291. }
  1292. function flagStore(r,url){
  1293. if(r.indexOf("<head")>=0)
  1294. {
  1295. console.log("Banned!\n"+url);
  1296. GM_setValue(flagLang,url);
  1297. }
  1298. else
  1299. GM_setValue(flagLang,"data:image/png;base64," + b2b64(r));
  1300. }
  1301.  
  1302. function trim(s){
  1303. return (txtSelO=s+'').replace(/\s+/g,' ').replace(/^\s/,'').replace(/\s$/,'');
  1304. }
  1305.  
  1306. function killId(nod){
  1307. if(!nod) return;
  1308. var n = nod;
  1309. if(typeof n == 'string'){
  1310. n= getId(nod);
  1311. }
  1312. if(!n) return;
  1313. if(n.parentNode) n.parentNode.removeChild(n);
  1314. else _log('cant kill: '+nod)
  1315. }
  1316.  
  1317. function addEl(to,type, attrArray, eL, html){
  1318. return to.appendChild(buildEl(type, attrArray, eL, html));
  1319. }
  1320.  
  1321. function buildEl(type, attrArray, eL, html)
  1322. {
  1323. var node = document.createElement(type);
  1324. for (var attr in attrArray) if (attrArray.hasOwnProperty(attr)){
  1325. node.setAttribute(attr, attrArray[attr]);
  1326. }
  1327. if(eL){
  1328. node.addEventListener(eL[0], eL[1], eL[2]?true:false);
  1329. }
  1330. if(html)
  1331. node.innerHTML = html;
  1332. return node;
  1333. }
  1334.  
  1335. function getId(id, parent){
  1336. if(!parent)
  1337. return document.getElementById(id);
  1338. return parent.getElementById(id);
  1339. }
  1340.  
  1341. /* */
  1342. function getXId(id){
  1343. var r=divExtract.getElementById(id);
  1344. if(r) return r;
  1345. throw "Xel bug " + id;
  1346. }
  1347.  
  1348. function getTag(name, parent){
  1349. if(!parent)
  1350. return window.document.getElementsByTagName(name);
  1351. return parent.getElementsByTagName(name);
  1352. }
  1353. /*
  1354. * Drag and drop support adapted fom http://www.hunlock.com/blogs/Javascript_Drag_and_Drop
  1355. */
  1356. var savedTarget=null; // The target layer (effectively vidPane)
  1357. var orgCursor=null; // The original mouse style so we can restore it
  1358. var dragOK=false; // True if we're allowed to move the element under mouse
  1359. var dragXoffset=0; // How much we've moved the element on the horozontal
  1360. var dragYoffset=0; // How much we've moved the element on the verticle
  1361. var didDrag=false; //set to true when we do a drag
  1362. var dragX, dragY;
  1363. function moveHandler(e){
  1364. if (e == null) return;// { e = window.event }
  1365. if ( e.button<=1 && dragOK ){ var x,y;
  1366. savedTarget.style.left = (x=e.clientX - dragXoffset) + 'px';
  1367. savedTarget.style.top = (y=e.clientY - dragYoffset) + 'px';
  1368. dragX=x-pageXOffset;
  1369. dragY=y-pageYOffset; if(dragY<=0)dragY=0;
  1370. return false;
  1371. }
  1372. }
  1373. function dragCleanup(e) {
  1374. document.removeEventListener('mousemove',moveHandler,false);
  1375. document.removeEventListener('mouseup',dragCleanup,false);
  1376. savedTarget.style.cursor=orgCursor;
  1377. dragOK=false; //its been dragged now
  1378. didDrag=true;
  1379. }
  1380. function dragHandler(e){
  1381. var htype=moz+'grabbing';
  1382. if (e == null) return;//
  1383. var target = e.target;// != null ? e.target : e.srcElement;
  1384. orgCursor=target.style.cursor;
  1385. if(target.nodeName!='DIV' )
  1386. return;
  1387. if( e.ctrlKey || e.altKey || e.shiftKey)
  1388. return; // enable selection inside
  1389. else if(clickedInsideID(target, res_dict))
  1390. return;
  1391. if (target = clickedInsideID(target, 'divDic')) {
  1392. savedTarget=target;
  1393. target.style.cursor=htype;
  1394. dragOK=true;
  1395. dragXoffset = e.clientX-target.offsetLeft;
  1396. dragYoffset = e.clientY-target.offsetTop;
  1397. //set the left before removing the right
  1398. target.style.left = e.clientX - dragXoffset + 'px';
  1399. target.style.right = null;
  1400. document.addEventListener('mousemove',moveHandler,false);
  1401. document.addEventListener('mouseup',dragCleanup,false);
  1402. return false;
  1403. }
  1404. }
  1405. function clickedInsideID(target, id) {
  1406. if (target.getAttribute('id')==id)
  1407. return target;
  1408. if (target.parentNode) {
  1409. while (target = target.parentNode) {
  1410. try{
  1411. if (target.getAttribute('id')==id)
  1412. return target;
  1413. }catch(e){}
  1414. }
  1415. }
  1416. return null;
  1417. }
  1418. //end drag code
  1419. function b2b64(inp) { // binary data --> base64
  1420. var output = [], c1, c2, c3, e1, e2, e3, e4, i = 0;
  1421. var k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  1422. var len = inp.length;
  1423. while( i < len ){
  1424. c1 = inp.charCodeAt(i++); c2 = inp.charCodeAt(i++); c3 = inp.charCodeAt(i++);
  1425. e1 = (c1&255) >> 2;
  1426. e2 = ((c1 & 3) << 4) | ((c2&255) >> 4);
  1427. e3 = ((c2 & 15) << 2) | ((c3&255) >> 6);
  1428. e4 = c3 & 63;
  1429. if( isNaN(c3)) e4 = 64;
  1430. if( isNaN(c2)) e3 = 64;
  1431. output.push( k.charAt(e1) + k.charAt(e2) + k.charAt(e3) + k.charAt(e4));
  1432. } return output.join("");
  1433. }
  1434.  
  1435.  
  1436. function ttrans( s, ttab ){
  1437. for( var c, cc, t='', il=s.length, i=0; i<il; i++ )
  1438. t += (c=ttab[cc=s.charAt(i)]) ? c : cc;
  1439. return t;
  1440. }
  1441. //var tabUrlEsc = { '#':'%23', '%':'%25', '&':'%26', '.':'%2e', '/':'%2f', '?':'%3f' };
  1442. function escAp(s){
  1443. return encodeURI(s);
  1444. //return ttrans( s, tabUrlEsc );
  1445. }
  1446. // &tk=[
  1447. function googleTK(text, SL) {
  1448. // view-source:https://translate.google.com/translate/releases/twsfe_w_20151214_RC03/r/js/desktop_module_main.js && TKK from HTML
  1449. var uM = TKK ; // 160513 '406423.4167013162'; //
  1450. var cb="&";
  1451. var k="";
  1452. var Gf="=";
  1453. var Vb="+-a^+6";
  1454. var t="a";
  1455. var Yb="+";
  1456. var Zb="+-3^+b+-f";
  1457. var jd=".";
  1458. var sM=function(a){return function(){return a}}
  1459. var tM=function(a,b){for(var c=0;c<b.length-2;c+=3){var d=b.charAt(c+2),d=d>=t?d.charCodeAt(0)-87:Number(d),d=b.charAt(c+1)==Yb?a>>>d:a<<d;a=b.charAt(c)==Yb?a+d&4294967295:a^d}return a};
  1460. var vM=function(a){
  1461. var b;
  1462. if(null!==uM) {
  1463. b=uM;
  1464. }else{
  1465. b=sM(String.fromCharCode(84));var c=sM(String.fromCharCode(75));b=[b(),b()];
  1466. b[1]=c();
  1467. b=(uM=window[b.join(c())]||k)||k
  1468. }
  1469. var d=sM(String.fromCharCode(116)),c=sM(String.fromCharCode(107)),d=[d(),d()];
  1470. d[1]=c();
  1471. c=cb+d.join(k)+Gf;
  1472. d=b.split(jd);
  1473. b=Number(d[0])||0;
  1474. for(var e=[],f=0,g=0;g<a.length;g++){
  1475. var m=a.charCodeAt(g);
  1476. 128>m?e[f++]=m:(2048>m?e[f++]=m>>6|192:(55296==(m&64512)&&g+1<a.length&&56320==(a.charCodeAt(g+1)&64512)?(m=65536+((m&1023)<<10)+(a.charCodeAt(++g)&1023),e[f++]=m>>18|240,e[f++]=m>>12&63|128):e[f++]=m>>12|224,e[f++]=m>>6&63|128),e[f++]=m&63|128)
  1477. }
  1478. a=b||0;
  1479. for(f=0;f<e.length;f++) { a+=e[f],a=tM(a,Vb)};
  1480. a=tM(a,Zb);
  1481. a^=Number(d[1])||0;
  1482. 0>a&&(a=(a&2147483647)+2147483648);
  1483. a%=1E6;
  1484. // return c+(a.toString()+jd+(a^b))
  1485. return a.toString()+jd+(a^b);
  1486. };
  1487.  
  1488. return { 'tk' : vM(text), 'SL' : uM };
  1489. }
  1490. // ]&tk=
  1491. function stickStyle(css){
  1492. var s=document.createElement("style"); s.type="text/css";
  1493. s.appendChild(document.createTextNode(css));
  1494. return (document.head||document.documentElement).appendChild(s);
  1495. }
  1496. function css(n){
  1497. var k,i=0;
  1498. _log('cssN:',n);
  1499. if(-1 === n){ try{
  1500. k= +(GM_getValue('backG',0));
  1501. if(0<=k && k< BG.C.length) i=k;
  1502. } catch(e){};}
  1503. else GM_setValue('backG', +(i=+n) );
  1504. try{
  1505. if(window.gttpCSS) window.gttpCSS.parentNode.removeChild(window.gttpCSS);
  1506. }catch(e){console.log('cssX:\n'+e)};
  1507. _log('cssS:'+i,BG.C[i]);
  1508. window.gttpCSS=
  1509. stickStyle(
  1510. '#divDic, #divDic div, #divDic span, #divDic a, #divDic img, #divLookup, #divUse {padding: 0; margin:0; \
  1511. width: auto;height: auto; border: none; border-radius: 0; background: none; box-shadow: none\}'+
  1512. '#divResult {overflow: visible !important; padding:3px !important; margin: 0 5px 3px 0 !important; '+
  1513. 'position: relative; z-index: auto !important;}'+
  1514. '#gtp_dict {max-height: 480px !important; overflow: auto !important;}'+
  1515. '#divResult table *{ line-height: 1 !important}'+
  1516. '#divDic, #divDic *, #divSelflag, #divSelflag *{\
  1517. font-family: Tahoma, sans-serif!important;\
  1518. font-size:medium!important;\
  1519. font-style: normal!important;\
  1520. font-weight: normal!important;\
  1521. font-stretch: normal!important;\
  1522. letter-spacing: normal!important;\
  1523. line-height: 1.1;\
  1524. color:'+FG.t[i]+'\
  1525. }'+
  1526. '#divDic,#divSelflag {position: absolute; background:'+BG.C[i]+'!important; color:'+FG.t[i]+
  1527. '!important; opacity: 1'+
  1528. ';padding:5px !important; margin:0; border-radius:5px; border: thin solid gray'+
  1529. ';text-align: left !important;}'+
  1530. '#divDic{ max-width:50%; padding: 3px; margin: 0;}'+
  1531. '#divSelflag{ max-width: 180px; }'+
  1532. '.gootranslink, #divDic .gootranslink ,#divSelflag .gootranslink\
  1533. {color:'+FG.l[i]+'!important; text-decoration: none !important;\
  1534. font: normal medium Tahoma,sans-serif !important;'+
  1535. 'cursor:pointer !important; }' +
  1536. '#divDic a.gootranslink:visited,\
  1537. #divDic a.gootranslink:hover,\
  1538. #divDic a.gootranslink:active\
  1539. {color:'+FG.l[i]+'!important; text-decoration: none !important;}' +
  1540. '#gtp_dict table{background:'+BG.C[i]+'!important;}'+
  1541. '#gtp_dict tbody {background: transparent !important;}'+
  1542. '#gtp_dict tr {background:'+BG.H[i]+'!important;line-height:1;}'+
  1543. '#gtp_dict tr>td{font-size:1em !important; line-height:1!important;\
  1544. background:transparent!important;'+
  1545. '}'+
  1546. '#divDic a.goohistlink {background:'+BG.F[i] +'!important;}'+
  1547. '#gtp_dict {margin: 0; position: relative;}'+
  1548. '#gtp_dict ol {padding: 0 .5em 0 0; margin-left: 0.2em;}'+
  1549. '#gtp_dict li {list-style: square inside; display: list-item;}'+
  1550. 'div#gtp_dict tr>td {padding-left: .25em; vertical-align:top; border: none; color:'+FG.t[i]+'!important; }'+
  1551. '#optSelLangFrom,#optSelLangTo {max-width: 150px; text-align: left !important; \
  1552. height:1.5em!important; min-height:1.5em!important;\
  1553. }'+
  1554. '#divDic input, #divDic select, #divDic img {vertical-align: baseline !important;}'+
  1555. '#divDic input[type="checkbox"]{vertical-align: text-bottom !important;}'+
  1556. '#divOpt span {color:'+FG.t[i]+'!important;}'+
  1557. '#optSelLangFrom,#optSelLangTo,#divDic input[type="textbox"]{background:'+BG.E[i]+'!important;\
  1558. color:'+FG.t[i]+'!important;\
  1559. }'+
  1560. '#divExtract{word-spacing: normal !important;}'+
  1561. '#divBottom {position: relative; width: 100%; font-size:medium; text-decoration:none; }'+
  1562. '#divBottom #historyLink {display: inline; position: relative; font-size:medium; text-decoration:none;}'+
  1563. '#divBottom #sourceLink {display: inline; position: relative; margin-left: .5em; font-size:medium; text-decoration:none;}'+
  1564. '#divBottom #imgSourcesave {display: inline; position: relative; margin-left:2px;\
  1565. cursor:pointer;}'+
  1566. '#divBottom #optionsLink {display: inline; position: relative; margin-left: 1em; font-size:medium !important; text-decoration:none !important;}'+
  1567. '#divBottom #optionsLink [id^="options"] {margin-right: 2px; padding-left: 2px;}'+
  1568. '#divDic #divOpt {position: relative; padding: 5px;'+
  1569. 'border-top: thin solid grey!important;}'+
  1570. '#divLookup, #divOpt, #divBottom,#divSourcetext,#divHist,#divuse {direction: ltr !important;}'+
  1571. '#divDic #divHist {background:'+BG.C[i]+'!important;; position:relative; padding:5px; text-align:left !important;'+
  1572. 'border-top: thin solid grey!important; color:'+FG.t[i]+'!important;}'+
  1573. '#divResult #gtp_dict {background:'+BG.C[i]+'!important;color:'+FG.t[i]+'!important;\
  1574. padding:3px!important; border-radius:3px;'+
  1575. 'margin-bottom: .1em!important; overflow-y:auto !important; overflow-x:hidden; font-size:medium;}'+
  1576. '#divDic #divOpt {background:'+BG.C[i]+'!important; position:relative; padding:5px; text-align:left !important;}'+
  1577. '#divLookup, #divUse {background-color:transparent !important; position:absolute;\
  1578. padding: 3px; margin: 0;}'+
  1579. '#divDic>#divSourceshow {\
  1580. border: none; padding: 0 0 4px 0; margin: 0;}'+
  1581. '#divSourceshow>#divSourcetext{ width:97%; height: 3em; line-height: 1.2; overflow: auto !important;\
  1582. padding: 0 0 0 4px; margin: 0; border: none; border-top: 1px solid #AAA}' +
  1583. '.gtlPassive:before{ content:"\u2193";}'+
  1584. '.gtlActive:before{ content:"\u2191" !important;}'+
  1585. '#imgUse, #divGetback, #divGetforw {margin-left: 5px !important; cursor: pointer;}'+
  1586. '#divSourcetext {background:'+BG.E[i]+'!important; color:'+FG.t[i]+'!important;}'+
  1587. '#divSelflag .gootransbutt, #divDic .gootransbutt {background:'+BG.T[i]+'!important;'+
  1588. 'border-radius: 3px; margin-top: 5px; }'+
  1589. '#divDic .goounsaved {background-color: #EF9024!important;'+
  1590. 'border-radius: 3px; margin-top: 5px; }'+
  1591. '#gtp_dict td.gtp-pos { color:'+FG.g[i]+'!important; font-style: italic !important; text-align: left; }'+
  1592. '#gtp_dict td.gtp-pos:before{ content:"\u25BE "; font-style: normal!important; color:'+FG.g[i]+'!important;}'+
  1593. '#gtp_dict td.gtp-word {color:'+FG.t[i]+'!important; padding-left: 5px; padding-right: 10px;'+
  1594. 'vertical-align: top; white-space: normal;}'+
  1595. '#gtp_dict .gtp-word i,'+
  1596. '#gtp_dict .gtp-word i span{color:'+FG.g[i]+'!important;}'+
  1597. '#gtp_dict .gtp-word i { padding-left:10px;}'+
  1598. '#gtp_dict .gtp-word i span {font-style:italic!important;}'+
  1599. '#gtp_dict td.gtp-trans {/*overflow-x: hidden;*/ vertical-align: top; white-space: normal;'+
  1600. ' width: 100%; color:'+FG.g[i]+'!important}'+
  1601. '#gtp_dict td.gtp-pos, #gtp_dict td.gtp-word, #gtp_dict td.gtp-trans {padding-bottom: 1px !important;}'+
  1602. '#gtp_dict td.gtp-pos.gtp-trs:before {content: "\u25C3 " !important;}'+
  1603. '#gtp_dict td.gtp-pos.gtp-trs {font-style: normal !important;}'+
  1604. '#gtp_dict .gtp-hide {display: none}'+
  1605. '#gtp_dict .gtp-block {display: block}'+
  1606. '#divTtsIfr{position: relative;padding: 0!important;margin:3px 0 0 0!important;\
  1607. background:'+ BG.C[i] +'!important; color:'+FG.t[i]+'!important;}'+
  1608. '#gdptrantxt {font-size: 1em !important; line-height: 1;\
  1609. position: relative;\
  1610. z-index:100500 !important;\
  1611. margin: 0 auto 4px auto !important;\
  1612. overflow: visible!important;\
  1613. display: block;\
  1614. }\
  1615. \
  1616. #gdptrantxt >span { \
  1617. position: relative; \
  1618. z-index:auto !important;\
  1619. display: inline-block;\
  1620. cursor: default;\
  1621. }\
  1622. #gdptrantxt i {\
  1623. font-style: normal !important;\
  1624. }\
  1625. #gdptrantxt >span >ul {\
  1626. display: block; \
  1627. visibility: hidden;\
  1628. position: absolute;\
  1629. z-index:100500 !important;\
  1630. color: '+FG.l[i]+'!important;\
  1631. list-style: none none outside;\
  1632. bottom: auto !important; top: 0 !important;\
  1633. left: -1em !important; right: auto !important;\
  1634. background:'+BG.A[i]+'!important;\
  1635. opacity: 1;\
  1636. max-width: none;\
  1637. overflow: visible;\
  1638. border: thin dotted ' + FG.g[i] + ' !important;\
  1639. border-radius: 5px !important;\
  1640. border-width: 0 1px 1px 1px !important;\
  1641. padding: .5em !important;\
  1642. margin: 1.1em 0 0 0 !important;\
  1643. transition: visibility .0s linear .2s;\
  1644. }\
  1645. #gdptrantxt >span:hover > ul{\
  1646. visibility: visible;\
  1647. transition-delay: 400ms ;\
  1648. }\
  1649. /**/\
  1650. #gdptrantxt >span:last-of-type > ul {\
  1651. left:auto !important; right: 0 !important;\
  1652. border-radius: 5px 0 5px 5px !important;\
  1653. }/**/\
  1654. #gdptrantxt >span:first-of-type ul {\
  1655. left: 0 !important; right: auto !important;\
  1656. border-radius: 0 5px 5px 5px !important;\
  1657. }\
  1658. #gdptrantxt >span ul li {\
  1659. white-space: normal;\
  1660. color:'+FG.l[i]+'!important;\
  1661. }\
  1662. #gdptrantxt >span ul li:hover {\
  1663. background-color:'+BG.E[i]+'!important;\
  1664. cursor: pointer;\
  1665. }\
  1666. #gdptrantxt >span:hover { background:' + BG.A[i]+ '!important;color:'+FG.l[i]+'!important;}\
  1667. #gdptrantxt .gtpcmmt {\
  1668. border-top: 2px groove '+FG.g[i]+' !important;\
  1669. margin-top: 0.5em;\
  1670. color:'+FG.g[i]+'!important;\
  1671. }\
  1672. .gtptogl{ position: relative; display: inline-block;\
  1673. cursor: pointer;font-weight:bold!important; }\
  1674. .gtptogl:before {position: absolute; bottom: -4px;\
  1675. background:' + '#EEE' + '!important;color:'+'#007FFF'+'!important;\
  1676. content: "L"; font-weight:bold!important;\
  1677. border: solid grey; border-width: 1px 8px 1px 1px;\
  1678. margin: 0 0 0 2px; padding:0;}\
  1679. input#gtpwPos:checked + .gtptogl:before{content: "R";\
  1680. border-width: 1px 1px 1px 8px; }\
  1681. ');
  1682.  
  1683. if(-1 !== n) return;
  1684. stickStyle(
  1685. '#divDic, #divDic textarea, #divDic iframe {resize: both !important; }'+
  1686. '#divDic *::'+(isChrome?'':moz)+'selection {background: #047 !important; color: #FC8 !important; }'+
  1687. '#divUse img, #divDic img, #divLookup img {display: inline; width: auto; height: auto;\
  1688. margin: 0; padding:0; vertical-align: baseline !important;}'+
  1689. '#divTtsLnk:after{ content:url('+imgPlay+');}'+
  1690. '#divTtsLnk {padding: 0 2px; margin: 0 2px 0 2px !important;}'+
  1691. '#divTtsIfh {width: 100%;overflow-x:hidden;\
  1692. background-color: rgba(127,127,127,.25); padding: 3px 0 !important;\
  1693. }'+
  1694. '#divResult, #divResult div, #divResult table, #divResult tr, #divResult tr td,\
  1695. #divResult a, #divBottom, \
  1696. #divOpt select, #divOpt input, .gootranslink, \
  1697. #divDic img, #divDic input, #divDic textarea, #divDic label, #divDic li\
  1698. { padding:0 0 0 0; margin: 0 0 0 0; background: none repeat scroll 0 0 transparent;\
  1699. border: none; line-height: 1.2; float: none}'+
  1700. '#divOpt input { padding: 4px 0 !important;}\
  1701. div#divBottom{padding-top: 3px;}\
  1702. .gootransbutt#optionsLink{margin-top:0; padding-top: 3px; padding-bottom: 1px;}\
  1703. #divOpt .gtBGColor{ border:thin solid blue !important; cursor: pointer;\
  1704. padding-right:6px; margin-right: 2px;}\
  1705. .gootranslink[titel]{position: relative;}\
  1706. .gootranslink[titel]:after {\
  1707. color: #050;\
  1708. content: attr(titel);\
  1709. position: absolute;\
  1710. visibility: hidden;\
  1711. z-index: 100509;\
  1712. opacity: 1;\
  1713. left: 16px;\
  1714. top: 32px;\
  1715. min-width: 0px;\
  1716. width: auto;\
  1717. white-space: pre !important;\
  1718. -moz-hyphens: none !important;\
  1719. text-decoration: none !important;\
  1720. border: 1px #aaa solid;\
  1721. border-radius: 6px;\
  1722. background-color: #dfd;\
  1723. padding: 1px 4px;\
  1724. font-size:medium; line-height:1;\
  1725. -webkit-transition: visibility .2s linear .2s;\
  1726. transition: visibility .2s linear .2s;\
  1727. }\
  1728. .gootranslink[titel]:hover:after {\
  1729. visibility: visible;\
  1730. -webkit-transition: visibility .5s linear .7s;\
  1731. transition: visibility .5s linear .7s;\
  1732. }\
  1733. #divOpt #gtp-save{\
  1734. margin-left: 2.5em;\
  1735. font-weight: bold; cursor: pointer;\
  1736. display: inline-block;\
  1737. z-index: 100511;\
  1738. }\
  1739. #divDic img:active {\
  1740. -moz-transform: translateY(2px);\
  1741. -webkit-transform: translateY(2px);\
  1742. transform: translateY(2px);\
  1743. }\
  1744. ');
  1745. }
  1746. function insAfter(n,e){
  1747. if(e.nextElementSibling){
  1748. e.parentNode.insertBefore(n,e.nextElementSibling);
  1749. }else{
  1750. e.parentNode.appendChild(n);
  1751. }
  1752. }
  1753. function insBefore(n,e){
  1754. e.parentNode.insertBefore(n,e);
  1755. }
  1756. function outerNode(target, node) {
  1757. var t=target;
  1758. if (t.nodeName==node) return t;
  1759. if (t.parentNode)
  1760. while (t = t.parentNode){
  1761. if (t.nodeName && t.nodeName==node)
  1762. return t;
  1763. }
  1764. return null;
  1765. }
  1766. var imgH='<img border=0 src="' , imgD='data:image/png;base64,',imgT='">';
  1767. var imgPlay=imgD+
  1768. 'iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAI1JREFUeNpj+H9h4v//D7YRh4FqGf6vsvuPF4PAnnQ4n+H/At3/WDEIgOjTvQg2EDP8ny7/HwWDAIy+sxnBvr0RzGb43y/0H45hAMR+fAQrm+F/B/t/DAASe3gQK5vhfwsDpgaQ2IP9WNkQDTBMsgaYJhgNcgqMfWUZDg3oGveUINh4NSBrnGdGggY0DAAAy70TuBaoTgAAAABJRU5ErkJggg=='
  1769. ;
  1770.  
  1771. //http://www.senojflags.com/images/national-flag-icons/Portugal-Flag.png
  1772. imgForwSrc= imgD+
  1773. 'R0lGODlhEAAQAIQfAAFYsQJkw15iWgRz3AeN0Xl8c2mBiQma5B6W1h+b3yqh4BKp+kWk0pudlDC2/0y79X+4z1fC/7q6r3DK/4rN7a3Kz8fKwc/Uyr3c5N7dzuTi1Ofl1enm2O3r3/b06////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAB8ALAAAAAAQABAAAAWf4OeNXmdyX6qKpNSc25p6TVEIgl1osljntxxPNrIILhrDZBl5OBaLj6mTa1CWk+YTOpXgsBEM5gFdmDLBiJrC2VCgB85lYJFcmg+MPAPnDP4aGg4ODxsVFBkPBwd/jRuDFBoQDxkVix+NHwBQSBmeFwoEHwEDAQEAAJQVDAwQFxCipqeoABkMiwcWFqKjpqgEBLjAwDIAHwoJyQkIzB8hADs=';
  1774. imgForw = imgH+imgForwSrc+imgT;
  1775.  
  1776. imgBackSrc= imgD+
  1777. 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAGBQTFRFEgAAAVixAmTDXmJaBHPcB43ReXxzaYGJCZrkHpbWH5vfKqHgEqn6RaTSm52UMLb/TLv1f7jPV8L/urqvcMr/is3trcrPx8rBz9TKvdzk3t3O5OLU5+XV6ebY7evf9vTrdcYePwAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAoklEQVQY003PWxKDIAwF0CCPYouCKIIB7f532UTttPfvnkkyE4Ar+3Ecb8pdoRGM859UY4yUxow/4CpPcM6HuCzLoxaZacV9IY1G0mWGsG0sUs4M1rnU9hRjpCt4AZZ9CyGWOauyg7UB09qC97UqpRhWDFNN3jfFAf0qiFiLcwK4g57KNAw0JUTXqY4gZ2vtgEKwMFBItL47QN/3T8oLxPnVB4gUDOnY6pKLAAAAAElFTkSuQmCC';
  1778. imgBack = imgH+imgBackSrc+imgT;
  1779.  
  1780. imgSay = "<img border=0 style="+'"margin-bottom: -3px;"'+
  1781. "src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB3ElEQVR42rVTvUsCcRju/DrOj1NBzVOH1KFEJGuvIYKm6i+ooamhwaGG/A8aChukJSiolqKgLYoai5Z2UVOUEj3SUzu/9XouOMnQCKIfvMP93t/7vO/zPO8RQ388xL8C2Gy2qXa7/ZLNZp+/3huNRrpQKJQGAjAMM2o2m8MymWwGn/l4PM6Uy+WmmKNpmnS5XLlqtRqIRCIHPQAGg4FC16BKpdrodDr3tVptX61WnySTSRPHcW8Oh2MaoFWSJMc1Gs1uJpPxEG63e0Gn0+2IkyFIxDvOeiwWO8YUE3a7/SmVSplApQyATaVSuZbL5TzIXbZarUfC7/ezjUbjolgs3qFYqFQq1+DHiRNJAAD0arXaR0w0j+5hjH/UbDY5vV4fEAEEiDSLcW6/ayEBpNNpE3QJiQ1QyAJkBDUh3N39CgA5s8ViOYQur4iaQqEYZll2z2q1XkkUzkul0icAKNzk8/keCsj5oP5ZvV5fQvcLUNoS9QKtZQKWLCK5/VVEnufXo9FoV0TJBZ/PF5bL5XMQcRK5BwCe9tgIIAoFQXTZEATh00aKoro2goYXNvJYpBW8WYU7Y30XCdxG8bjvIkF5rdPpjMO1pUQicf3jKkPlKXj9AsGeB73535/pN+cD5ocErGex9gcAAAAASUVORK5CYII='>";
  1782. imgSwap = "<img border=0 style="+'"margin-bottom: -3px;"'+
  1783. "src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAQCAYAAAD52jQlAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAGFJREFUOMu1kkESwCAIAxM+7vTlevJipYKkOWeWQAB2ar2jIFMD31ABEACYBj5kLKkooX9TGTSwUqZQusbToOnd+CxbQiQxXeMccPEVrNzOA//YvkKp9SNnWQo2ZcK6PgocHMgoj3uaTsAAAAAASUVORK5CYII='>";
  1784. imgGoGo="<img border=0 style="+'"margin: 0 0 -3px 0;"'+
  1785. "src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAC4jAAAuIwF4pT92AAADCElEQVR42o2TWU8TURiGxyv/hv/ERCOylAKFC0CNXBgIqLhFixi2sEhpyyb7EkBklwIFZDHQsmgLBYFCFwqURgqaiJGZM+XOvJ4z0IJ4US+eZDKZ75n3e88Ml1D6oyeuTDiOLSNQnBJTShCtJZBr+O8pqr6rubm5XDA4KvHFlYuILfdBwSjzIYYSXeqDXEt+J6mMKf8lYknOS86LorQiEoo8LcrststBRSfrnAkCEklE76sPv+Y3LVSOjU+9NBpnM2ZmZpUMo3FGaTAYMwwGwzPKfU5RSgKSh60E1eMC6iYEPGihHVGRXCMir2MPy2tb8Hr3cXBwgP39fQmv14u9vT0JjhXLJE/eEoxYeOgXeQwtHEGjF2gqEZEaH+7V/sTwjAtu964k8uMXMjh2OmyVrjkedZMC7UvE03aCQh1BarMIGRVF0lRvdG5YrXZ8sixj1eb4VxSlIVIXg2Ye+f2CtI6appm3HaFzlodM7ZN4VO9Bt34Kr8oboG3pxuSciWKG+cuatCIn15x0UTYiYHSJR4FOQG6fgA/0WjUkIIJKGAr1N+Q3jKGlT48u/TheN7SjqqMfBrPlTMR6uF0tQmfiseP9BTdlgCa8VSUGRDI1QXajCYNj07Cu21DfNYD5xWWpaEkUSR9gPTDu1orI7CbI6iFIqj2RhJeIEmGUxzVWaBu7UPPuPZp7B2F3OOHxeE5OTVZCAj3ITt9+USChEpFcfYCsyk6kF1SgfWAULpcLOzs7koyLoCL/cMTp8EUBI5QSUXwIVdtnDE8YUU1TDX80YGtri34WbnBhxfxRuIrQYUIHzgj1U0wkCeNmsYiKfg9WVzcwPW9Cm24Ezs1NKRUXn2NKTyywtCcWLvX6SfBTsNSryHGshCjdCFHu4saLXRS1btLvyQab3YHlVWtgvaB/dVpmU3x44ujx9bhR3EmbhE5vwcaGHQ5a9CZNw1bb3t4OLnqerb2iSNUNxCdPoKPXTNeywmazUZFDErFETBY8UU7OpWtp9XnKvGksLKzQtdZht9vhdDr/Ev0Byz5/VV64nnQAAAAASUVORK5CYII='>";
  1786. //imgFmt="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA0klEQVQ4y6WSPQoCMRCFPyXN3kDB2lJ7G0tLQSzWqwgOGn8uYmOxjScQwQso7h30AIsgg1i4gkhiVn1VwoRv3ptMiadE68AIiHBriTVrvBJdIlrx1GJEU0R776XyyznCmpO/AxOg8w4pU1wtYAvMEe1+C9gAO+Caz2ngypkU9iK6+iWCU8ZBbwBDz/sp1qSfAdYcgPgfB1Wg7R2mNefPALgB6gHcwg4eHZJ/IjTzv3ZpjDXHkIM90C/q4HUPLvkAQ0tUAzKXgwmwQDQKIDJg9rzcAbW2Oj2CkYeiAAAAAElFTkSuQmCC";
  1787. imgWayBack="<img border=0 style="+'"margin: 0 0 -3px 0;"'+
  1788. "src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAjklEQVR42mOwqf/PQAlmGNQGcAGxHbkGcAPxfiD+S44BPEB8CIj/QzFJBvAC8VEkzSD8CIhnALEiIQP4gPg4mmZk/AWIAwkZcAyPASD8C4jNCHnhMAFDjhIKRFAMHEDSwArESkCcAsTXoGIKhKIRlAb2APEfNHE2IF4ExF7EJCQOILbEIs4CxMpDIy8QhQEekOZZucV1OQAAAABJRU5ErkJggg=='>";
  1789. imgUse = imgD+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQklEQVR42mNkoBAwgoiwykntQCoeTW7hqva8SmINeGZv7yCJLHHw4IHnQAOkCBoQXjdnJpBOI9MHsxhDa2b9z4v2xir7/z8QgyCU/gdi/GMA00CKYc7qnQyMwdUz/icGuSFp+s/w+cs3hqPHzzK8fPUGzBcVE2EwMzVk4OTkhGgG4X//GTbtPsTAGFgx5X9iiCfYFpDE+/cfGTZv28Ogr6vJ8A7ItjQ3ZLhy/Q7DxUvXGVxcHRj4+PgY/kIN2LH3IAOjX8mE//Gh3gz/oU7bu+8wg4S4CIOBnjbDlFmLGRLiIxnYWJgYzl+4wvD0+WsGSxtLhr///kPVHmBg9Cns+R8d7At32rJlaxnCw/0Y/vxjYli2dBVDaEQI2DZmoA0r12xg8A30hxgAxIcPAg3wzOv4HxrgDRb4C/TGmtXrGbx9PBmYWFgZVq9YA4wnRoa/f/4xeAf4MOzYsp3B3dcH7oVTR4FecMtq+e/r7QExAIhPnzzFwMsnwKCkqsIgwM0OVgwKnzPnrjB8/PCeQdPAEO7aCyeOMDC6pDf8d3V1AQv8BcXN758Mu3YfZJBXUmQQl5YCGszA8OzJE4ZH9+4z2DnYMPxkZAGrBYXZtbPHGBgdk2v+2zo6AQX+g21jY2FmALqZ4cyZCwxv3rwFKmZgEBYWYjAw1GP4zcDE8O3nb4gBQPFb508wMNonVv7XNzYFGwBzGgsTEwMvFwfI+8DkAzQPGDgfvn1n+PHrLzhdwMDDG5cYGK0iC/8zUABAmcmAEgMA4i8z829X6pgAAAAASUVORK5CYII=';
  1790.  
  1791. imgSave= imgD+
  1792. 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACgklEQVR42mNkAIL4tTeX/P36xnpBtCXDolN3GYS42Bn8dGUYGBkZGWBg/+0XDFOOPfzDxSOw8enZg5X729N/g8TBKuJWX/v++d0TjnVprgx2vZsY1MT4GebE2jMgg93XnzBMPnKXgYdPhOE/A8OiFRE68XADolZc+v7u+V2O7QUBDMbNyxg0JAQZlqZ6ohiw/fIDhr6DNxgEhSTB/P///9euiTFsARsQtuTs96ePb3PsLgpmOPfoJQM3GyuDgZwYigErHxQw3P/wnoGVhR2kmeH05aivt/bsFQEbELjg5PfHT+5y/Pj5i4GZiYkBG0iIqGZgYvwH5x89O4Xh1t6zCmADPGce+s7LycrBAPIdDmBuHAkM1L8IA870AQ04DzHAdere70CKgwEPcLFNAboAYcCR050Md/ZDDXCcuJMIA7IYGJmQvHCqieHugQsQA2z7tnzXEBfgEOXBbQa7VBSQRDLgdA0Dw4fDEAMsuzZ835nrxfH/zx+GP38QzvwP1DD3VjDDp7+PcZl7AWyAadua7weK/Tm+ff3G8Ov3HxQV7//eYVh8O5Xh3/+/KOL//jEzvHvBaw02wLBp+fcj5cEcL16+Y/j67QeGNZe/rmE4+XYxitj9Rw4Ml7Z9h3hBp27x95NV4RwvXmE34C/Q9lUPKhne/rkL5qsKGzIcOefLcGbXFogBmtXzvx9JUeHgYsWeiEDg1dcnDB3Xe4Bpn5GhUquUIXPzL4azB/YpMLb0T+E6+o1nryLrI2Nmhn8gEyBZEJkEhScwjX3geQMS+s//RfjfvV9Sz0x4/xszLlmyRAmUFIBYGogFgZgbmiZYgJgZFmZADMq+P4H4CxB/AOKnQHwQALc2/z+3odafAAAAAElFTkSuQmCC';
  1793. imgClip=imgD+'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAQCAYAAAAvf+5AAAAACXBIWXMAAAsTAAALEwEAmpwYAAAArklEQVR42mNgIBeI1v4+LVrz87dY7W9/rAqE63+ZABU1iNb9/i9c8/s8kD4gXPerGK5ArP53AMgE0bpflSBFKLjm50eRut/tQANOMsBMEa39uRnMRsJgRXU/34HkEQoJ4MGkULju5w5QSADpHzgVghSJ1P7uAAZLgljtrwxkxWgKf62BBBUoaH49ALLP4HcjFjHiFQKtqCas8OcvBonKf6JgxcjRB0wQyHzh2t++ACFkSePupdPoAAAAAElFTkSuQmCC';
  1794. imgFlags= {
  1795. 'AN': imgD+
  1796. 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAABANJREFUOMutlEtsVHUUh797//c10955F2hKM7QUEUgNoRAqSUGJESO6ACSyIKgJwSXGGFJ2mhijG2JE3WgiiSaCAQlVeagIhAYID4GIgKU4lGdbhs5MZ+bemft0UXGBukF/y7M4X07OOR/8T9n84eebNm3ZuvPBuvJgYcvOg8r573a0zF62uqP/zM/JUdvX8T1f1fRqV+vkQu74gXsqoaUaRlSbt2zaxby1UJs2e929WR1tSzqSdH/15RMnThw7fL+ftP7tj41hueG5eDK12GzJLp3a0vxoImaKCyNlLuWrnBvKU8oXWZoKKVoOZ4suoSyBAIQGWpSIEaFnWoLH2zOkhs9d2Lh8aed9gBh7ZuOVk+acDeVU68JEzJwUNxQ5Kgc4rk/ZsqnYNWJBnZ+eb+bZVp3V0xvoTAvSIkTyXUZqPh4SrqSQ1AQzOmdNsq/8Ovr7wOXTALJ3sX8/jkXZsig7PlU3oFGRWTA5QlRT8YRKBQULQdEDTYKeKRF6uzJ8s7yZBSkBnsvtksXVgs1vt0qse++Dd2a2t6UARFs2Gx/p6FkVeh7pRp2kJpBkyJoqm+el6Zli0Ds3jl338fwAz/MJQvDCEMsL6Z6kkxtzGbICbARJTZBpyhiPTElmDu/t6xNJr3LN6V652XJdYoZOKqKS0AS2H7B9sMqqbBQ5CHA9nyCcAIRB8OcGwdRkNnQm2X/D5nrFQ1NVTEWma1H3vKuH9v0g8oWC0/TYoqfHjUSrUASZBp2ELohrMhU/ZElLFE1iAuD7BEGA7/oTABlCwPF9xj2J4yMOViBIGAIzFiXmFg0B0JROTy1ku54kDCYAhoqpyUQViU8vV2iOSnTEBL7nI4UBvj8xRQhIEmgyHLxR5XzJpx4CqkG6fu/uZ6+99LICYFZG9ymq9pZVsynaDhUnQs0LSRgyqajgzXPjtGs+cxs87oxZxHGYGQlpMWUCwJBlTt2pQKACUaxisbC994W1lmUNCIDh3MDtzOIVr1cCWddVhUxUJxZRiGkybgDjTsipuzbbLxU5ervKj9fKhI7DyvZGnCBkz1CFHTkL3TRpvXn6THHrq2uK+ZF+IPzrk7XBk31M71lbsuqUa3UsR8cxQkxFolETxKMGRmMES5ZBM9hVrPP93hKBW8coj461DJ057p7e/8X1awPfBlD5myoy1uiRm0JdW7FrlGp1qnWXWqBiGhpNTREKnkz5yvnB6i/HLgS3ruYoDef0ejnnDudy+bHSTQfKQPCvLiod2bXbnP/iJ2XbpWg5WEInlPAv9W070r/n692DJ48esF33hqmKetn1w4cyYnPvtrO8ezSc8f6h4vxVr2yNRiJz/kmID53ZK9a/MfWpNR9FFJGduPL/nj8ActPaP8mCkKMAAAAASUVORK5CYII='
  1797. ,'en': imgD+
  1798. 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAJJSURBVHjapJNdSJNRGMd/Z3u3OTXXhx8xjRLDFWIk0jAk6WYYfaAZSUWGZkFdRNRFYAYFXhkI2gpKqISC1IsIUiKIchUEUQiuj4uiMT8m0wbNr+n2vu/p4l2K3Yn/m3Pg8Pye8/wf/kJKyWokACuQnjxXojgwowCOwPW2iS37y3k0bOfJwwHmYzFePK5n7Oxl0FRyH9zicGM3CZOFBhccypMox2tJdWZnK0Bay/AGmr+McmJvKUXbaul79hmTzYJ9x3bQdEw2C2V7XOzLUdmVZ2PWvZvm1lcAaQpg/vY9xL2NRdRMvqHUlYmzoRw9oREPjICqoic0qtIiFGVmECp20+kd4IPPD2AWQMFMcOSnxWZDavqyIcfOXARVJ7fLu9w4s4nEwgLpmzdtVQB+HW0kNcOBFo3Cv6VICWYTSEmw6hSYBOjGo7LOwdz0lHEHiMVimCciaNEpRLIWqSMUxWCpKgiBEAIJqI4M5tLtS4Cs++3kZGUlK5cUcFciEwkKBl//t3xBeHIS3KWYAEo87biruxiKWkh568N/447RWZdI3fAlMG8l5Z2PT00deOq6KfHcBjAA+YVO+p6eo8zXy/P+r9R9tCcbCQQCgIMHOuh3llFx2kNn/jjFhWuXAN6rFay/66XtZZjG9zrh0KjxVasCNgsAs9N/OHnkJq0/HLjOH+NadmjRg7jW00tnWOPKQGRxzEH/EOM7XUhNI+of4nckCEDThRaCl2qor66E/p64ABxALrBmhVmYBsYEYE4GybxCgAbExWrj/HcACIPUyGtYcDcAAAAASUVORK5CYII='
  1799. ,'fr': imgD+
  1800. 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAFESURBVHjapJM7TsNAEIa/9RqjKECEkGgoKOgoaHKCdByBc3APDsIRaHID01ASRTxEgxI5zsvetb1DkcSJCUaKMtJqZzSrb2f/nVEiwj6mgAA4Wu67mAWmPtDqdB6+f2e73ftK3L+92yJcPT2e+0CzKBzt9uW/1zVurpc1KxBh/vwC0PQBbW3BeJwyHE5rAebto/T9s1MkywC0D2CMJYpmRNG8FuBG49IvPE1u0wUMIEkMg8GMOJ5T9yn5KC59AWxiNgEJvV5GHCf1kvffS1+3Tkh9bw1I0wSRBs65ehU3cpJlpJnbBBi0PsS5+qaSFUBAihyTWwC8hYgG50ApVa6tjlvlPAVOSIxdV2CtJQiEIPDrnxAcVKoxdi2iFSmYTD4r58MwrMSvcfSntgpoARfA8Y6zMAG+FKCXg6R3BBSAVfuO888AocKXohfLXWQAAAAASUVORK5CYII='
  1801. ,'ru': imgD+
  1802. 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAADkSURBVHjapJM5TgNBEEVfzeZlQIOE5ARxClLOxC04CzFX4ArERAhZsoTEyDDurqa7SGxsIYJZKqnov9p+iZkxJQSogLN9HhIKfBZAY2abUdVFVhlQT5igzoB8AiDPAGKMg5UHTQFwc/fI6rKh/VLsz4b/u9FFXbF5b4+AnXe8rIW2C72qN8uSwtwJoHMwm5NSP0+EbyP4E8DD0z3XZUnqdr0A2XLBawjcHgBOPZYXINILYMlw6o8deFVsvoCq7AewhFf9BWg047n9GOMDFaABroDzgeIt8CZ7J1YjHBkBlanv/DMAwHdYum9dlZQAAAAASUVORK5CYII='
  1803. ,'zh-CN': imgD+
  1804. 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAFbSURBVHjapJO/SgNBEIe/vduLCSaKFhb6DCnFzs4XsMgjWlj4AD6BFhYKFqKgTSzSaBLN7f+xuJM7RSHRHywLy8w3Oz9mlIjwHymgA/TrexU54E0Dm+Pj0QSACGRADt39gLnQTZkftHd2uqOBdYmR3uGQYjfhnzPSXJHeYTCK2Lu8AquGJYC9vgFY10AupUdvTekdTYgnGvdYVQ5P0nTa+kW+vYV4D5BrgGAt9nZOmCzwDxlxkqG60D0ImCsN/msbKs+J1gKgAXww+Kcp5nKBKgQ0rA09i/Oi8iR880HAGdMATFnSuX8kzWZ8vvqHJvi7idnGBibPGkBZlvSzDJFURfj6FC1ISyl4SpcagDUWVRRISi2ngPTL8PiArUysW3AW0RqUWmqCRATjWiZaa6HbQxXFcjOYUpVTA1wU4eb15S+r4BSwCewBgxWT58BY1XZ16nsVRcCp/67zxwDGd5ld8bkQAQAAAABJRU5ErkJggg=='
  1805. ,'ar': imgD+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAIvSURBVHjapJPNSxRxHMY/M/Ob3bXddV3DBTUh8yJdCiHwIIV0DXqB7nWLDv0NBt06Rt3q0E0PGaFBmGSGUCZKQR6ENV8wddfVfZ35zW/mN9NByd4u4nP5Hr7wgYfneYwoijiODCAGpA7uUaSAugAyN0aHCn9//TAg0BoAYZrYlv0P4cX1oZwAkjrUnMv1ABBFEX6oaU+1cibbARGsVbZZrxWxTRPDMAH4UsgDJAVg+WFATTmUZBWtNVd7L3Ktux9ZaxBvShDriTO2/InhxSlMA042NeOHAYAlADzfpyIbFBplLp/u42bnBRzHYWVjHa01bdlWrnT0sV4t8mppBmFYeL4PgAkgPUnJq9LQHpdyvbizn9koFgl8n3gsxlZ5D39+gcFsDwrNjqwiPXkIcKVHvrxJwa3SIgOcmRkCIUil0+yUSkTxOLsfpmltKHaVQ778A1d6vwMcwlBTk3W2kzaJ5VWyc/Ns1euYmWbK468xZ+cpZBJU3CphqHGls58QgJQSO2njKo+RlY8M3L3Dzq3bdHSdoimdRn9bpO3xEx5tLrDn1MidaMGX8hCgpIeIkqTsBCMLb+gebOfe2Cjm+ASh72M+uM9T1ng28ZKUnSCKQtSBhf0UlCJBREzY2Jbg4fvnTHadpX/gPKZpMLc0zOzqV2xLYBkmIRGeUr8AKtIh5fzmHy2b/v6Oyam3YIDAIi5s5H/qbAAZoBNIH3ELNWDDAKyDIVlHBGhAGced888BANVaBfgg0AbGAAAAAElFTkSuQmCC'
  1806. ,"af":"Namibia" //
  1807. ,"sq":"Albania"
  1808. ,"am":"Ethiopia"
  1809. //,"ar":"United-Arab-Emirates"
  1810. ,"hy":"Armenia"
  1811. ,"az":"Azerbaijan"
  1812. ,"eu":"Spain"
  1813. ,"be":"Belarus"
  1814. ,"bn":"Bangladesh"
  1815. ,"bs":"Bosnian"
  1816. ,"bg":"Bulgaria"
  1817. ,"ca":"Spain"
  1818. ,"ceb":"Philippines"
  1819. ,"ny":"Mozambique"
  1820. /* ,"zh-CN":"Chinese"*/
  1821. ,"co":"Italy"
  1822. ,"hr":"Croatia"
  1823. ,"cs":"Czech-Republic"
  1824. ,"da":"Denmark"
  1825. ,"nl":"Netherlands"
  1826. /*, "en":"English"*/
  1827. ,"eo":"United-Nations"
  1828. ,"et":"Estonia"
  1829. ,"tl":"Philippines"
  1830. ,"fi":"Finland"
  1831. /* ,"fr":"France"*/
  1832. ,"fy":"Netherlands"
  1833. ,"gl":"Ukraine"
  1834. ,"ka":"Georgia"
  1835. ,"de":"Germany"
  1836. ,"el":"Greece"
  1837. ,"gu":"India"
  1838. ,"ht":"Haiti"
  1839. ,"ha":"Nigeria"
  1840. ,"iw":"Israel"
  1841. ,"hi":"India"
  1842. ,"hmn":"Laos"
  1843. ,"hu":"Hungary"
  1844. ,"is":"Iceland"
  1845. ,"ig":"Nigeria"
  1846. ,"id":"Indonezia"
  1847. ,"ga":"Ireland"
  1848. ,"it":"Italy"
  1849. ,"ja":"Japan"
  1850. ,"jw":"Japan"
  1851. ,"kn":"India"
  1852. ,"kk":"Kazakhstan"
  1853. ,"km":"Cambodia"
  1854. ,"ko":"North-Korea"
  1855. ,"ky":"Kyrgyzstan"
  1856. ,"lo":"Laos"
  1857. ,"la":"Vatican-City"
  1858. ,"lv":"Latvia"
  1859. ,"lt":"Lithuania"
  1860. ,"mk":"Macedonia"
  1861. ,"mg":"Madagascar"
  1862. ,"ms":"Malaysia"
  1863. ,"ml":"India"
  1864. ,"mt":"Malta"
  1865. ,"mi":"New-Zealand"
  1866. ,"mr":"India"
  1867. ,"mn":"Mongolia"
  1868. ,"my":"Burma" //absent
  1869. ,"ne":"Nepal"
  1870. ,"no":"Norway"
  1871. ,"fa":"Iran"
  1872. ,"pl":"Poland"
  1873. ,"pt":"Brazil"
  1874. ,"pa":"Pakistan"
  1875. ,"ro":"Romania"
  1876. /*, "ru":"Russia"*/
  1877. ,"sr":"Serbia"
  1878. ,"st":"Lesotho"
  1879. ,"si":"Sri-Lanka"
  1880. ,"sk":"Slovakia"
  1881. ,"sl":"Slovenia"
  1882. ,"so":"Somalia"
  1883. ,"es":"Spain"
  1884. ,"su":"Sudan"
  1885. ,"sw":"Mozambique"
  1886. ,"sv":"Sweden"
  1887. ,"tg":"Tajikistan"
  1888. ,"ta":"India"
  1889. ,"te":"India"
  1890. ,"th":"Thailand"
  1891. ,"tr":"Turkey"
  1892. ,"uk":"Ukraine"
  1893. ,"ur":"Pakistan"
  1894. ,"uz":"Uzbekistan"
  1895. ,"vi":"Viet-Nam"
  1896. ,"cy":"Wales"
  1897. ,"yi":"Israel"
  1898. ,"yo":"Nigeria"
  1899. ,"zu":"South-Africa"
  1900. };
  1901. imgFlags['zh-TW'] = imgFlags['zh-CN'];
  1902. imgFlags['to'] = imgForwSrc; imgFlags['from'] = imgBackSrc;
  1903.  
  1904. languagesGoogle='</option><option value="auto">Detect language</option></option><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="am">Amharic</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="bs">Bosnian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="ceb">Cebuano</option><option value="ny">Chichewa</option><option value="zh-CN">Chinese</option><option value="co">Corsican</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="fy">Frisian</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="ha">Hausa</option><option value="haw">Hawaiian</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hmn">Hmong</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="ig">Igbo</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="jw">Javanese</option><option value="kn">Kannada</option><option value="kk">Kazakh</option><option value="km">Khmer</option><option value="ko">Korean</option><option value="ku">Kurdish (Kurmanji)</option><option value="ky">Kyrgyz</option><option value="lo">Lao</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="lb">Luxembourgish</option><option value="mk">Macedonian</option><option value="mg">Malagasy</option><option value="ms">Malay</option><option value="ml">Malayalam</option><option value="mt">Maltese</option><option value="mi">Maori</option><option value="mr">Marathi</option><option value="mn">Mongolian</option><option value="my">Myanmar (Burmese)</option><option value="ne">Nepali</option><option value="no">Norwegian</option><option value="ps">Pashto</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="pa">Punjabi</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sm">Samoan</option><option value="gd">Scots Gaelic</option><option value="sr">Serbian</option><option value="st">Sesotho</option><option value="sn">Shona</option><option value="sd">Sindhi</option><option value="si">Sinhala</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="so">Somali</option><option value="es">Spanish</option><option value="su">Sundanese</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="tg">Tajik</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="uz">Uzbek</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="xh">Xhosa</option><option value="yi">Yiddish</option><option value="yo">Yoruba</option><option value="zu">Zulu</option>';
  1905.  
  1906. /* */
  1907. try{
  1908. body=
  1909. window.document.body;
  1910.  
  1911. maxHT=GM_getValue('histSize');
  1912. if(!maxHT) maxHT=20;
  1913. maxWC=GM_getValue('histWc');
  1914. if(!maxWC) maxWC=3;
  1915. sourceBH = GM_getValue('sourceBH',3);
  1916. sourceDP = GM_getValue('sourceDP',10);
  1917. if(!sourceDP) sourceDP = 10;
  1918.  
  1919. sT=GM_getValue('sourceText');
  1920. if (sT){
  1921. try{
  1922. sT=JSON.parse(sT);
  1923. }catch(e){console.log('broken source\n'+e)} ;
  1924. } else sT='';
  1925.  
  1926. // gmail spoils my timeout -- workaround
  1927. // borrowed from dbaron.org/log/20100309-faster-timeouts :
  1928. var setZeroTimeout,handleMessage,
  1929. timeouts = [],
  1930. messageName = "zero-timeout-160309";
  1931. // Like setTimeout, but only takes a function argument. There's
  1932. // no time argument (always zero) and no arguments (you have to
  1933. // use a closure).
  1934. setZeroTimeout= function(fn) {
  1935. timeouts.push(fn);
  1936. window.postMessage(messageName, "*");
  1937. },
  1938. handleMessage= function(event) {
  1939. if (typeof event.data==='string' && event.data === messageName) {
  1940. event.stopPropagation();
  1941. if (timeouts.length > 0) {
  1942. var fn = timeouts.shift();
  1943. fn();
  1944. } } }
  1945. //}
  1946.  
  1947. window.addEventListener("message", handleMessage, true);
  1948. // Add the one thing we want added to the window object.
  1949. //window.setZeroTimeout = setZeroTimeout;
  1950. // })();
  1951.  
  1952. document.addEventListener('mouseup', showLookupIcon, false);
  1953. document.addEventListener('mousedown', mousedownCleaning, false);
  1954. // http://www.senojflags.com/#flags16
  1955. if( location.href.indexOf(senojflags[0])>-1
  1956. ||location.href.indexOf(senojflags[1])>-1
  1957. ){try{
  1958. var f16=getId('flags16');
  1959. if(f16){
  1960. if(!fCSS) fCSS=
  1961. 'div#flags16 img {cursor: pointer !important}'+
  1962. 'div#flags48,div#flags32 {display:none; visibility: hidden}';
  1963. stickStyle(fCSS);
  1964. _log('inside\n' + location.href);
  1965. insBefore(buildEl('div',{style:'font: bold italic 100% sans-serif; color:red;',
  1966. align:'left'},null,'&nbsp;&nbsp;<u>Click on a country flag icon then choose the language</u>'),
  1967. f16);
  1968. f16.addEventListener('click',flagClick,false);
  1969. }
  1970. }catch(e){console.log('senojflags\n'+e)}
  1971. }
  1972. }catch(e){console.log('nobody\n'+e); }
  1973.  
  1974. function deURI(u,m){
  1975. if(!m) m= "&q=";
  1976. var x = u.indexOf(m);
  1977. if(x>=0) u=u.substr(x + m.length);
  1978. return decodeURIComponent(u).split(' ').slice(0,9).join(' ');
  1979. }
  1980. var uq=location.href.match(/^https:\/\/translate\.google\.[a-z]{2,3}\/translate_tts\?client\=t\&.+?(\&q\=.+)/);
  1981. if(uq && uq[1])
  1982. window.document.title=deURI(uq[1]);
  1983.  
  1984. function cmdGT(aS,aT){
  1985. txtSel = getSelection(null) || txtSel;
  1986. if(!isInited) {css(-1); isInited=true; }
  1987. /* 16.08.25 */
  1988. if(!txtSel) txtSel="Google Translator";
  1989. if(aT&& getId('divResult')){
  1990. killId('divUse');
  1991. getId('divResult').innerHTML = 'Loading...'
  1992. gtRequest(formatted?txtSelO:txtSel,gt_sl=aS,gt_tl=aT);
  1993. return;
  1994. }
  1995. var p = {t: pageYOffset+5+"px",l: pageXOffset+10+"px", r:"auto" };
  1996. if(savedTarget) // was dragged
  1997. p.t=dragY+pageYOffset +"px", p.l=dragX+pageXOffset+"px";
  1998. else if(GM_getValue('gtpwPos',false)) /* 160905 */
  1999. p.l = 'auto', p.r=(10-pageXOffset)+'px';
  2000.  
  2001. var divLookup = getId('divLookup') ||
  2002. buildEl('div', {id:'divLookup', style: 'z-index:100000'+
  2003. ';border: none;' +
  2004. ';top:' + p.t +';left:' + p.l +';right:' + p.r +';bottom: auto'
  2005. }, null, null);
  2006. body.appendChild(divLookup);
  2007. if(aT){
  2008. lookup(null,aS,aT);
  2009. } else lookup();
  2010. }
  2011.  
  2012. function playTTS(lang, text) {
  2013. try{
  2014. text = text.replace(/[«»'"]/g, ' ');
  2015. var tk=googleTK(text,soundSL);
  2016. soundSL=tk.SL;
  2017. var Url = ttsURL + "&ie=UTF-8&total=1&idx=0" +
  2018. "&tl=" + lang +
  2019. "&textlen=" + text.length +
  2020. "&tk=" + tk.tk+
  2021. "&q=" + text;
  2022. var AuCtx= window.AudioContext || window.webkitAudioContext;
  2023. var context = new AuCtx();
  2024. var source = context.createBufferSource();
  2025.  
  2026. var soundRequest = GM_xmlhttpRequest({
  2027. method: "GET",
  2028. url: Url,
  2029. responseType: 'arraybuffer',
  2030. onload: function(response) {
  2031. try {
  2032. context.decodeAudioData(response.response, function(buffer) {
  2033. source.buffer = buffer;
  2034. source.connect(context.destination);
  2035. source.start(0);
  2036. });
  2037. } catch(e) {console.log(e)}
  2038. }
  2039. });
  2040. }catch(e){console.log(e)}
  2041. }
  2042.  
  2043. saySrc= function (evt){
  2044. evt.preventDefault(),evt.stopPropagation();
  2045. playTTS(gt_sl,txtSel||txtselO);
  2046. }
  2047. sayDst=function (){}
  2048. // postMessage('tgtooltip auto|en','*')
  2049. function wMsg(e){
  2050. //event.source!=window in Chrome
  2051. if(!(typeof e.data==='string' && e.data.substr(0,9)==='tgtooltip')) return;
  2052. e.stopPropagation();
  2053. var m=e.data.match(/tgtooltip[\s\?/|#]*([a-zA-Z-]+)[\|\/]([a-zA-Z-]+)/);
  2054. if (m && m[2]) cmdGT(m[1],m[2]);
  2055. else cmdGT();
  2056. }
  2057.  
  2058. GM_registerMenuCommand("translate.google tootip", function(){cmdGT()} );
  2059. window.addEventListener("message", wMsg, false);
  2060. }
  2061. main();
  2062. }