Полезная информация

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№1317625-03-2019 18:35:52

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 476
UA: Firefox 66.0

Re: Custom Buttons

rubel перевод Ключи на Яндекс и Microsoft ищите сами

скрытый текст

Выделить код

Код:

/*Initialization Code*/ 
//--------------------------------Перевод---------------------------------------- 
//Ключи
//Яндекс
var keyuser = "________________________";
//Microsoft
var keyus = "_________________________"; 

//Здесь можно изменять парамеры:
//Выбираем язык перевода: 
//Google поддерживает 71 языков и auto
//Microsoft поддерживает 45 языков- "" : auto,"en","ar","bg","hu","vi","ht","nl","el","da","he","id","es","it","ca","zh-CHT","zh-CHS","tlh","tlh-Qaak","ko","lv","lt","ms","mt","de","no","fa","pl","pt","ro","ru","sk","sl","th","tr","uk","ur","fi","fr","hi","mww","cs","sv","et","ja" 
//Promt поддерживает 7 языков- "a": "auto", "e": "en", "s": "es", "i": "it", "g": "de", "p": "pt", "r": "ru", "f": "fr", 
//Яндекс поддерживает 33 языка- "": auto,"az","sq","en","hy","be","bg","hu","nl","el","da","es","it","ca","lv","lt","mk","de","no","pl","pt","ro","ru","sr","sk","sl","tr","uk","fi","fr","hr","cs","sv","et" 

//Варианты выбора языка переводчика для перевода текста в окне. Нужное разкоментировать. Остальное закоментировать.
//Google,
var langFrom_google_text = "auto";//авто
var langTo_google_text = "ru"; 
//Microsoft 
var langFrom_Microsoft_text = "";//авто 
var langTo_Microsoft_text = "ru"; 
//Promt 
var langFrom_PROMT_text = "a";//авто
var langTo_PROMT_text = "r"; 
//Яндекс 
var langFrom_yandex_text = ""; //авто
//var langFrom_yandex_text = "en-"; //английский и так же другие языки, тире обязательно
var langTo_yandex_text = "ru";
    
//Назначаем иконки
var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg==";
var gticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADPElEQVR4nGWTTWhjZRSG3/uTNr39mTqTn1KacagTqyKIlYJ2ExQCUhiprgpduRVFpLvZjOCsXEgWFqRk0RZcWLopmOnCQcPUsVBiTEZbalrGTJOZJm2aNGm++92b737fcdGZTfvAuznwnMV7OBouEI/HdSHEyNzcXCwajb7r8/n6T09P99bW1u4PDw8/SiQSbHd396IGBINBJJPJQDqdvssYK0kpO0SkiIiUUlII0SqVSr8lk8n3JycnjUsLZmdnb5bL5T+klPK5RNzp0BlzyHEFKXU+cxynubKy8tXExIQJABoAzM/PB6amptYikch70DRtv3iMh5kClPQglcKzozMMXhnAh7E3EL0RhCcEX19f/6xSqSxhdHRUT6VS39i2LYUQtJ7epm9/uEdHtSZJKUkpRa0zm75fvE+f3/mRmM3JcRyqVqulmZmZl7G6uhopl8sHtm3TduEpffH1T1Srn9FFavUmnTRaJKUkx3Go0WiojY2N22aj0Yj5fL6wJyVS6R289koYVwd7L3V07aUBAICUEkopSCk1v99/Sw+Hw5NSyi7OXZQrTQwFBy6f6DlKKSil4HkeOp0ODMO4btq23S+EgFQaAAKzO1BKQdd1AICmaSAiEBGUlBBCwHVduK4LzrlpHh4e7nHOVW+vofdbPmxkHuPWB6/D6vFD13UoRfj38TPsP6mBOxJjN64gdNUC5xz1er2l5/P5XxqNBvNEByPBLmS2n+LXzQK4zcH5ebp9GkAeEksPwJgNxhhs20axWMzo7Xb7US6Xyx7Xanh7LIhXRywklh7i9z/30Wy1YNsMfT0mrG4DGoCO64Ixhlqt5uTz+UVjZ2dHDA0NFYPB4Cd9fVb3W2MhnDZb+DldwD+FCk5OWvivVEX27ycY7APevHkNouNSNpu9l8vlvtMAIBQKGfF4/Mvp6em7oVCoxzAMOB0PjAsQEfxdPvi7DBgG4Dgu5fP5vxYWFj4uFAoHBgAwxmhvby8jpTywLOsdy7IGfKah9XSb56IOeJ7A0dGxs7m5mVpeXv60Xq8fcM7Pf+EFsVhMq1Qq18fHx2ej0ehHgUAgYpqm2W63W6VSKVMsFhe3trYeVKtV/sL5HwhICaDODiyAAAAAAElFTkSuQmCC";
var promticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQ0lEQVQ4jX2TX2xTdRTHT7O4GWL0gSwKmphoi3SsdFXHZiRjDExGSIxGHoTgwzDAUoM4skgEE6ckmiiEB2D8GYqbo2LLrmxZ51rWlob+W1e2ua2z2tp1ZVzrunZr161r7/3drw9TCLr4Sc7b+Zycc3IO0QNkY4M333LrD19zGbSc64aWc/VoOZepnnOZD3KuHi3nNB9rCQQcW2kl7CPjH3tPF7OUjpAxEbKDhNwEQUgSxBRBiD8GYWY/UlONzHO76YJery+4LwcmJmrHZtL5tlOVmGsjzPcQFgcIuRBBmCaIaYKYJIip18HyHiylv2Ae5wUtERGFef5ZZzQWS4sSmjgO060yzBsJi/2E3G8E4Y/lDpajDJIwDEkMwW2rHvf5fI/QlZHQFc+CBO8CQ9efOVw8s225gIewFCDkeRnEuSKwzGqw7PuQWAySlMFcrJ4NeIyv0SFv+N5nvIjdgSx2+NLYZ/Sio7nW4uTqdE7jIZ3TfFzntH6u03ON9g/aq9DQvgkftlfg5A+1aGk50EG77MHEK3cyKLHPQm6aRrkljqYu+/V/L/mNjroual0HuqwAnVeAzsix9og6Rg23xjmlLQm5OQ65OQ7FzRlstUyJtoHB7f/Ivf6+2kdNKpFMSlC3EvTjepDhBexo3tNLY+Ep9YaeyaX1tiSU9llscKSw0TOPPTecQ8FgsCgYDBZtt789Sv6NoGEVaKAU5C5F4fWSrHPIW05ERMetQxfV/fPQ+Bbw8nAWFaM5vDq6iK9tt9+77Pnu8NOz20AJDSimAd0tA4XVOGhovHR/vkgksqbqVjC5+VcBVSGGLb8zbAkxVHe642+OvpuQiSqQoAblNaClF1Hs2jQdjUbXPrSks1bHR5UjWZQPZqDxpKFyzEJ17VNckr5HIZOD2HMgUQHKrsOpn84e+c8p8zy/6qVzvZFnDJN46moYxedM+HKyGUPSCOpZI9awUjzBFCjr2+zneX7Viv/Q2tm3t+CEixWccKC68ygmhCj8wi8wCr04JnyCkruqfHd/984V5b+RnbxqbNj11VHLzrZ9kRr9O9ka614orTXseUPZvW8s39b9n/wQfr+/MBwOP+n+2V3huOOoTCQSj6+U9xeWlBixn0UlkAAAAABJRU5ErkJggg==";
var yndicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC8UlEQVQ4jY2TTWgcZQCGv1OLgkX0UlChaC8iEUo1kNJV0UiTNl1SFasYk2pELeohVkOgWkILDSTR2tWGjRILhigVoxIbf1oaWkJtIokmYWOa3253t2T/Z2dnZmfnm5nv8RZIhdIXnst7eE7vK+oH5JvPfSe5HfZ963SImxPsL9E45PD6r/KWvDYsCfaXnN2nzYp1gt2nDZqGbJqGbJrP2ixrPpZU+AoMR5GxFCNRj6Yhmxe/t6j9uji6TvDsV3kaBk1az5XQy4q0pbia8WgYNMmVFA2DJhdWXCypaPrJJPhNgere/ME1wZM9aQ78oOMrGItJlIJIyiVf8rFdxWLW4+UzBfSyImv5vDCg8URPKlf1afw+IYQQO07eIGv5jMcc+v+2OPhjnqThkbV89g9kee9njZzlM5Fw+GXOpueKwa4vU1R9dmNACCHEY91RMqbH5Ws2ZVcR01ySRY/OCwXq+5LU9yWJaS5ayeeV/hQ5y6e+L8nOkzG2dy3vEYETK8Q0l7pwgpThURdOUBdOkLc89vYmiGkug9MGe3sTRHMSWyrqwgme+fw6FccXF0XFsTl026cmFGUx7VATilITihK+lKfsKjr/yKx1CymHklTUhKIEupd4uH32H/HQRzMYZZ94XlJ2FasFyWpBcmneIFN0CYZWqO5e4vlT15CeQrM8qruXeKQ9woOHp3aKB1onieccaj9ZIKW7PNVxdY1dXfOkiy77Ty2TNVzmV21az8R59MgM93842SuEEGJzyxjVx/9Fs1xe+mKB85ECgaMRAkcj1HbOYTk+17Nl9nTNkdIljx+ZZnPLldym5j/vEUIIce+7o1R9PEWwaxbD9nA9RVqXzMRMpqImTx+bwSx7pHVJoH2aLe+Pcfc7o6+uDWnT2yNUtk1Q2TbBjsOTXJzVsKVPseRxcVYjrUtOnI1T2TbB1pbL3PXWyPop3/nGebYdGmf7B3/dkm2Hxrmj+Zyzsfn3resEGxqHOzYc+I3bonH4f3f+Dz63ssfSaOz4AAAAAElFTkSuQmCC";
var bingicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABMUlEQVQ4jY2SsU7DMBCG/TJYYqpEPDojcbq0NGM7sXdnggnigYFOyVDqLLBAkRJLTIwJSwdYw8gj8AQ/Q0kaO6HNSZbPp/P332+ZkJ7hSo2uvNdFV2rwMEOVGw28UVjl5bZZaqi8hA3aqzB/KOBKDVWUrcZ6ir/dgLlSY/HxAx5mmD++d15u7jzMjDNxpcbZyzeE+mz563o4bteaY9nj2bktwP97F7upS72yUgdLfNDIA428g9SD/6APZG84SoDGwoDQeFurly3CEh+OEmBKIFgPcWwBCCHkKPJwt7nA+dvIFBg/C9wUV3VhsbnF4L4NmKYT0Fjg9HVoApgSSL/WBuBkZQKm6QQ08jDLgraF8ZPAdX6JJnCw3AFo5IHGArMs2NVsi44SYIkPlviozraFrvgFK3TyTsPvtF8AAAAASUVORK5CYII=";
var lmricon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQ0lEQVQ4jX2TX2xTdRTHT7O4GWL0gSwKmphoi3SsdFXHZiRjDExGSIxGHoTgwzDAUoM4skgEE6ckmiiEB2D8GYqbo2LLrmxZ51rWlob+W1e2ua2z2tp1ZVzrunZr161r7/3drw9TCLr4Sc7b+Zycc3IO0QNkY4M333LrD19zGbSc64aWc/VoOZepnnOZD3KuHi3nNB9rCQQcW2kl7CPjH3tPF7OUjpAxEbKDhNwEQUgSxBRBiD8GYWY/UlONzHO76YJery+4LwcmJmrHZtL5tlOVmGsjzPcQFgcIuRBBmCaIaYKYJIip18HyHiylv2Ae5wUtERGFef5ZZzQWS4sSmjgO060yzBsJi/2E3G8E4Y/lDpajDJIwDEkMwW2rHvf5fI/QlZHQFc+CBO8CQ9efOVw8s225gIewFCDkeRnEuSKwzGqw7PuQWAySlMFcrJ4NeIyv0SFv+N5nvIjdgSx2+NLYZ/Sio7nW4uTqdE7jIZ3TfFzntH6u03ON9g/aq9DQvgkftlfg5A+1aGk50EG77MHEK3cyKLHPQm6aRrkljqYu+/V/L/mNjroual0HuqwAnVeAzsix9og6Rg23xjmlLQm5OQ65OQ7FzRlstUyJtoHB7f/Ivf6+2kdNKpFMSlC3EvTjepDhBexo3tNLY+Ep9YaeyaX1tiSU9llscKSw0TOPPTecQ8FgsCgYDBZtt789Sv6NoGEVaKAU5C5F4fWSrHPIW05ERMetQxfV/fPQ+Bbw8nAWFaM5vDq6iK9tt9+77Pnu8NOz20AJDSimAd0tA4XVOGhovHR/vkgksqbqVjC5+VcBVSGGLb8zbAkxVHe642+OvpuQiSqQoAblNaClF1Hs2jQdjUbXPrSks1bHR5UjWZQPZqDxpKFyzEJ17VNckr5HIZOD2HMgUQHKrsOpn84e+c8p8zy/6qVzvZFnDJN46moYxedM+HKyGUPSCOpZI9awUjzBFCjr2+zneX7Viv/Q2tm3t+CEixWccKC68ygmhCj8wi8wCr04JnyCkruqfHd/984V5b+RnbxqbNj11VHLzrZ9kRr9O9ka614orTXseUPZvW8s39b9n/wQfr+/MBwOP+n+2V3huOOoTCQSj6+U9xeWlBixn0UlkAAAAABJRU5ErkJggg==";
var maillicon="data:image/gif;base64,R0lGODlhEAAQAPeSAPt3d+9fX8kTE39xVP+wsCFiAP/hpv/Sd4NYAf/Rdf/Whf/Ufebe3v/Teo+Caf/Xh//hpEAYAHZWF/+3JtfSyf7s7P/cl//p6WolJakZD//Naf/19WJMIPBnZ/jOzoMkJPrY2P/GU+xxcU87FH9TEO+kDvv6+f+yGf39/NmzaJQyIKJMPO3554lXPm3OPP38/KSYImLKLehYWPeysvFubv+8NUa2C1a6H31EKox2SJSaOPaBgfbRhvbYnPt8fFpmFbN+FrCXY3UHB//HVjlTCf/BRf/pvG5SMq6Tk/F0dDOSAf/MZzGSAGhTKP/LZKx7Gv/dmT+JCPO3t8m3t4xhCf/x8ZsVFYEZBPyVleuWlvzd3fSSkko0DZVyK7ctJf/blJFsbIt9Ff++Pf/lsPOrq/LPiMctLfJ4eP/lsubk3v/YirOqmfauHGJQLd9CQlECAf7U1P/MzNnVzPnFV0AnAP23t//7+8leXkq8EJGFbPnBwfS3Pv+zG2NPKNSbKP+uDf+4K9K0d/yZmWFPK3o9FnRSJXZISG1dPPrS0rmyoreSR8MUEtytP+dQUNAhIfVsbN9AQNcwMP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJIALAAAAAAQABAAAAjbACUJFHghDgECdgYOrAKnjiAfACICwLJBoaQzjzJq1LijgsI7AUIm2TIDkZ4OAWhoGfihUSMQZES4nNlIhgeBGCDp3MlTpxspkgyZiUS0qNGiWcBYccS0aVMvK1ocGYFEiICrizKowFFIQhdFKcpQmPLmCiESVID42RPCSQIFX3pIYhABwZ8TE2oUGbLkwAMLEMageEGnBJ8wRH7M0dBADRQDaIwkksSFDSAYBQroWMAjUJAcTQblkTTgiRhGSphE4XDIwRo5JgamadNngI0beCzqFuiCRYzdkgICADs=";

function GetXmlHttpObject(){
         if (window.XMLHttpRequest){ return new XMLHttpRequest();}
         if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP");}
        return null;
        };

var btn = this;

btn.lastClick = {
    X: 0,
    Y: 0
};
addEventListener("mouseup", function(e) {
    if (e && e.button == 0 && e.view.top == content) {
        var lc = btn.lastClick;
        lc.X = e.clientX;
        lc.Y = e.clientY;
    }
}, false);

var createWindow = function(text, status, title, id, pos, size){
    var win = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
    var doc = win.document, wId = 'ujs_window'+(id || ''), w = doc.getElementById(wId);
    var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()};
    if(w)w.closeWin();
    w = doc.createElement('div');
    w.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:3px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof w.style.borderRadius === 'string' ? 'background-color:#f3f5f7;padding-top:4px;border-radius:4px;box-shadow:0 0 12px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");'));
    w.id = wId;
    w.closeWin = function(){
        doc.removeEventListener('keydown', keyDown, false);
        this.parentNode.removeChild(this);
    };
    w.addEle = function(str, style){
        var ele = doc.createElement('div');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };
    var img = doc.createElement('div');
    img.setAttribute('style', 'display:block;float:right;width:18px;height:18px;padding:0;margin:0;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=");background:-o-skin("Caption Close Button Skin");');
    img.title = (win.navigator.language.indexOf('ru') == 0) ? '\u0417\u0430\u043A\u0440\u044B\u0442\u044C' : 'Close';
    img.addEventListener('click', function(){this.parentNode.closeWin()}, false);
    w.appendChild(img);
    w.addEle(title, 'display:table;color:#000;font:16px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
    var cnt = w.addEle(text, 'display:block;border:1px solid #aaa;margin:2px 0 1px 0;padding:4px;background-color:#fafcfe;color:#000;font:14px Times New Roman;width:240px;height:120px;overflow:auto;cursor:text;');
    w.addEle(status, 'display:table;color:#555;font:10px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
    w.addEventListener('mousedown', function(e){
        if(e.target == w){
            e.preventDefault();
            var grabX = e.clientX, grabY = e.clientY, origX = parseInt(w.style.left), origY = parseInt(w.style.top);
            var mouseMove = function(ev){
                w.style.left = origX+ev.clientX-grabX+'px';
                w.style.top = origY+ev.clientY-grabY+'px';
            };
            doc.addEventListener('mousemove', mouseMove, false);
            doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false);
        }
    }, false);
    doc.documentElement.appendChild(w);

    if(size){
        cnt.style.height = size.height;
        cnt.style.width = size.width;
    }else{
        for(var i = 3; i < 10; i++){
            if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){
                cnt.style.height = 50*i+'px';
                cnt.style.width = 100*i+'px';
            }else break;
        }
    };
    var docEle = doc.compatMode == 'CSS1Compat' ? doc.documentElement : doc.body;
    var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight;
    if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0};
    if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0};
    var hW = parseInt(w.offsetWidth/2);
    w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
    w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
    w.style.visibility = 'visible';
    doc.addEventListener('keydown', keyDown, false);
};

var getSel = function (w) {
    var s, d = w.document;
    if (d.selection) {
        var r = d.selection.createRange();
        s = r ? r.text : ''
    } else {
        s = d.getSelection().toString();
        if (!s) {
            var e, t = d.getElementsByTagName('textarea'), u = d.getElementsByTagName('input'), i = t.length;
            while(e = (i > 0) ? t[--i] : u[-i--])try{
                if (e.offsetHeight > 0 && (s = e.value.substring(e.selectionStart, e.selectionEnd))) break
            }catch(x){}
        }
    };
    if (!s) for (var j = 0, f; f = w.frames[j]; j++) {
        try {
            if (s = getSel(f)) break
        } catch(x) {}
    };
    return s
};

var getHash = function (txt) {
    TKK=eval('((function(){var a\x3d817046147;var b\x3d-335196159;return 410049+\x27.\x27+(a+b)})())');
    function sM(a) {
        var b;
        if (null !== yr)
            b = yr;
        else {
            b = wr(String.fromCharCode(84));
            var c = wr(String.fromCharCode(75));
            b = [b(), b()];
            b[1] = c();
            b = (yr = window[b.join(c())] || "") || ""
        }
        var d = wr(String.fromCharCode(116))
            , c = wr(String.fromCharCode(107))
            , d = [d(), d()];
        d[1] = c();
        c = "&" + d.join("") + "=";
        d = b.split(".");
        b = Number(d[0]) || 0;
        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var l = a.charCodeAt(g);
            128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023),
                e[f++] = l >> 18 | 240,
                e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224,
                e[f++] = l >> 6 & 63 | 128),
                e[f++] = l & 63 | 128)
        }
        a = b;
        for (f = 0; f < e.length; f++)
            a += e[f],
                a = xr(a, "+-a^+6");
        a = xr(a, "+-3^+b+-f");
        a ^= Number(d[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return c + (a.toString() + "." + (a ^ b))
    }

    var yr = null;
    var wr = function(a) {
        return function() {
            return a
        }
    }
        , xr = function(a, b) {
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2)
                , d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d)
                , d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
            a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
        }
        return a
    };

    return sM(txt);
};

//----------Перевести  текст  из буфера в окне Google------------


var ujs_google_translat = function (dir){
    var win = content, lng = win.navigator.language.slice(0, 2), txt = gClipboard.read(), l = dir.split('|');
    if (txt) {
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                    result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();

                    createWindow(result, status, '<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', btn.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
    };
};

//----------Перевести выделенный текст в окне Google------------


function ujs_google_translate (){
    var win = content, lng = win.navigator.language.slice(0, 2), txt = getSel(win);
    if (txt) {
        var xhr = new XMLHttpRequest();
       // var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
      
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                    result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    //status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();
                     status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + langTo_google_text.toUpperCase();
                   createWindow(result, status, '<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', btn.lastClick);
                   
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
     };
};



//----------Перевести выделенный текст в окне Microsoft------------
function ujs_Microsoft_translate (){
      var win = content, txt = getSel(win);
    var encTxt = encodeURIComponent(txt);
    if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt), post = encTxt.length > 1024;
        var urlt = 'http://www.bing.com/translator/?from='+langFrom_Microsoft_text+'&to='+langTo_Microsoft_text+'&SourceText=' + encTxt;       
        var uridetect = "http://api.microsofttranslator.com/V2/Ajax.svc/Detect?appId="+keyus+"&text="+ encTxt;
        var url="http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId="+keyus+"&from="+langFrom_Microsoft_text+"&to="+langTo_Microsoft_text+"&text="+ encTxt;
 
        if (txt && location. hostname != 'http://api.microsofttranslator.com/')
         { var result="Подождите идет перевод", status="";
            createWindow(result, status,'<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Bing</a>', '_gt', btn.lastClick);
         }
        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open(post ? 'POST' : 'GET', url, true);
           if(post)xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           xmlhttp.send(post ? encTxt : null);
           xmlhttp1=GetXmlHttpObject();
           xmlhttp1.onreadystatechange=stateChanged;
           xmlhttp1.open('GET', uridetect, true);
           xmlhttp1.send(null);
        }
       function stateChanged(){
         if (xmlhttp.readyState==4 && xmlhttp1.readyState==4)
         {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\"/g, '').replace(/\\u000d/g, " ").replace(/\\u000a/g, "<br />").replace(/\//g, '');
           var tryain1=xmlhttp1.responseText;
           tryain1=tryain1.replace(/\"/g, '');
           var result = tryain;
          var status =(tryain1 +' -\u203A '+ "ru").toUpperCase();
          createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Bing</a>', '_gt', btn.lastClick);
         }
       }  
      gettransdata();
   } 
};


 //----------Перевести текст в окне Яндекс------------
function ujs_yandex_translate() {
       var win = content, txt = getSel(win);
       var encTxt = encodeURIComponent(txt);
     if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt);
        var url ="https://translate.yandex.net/api/v1.5/tr.json/translate?key="+keyuser+"&lang="+langFrom_yandex_text+langTo_yandex_text+"&text=" + encTxt;

        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('GET', url, true);
           xmlhttp.send(null);
        }
        function stateChanged(){
          if (xmlhttp.readyState==4)
           {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\\n/g, "<br />");
           var data = JSON.parse( tryain );
           var result,status;
           if (data.code == "401") {result = "Неправильный ключ API"; status = "";} 
           if (data.code == "402") {result = "Ключ API заблокирован"; status = "";} 
           if (data.code == "403") {result = "Превышено суточное ограничение на количество запросов"; status = "";} 
           if (data.code == "404") {result = "Превышено суточное ограничение на объем переведенного текста"; status = "";} 
           if (data.code == "413") {result = "Превышен максимально допустимый размер текста"; status = "";} 
           if (data.code == "422") {result = "Текст не может быть переведен"; status = "";} 
           if (data.code == "501") {result = "Заданное направление перевода не поддерживается"; status = "";} 
           if (data.code == "200") {result = data.text; var status1 = data.lang; status =(status1.replace(/\-/g, "-\u203A")).toUpperCase();}
           var urlt = 'http://translate.yandex.ru/?text=' + encTxt + '&lang=' + status1;
           createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Яндекс</a>', '_gt', btn.lastClick);
           }
        }  
        gettransdata();
    } 
};

//----------Заменить текст переводом Microsoft------------
function ujs_Microsoft_TexReplace (){
      var win = content, txt = getSel(win);
    var encTxt = encodeURIComponent(txt);
    if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt), post = encTxt.length > 1024;
        var urlt = 'http://www.bing.com/translator/?from='+langFrom_Microsoft_text+'&to='+langTo_Microsoft_text+'&SourceText=' + encTxt;       
        var uridetect = "http://api.microsofttranslator.com/V2/Ajax.svc/Detect?appId="+keyus+"&text="+ encTxt;
        var url="http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId="+keyus+"&from="+langFrom_Microsoft_text+"&to="+langTo_Microsoft_text+"&text="+ encTxt;
 
        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open(post ? 'POST' : 'GET', url, true);
           if(post)xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           xmlhttp.send(post ? encTxt : null);
           xmlhttp1=GetXmlHttpObject();
           xmlhttp1.onreadystatechange=stateChanged;
           xmlhttp1.open('GET', uridetect, true);
           xmlhttp1.send(null);
        }
       function stateChanged(){
         if (xmlhttp.readyState==4 && xmlhttp1.readyState==4)
         {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\"/g, '').replace(/\\u000d/g, " ").replace(/\\u000a/g, "<br />").replace(/\//g, '').replace(/\\n/g, "<br/>").replace(/\\r/g, "");
           var tryain1=xmlhttp1.responseText;
           tryain1=tryain1.replace(/\"/g, '');
           var result = tryain;
            var range = content.getSelection().getRangeAt(0);
              range.deleteContents();
              range.insertNode(range. createContextualFragment(result));
         }
       }  
      gettransdata();
   } 
};
//----------Заменить текст переводом Яндекс------------ 
function ujs_TexReplace_translate() {
        
       var win = content, txt = getSel(win);
       var encTxt = encodeURIComponent(txt);
     if (txt) { 
        var xhr = new XMLHttpRequest();
        var encTxt = encodeURIComponent(txt);
        var url ="https://translate.yandex.net/api/v1.5/tr.json/translate?key="+keyuser+"&lang="+langFrom_yandex_text+langTo_yandex_text+"&text=" + encTxt;

        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('GET', url, true);
           xmlhttp.send(null);
        }
        function stateChanged(){
          if (xmlhttp.readyState==4)
           {
           var tryain=xmlhttp.responseText;
           tryain=tryain.replace(/\\n/g, "<br />");
           var data = JSON.parse( tryain );
           var result = data.text;
     
          var range = content.getSelection().getRangeAt(0);
              range.deleteContents();
              range.insertNode(range. createContextualFragment(result));
           }
        }  
        gettransdata();
    } 
    
};  

//----------Заменить текст переводом Google------------
function ujs_google_TexReplace() {
    var win = content, lng = win.navigator.language.slice(0, 2), txt = getSel(win);
    if (txt) {
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
       
           function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('POST', url, true);
           xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
           xmlhttp.send('q=' + encodeURIComponent(txt));
        }
        function stateChanged() {
            
                if (xmlhttp.readyState == 4 ) {
           var result = '';
           var data = JSON.parse(xmlhttp.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
           for(var i = 0, n; n = data[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
           
              var range = content.getSelection().getRangeAt(0);
              range.deleteContents();
              range.insertNode(range. createContextualFragment(result));
                                     
                }
        }  
        gettransdata();
    } 
};




 
//--------Перевести текст в Google в новой вкладке--------------
function ujs_GoogleTextPageNew_translate() { 
var win = content, txt = getSel(win);
var encTxt = encodeURIComponent(txt);
var ctabpos = gBrowser.selectedTab._tPos +1;
var url="http://translate.google.com/translate_t?text="+encTxt+"&sl=auto&tl=ru&hl=ru&eotf=0&ujs=gtt";
gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};

//--------Перевести текст в Яндексе в новой вкладке--------------
function ujs_yandexTextPageNew_translate() { 
       var win = content, txt = getSel(win);
        var encTxt = encodeURIComponent(txt), post = encTxt.length > 1024;
       var ctabpos = gBrowser.selectedTab._tPos +1;
     if (txt) { 
        var xhr = new XMLHttpRequest();
        var url ="https://translate.yandex.net/api/v1.5/tr.json/detect?key="+keyuser+"&lang=ru&text=" + (post ? '' : encTxt);

        function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open(post ? 'POST' : 'GET', url, true);
           if(post)xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           xmlhttp.send(post ? encTxt : null);
        }
        function stateChanged(){
          if (xmlhttp.readyState==4)
           {
           var tryain=xmlhttp.responseText;
           var data = JSON.parse( tryain );
           var status1 = data.lang;
           var urlt="http://translate.yandex.ru/?text=" + encTxt + "&lang=" + status1 + "-ru";
           gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(urlt), ctabpos);
           }
        }  
        gettransdata();
    } 
};
//---------Перевести текст в PROMT в новой вкладке---------------
function ujs_PROMTTextPageNew_translate(){ 
var win = content, txt = getSel(win);
var encTxt = encodeURIComponent(txt); 
var ctabpos = gBrowser.selectedTab._tPos +1;
var url="http://www.translate.ru/?External=IE8Accelerator&formEncoding=utf-8&direction=ar&prmtlang=ru&status=translate&template=General&source="+encTxt;
gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//---------Перевести текст в Microsoft в новой вкладке---------------
function ujs_MicrosoftTextPageNew_translate(){
  var ctabpos = gBrowser.selectedTab._tPos +1;
  var win = content, txt = getSel(win);
  var encTxt = encodeURIComponent(txt);
  var url="http://www.bing.com/translator/?to=ru&Text="+encTxt;
  gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};





//--------Перевести страницу с Google--------------
function ujs_googlePage_translate() {
   var urlt = content.document.location.href;  
   var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1";
 getBrowser (). loadURI(url, {
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};
//---------Перевести страницу с Promt---------------
function ujs_PromtPage_translate() {
var urlt = content.document.location.href;
var url = "http://www.translate.ru/siteTranslation/autolink/?direction=ar&template=General&sourceURL="+encodeURIComponent(urlt);
getBrowser().loadURI (url, {
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};
//---------Перевести страницу с Microsoft---------------
function ujs_MicrosoftPage_translate() {
var urlt = content.document.location.href;
var url = "http://www.microsofttranslator.com/bv.aspx?from=&to=ru&a="+encodeURIComponent(urlt);
getBrowser (). loadURI(url, {
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};






//---------Перевести страницу с Microsoft в новой вкладке ---------------
function ujs_MicrosoftPageNew_translate() {   
        var urlt = content.document.location.href;  
    var url = "http://www.microsofttranslator.com/bv.aspx?from=&to=ru&a="+encodeURIComponent(urlt);
    var ctabpos = gBrowser.selectedTab._tPos +1;
    gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//---------Перевести страницу с Promt в новой вкладке ---------------
function ujs_PromtPageNew_translate() {                 
      var urlt = content.document.location.href;  
    var url = "http://www.translate.ru/site/General/au-ru/?url="+ encodeURIComponent(urlt) + "";
    var ctabpos = gBrowser.selectedTab._tPos +1;
    gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
};
//--------Перевести страницу с Google в новой вкладке --------------
function ujs_GooglePageNew_translate() {
   var urlt = content.document.location.href;  
   var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1";
    var ctabpos = gBrowser.selectedTab._tPos +1;
     
   var css = '@-moz-document domain("translate.google.com") {\
   #gb, #gt-c:not([class="g-section"]) { display: none !important; }\
   #contentframe { top: 0 !important; }\
   }';
   var uri = makeURI("data:text/css," + encodeURIComponent(css));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"]. getService(Ci.nsIStyleSheetService);
   try { sss.unregisterSheet(uri, sss.AGENT_SHEET) }
   catch(e) { sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET) } 

   gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
 };
 
 
 
 
 
//Контекстное меню для перевода из буфера-------------------------------------------  

(function () {
 if ( document.getElementById("TranslateBufer") ) return; 
 var contextMenu = document.getElementById("contentAreaContextMenu");  
 var Item = document.createElement("menuitem");
       Item.setAttribute("Id", "TranslateBufer");
       Item.setAttribute("label", "Перевод из буфера");
       Item.setAttribute("class", "menuitem-iconic");
       Item.setAttribute("image", mainicon);
       Item.addEventListener("command", function(){ujs_google_translat('auto|ru')}, false);

    contextMenu.insertBefore(Item, document.getElementById("context-viewpartialsource-selection") ); 
    addDestructor(function() { contextMenu.removeChild( Item ) });
 })();

 //Контекстное меню для перевода страниц-------------------------------------------  

(function () {
 if ( document.getElementById("TranslatePage") ) return; 
  
  var menu = document.createElement("menu");  
  var menuPopup = document.createElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
  
    menu.id = "TranslatePage";
    menu.setAttribute("label", "Перевести страницу");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);
   
  contextMenu.insertBefore(menu, document.getElementById("context-viewsource") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) }); 

    var array = [
        {label:"Google", func: ujs_googlePage_translate, image:gticon},
        {label:"Promt ", func: ujs_PromtPageNew_translate, image:promticon},
        {label:"Microsoft", func: ujs_MicrosoftPage_translate, image:bingicon},
        { separator: '' },
        {label:"Google в новой вкладке", func: ujs_GooglePageNew_translate, image:gticon},
        {label:"Promt в новой вкладке", func: ujs_PromtPageNew_translate, image:promticon},
        {label:"Microsoft в новой вкладке", func: ujs_MicrosoftPageNew_translate, image:bingicon}
        ];
        
   array.forEach(function( m ) {  
       if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );

       });
   
     addEventListener("popupshowing", function() {
     menu.hidden = gContextMenu.isTextSelected || gContextMenu.onImage || gContextMenu.onTextInput ; 
  }, true, contextMenu );
})();

 //Контекстное меню для перевода текста-------------------------------------------  
(function () {
 if ( document.getElementById("TranslateSelected") ) return; 
  
  var menu = document.createElement("menu");  
  var menuPopup = document.createElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
      
    menu.id = "TranslateSelected";
    menu.setAttribute("label", "Перевести выделенный текст");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);

  contextMenu.insertBefore(menu, document.getElementById("context-viewpartialsource-selection") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) });
     
    
  var array = [
        {label:"В окне Google", func: ujs_google_translate, image:gticon},
        {label:"В окне Яндекс", func: ujs_yandex_translate, image:yndicon},
        {label:"В окне Microsoft", func: ujs_Microsoft_translate, image:bingicon},
        { separator: ''},
        {label:"Заменить текст переводом Яндекс", func: ujs_TexReplace_translate, image:yndicon},
        {label:"Заменить текст переводом Microsoft", func: ujs_Microsoft_TexReplace, image:bingicon},
        {label:"Заменить текст переводом Google", func: ujs_google_TexReplace, image:gticon},
        { separator: ''},
        {label:"В Google в новой вкладке", func: ujs_GoogleTextPageNew_translate, image:gticon},
        {label:"В Яндексе в новой вкладке", func: ujs_yandexTextPageNew_translate, image:yndicon},
        {label:"В PROMT в новой вкладке", func: ujs_PROMTTextPageNew_translate, image:promticon},
        {label:"В Microsoft в новой вкладке", func: ujs_MicrosoftTextPageNew_translate, image:bingicon}
              ];
  array.forEach(function( m ) {  
        if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );
       });
 
     addEventListener("popupshowing", function() {
     menu.hidden = !gContextMenu.isTextSelected; 
  }, false, contextMenu ); 
 })();

Отредактировано Andrey_Krropotkin (26-03-2019 08:26:08)

Отсутствует

 

№1317726-03-2019 06:56:28

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 63.0

Re: Custom Buttons

Andrey_Krropotkin
К сожалению, у меня эта кнопка совсем не работает. Может я не те файлы поставил на 66?
Сам Custom Buttons custom_buttons-0.0.7.0.0.3-fx-paxmod.xpi ---https://forum.mozilla-russia.org/viewtopic.php?pid=767960#p767960
config.js от туда же.
Может надо было custom_buttons-0.0.7.0.0.3-fx-bootstrap.xpi и bootstrap-loader.js  ?
Как надо сделать?
Но остальные кнопки у меня работают прекрасно из FF 63.03:

скрытый текст
Адрес строка Not Javascript
Видео в PotPlayer
ПАРОЛИ
Перевод
Экспорт СВ в HTML файл
BBCode
find bar
Image Uploader+close-tab
Мультирежим
Proxy
Reload userChrome
Save snapshot to html
Save+ +
storage
Tools
Undo Close Tab

Отсутствует

 

№1317826-03-2019 07:40:18

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 476
UA: unknown 0.0

Re: Custom Buttons

rubelа что конкретно не работает? В меню пункты появляются? Этот код мало, чем отличается от предыдущего.

Отсутствует

 

№1317926-03-2019 07:57:52

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 66.0

Re: Custom Buttons

Andrey_Krropotkin
Пункты в меню не появляются, и сама иконка кнопки блеклая серая.

Отсутствует

 

№1318026-03-2019 08:27:56

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 476
UA: Firefox 66.0

Re: Custom Buttons

rubel когда ключ Яндекс в 5 строчке удалял прихватил и кавычки в конце, сейчас подправил.

Нашел ключи для Яндекс в дополнении Translation Comparison, не проверял, может быть и рабочие:

скрытый текст
trnsl.1.1.20170531T164052Z.ccd7b208874da7ac.48834af162817eacfc5c2bd4c0c552d245c15d4c
trnsl.1.1.20170531T164120Z.57e9764369279ca0.2a07c3f1cc980dab3c31eb4d00e5a85d78cfd50d
trnsl.1.1.20170531T164206Z.42984e20fd20e508.8477a9e98a16402a6617cae4c29745e40797d870
trnsl.1.1.20170531T164243Z.d1c8404173919cdb.cc877c3109e0c01b20455452007962a387f81395
trnsl.1.1.20170531T165002Z.9b75ff18d1ee50df.05f596a4da4502e081521376cec23c57a5d8f65d
trnsl.1.1.20170531T165100Z.16b37639423e81af.f5640f09857a869e45b941876ae7e5cc8d87d2f4
trnsl.1.1.20170531T165038Z.75ae1664f1cdd27b.2a46f16d4cdc7eea3ea8edb49c3d28de107aa414
trnsl.1.1.20170531T165200Z.1b573cfc8f0ffc31.9300640b379bd65c2bf0d8d2831122f89f13340c
trnsl.1.1.20170531T170633Z.e484857bfdbe5602.24c520106cac943b689379bcbcca5e5eae17b33f
trnsl.1.1.20170531T170650Z.1352c66eefea1e6a.dd53d66d2aaa4b4e2bfebf067382f0855d1a1b6d
trnsl.1.1.20170531T170709Z.182e3ee8c23a7a1d.c929b0f14b17ba98249fef6e2db905f592ac3c2e
trnsl.1.1.20170531T170725Z.1162db22c4cbc4b9.edf78a201e56d04decf522a8d400a057ab3aaed6

Отредактировано Andrey_Krropotkin (26-03-2019 08:46:46)

Отсутствует

 

№1318126-03-2019 09:16:35

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 66.0

Re: Custom Buttons

Andrey_Krropotkin
Вот теперь все отлично! Спасибо Вам огромное за помощь.:beer:
Ну а ключ для Яндекс  я еще в первую Вашу кнопку получил персональный.

Отсутствует

 

№1318226-03-2019 09:27:03

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 476
UA: Firefox 66.0

Re: Custom Buttons

rubel Ключ для Microsoft который у Вас в предыдущем коде, скоро перестанет работать, так как многие им пользуются.
Для остальных как получить ключ для Яндекс в картинках можно посмотреть на здесь

Отсутствует

 

№1318326-03-2019 10:06:54

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 66.0

Re: Custom Buttons

Andrey_Krropotkin пишет

Ключ для Microsoft который у Вас в предыдущем коде, скоро перестанет работать, так как многие им пользуются.

Если честно, то я почти всегда юзаю  Google переводчик, он мне нравится больше чем все остальные.

Отсутствует

 

№1318428-03-2019 12:30:36

drage2
Забанен
 
Группа: Members
Откуда: Донецк
Зарегистрирован: 23-11-2017
Сообщений: 392
UA: Firefox 66.0

Re: Custom Buttons

Кнопку "открыть папку профиля" для FF 66 ? Старая не пашет...

Отредактировано drage2 (28-03-2019 13:18:10)

Отсутствует

 

№1318528-03-2019 14:16:58

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 476
UA: Firefox 66.0

Re: Custom Buttons

drage2 в секцию код
var file = Components.classes["@mozilla.org/file/directory_service;1"]
                 .getService(Components.interfaces.nsIProperties)
                 .get("ProfD", Components.interfaces.nsIFile);
    file.launch();

Отсутствует

 

№1318628-03-2019 14:35:58

drage2
Забанен
 
Группа: Members
Откуда: Донецк
Зарегистрирован: 23-11-2017
Сообщений: 392
UA: Firefox 66.0

Re: Custom Buttons

Andrey_Krropotkin
Респект! Надоест FF , обращайся, есть Netscape Navigator(Seamonkey2.53) Gecko -56
6kd9kmqf.png

Отредактировано drage2 (28-03-2019 14:38:33)

Отсутствует

 

№1318728-03-2019 15:49:40

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1392
UA: Firefox 52.0

Re: Custom Buttons

Можете поправить кнопку для FF52 и многопроцессорного режима?
Кнопка передает выделенный текст в файловый поисковик (или др. программу), работает на 52. В многопроцессорном режиме не работает.

Про эту кнопку знаю, она работает, но вешает браузер пока не закроешь поисковик. Так не пойдет, бывает нужно несколько поисков подряд открыть.

Портативность пути сохранить желательно, но необязательно.

скрытый текст

Выделить код

Код:

// Получить выделенный текст
var sel = document.commandDispatcher.focusedWindow.getSelection(); // из страницы
if ( sel.isCollapsed ) {    
     var el = document.commandDispatcher.focusedElement;    // из текстового поля
     if ( el && el.textLength )
          sel = el.value.substring(el.selectionStart, el.selectionEnd);  
     }
if ( sel.anchorNode && sel.anchorNode.parentNode.tagName == 'PRE' ) {  // из 'PRE'
     var sel = sel.focusNode.data.substring(sel.anchorOffset, sel.focusOffset); 
     }          
if ( sel == '') {                                   // если выделенного текста нет
     Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
     .showAlertNotification(self.image, self.label, "Выделите или скопируйте текст!", false, "", null, "");
     return;
     }

// Запустить программу из папки профиля
var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
file.initWithPath(file.path + "\\Soft\\Everything.exe");
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(file);
process.runw(false, ["/s", sel], 2);           // с параметром и передать полученное значение

Отсутствует

 

№1318829-03-2019 03:19:45

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 388
UA: Firefox 60.0

Re: Custom Buttons

Как изменять ширину вкладок (табов) в зависимости от их количества? Чем больше вкладок, тем меньше их ширина.
Есть ли работающий код [CB] или стиль userChrome.css? Расширение TabMix у меня НЕ установлено (оно мне не нужно).
Дано: панель вкладок сверху, она может быть в одну/несколько строк. Браузер: Basilisk 2019.02.11.
Надо: ширину табов к примеру от 350 до 50 пикселей, ширина уменьшается в зависимости от количества открытых вкладок.
При переполнении табов появляется следующая строка панели вкладок - это у меня есть и работает в CSS-стиле.

сделал код [CB], но есть баг: при открытии последней вкладки мелькает вторая строка панели вкладок, затем ширина табов уменьшается и 2 строка пропадает.

Выделить код

Код:

function TabCollapsed() {
    try { window.clearTimeout(TabCollapsed.timeout) } catch(e) {};
    TabCollapsed.timeout = window.setTimeout(()=> {
        var tabbrowser = document.getElementById('tabbrowser-tabs');
        var Tabs = gBrowser.tabs.length;
        const maxTabs = 16, maxTabWidth = 320;
        Tabs = Math.min(Tabs, maxTabs); // возвращает минимальное число из группы чисел
        document.getElementById("TabsToolbar").collapsed = (Tabs == 1);
        if ( Tabs == 1 ) return;
        var tabWidth = Math.min(( tabbrowser.clientWidth - (48 + maxTabs) ) / Tabs, maxTabWidth); // подгон ширины
        custombuttons.setPrefs('browser.tabs.tabMaxWidth', tabWidth);
        custombuttons.setPrefs('browser.tabs.tabMinWidth', tabWidth);
    }, 50);
};
addEventListener("TabOpen", function() {TabCollapsed(true)}, false, gBrowser.tabContainer);
addEventListener("TabClose", function() {TabCollapsed(false)}, false, gBrowser.tabContainer);
setTimeout(function() TabCollapsed(false), 1000); // старт браузера

Отредактировано Dobrov (29-03-2019 03:23:42)

Отсутствует

 

№1318929-03-2019 11:15:44

drage2
Забанен
 
Группа: Members
Откуда: Донецк
Зарегистрирован: 23-11-2017
Сообщений: 392
UA: Firefox 66.0

Re: Custom Buttons

Dobrov

Dobrov пишет

Браузер: Basilisk 2019.02.11

Думаешь , кто-то экспериментировать будет с этим "Вазелином"? Код заложен в любом FF , вкладки уменьшаются сами , можно и максимум и минимум назначить стилем..

.tabbrowser-tab[fadein]:not([pinned]) {min-width: ...px !important;}
.tabbrowser-tab[fadein]:not([pinned]) {max-width: ...px !important;}

Отредактировано drage2 (29-03-2019 16:12:39)

Отсутствует

 

№1319001-04-2019 14:31:29

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

приветствую
Save( Firefox 24 + ) от 07.03.2017 https://forum.mozilla-russia.org/viewto … 40#p493040
как в этой кнопке прописать свой редактор? ("Открыть выделенный текст в внешнем редакторе, в контекстном меню")

Отредактировано firepox (01-04-2019 14:33:40)

Отсутствует

 

№1319101-04-2019 14:35:41

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 60.0

Re: Custom Buttons

firepox пишет

приветствую
Save( Firefox 24 + ) от 07.03.2017 https://forum.mozilla-russia.org/viewto … 40#p493040
как в этой кнопке прописать свой редактор? ("Открыть выделенный текст в внешнем редакторе, в контекстном меню")

Не надо в кнопке прописывать. Просто измени для windows редактор по умолчанию на нужный.

Отсутствует

 

№1319201-04-2019 16:01:16

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

Пожалуйста, помогите с иконкой.
Использую эту кнопку - Запуск программы( Firefox24+ ) от 28.01.2017. https://forum.mozilla-russia.org/viewto … 81#p708281
вместо EXE файла указываю CMD все работает, но хотелось бы иконку менять.
иконка не применяется, если вставлять (см. скрин)
tkJdTeK.png

спасибо!

Добавлено 01-04-2019 16:29:36

bunda1 пишет

Просто измени для windows редактор по умолчанию на нужный.

для TXT по умолчанию akelpad
менял на блокнот, ничего не происходит при Открыть в внешнем редакторе

Отредактировано firepox (01-04-2019 16:29:36)

Отсутствует

 

№1319301-04-2019 21:32:02

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 60.0

Re: Custom Buttons

firepox пишет

Пожалуйста, помогите с иконкой.
Использую эту кнопку - Запуск программы( Firefox24+ ) от 28.01.2017. https://forum.mozilla-russia.org/viewto … 81#p708281
вместо EXE файла указываю CMD все работает, но хотелось бы иконку менять.
иконка не применяется, если вставлять (см. скрин

Удали в инициализации:

Выделить код

Код:

document.getAnonymousNodes(self)[0].src = "moz-icon://file://" + path;

Добавлено 01-04-2019 21:37:42

firepox пишет

для TXT по умолчанию akelpad
менял на блокнот, ничего не происходит при Открыть в внешнем редакторе

Странно, у меня как раз в блокноте отрывется. А что просходит эсли просто сохранить TXT на диск и потом открыть двойным кликом?

Отредактировано bunda1 (01-04-2019 21:37:42)

Отсутствует

 

№1319401-04-2019 23:27:42

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

bunda1 пишет

Удали в инициализации:

спасибо!

bunda1 пишет

А что просходит эсли просто сохранить TXT на диск и потом открыть двойным кликом?

скрытый текст
XOj9ImY.gif

Редактор здесь - C:\Program Files\AkelPadmax_port\AkelPad.exe

Отредактировано firepox (01-04-2019 23:31:30)

Отсутствует

 

№1319502-04-2019 10:31:40

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 60.0

Re: Custom Buttons

Нет, нет, я другое спрашивал - что просходит эсли просто сохранить TXT на диск и потом открыть двойным кликом, через windows?

Отсутствует

 

№1319602-04-2019 11:03:27

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

firepox пишет

Нет, нет, я другое спрашивал - что просходит эсли просто сохранить TXT на диск и потом открыть двойным кликом, через windows?

выделяю текст - Сохранить выделенный текст в файл - на Рабочем столе появляется Save - 02.04.2019.txt - кликаю 2 раза - открывается в C:\Program Files\AkelPadmax_port\AkelPad.exe

windows 10 x64

Добавлено 02-04-2019 11:07:03
использую firefox 56.0.2 портативную
запускаю так:
start "" firefox\firefox.exe -no-remote -profile "%~dp0firefoxprofile" %*

Добавлено 02-04-2019 11:11:16
Было бы идеально, если в кнопку Save( Firefox 24 + ) от 07.03.2017 добавить возможность указать редактор - нажимаем СКМ - появляется окно с выбором EXE файла, как в  Запуск программы( Firefox24+ ) от 28.01.2017

Добавлено 02-04-2019 11:31:10
создал чистый профиль - установил только custombuttons и кнопку = ничего не происходит при нажатии  Открыть в внешнем редакторе

Отредактировано firepox (02-04-2019 11:31:10)

Отсутствует

 

№1319703-04-2019 21:54:06

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 60.0

Re: Custom Buttons

firepox
Пробовал, но у меня не получается открыть текст в windows блокноте из кнопки, а только в блокноте по умолчанию :(

Отсутствует

 

№1319805-04-2019 22:37:49

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

bunda1 пишет

Пробовал, но у меня не получается открыть текст в windows блокноте из кнопки, а только в блокноте по умолчанию :(

спасибо! Варианта "Сохранить выделенный текст в файл" и нажатие всплывающего алерта решает проблему.

Отсутствует

 

№1319905-04-2019 22:58:14

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 319
UA: Firefox 50.0

Re: Custom Buttons

Обратил внимание что в последнее время гуглтранслит в FF теперь переводит не все страницы.
Это проблема гугла или кода?
например не переводит эту
https://discourse.mcneel.com/t/script-to-rotate-objects-90-degrees-around-their-center/8231/23
Гугл хром переводит ее без проблем

Инициализация

скрытый текст

Выделить код

Код:

//присваиваем атрибуты
var gButt = document.getElementById("gd12gtbutton");
gButt.setAttribute("context", "event.stopPropagation()");
gButt.setAttribute("onclick", "event.stopPropagation(); gButtClick(event);");

//подсказка для кнопки
gButt.setAttribute("tooltiptext", "L = Перевести страницу / выделенный текст \nM = Перевести текст из буфера обмена \nR = Заменить текст переводом");

//Объявляем 'clipboard' .................................................................
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);

//обрабатывать клики на кнопке..............
gButtClick = function(event)
    {
        //левым кликом на кнопке
        if ( event.button ==0)
          {
        t = document. commandDispatcher. focusedWindow. getSelection (). toString ();
        if (t.length > 0)
        {
        //отключать реакцию по умолчанию на левый клик
        event.preventDefault();
        event.stopPropagation();
        //...
        var x = gBrowser.mCurrentTab._tPos +1; 
        //Перевести текст в google
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab("http://translate.google.com/translate_t?hl=ru#auto|ru|"+t), x);
        }
        else
        {
        //Перевести страницу в google
        gd12.gdButton.clickHandler();
        }
          }
        //средним кликом на кнопке..
        else if ( event.button ==1)
        {
        //Перевести текст в google из буфера обмена
        var x = gBrowser.mCurrentTab._tPos +1; 
        var t = readFromClipboard()
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab("http://translate.google.com/translate_t?hl=ru#auto|ru|"+t), x);
        }
        //правым кликом на кнопке...
        else if ( event.button ==2)
        {
        //отключать реакцию по умолчанию на правый клик
        event.preventDefault();
        event.stopPropagation();
        //Заменить текст переводом(google)
        var doc = getBrowser (). contentDocument;
        sel = doc. defaultView. getSelection ();
        
        var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
        converter.charset = "UTF-8";
        str = converter.ConvertFromUnicode(sel);
        str = escape(str + converter.Finish());
        
        var url='http://translate.google.ru/?q='+sel+"&hl=ru"+"&langpair=auto|ru&tbb=1"
        xmlhttp = new XMLHttpRequest()
        xmlhttp.open('GET',url, true);
        xmlhttp.onreadystatechange = function()
        {     
            if (xmlhttp.readyState != 4) return  
            if (xmlhttp.status == 200) 
            {
                var div_ = doc. createElement ('div');
                div_.innerHTML =xmlhttp.responseText
                var TBODY_= div_.getElementsByClassName ("almost_half_cell")[0]
                var TBODY_=TBODY_. getElementsByTagName ("span") [0].textContent;
                var range = content.getSelection().getRangeAt(0);
                        var ht=range.cloneContents();
                        range.deleteContents();
                        ht.textContent=TBODY_
                        range.insertNode(ht);
            }
        }
        xmlhttp.send(null);
        }         
     };

Отредактировано leex (05-04-2019 23:05:01)

Отсутствует

 

№1320007-04-2019 13:38:40

vitalii201
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 675
UA: Firefox 66.0

Re: Custom Buttons

Перестала работать кнопка "количество закладок":

Bookmark Count

Выделить код

Код:

with(Components.classes["@mozilla.org/browser/nav-history-service;1"]
    .getService(Components.interfaces.nsPIPlacesDatabase)
    .DBConnection.mozIStorageConnection
    .createStatement('SELECT count(fk) FROM moz_bookmarks')
    )
    {

    step();
    bkmcnt=getInt32(0);
    finalize();
    }
    var name = "Number of Bookmarks = "; 
         cbu.gClipboard.write(name + bkmcnt);
alert("The total number of bookmarks = "+bkmcnt) ;


Можно исправить?

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]