Toggle Find+ ( Firefox 24+ )
Авторы: bunda1, Dumby, iDev.Pi, за помощь с кнопкой спасибо mserv и Infocatcher.
Версия: от 20.06.2016.
Описание: кнопка сильно изменяет стандартную панель поиска по странице и добавляет дополнительные возможности для поиска по странице:

Настройки кнопки в меню кнопки:
http://i64.fastpic.ru/big/2014/0513/db/e3dc7df0a721557e6140fc1cc92bdddb.jpg
Автоматически закрывает панель поиска через установленное время, если это включено в настройках кнопки, время можно изменить в настройках кнопки.


Если в настройках кнопки включено автовыделение автоматически на всех страницах выделяет заранее введенный текст или текст из поля вода на панели поиска, если это включена в настройках кнопки автоматически выделяет ссылки на страницах если адресс ссылки содержит текст для автовыделение. Можно менять цвет автовыделения в настройках кнопки. При наведении курсором на кнопку в сплывающей подсказке(тултипе) отображается текст для автовыделение вместе с подсказкой по кнопке:
http://i63.fastpic.ru/big/2014/0528/f3/73fd1c4e428b659650243ea26cad27f3.jpg


Показывает количество найденных совпадений на панели поиска.
Минимизирует панель поиска по странице,  мини панель поиска можно разместить разных углах браузера поверх страницы.
Добавляет кнопку "Вставить и искать" на панель поиска, ЛКМ на которой запускает поиск выделенный текст или текста из буфера обмена по странице, а ПКМ очищает поле текстового ввода на панели поиска.
Добавляет кнопку "Поиск" на мини панели поиска, ЛКМ и ПКМ на которой соответственно запускает поиск текста из поля текстового ввода панели поиска верх-вниз по странице, кнопка "Поиск" замещает стандартные кнопки панели поиска Далее и Назад:
http://i62.fastpic.ru/big/2014/0528/fb/cf343e4782e1173e07f7adb3cbb6d1fb.jpg http://i62.fastpic.ru/big/2014/0528/d4/f558e9ff3c35c029e21d4ed1dba836d4.jpg http://i61.fastpic.ru/big/2014/0528/e4/15553587206acd3aa104c0cdd15627e4.jpg http://i62.fastpic.ru/big/2014/0528/6c/b3d8e2a5e79b90509e9e034d79fa446c.jpg


Добавляет в контекстное меню выделенного текста дополнительные пункты, если это включено в настройках кнопки:
http://i63.fastpic.ru/big/2014/0513/c7/0ef2665210ed57840803bc2f14bff0c7.jpg


Клики на кнопке:
ЛКМ => Показать - скрыть поиск по странице,
СКМ => Поиск по странице из буфера обмена,
ПКМ => Mеню кнопки с настройками,
Двойной ПКМ или Ctrl + ПКМ или Snift + ПКМ => Стандартное меню кнопки.


Сочетания клавиш добавляемые кнопкой:
Ctrl + F(а) => Показать - скрыть поиск по странице,
Ctrl + ALT+ F(а) => Поиск по странице из буфера обмена,
Ctrl + ALT+ H(р) => Добавить текст(выделенный / из буфера обмена) для автовыделения текста,
CTRL + SHIFT + F(а) => Oткрыть панель поиска по странице с чистой поисковой формой или очистить поисковую форму если панель уже открыт.


Управление панелью поиска мышью:
Двойной ЛКМ на панели поиска или двойной ПКМ на поле текстового ввода панели поиска включает - отключает обычную подсветку(Подсветить все) на странице всех найденных совпадений с поисковым запросом или включает - отключает автовыделение если это включено в настройках кнопки.
Двойной СКМ на странице открывает-закрывает панель поиска, если это включено в настройках кнопки.
ЛКМ на надписи 'Найти' на панели поиска запускает поиск, а ПКМ очищает поле текстового ввода на панели поиска, если это FF17-24.
ЛКМ + ПКМ на поле текстового ввода панели поиска очищает поле текстового ввода.
СКМ на панели поиска запускает поиск по странице из буфера обмена.
Прокрутка колёсиком мыши вверх-вниз на панели поиска соответственно запускает поиск по странице.

Код инициализации кнопки Toggle Find+:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .............
this.onclick =e=> {

   if ( e.button == 0 )
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
          
   if ( e.button == 1 ) { 
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        goDoCommand("cmd_paste");
        };
     
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
        e.preventDefault();  
        menu.showPopup( this, -1, -1, "popup", "bottomleft", "topleft");
        }
};


// Настройки и переменные для кнопки ............. 
var findbarRight = 18;             // отступ справа у мини панели поиска
var addKeyboardShortcuts = true;   // разрешить дополнительные сочетания клавиш для панели поиска
var finder = (gBrowser.finder || gFindBar);
var lighted = (finder._highlightDoc || finder._highlight || finder.highlight).bind(finder);
var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);



// Проверить наличие строк в about:config и создать если не существует .............
if ( cbu.getPrefs("FindBar.version") != '15') {
   ["FindBar.top","FindBar.mini","FindBar.right","FindBar.auto_Close","FindBar.autoclear","FindBar.Highlight",
    "FindBar.Highlight.Link","FindBar.pasteButton","FindBar.contextFindWords","FindBar.ToggleWithDoubleMiddleClick",
    "FindBar.Autohighlight.ToggleWithDoubleClick","FindBar.auto_Find"].forEach(pref=> cbu.setPrefs(pref, false) );
     
    ["FindBar.version,15", "FindBar.CloseTimer,7", "ui.textHighlightBackground,#ef0fff", "FindBar.Highlight.value,"]
    .forEach(pref=> cbu.setPrefs(pref.split(",")[0], pref.split(",")[1]) );     
};


// Подсказка для кнопки .............
this.onmouseover =()=> {
   // получить и обрезать подсказку для автовыделение ....
   var val = gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data;
   var value = val.substring(0,50) + ( (val.length > 50) ? '....' : "" );
                    
   this.tooltipText = "Поиск по странице \nЛ:    Показать - скрыть поиск по странице \nС:    Поиск по странице из буфера обмена\
                     \nП:    Mеню кнопки \nДП: CB меню \n\nАвтовыделение: " + value;                                                    
};


// Создать меню с настройками для кнопки .............
var array = [
  { label: 'Автоматически закрыть', value: 'FindBar.auto_Close', func: autoClose, cek:''},
  { label: 'Закрыть через: |7| секунд', value: 'FindBar.CloseTimer', change:''},
  { separator: '' },
  { label: 'FindBar мини', value: 'FindBar.mini', func: toggleAttribute, cek:''},
  { label: 'FindBar сверху', value: 'FindBar.top', func: toggleAttribute, cek:''},
  { label: 'FindBar справа', value: 'FindBar.right', func: toggleAttribute, cek:''},
  { label: 'Кнопка "Вставить и искать" на FindBar', value: 'FindBar.pasteButton', func: toggleAttribute, cek:''},
  { separator: '' },
  { label: 'Find в контекстном меню', value: 'FindBar.contextFindWords', cek:''},
  { label: 'Запуск поиска выделением текста', value: 'FindBar.auto_Find', cek:''},
  { label: 'Быстрый поиск по мере набора текста', value: 'accessibility.typeaheadfind', cek:''},
  { label: 'Открыть панель поиска с поиском по старому запросу', value: 'FindBar.autoclear', cek:''},  
  { label: 'Переключать FindBar двойным средним кликом на странице', value: 'FindBar.ToggleWithDoubleMiddleClick', cek:''},
  { label: 'Переключать aвтовыделение двойным кликом на панели поиска', value: 'FindBar.Autohighlight.ToggleWithDoubleClick', cek:''},
  { separator: '' },
  { label: 'Автовыделение', value: 'FindBar.Highlight', func: toggleAttribute, cek:''},
  { label: 'Автовыделение в ссылках', value: 'FindBar.Highlight.Link', func: Highlight, cek:''},
  { label: 'Добавить текст для автовыделения', value: 'add', func: toggleHighlightValue },
  { label: 'Сбросить текст для автовыделения', value: 'clear', func: toggleHighlightValue },
  { label: 'Изменить цвет: |#ef0fff| для автовыделения', value: 'ui.textHighlightBackground', change:''}
            ];

var menu = self.appendChild( document.createElement("menupopup") );
array.forEach(m=> {
     if ( "separator" in m ) { menu.appendChild( document.createElement("menuseparator") ); return };
     if ( "value" in m ) var p = cbu.getPrefs( m.value );   
     var mItem = document.createElement("menuitem"), arr = m.label.split("|");    
     mItem.setAttribute("label", ("change" in m) ? (arr[0] + p + arr[2]) : m.label );     
     if ( "cek" in m ) { 
          mItem.setAttribute('type', 'checkbox');
          mItem.setAttribute('checked', p );
          mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');                                                      
          }              
     if ( "change" in m ) {
          mItem.addEventListener("command", e=> {
             var val = custombuttons.promptBox(this.label, 'Отмена вернёт значение по умолчанию');
             var pref = val[0] ? val[1] : arr[1];
             cbu.setPrefs( m.value, pref );
             this.label = arr[0] + pref + arr[2];
          }, false);
          };
     if ( "func" in m ) mItem.addEventListener("command", e=> { m.func(m.value) }, false);

     menu.appendChild(mItem);
});
menu.setAttribute("onclick", "event.stopPropagation()");


// Установить и удалить разные атрибуты для панели поиска .............
function toggleAttribute(s) {
  if ( s == "FindBar.Highlight" ) { gFindBar.getElement('highlight').removeAttribute("checked"); Highlight(); return };
  
  var atrr = s.substring(8);
  setTimeout(()=> { cbu.getPrefs(s) ? gFindBar.setAttribute(atrr, "true") : gFindBar.removeAttribute(atrr) }, 0);
  if ( s !== "FindBar.mini" ) return;      
  if ( cbu.getPrefs(s) ) {       
       if ( gFindBar.getElement('highlight').hasAttribute("checked") ) {
            gFindBar._findField.style.color = cbu.getPrefs("ui.textHighlightBackground");
            }    
       }     
  else
       {
       if ( !!gFindBar._findField.style.color ) {
            gFindBar.getElement('highlight').setAttribute("checked", "true");
            gFindBar._findField.removeAttribute("style");
            }
       }        
};
["FindBar.top", "FindBar.mini", "FindBar.right", "FindBar.pasteButton"].forEach(s=> toggleAttribute(s));


// Установить нужную иконку кнопки при старте браузера или при изменениях настроек автовыделения .............
var s = "FindBar.Highlight";
function toggleImage() {
   self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon").
   src = cbu.getPrefs(s)
   ? "data:image/x-icon;base64,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"
   : "data:image/x-icon;base64,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";  
};
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );


// Удалить оргинальный панель поиска и создать новый с дополнительными возможностями .............
delete window.gFindBar;
window.gFindBar = document.getElementById("FindToolbar");
if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) {
     var version = parseInt(Services.appinfo.version);
     if ( version > 25 )                                // удалить на FF25+
          for( var tab of gBrowser.tabs ) {
          if ( !tab._findBar ) continue;
          tab._findBar.parentNode.removeChild( tab._findBar );    
          delete tab._findBar;
          }
     else document.getElementById("browser-bottombox")  // удалить на FF17-24
          .removeChild( document.getElementById("FindToolbar") );  
     
     if ( version > 38 ) {                              // исправить глюк на FF38+
          setTimeout(()=> {
             eval("gFindBar.startFind = " + gFindBar.startFind.toString()
             .replace('this.browser.finder.getInitialSelection();',
             'this.onCurrentSelection(gBrowser.finder.getActiveSelectionText(), false)'));
             
             var {Finder} = Cu.import("resource://gre/modules/Finder.jsm");
             eval("Finder.prototype.getActiveSelectionText = " + Finder.prototype
             .getActiveSelectionText.toString().replace('.replace', '; //'));          
          }, 3000);
          }        

     gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
     gFindBar.setAttribute("browserid", "content");
     version < 25 && gFindBar.setAttribute("oldFindBar", "true");       
     gFindBar.id = "FindToolbar";
     gFindBar.clientTop;
     delete window.gFindBarInitialized;
     window.gFindBarInitialized = true;

     gFindBar._selectionMaxLen = 1000;             // лимит символов для поиска и подсветки
     gFindBar._quickFindTimeoutLength = 4500;      // время закрытия панели поиска эсли тот открыт по мере набора текста
     };
if ( gFindBar instanceof Ci.nsIDOMEventListener )  // добавить поиск по мере набора текста
     addEventListener("keypress", gFindBar)
     function onBrowserKeypress(msg) {msg.target == gBrowser.selectedBrowser && gFindBar._onBrowserKeypress(msg.data);}
     messageManager.addMessageListener("Findbar:Keypress", onBrowserKeypress);
     addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onBrowserKeypress));


// Показать количество совпадений на панели поиска, автор кода 'Dumby' .............
var curHit, allHits, lastCurHit;
const fff = gFindBar._findField,
      lab = fff.parentNode.insertBefore( document.createElement("label"), fff ),
      nrm = Ci.nsISelectionController.SELECTION_NORMAL;
      lab.id = "hits";
addDestructor(()=> fff.parentNode.removeChild(lab) );

function updateHits(arg) {
   if ( gFindBar.hidden ) return;
   var win = arg instanceof Ci.nsIDOMWindow && arg || content;
   var finder = gBrowser.finder || gFindBar;
   if ( win == content ) curHit = allHits = 0;
   var word = fff.value;
   var controller = finder._getSelectionController(win);
   var doc = win.document;
   
   if ( word && controller && doc && doc.documentElement ) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var nsIFind = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);        
        nsIFind.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = nsIFind.Find(word, searchRange, startPt, endPt))) {
               allHits++;
               if ( !curHit) {
                    var sel = controller.getSelection(nrm), range;
                    if ( sel.toString() ) range = sel.getRangeAt(0);
                    else {
                         var editableNode = finder._getEditableNode(retRange.startContainer);
                         if ( editableNode ) sel = editableNode.editor.selectionController.getSelection(nrm);
                         if ( sel.toString() ) range = sel.getRangeAt(0);
                         }
                    var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                               .every(function(prop) range[prop] == retRange[prop]);
                    if ( comp ) curHit = allHits;
                    }
               startPt = retRange.cloneRange();
               startPt.collapse(false);
               }
        Array.forEach(win.frames, frame=> updateHits(frame));
       }
    if ( win != content ) return;
    lab.value = curHit + "/" + allHits;
    
    if ( fff.value ) self.lastValueOfFind = fff.value; // запомнить текст для поиска   
    
    // поле текстового ввода красное если ничего не найдено .... 
    allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status");

    // поле текстового ввода мигает желтим если переход с низа наверх страницы и наоборот ....
    if ( !!arg && arg == "flash" && allHits > 2 && (allHits/curHit * allHits/lastCurHit == allHits) ) {         
         fff.setAttribute("flash", true );
         setTimeout(()=> fff.removeAttribute("flash"), 600);
         }
    lastCurHit = curHit;   
};
updateHits();


// FindBar, поиск колесиком мыши .............
addEventListener('DOMMouseScroll', e=> { gFindBar.onFindAgainCommand(e.detail < 0); updateHits("flash") }, false, gFindBar);


// Отслеживать клики на панели поиска .............
addEventListener("mousedown", e=> {

   if ( e.button == 1 ) {  // поиск из буфера обмена
        e.preventDefault();
        var str = (gClipboard.read()).replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста
        gFindBar._findField.value = str;
        Highlight("hits", "greenLight");
        }   
   
   var targ = e.originalTarget
   if ( !targ.hasAttribute("anonid") ) return; 
   
   if ( targ.value == 'Найти:') { // кнопка 'Найти:'
        e.button ? clearFindField() : gFindBar.onFindAgainCommand(false);  
        updateHits("flash");
        }

   if ( targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous
        setTimeout(updateHits, 0, "flash");
        }         
   
}, false, gFindBar); 


// Двойной клик на панели поиска включает и выключает автовыделение или стандартную подсветку текста ............. 
addEventListener("dblclick", e=> {
   
   if ( e.originalTarget.nodeName == 'div' && e.button == 0 ) return;
   if ( /:label|button|check/.test( e.originalTarget.nodeName ) ) return; 

   if ( cbu.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick") ) {       
        var s = cbu.getPrefs("FindBar.Highlight");
        cbu.setPrefs("FindBar.Highlight", !s );
        
        menu.childNodes[16].setAttribute("checked", !s);    
        gFindBar.getElement('highlight').removeAttribute("checked"); 

        Highlight(); 
        }             
   else  
        {
        if ( cbu.getPrefs("FindBar.Highlight") ) return;         
        gFindBar.getElement("highlight").click(); 
        gFindBar._findField.style.color = (gFindBar._findField.style.color || !gFindBar.hasAttribute('mini')) 
        ? "" : cbu.getPrefs("ui.textHighlightBackground");            
        };
   
   // закрыть контекстное меню поисковой формы ....
   var hbox = gFindBar._findField.mInputField.parentNode;
   setTimeout(()=> document.getAnonymousElementByAttribute(hbox, "class", "textbox-contextmenu").hidePopup(), 20);     
                        
   window.content.focus(); 
}, false, gFindBar);


// ЛКМ + ПКМ на поле текстового ввода очищают его .............
function clickToClear(e) { 
   if ( e.type == "mousedown" ) {
        if ( e.button == 0 ) this.leftButtonDown = true;
        if ( e.button == 2 && this.leftButtonDown ) {
             this.leftButtonDown = false;
             this.stopMenu = true; 
             setTimeout(()=> { clearFindField() }, 0); 
             }
       }

   if ( e.type == "click" ) {
        if ( e.button == 0 ) this.leftButtonDown = false;
        if ( e.button == 2 && this.stopMenu ) {
             e.preventDefault();
             e.stopPropagation();
             this.stopMenu = false; 
             }
        }     
};
["mousedown", "click"].forEach(type=> addEventListener(type, clickToClear, false, gFindBar._findField) );


// Запускать поиск выделением текста если это разрешено в 'about:config' .............
function autoFind(e) {
   if ( e.button != 0 ) return;
   if ( !cbu.getPrefs("FindBar.auto_Find") ) return;
   if ( /input|password|textarea|textbox|searchbar|findbar|tabbrowser/.test(e.target.localName) ) return;

   if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection();
   
   if ( e.type == 'mouseup' ) {   
        var selection = getBrowserSelection();
        if ( selection && selection !== lastSelection ) {
             setTimeout(()=> {  
                gFindBar.onFindCommand();                      
                updateHits();
                lab.value == "0/0" ? Highlight() : Highlight("", "greenLight")
             }, 50);
             }   
        }
};
addEventListener("mouseup", autoFind, false, gBrowser);
addEventListener("mousedown", autoFind, false, gBrowser);


// Автоматически закрывать панель поиска, если это разрешено в 'about:config' .............       
function autoClose() {
  window.clearTimeout(self.closeTimer);
  try { autoClose.removeListener() } catch(e) {};
  
  function closeFind(e) { 
     if ( e !== 'timer' && e.target.nodeName == 'findbar') { 
          window.clearTimeout( self.closeTimer ); 
          autoClose.run = true;         
          }               
     else if ( e == 'timer' || autoClose.run && !gFindBar._findField.getAttribute("focused") ) {    
               self.closeTimer = setTimeout(()=> {          
                  gFindBar.close();                  
               }, cbu.getPrefs("FindBar.CloseTimer") + '000');               
               autoClose.run = false;               
               }
  }
  
  if ( cbu.getPrefs("FindBar.auto_Close") && !gFindBar.hidden ) { 
       closeFind('timer');       
       addEventListener('mouseover', closeFind, false, window);       
       autoClose.removeListener =()=> { removeEventListener('mouseover', closeFind, false, window) };  
       } 
};


// Переключать панель поиска двойным средним кликом на странице .............
addEventListener("mouseup", e=> {
  if ( e.button != 1 ) return;
  if ( !cbu.getPrefs("FindBar.ToggleWithDoubleMiddleClick") ) return;
       
       if ( self.flag ) { 
            gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
            Highlight("hits", "greenLight");
            gFindBar._findField.focus();
            };
            
       self.flag = true;
       
       setTimeout(()=> { self.flag = false }, 600);
}, false, gBrowser);


// Сочетания клавиш для управление поиском на странице .............
addEventListener('keydown', e=> {
  if ( content.location.href == 'chrome://browser/content/places/places.xul' ) return;
  
  // Ctrl+snift+g и F3, запуск подсчета совпадений ....
  if ( e.keyCode == 114 || ((!e.altKey) && ((e.ctrlKey) || (e.shiftKey)) && (e.keyCode == 71)) ) {
       gFindBar.hidden || setTimeout(updateHits, 0, "flash");
       }

  // Ctrl+f, показать - скрыть панель поиска ....
  if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       e.stopPropagation();
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
       Highlight("hits", "greenLight");
       gFindBar._findField.focus();
       }
       
  if ( !addKeyboardShortcuts ) return; // дальше дополнительные сочетания клавиш для панели поиска
       
  // Ctrl+alt+f, поиск по странице из буфера обмена ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 70) ) {
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
       goDoCommand("cmd_selectNone");
       goDoCommand("cmd_paste");
       Highlight("hits", "greenLight");
       }
        
  /* Ctrl+snift+f, открыть панель поиска с чистой поисковой формой или очистить поисковую форму или
     открыть панель поиска с предыдущим запросом/выделенным текстом или искать выделенный текст если панель поиска открыт
     если настройках кнопки включена 'Всегда открывать пустую поисковую форму' ....*/
  if ( (e.ctrlKey) && (!e.altKey) && (e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       var val = self.lastValueOfFind ? self.lastValueOfFind : "";
       var sel = document.commandDispatcher.focusedWindow.getSelection().toString();
       if ( sel.length !== 0 ) { val = sel };  
       gFindBar.onFindCommand();
       cbu.getPrefs("FindBar.autoclear") ? setTimeout(()=> { gFindBar._findField.value = val; Highlight("hits", "greenLight"); }, 10) 
                                         : clearFindField();
       }
        
  // Ctrl+alt+h, добавить текст(выделенный / из буфера обмена) для автовыделения ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 72) ) toggleHighlightValue('add');
  
}, false, window);


// Автоматически выделить слова и ссылки .............
function Highlight(hits, green) {

  var findValue = gFindBar._findField.value;
  var hidden = gFindBar.hidden;

  if ( !hidden ) {
       // выделить зеленным искомый текст на странице .... 
       if ( !!green && green == "greenLight") setTimeout(()=> { gFindBar._find() }, 10);  
  
       // для запуска подсчета совпадений ....
       if ( !!hits && hits == "hits" ) setTimeout(updateHits, 20);
       }

  // получаем текст для автовыделения из 'about:config' или из панели поиска ....
  if ( cbu.getPrefs("FindBar.Highlight") ) {
       var value = hidden
       ? gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data 
       : ( findValue.length > 2 ) ? findValue: "";
       } 

  // удалить и запустить подсветку совпадений ....
  lighted(false); if ( !!value ) lighted(true, value);

     
  /* изменить цвет ссылок на страницах если содержат искомое слово,
     если разрешено в 'about:config' и включена автовыделение ....*/
    
    var hLink = cbu.getPrefs("FindBar.Highlight.Link") && value;
    var color = cbu.getPrefs("ui.textHighlightBackground");

    function highlightLinks(win) {
       var doc = win.document, links = doc.links;
       
       if ( (hLink || "prop1" in doc ) && links ) {
             hLink ? doc.prop1 = true : delete doc.prop1;

             Array.forEach(links, link=> {

                if ("prop2" in link) link.style.color = link.prop2;
                if ( hLink && String( link ).indexOf( value ) != -1 ) {
                     link.prop2 = link.style.color;
                     link.style.color = color;
                     }
                else if ("prop2" in link) delete link.prop2;
             });
        }
        for ( var i = 0; i < win.frames.length; i++ ) highlightLinks(win.frames[i]);
    };
    highlightLinks(content);
};

   
// Обработчик следит за загрузкой и переключением вкладки и запускают автовыделение .............
var listener = { 
   onStateChange: function(wpr, req, flag) {
      if ( gBrowser.currentURI.spec == 'chrome://global/content/console.xul') return; 
      if ( flag & Ci.nsIWebProgressListener.STATE_STOP ) Highlight("hits");
   },
      
   onLocationChange: function(wpr, req) {
      if ( wpr.currentURI.spec != "about:blank" && !req && wpr.document.readyState == "complete")
           Highlight("hits");
      gFindBar._findField.removeAttribute("style");
      gFindBar.getElement('highlight').removeAttribute("checked");           
   }       
};
gBrowser.addProgressListener(listener);
addDestructor(()=>  gBrowser.removeProgressListener(listener) );


// Обработчики следят за панелью поиска, запускают автовыделение и другие функции .............
addEventListener("drop", e=> { Highlight("hits", "greenLight") }, false, gFindBar._findField);
addEventListener("input", ()=> { Highlight("hits", "greenLight") }, false, gFindBar._findField);
gFindBar.watch("hidden", (prop, oldV, hidden)=> {
   setTimeout(()=> { Highlight("hits", "greenLight"); autoClose() }, 10);
    
   if ( !hidden && cbu.getPrefs("FindBar.autoclear") ) { // открывать без выделенного текста
        document.activeElement.blur();
        try { self.lastValueOfFind } catch(e) { self.lastValueOfFind = '' };
        gFindBar._findField.value = self.lastValueOfFind ? self.lastValueOfFind : '';
        gFindBar._findField.focus();
        }
       
  return hidden;
});


// Добавляем подменю в контекстного меню на странице для выделенного текста .............
((contextMenu, el)=> {
  var menu = document.createElement("menu");      
  menu.setAttribute("label", "Find");  
  contextMenu.insertBefore(menu, el); 
  addEventListener("popupshowing", ()=> {
     menu.hidden = !cbu.getPrefs("FindBar.contextFindWords") || !gContextMenu.isTextSelected; 
  }, false, contextMenu);
  addDestructor(()=> contextMenu.removeChild(menu) );
  
  var array = [
              { label:"Найти на странице", func: findToContex },
              { label:"Выделить текст на странице", func: highlightSel },
              { label:"Автовыделение, добавить текст", func: addSel }
              ];
  var menuPopup = menu.appendChild( document.createElement("menupopup") );              
  array.forEach(m=> {  
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.func = m.func;
       menuPopup.appendChild( mItem );
  });
  addEventListener("command", e=> { e.target.func() }, false, menu);
  
  function findToContex() {
     gFindBar.onFindCommand();
     Highlight("hits", "greenLight");
  };
        
  function highlightSel() {
     var finder = gBrowser.finder || gFindBar;
     var lighted = (finder._highlightDoc || finder._highlight).bind(finder);
     lighted(false), lighted(true, getSelect() );
     goDoCommand("cmd_selectNone");
  };
        
  function addSel() toggleHighlightValue('add');
   
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-properties"));


// Очистить поле текстового ввода на Findbar .............
function clearFindField() {  
  setTimeout(()=> { 
     gFindBar._findField.value = ''; 
     Highlight("hits");
     gFindBar._findField.focus();
  }, 0)
};       


// Добавить или удалить текст для автовыделения .............
function toggleHighlightValue(arg) { 
  if ( arg == 'clear' ) {
       var str = '', title = self.label, notification = "Текст для автовыделение удален";
       }        
  if ( arg == 'add' && getSelect() ) {
       var str = getSelect(), title = "Автовыделение"; 
       var notification = str.substring(0,50) + ( (str.length > 50) ? '....' : "" );
       if ( cbu.getPrefs("FindBar.Highlight") ) { goDoCommand("cmd_selectNone") };           
       }       
  cbu.setPrefs("FindBar.Highlight.value", convertFromUnicode("UTF-8", str) );
  alertsService.showAlertNotification(self.image, title, notification);     
  Highlight();      
};
  

// Получить выделенный текст из страницы или из буфера обмена, если нет текста получить false .............
function getSelect() {
   var el = document.commandDispatcher.focusedElement;
   try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {};
   var sel = document.commandDispatcher.focusedWindow.getSelection();
   if (sel == '') sel = gClipboard.read();
   if (sel == '') alertsService.showAlertNotification(self.image, self.label, "Выделите или скопируйте текст!");
   return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,"");
};


// Конвертировать текст в юникод .............
function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};


// Запустить поиск через Toggle Find+3 если нажать в главном меню на пункт меню 'Найти' .............
addEventListener("command", ()=> { gFindBar.onFindCommand(); Highlight("hits", "greenLight") }, false, document.getElementById("cmd_find"));


// Создать кнопку "Учесть регистр" на Findbar .............
var check = document.createElement("checkbox");
check.setAttribute("id", "findCheckbox");
check.setAttribute("label", "Учесть регистр");
check.setAttribute("tooltiptext", "Учесть регистр");
check.setAttribute("checked", gFindBar._shouldBeCaseSensitive(""));
gFindBar.getElement("findbar-container").appendChild(check);
addDestructor(()=>  check.parentNode.removeChild(check) );
check.addEventListener("command", ()=> { gFindBar._setCaseSensitivity(this.checked); Highlight("hits", "greenLight") });               


// Создать кнопку "Поиск" на Findbar .............
var search = document.createElement("toolbarbutton");
search.setAttribute("id", "findButton");
search.setAttribute("tooltiptext", "Л: Искать следущее \nС: Поиск текста из буфера \nП: Искать предыдущее");
search.setAttribute("style", "list-style-image: url('chrome://global/skin/icons/Search-glass.png') !important; -moz-image-region: rect(0px, 16px, 16px, 0px);");                             
gFindBar.getElement("findbar-container").appendChild(search);
addDestructor(()=> search.parentNode.removeChild(search) );
search.addEventListener("click", e=> { e.button !== 1 && gFindBar.onFindAgainCommand(!!e.button); updateHits("flash") });


// Создать кнопку "Вставить и искать" на Findbar .............
var paste = document.createElement("toolbarbutton");
paste.setAttribute("id", "pasteButton");
paste.setAttribute("tooltiptext", "Л: Поиск выделенного текста/из буфера \nП: Очистить");
paste.setAttribute("image", "data:image/x-icon;base64,AAABAAEADhAAAAEAIADoAwAAFgAAACgAAAAOAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/ylTda0pU3X/KVN1/ylTdf8pU3X/HTpS/4WFhf/w8PL/8fHz//Hx8//x8fP/8fHz//Hx8/+FhYX/KVN1/yRJaP8jSGf/I0dl/yNHZP8YMEX/j4+P//Hx8//x8vP/8fLz//Hy8//x8vP/8fLz/4+Pj/8pU3X/JUxr/yVLav8kSmn/JElo/xkyR/+cnJz/8vLz//Ly9P/y8vT/8vL0//Ly9P/y8vT/nJyc/ylTdf8nTm3/Jk1t/yVMa/8lSmn/GjNJ/6urq//y8vT/8/P1//Pz9f/z8/X/8/P1//Pz9f+rq6v/KVN1/ydPb/8nTm7/Jk1t/yZMa/8aNEr/srKy//X19v/19vf/9fb3//X29//19vf/9fb3/7Kysv8pU3X/J1Bx/ydQb/8nTm//Jk1t/xs2S/+8vLz/+fr6//r7+//6+/v/ubm5/7e3t/+3t7f/ubm5/ylTdf8oUXP/KFBx/ydQcf8nT2//GzZN/76+vv/6+/v/+/v8//v7/P/ExMT/9vb2/7e3t/na2tpfKVN1/ylTdP8pUXP/KFBy/yhPcP8bN03/v7+///v7/P/7/Pz/+/z8/8rKyv+3t7f/4OLgaQAAAAApU3X/KVN1/yhSdP8oUnT/KFJy/xw4UP+/v7//v7+//7+/v/+/v7//uru7/2OBmf8AAAAAAAAAAClTdf8pU3X/KVN1/ylSdP8pUnT/JEpn/yRIZv8kSGX/I0dk/yNGY/8jRWL/KVN1/wAAAAAAAAAAKVN1/ylTdf8lS2n/IztO/yM7Tv8jO07/IztO/yM7Tv8jO07/JUtp/ydOb/8lS2n/AAAAAAAAAAApU3X/K2GQ/yhahv91dXX/XV1d/11dXf9dXV3/XV1d/4B/f/8oWob/Kmad/ylTdf8AAAAAAAAAAClTda0pU3X/KVN1/7O0tP/h4eD/3t7f/97f3//g4OD/s7S0/ylTdf8pU3X/KVN1rQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1yds1dXFv1XVxb9Wxxdc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUwFASZMCwAlTAsAI00LIys1CxcXFsEYFxbCJS01DAAlTQsAJk0LASZNCwAlTQUAAAAAAAAAAPwArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAASsQQAMrEEADKxBAAysQQAMrEEADKxB8PysQQAMrEE=");
var node = gFindBar.hasAttribute('oldFindBar') ? gFindBar.getElement("find-next") : gFindBar.getElement("highlight");
gFindBar.getElement("findbar-container").insertBefore(paste, node);
addDestructor(()=> paste.parentNode.removeChild(paste) );
paste.addEventListener("click", e=> {
   if ( e.button == 0 ) {
        if ( !getSelect() ) return;
        gFindBar._findField.value = getSelect(); // вставить текст
        Highlight("hits", "greenLight");
        };
   if ( e.button == 2 )        
        setTimeout(()=> clearFindField(), 0); // очистить поле текстового ввода  
}, false);


// Стиль для панели поиска .............
var uri = makeURI('data:text/css,'+ encodeURIComponent('\
#FindToolbar { border-bottom: 1px solid grey !important; }\
#find-field, .findbar-textbox { width: 325px !important; }\
#FindToolbar > .findbar-container > * { display: -moz-box !important; }\
#FindToolbar .findbar-textbox[status="notfound"] { color: white !important; }\
#FindToolbar > hbox > label { -moz-appearance: none !important; font-weight: bold !important; }\
#FindToolbar .findbar-textbox:not([style]):not([status="notfound"]) { color: black !important; }\
\
#FindToolbar .findbar-closebutton,\
#FindToolbar:not([mini]) #findButton,\
#FindToolbar .findbar-container > image,\
#FindToolbar:not([pasteButton]) #pasteButton,\
#FindToolbar .findbar-case-sensitive.tabbable,\
#FindToolbar checkbox[anonid="find-case-sensitive"],\
#FindToolbar .findbar-find-fast.findbar-find-status,\
#FindToolbar .findbar-find-fast[anonid="match-case-status"] {\
   display: none !important; }\
\
/* мини панель поиска ....*/\
#FindToolbar[mini] .findbar-textbox {\
   width: 16em !important;\
   height: 21px !important;\
   padding-right: 20px !important;\
   margin-right: 2px !important;\
   margin-left: -4px !important; }\
#FindToolbar[mini] {\
   position: fixed;\
   padding: 0 !important;\
   background: menu !important;\
   box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;\
   border: 1px solid grey !important; }\
#FindToolbar[mini][top] {\
   border-top: 0 !important;\
   border-radius: 0 0 8px 8px !important; }\
#FindToolbar[mini][right] {\
   right: ' + findbarRight + 'px; }\
#FindToolbar:not([top]) + #content {\
   -moz-box-ordinal-group: 0 !important; }\
#FindToolbar:not([top]) {\
   -moz-box-ordinal-group: 1 !important; }\
#FindToolbar[mini]:not([top]) {\
   border-radius: 8px 8px 0 0 !important;\
   margin-top: -29px !important; }\
\
#FindToolbar[mini] toolbarspacer,\
#FindToolbar[mini] label[class="checkbox-label"],\
#FindToolbar[mini] toolbarbutton.findbar-find-next,\
#FindToolbar[mini] toolbarbutton.findbar-find-previous,\
#FindToolbar[mini] .findbar-highlight label,\
#FindToolbar[mini] .findbar-closebutton,\
#FindToolbar[mini] .findbar-find-fast[anonid="find-label"],\
#FindToolbar[mini] .findbar-highlight,\
#FindToolbar[mini] .findbar-highlight[checked] {\
   display: none !important; }\
\
/* расположение элементов на панели поиска ....*/\
#pasteButton { padding-left: 6px !important; padding-right: 6px !important; }\
\
#FindToolbar:not([mini]):not([oldFindBar]):not([pasteButton]) #findCheckbox { margin-left: 35px !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) .findbar-highlight.tabbable { -moz-box-ordinal-group: 4 !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) * { -moz-box-ordinal-group: 99 !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) hbox[anonid="findbar-textbox-wrapper"] {\
   -moz-box-ordinal-group: 1 !important; margin-left: -10px !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) #pasteButton {\
   -moz-box-ordinal-group: 2 !important; margin-left: 5px !important; margin-right: 15px !important; }\
\
#FindToolbar:not([mini]) #hits { text-align: right; width: 4.1em !important; margin-left: -13px; margin-right: -1px; color: green; }\
\
#FindToolbar[mini] #hits { -moz-appearance: none !important; margin-top: 3px !important; }\
#FindToolbar[mini] textbox.findbar-textbox { -moz-box-ordinal-group: 1 !important; }\
#FindToolbar[mini] #findCheckbox { -moz-box-ordinal-group: 2 !important; margin-left: -24px !important; margin-right: -3px !important; }\
#FindToolbar[mini] #pasteButton { -moz-box-ordinal-group: 3 !important; margin: -5px 0 !important; }\
#FindToolbar[mini] #findButton { -moz-box-ordinal-group: 4 !important; margin: -5px 0 !important; }\
\
#FindToolbar[mini][oldFindBar] #pasteButton { margin: 1px 0 !important; }\
#FindToolbar[mini][oldFindBar] #findButton { margin: 1px 0 !important; }\
\
#FindToolbar[mini]:not([oldFindBar]) #findCheckbox { margin-left: -33px !important; margin-right: -5px !important; }\
\
/* не показывать панель поиска на страницах ....*/\
#main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar,\
#main-window[title="Управление дополнениями - Mozilla Firefox"] #appcontent > #FindToolbar\
 { display: none !important; }\
'));

var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0); 
addDestructor(()=> { sss.unregisterSheet(uri, 0) });

Как добавить кнопку

bunda1 пишет:

У меня не  воспроизводится проверил сейчас на этой странице на FF13 и FindBar мини, может я что то неправильно понял :(

Кажется понял, почему ты не можешь воспроизвести.  Ты ищешь на странице с помощью прокрутки? Попробуй с помощью лупы.

mserv
Да заметил этот баг сейчас буду исправлять.

Ура, отдельная тема :)

Чтобы не потерялись мои багрепорты/фичереквесты/просьбы/предложения - перенесу-ка я их сюда, и по мере их выполнения буду их вычёркивать.

Баги:
1. Поломано выделение слов в строке поиска двойным кликом (и выделение всего введённого сразу тройным кликом)
2. Если в поиск начать вписывать букву за буквой (так, чтобы получилась длинная абракадабра, которой точно нет на странице) - то при добавлении новых букв - цвет фона поля поиска меняется с красного (сигнализирующего о том, что на странице нет искомой фразы) на белый (сигнализирующий, что фраза на странице есть).
3. При повторном открытии файндбара - фокус переходит на следующее найденное слово (происходит при снятой галке у "Всегда открывать пустую поисковую форму").
4. "??????" или "отсутствует" - автоматически подсвечивается, даже если вы это не искали.
5. "Автовыделение" подсвечивает найденные на странице искомые слова, если панель поиска закрылась по таймеру.
6. Иногда искомое может измениться с верхнего на нижний регистр (и наоборот). Подробности в отдельном сообщении.
7. Иногда файндбар открывается не перенимая на себя фокус.
8. Невозможно пользоваться mini на девайсах без колеса прокрутки.
9. На страницах без прокрутки (где невозможно вызвать авто-прокрутку средним кликом) - поиск открывается/закрывается не двойным, а одиночным средним кликом.
10. На страницах, где много пустого места - показ/скрытие панели происходит не двойным, а одинарным мидл-кликом. Подробности в отдельном сообщении.
11. При открытии файндбара через двойной middle-click - фокус не переходит на поисковую строку.
12. Таймер автоскрытия должен отсчитываться не с момента открытия панели, а с момента последнего действия с ней.
13. В моменты, когда кнопка "найти" имела статус disabled - она выглядела так же, как и не disabled.


Фичереквесты:
1. Добавить таймер закрытия на панель поиска, чтобы было видно через сколько секунд она закроется. Думаю, что это не стоит добавлять в mini.
2. Сделать из кнопки отдельный джетпак и захостить на АМО.

3. Сделать позицию файндбара настраиваемой: сверху/cнизу + отдельная настройка для мини: слева/справа. Если с этим нужна помощь - могу написать CSS-стили для всех состояний файндбара.
4. Приделать "умный" хоткей ctrl+shift+f который будет открывать строку с инвертированной настройкой "Очищать поисковую форму".
5. сделать встроенную в [firefox] фичу автоматической вставки подсвеченного на странице текста в строку поиска при её открытии отключаемой.
6. Сделать фичу сохранения введённого в поиск текста между открытиями файндбара опциональной (т.е. чтоб можно было её включать/отключать). Сейчас текст сохраняется, но это иногда мешает и многим непривычно.
7. Добавить в кнопку возможность переключения булевых префов (используемых этой кнопкой) через её контекстное меню.


Просьбы иного характера:
1. Добавить описание кнопки в её help (ПКМ по кнопке - Custom Button - Edit Button - вкладка Help).
2. Добавить подсказки с пояснениями работы настроек.

3. Создать для кнопки отдельную тему.
4. Переименовать настройку в FindBar.ToggleWithDoubleMiddleClick, чтобы название отражало смысл того, что делает эта настройка.
5. Добавить в описание кнопки информацию о настройке FindBar.ToggleWithDoubleMiddleClick.
6. Добавить в описание кнопки:
"Перейти к предыдущей/следующей найденной фразе можно наведя курсор на Панель поиска и покрутив колесо вверх/вниз.
Двойной клик ЛКМ по полю ввода включает/отключает подсветку всех найденных совпадений с поисковым запросом".

iDev.Pi пишет:

Добавить в описание кнопки:
"Перейти к предыдущей/следующей найденной фразе можно наведя курсор на Панель поиска и покрутив колесо вверх/вниз.
Двойной клик ЛКМ по полю ввода включает/отключает подсветку всех найденных совпадений с поисковым запросом".

Можешь уже зачеркнуть.

Баг ли это?
На страницах без прокрутки (где невозможно вызвать авто-прокрутку средним кликом) - поиск открывается/закрывается не двойным, а одиночным средним кликом.

Это баг, на какой странице заметил?

bunda1 пишет:

Это баг, на какой странице заметил?

я заметил на about:newtab и на своей локальной домашней, но проявляется везде: открой картинку любую в новой вкладке или вот:
http://www.gatsby.ucl.ac.uk/~edward/code/ как пример (первая страница что выдал мне гугл по запросу "small page").

iDev.Pi
На about:newtab и подобных не проблема, а вот с http://www.gatsby.ucl.ac.uk/~edward/code/ ты меня конкретно озадачил не знаю что и делать, измерять страницу что ли, вот же проблема. :(

bunda1
а может объявить тогда этот баг фичей?
ну а чего? всё равно на таких страницах нет автопрокрутки.

iDev.Pi пишет:

а может объявить тогда этот баг фичей?

Точно так и поступим если не исправлю.

iDev.Pi пишет:

ну а чего? всё равно на таких страницах нет автопрокрутки.

Там нет скролбара, и жаль что у скролбара нет ID

ещё баг:
1. зайти на страницу
2. зажать (и не отпускать) мидл клик, чтобы появился авто-скроллинг
3. опустить курсор вниз, чтобы началась прокрутка
4. отпустить мидл клик

Как результат: срабатывает TF+3, хотя не должен бы.

10-03-2012 01:42:11
ы, как странно: зависит от того, куда кликать. Если на пустые места справа-слева - то баг случается. Если кликать где-то по центру - то бага нет.

iDev.Pi

Можно весь стиль кнопки заменить этим (в него уже внесены все необходимые исправления + код немного привёл в порядок).

Твой стиль удлиняет FindBar mini может лучше что то сделать с "Phrase not founo" например удалить и как этот баг увидеть.

bunda1 пишет:

Твой стиль удлиняет FindBar mini

всего-то на 4 пикселя, вот же ты жадина :)
можно убрать тот отступ слева (примерно 20пх) который ты зачем-то оставил. Не понимаю, для чего он нужен.

bunda1 пишет:

может луче что то сделать с "Phrase not founo"

но с ней всё в порядке, просто ты в своём стиле выставил отрицательный отступ, вызвав это наезжание элементов.

bunda1 пишет:

и как этот баг увидеть.

примени стиль

Выделить код

Код:

#FindToolbar > .findbar-container > * {
    display: -moz-box !important; }

mserv

Баг в Toggle  Find+3, если использовать FindBar мини.  При поиске на странице, если искомое слово содержится в любом окне для ввода текста и на него попадает курсор, то на нём поиск прекращается, стоит как вкопанный.

Исправил Toggle  Find+3

10-03-2012 02:14:25

iDev.Pi пишет:

bunda1 пишет:

и как этот баг увидеть.

примени стиль

Выделить код

Код:

#FindToolbar > .findbar-container > * {
    display: -moz-box !important; }

В моем коде этот стиль тоже был изначально но я таково бага не замечал. Я не понимаю в чом дело.

bunda1 пишет:

Я не понимаю в чом дело.

в отрицательном значении margin-left для текстового поля.

iDev.Pi
Нет я том почему у меня не появляется "Phrase not founod"

bunda1
у тебя локаль английская? надо английскую. потом применяешь стиль. потом вбиваешь что-нибудь в поиск такое, чего точно нет на странице. Всё.
а, ну и я не знаю как там у тебя на 3.6 - я то на найтли.

bunda1
У кнопки, однако, 1000 с лишним строк кода, GUI, который больше, чем просто кнопка, и настройки, которые не всем удобно/возможно изменять в about:config.
Я это к тому, что не было мысли вынести эту кнопку в отдельное расширение?

bunda1 пишет:

mserv

Баг в Toggle  Find+3, если использовать FindBar мини.  При поиске на странице, если искомое слово содержится в любом окне для ввода текста и на него попадает курсор, то на нём поиск прекращается, стоит как вкопанный.

Исправил Toggle  Find+3

Спасибо. Заметил, что лупа не работает при большом количестве найденных результатов на странице.  И ещё, если происходит смена регистра найденного слова на странице, то на лупу приходится нажимать дважды. При первом щелчке происходит смена регистра в FindBar мини, а при втором осуществляется переход.

hydrolizer пишет:

bunda1
У кнопки, однако, 1000 с лишним строк кода, GUI, который больше, чем просто кнопка, и настройки, которые не всем удобно/возможно изменять в about:config.
Я это к тому, что не было мысли вынести эту кнопку в отдельное расширение?

Настройки я перенесу в меню кнопки. Было бы неплохо сделать из кнопки Jetpacks, но я это не умею и учится нет времени. Надо исправыть ошибки в кнопке. Может ты знаешь как узнать что на странице произошел переход Назад(back) и Вперёд(Forward). Это можно узнать обработчиком

Выделить код

Код:

gBrowser.tabContainer.addEventListener("TabAttrModified",func, true);

но я не хочу его использовать.

iDev.Pi пишет:

у тебя локаль английская? надо английскую. потом применяешь стиль. потом вбиваешь что-нибудь в поиск такое, чего точно нет на странице. Всё.
а, ну и я не знаю как там у тебя на 3.6 - я то на найтли.

Я проверял на найтли(F13) + локаль английская, и у меня Phrase not found не появляется и не должна появляться потому что в CSS коде кнопки есть этот код

Выделить код

Код:

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image
{display: none !important;}

и он не зависит от локали.

10-03-2012 14:38:57

mserv пишет:

Заметил, что лупа не работает при большом количестве найденных результатов на странице.  И ещё, если происходит смена регистра найденного слова на странице, то на лупу приходится нажимать дважды. При первом щелчке происходит смена регистра в FindBar мини, а при втором осуществляется переход.

Да есть такой непонятный баг, буду исправлять.

bunda1 пишет:

потому что в CSS коде кнопки есть этот код

а, ну так тут уж борьба стилей происходит - чей главней окажется (display:none из кнопки или display:-moz-box из персонального стиля) - от того результат и зависит. У меня личные стили побеждают стили из кнопки.
Ну, можешь временно в кнопке удалить те строки, перезагрузиться и увидишь баг. Но ещё проще - всё-таки импортировать стиль, который я привёл. Баг фиксится удалением отрицательного margin-left. Панель становится шире на 4 пикселя, если тебе их жалко - то отрежь пустое место слева на панели, оно лишнее и там можно сэкономить ~20пикселей.

Замечания по поводу бага с toggle срабатывающем при одиночном мидл-клике (не на странице без прокрутки, а вот здесь): нашёл новые зависимости: зависит от того где НАЧИНАЕТСЯ мидл клик и где ты его ОТПУСКАЕШЬ: если слева/справа от мест, где клик начинается или заканчивается есть какие-то блоки текста - то глюк не воспроизводится, если блоков текста там нет - то глюк воспроизводится. Отчётливо видно на страницах АМО: открой страницу любого дополнения и поиграйся с мидл кликом (зажать мидл клик, повести курсор чтоб сработала автопрокрутка, отпустить мидл-клик).

У меня есть подозрение, что этот баг связан с багом, где на странице без скроллинга toggle происходит одиночным кликом: у меня такое чувство, что это 2 немного разных частных случая одного и того же бага: мне кажется, что я раньше как-то замечал, что на страницах АМО некоторые картинки (справа и слева от которых нет текста) сделаны так, что каким-то образом занимаю всю ширину страницы (не могу сейчас найти этому подтверждение).


Новый баг:
если на странице есть слово, которое встречается дважды, но в разных регистрах (допустим, roar и ROAR), то т.к. между скрытием и открытием файндбара твоя кнопка как бы автоматически нажимает "Next", то если в поиск ввести искомое слово в НИЖНЕМ регистре (не заглавными буквами) и 4 раза мидл-кликнуть на странице - фокус покажется сначала на 1-ом слове, а потом перейдёт на второе. Хоть мне даже это само по себе не очень нравится, но баг не в этом, а в следующем:
в момент, когда панель откроется и когда подсветка слова на странице выпадет на случай с заглавными буквами - то в поиск уже будет вписано искомое слово в верхнем регистре.

iDev.Pi пишет:

Новый баг:

Пост 19 не?

iDev.Pi

а, ну так тут уж борьба стилей происходит - чей главней окажется (display:none из кнопки или display:-moz-box из персонального стиля) - от того результат и зависит. У меня личные стили побеждают стили из кнопки.

в кнопке тоже есть

Выделить код

Код:

#FindToolbar > .findbar-container > * { display: -moz-box !important; }

Панель становится шире на 4 пикселя, если тебе их жалко - то отрежь пустое место слева на панели, оно лишнее и там можно сэкономить ~20пикселей.

Как отрезать ?

Замечания по поводу бага с toggle срабатывающем при одиночном мидл-клике (не на странице без прокрутки....

да интересный феномен, но двойной мидл-клик надо делать быстро, иначе это будет не двойной клик. Можно поставить таймер для сброса мидле клика, но разве это так нужно? Я уже жалею что использовал двойной мидл-клик от него только проблемы.

если на странице есть слово, которое встречается дважды, но в разных регистрах (допустим, roar и ROAR), то т.к. между скрытием и открытием файндбара твоя кнопка как бы автоматически нажимает "Next"

так я сделал ради красоты, чтобы "искомое" слово выделялось зеленым.

когда подсветка слова на странице выпадет на случай с заглавными буквами - то в поиск уже будет вписано искомое слово в верхнем регистре.

Эсли будет find паменяетса на Find, я правыльно понял ?

скрытый текст
Сплошные баги. Эх, пойду с горя напьюсь.

bunda1 пишет:

в кнопке тоже есть

Выделить код

Код:

#FindToolbar > .findbar-container > * { display: -moz-box !important; }

так оно идёт в начале стиля и перебивается последующими правилами.
это же основы CSS: если два правила с одинаковой важностью в одном стиле диктуют противоположные значения - применено будет то, которое идёт позднее.

10-03-2012 16:23:23

bunda1 пишет:

Как отрезать ?

тяжело стиль для этой кнопки править, т.к. чтобы он сработал - нужен рестарт. И применения стиля через Stylish - тоже не перебивает стиль в кнопке пока не сделаешь рестарт.
если судить аналитически, то отрезать эту пустоту можно либо уменьшением width всей панели, либо этот отступ вызван каким-то стилем из самой лисы и надо отдельное правило, чтобы его отрезать.
Попозже попробую выяснить точно и сообщу о результатах.

bunda1 пишет:

Эсли будет find паменяетса на Find, я правыльно понял ?

да, и так тоже.

bunda1 пишет:

так я сделал ради красоты, чтобы "искомое" слово выделялось зеленым.

не понял, причём здесь вообще цвет

bunda1 пишет:

Я уже жалею что использовал двойной мидл-клик от него только проблемы.

Зато очень удобно. А если заменить на ПКМ+СКМ?

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

bunda1 пишет:

Сплошные баги. Эх, пойду с горя напьюсь.

Да ладно тебе, какие баги? Так мелкие недоработки. Зато кнопка в целом супер и становится всё лучше. А немного напиться иногда полезно, но лучше этим заняться, когда всё исправишь. Ты нам ещё тверЁзый нужЁн.:D

iDev.Pi пишет:

это же основы CSS: если два правила с одинаковой важностью в одном стиле диктуют противоположные значения - применено будет то, которое идёт позднее.

Спасибо, не знал.

iDev.Pi пишет:

тяжело стиль для этой кнопки править, т.к. чтобы он сработал - нужен рестарт. И применения стиля через Stylish - тоже не перебивает стиль в кнопке пока не сделаешь рестарт.

Это легко. Надо удалить весь CSS из кнопки:

Выделить код

Код:

#FindToolbar:not([mini="true"])......
...........
...........
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;
}

рестарт и далее через Stylish.

А если заменить на ПКМ+СКМ?

Так же не удобно.

Добавил в настройки кнопки Toggle  Find+3 новые пункты:
Переключить двойным средним кликом - Показать - скрыть Поиск по странице, двойным средним кликом на странице, теперь можно отключить в настройках кнопки.
Изменить цвет: - Можно менять цвет Автовыделение

bunda1
как тебе такой стиль?

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar[autohide] .findbar-closebutton,
#FindToolbar[mini] label.findbar-find-fast,
#FindToolbar[mini] .find-status-icon,
#FindToolbar[mini] .findbar-find-status,
#FindToolbar[mini] .toolbarbutton-text,
#FindToolbar[mini] .checkbox-label,
#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini] .tabbable[disabled] {
    display: none !important; }
#FindToolbar[mini] checkbox {
    display: -moz-box !important;
    margin-right: -1px !important; }

#FindToolbar[mini] #find-field,
#FindToolbar[mini] .findbar-textbox {
    width: 160px !important; }

#FindToolbar[mini] > hbox > *,
#FindToolbar[mini] .checkbox-icon,
#FindToolbar[mini] .checkbox-label-box {
    margin: 0 !important;
    padding: 0 !important; }

#FindToolbar[mini] .tabbable > image {
    margin: 0 1px 0 1px !important; }

#FindToolbar[mini] {
    padding: 2px 2px 0 2px !important;
    height: 22px !important; }
#FindToolbar[mini] > .findbar-container,
#FindToolbar[mini] > .findbar-container > * {
    max-height: 17px !important; }

#FindToolbar[mini] label:not([class]) {
    padding-left: 2px !important;
    font-weight: bold !important;
    -moz-box-ordinal-group: 0 !important; }
#FindToolbar[mini] .tabbable:not(.findbar-highlight) {
    -moz-box-ordinal-group: 1 !important; }
#FindToolbar[mini] .findbar-textbox {
    -moz-box-ordinal-group: 2 !important; }
#FindToolbar[mini] checkbox { 
    -moz-box-ordinal-group: 3 !important; }
#FindToolbar[mini] .findbar-highlight {
    -moz-box-ordinal-group: 9 !important; }

#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 6px 6px !important; }

#FindToolbar[red] .findbar-textbox {
    box-shadow: 0 0 0 1em red inset !important; }
#FindToolbar:not([red]) .findbar-textbox[status="notfound"] {
    background: rgba(207,219,236,0.99) !important;
    color: black !important;
    box-shadow: none !important; }

#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important; }

В нём скрываются кнопки вперёд-назад-искать когда их нельзя ещё кликать.
Это может кого-то раздражать тем, что панель будет меняться в размерах каждый раз при переходе от состояния когда ничего не искалось в состояние когда что-то введено в поиск.
Для тех, кого это раздражает - удалите этот кусок:

Выделить код

Код:

,
#FindToolbar[mini] .tabbable[disabled]

ещё можно было бы сделать такую штуку: скрывать кнопку закрытия панели только в случае, если включено автоскрытие по таймеру.
Для того, чтоб я мог это через стиль сделать - надо чтоб ты добавлял аттрибут (например [autohide] (необязательно даже ему выставлять значение true - можно просто добавлять его только в случае, если автоскрытие включено)) какому-нибудь элемент (например, самому файндбару).

iDev.Pi
Извини, мне не нравится:
1. зачем кнопки find-next, find-previous на FindBar mini?
2. FindBar mini стал длиннее,
3. уже не нужно

Выделить код

Код:

#FindToolbar[yellow] .findbar-textbox {
    box-shadow: 0 0 0 1em yellow inset !important; }

4. checkbox не там
5. отступ слева все так нужен, вот почему

Поиск по странице из буфера обмена, если кликнуть средним кликом на Findbar или FindBar mini.

теперь не удобно кликнуть.
Я поклонник минимализма.

Для того, чтоб я мог это через стиль сделать - надо чтоб ты добавлял аттрибут (например [autohide] (необязательно даже ему выставлять значение true - можно просто добавлять его только в случае, если автоскрытие включено)) какому-нибудь элемент (например, самому файндбару).

ок

bunda1 пишет:

Извини, мне не нравится:

bunda1 пишет:

1. кнопки find-next, find-previous на FindBar mini,

так это я специально: у меня на нетбуке, например, есть тачпад и он не то что без колеса прокрутки, в нём даже мидл-клика нет. От кнопок я отрезал текст и подровнял

bunda1 пишет:

2. FindBar mini стал длиннее,

на ширину одной кнопки (~18пикселей), всё остальное из-за того, что я выставил довольно большую ширину текстового поля.

bunda1 пишет:

3. уже не нужно

я не стал особо вникать что это - подумал это стиль для подсветки найденного на странице.

bunda1 пишет:

4. checkbox не там

могу передвинуть, но на самом деле это всё самообман: у тебя он находится поверх текстового поля, а значит полезного пространства меньше ровно на ширину чекбокса, т.е. выигрышь будет лишь от padding-ов чекбокса, но перенести могу.

bunda1 пишет:

5. отступ слева все так нужен, вот почему

зачем так изгаляться? есть же для этого преф middlemouse.paste для любителей вставлять текст из буфера обмена средним кликом. Причём работать это будет, само собой, везде.

bunda1 пишет:

Я поклонник минимализма.

кстати, можно сделать так: сузить текстовое поле до какого-то приемлемого минимума и расширять его по мере надобности (до какого-то приемлемого максимума).
но даже если этого не делать: мой вариант на самом деле занимает меньше места, чем твой, если выставить ширину текстового поля не 250пх, а 150пх - тогда будет так же, как у тебя на скриншоте, а в случае, когда поле поиска будет пустым - и того меньше, чем в твоём варианте.
Сравни сам:
твой вариант
http://img848.imageshack.us/img848/8017/2167b2d1ec8b0812770add0.jpg
мой вариант
http://img851.imageshack.us/img851/2249/my1.png

iDev.Pi

Для того, чтоб я мог это через стиль сделать - надо чтоб ты добавлял аттрибут (например [autohide] (необязательно даже ему выставлять значение true - можно просто добавлять его только в случае, если автоскрытие включено)) какому-нибудь элемент (например, самому файндбару).

#FindToolbar[autohide]...

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
        if (!gFindBar.hidden) gFindBar.onFindAgainCommand(event.detail = 0);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение' 
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='   Закрыть через '
var ClearPref ='Сбросить текст'

 
//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '...' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");



//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '5')
{   
    prefs.setCharPref("FindBar.version", "5");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "Firefox");
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "3");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='● ';
var n = '   ';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) autohide(event);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c: n) + AutoClose;
this.FBClose = label;
if(mi) mi.label = label;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label; 
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c : n) + 'FindBar мини'
this.FBmini = label;
if(mi) mi.label = label;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c : n) + 'Find в контекстном меню';
this.FindInMenu = label;
if(mi) mi.label = label;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c : n) + 'Переключить двойным средним кликом';
this.MiddleClick = label;
if(mi) mi.label = label;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var label = (custombuttons.getPrefs(s)? c : n) + AutoHighlight;
this.aHighlight = label;
if(mi) mi.label = label;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолча?нию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = n + 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label; 
if(mi) mi.label = label;
};

//Автовыделение, добавить текст(Auto Highlight, add text)..... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
//пункт меню(menuitems)
var label = n + 'Добавить текст'
this.PrefValue = label;
if(mi) mi.label = label;
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
//пункт меню(menuitems)
var label = n + ClearPref;
this.ClearPref = label;
if(mi) mi.label = label;
};

//Findbar, переклучить атрибут 'autohide'.................................
function autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
  };
//Запускаем функции f_autohide 
setTimeout(function() {autohide(event);}, 200)

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { label: this.FBClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: ''},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { label: this.FBmini, cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: ''},
  { label: this.FindInMenu, cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:''},
  { label: this.MiddleClick, cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:''},
  { label: "separator", sItemId: ''},
  { label: this.aHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: ''},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''},
  { label: this.PrefValue, cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: this.ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd)
    mItem.setAttribute("style", "margin-left: -14px;");
     //....
    var CCsubCall = document.getElementById("custombuttons-contextpopup-subCall");
    CCsubCall.setAttribute("style", "margin-left: -4px;");
  }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, установить и удалить атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttonsUtils.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
HighBut.setAttribute("tooltiptext", "L = Искать следущее"+"\n" +"L = Поиск выделенного текста " + "\n" + "R = Очистить поле текстового ввода");
}
else
{
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
gFindBar._findField.style.color = "black";
}
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);

  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
var FBar ={

addEvList : function(event)
{
//Стоп, при открытии настройки панелей
if (window.ToggleFindRun == 'stop') return;

//добавляем обработчики для обработки мышиных событий на странице.......
//включена 'Использовать автоматическую прокрутку'...
gBrowser.addEventListener('click', function(event){if (custombuttons.getPrefs("general.autoScroll")){FBar.clickClose(event); }}, true);

//если не включена 'Использовать автоматическую прокрутку'
gBrowser.addEventListener('dblclick', function(event){if (!custombuttons.getPrefs("general.autoScroll")) FBar.clickClose(event);}, true);
},
clickClose : function(event)
{  
 //если нажатие на среднюю кнопку мыши
 if (1 == event.button)
 {  
   //Объявляем адреса для фильтра 're'
    var re = /chrome:\/\/|file:\/\/|data:text\/|data:image\/|about:/;
   //Стоп, если адрес из 're'
   var str = String(getBrowser().currentURI.spec);
   var str = str.substring(0,13);
   if (str.search(re) != -1) return;
   //Стоп, если это ссылка(if link)
   var link = this.getLink(event.target);
   if(link) return;
   //если разрешено в настройках(about:config)
   if (custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick"))
   {
   //переключить 'Поиск на странице'
   gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
   if (!gFindBar.hidden){Find(event); gFindBar._findField.focus();
   }
    }
  }
},
clickLink : function(event)
  {
//Объявляем ссылку'Link'............
this.getLink = function(node) {
    if(!node || !node.localName)
        return null;

    const docNode = Node.DOCUMENT_NODE; // 9
    const eltNode = Node.ELEMENT_NODE; // 1
    for(node = node; node && node.nodeType != docNode; node = node.parentNode) {
        if(
            (
                node instanceof HTMLAnchorElement
                || node instanceof HTMLAreaElement
                || node instanceof HTMLLinkElement
            )
            && node.hasAttribute("href")
            || node.nodeType == eltNode && node.hasAttributeNS("http://www.w3.org/1999/xlink", "href")
        )
            return node;
    }
    return null;
  };
}   
             };
//Запускаем функцию addEvList(run function addEvList)            
FBar.addEvList(event);             
//Запускаем функцию clickLink(run function clickLink)             
FBar.clickLink(event);



//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){ Highlight(event) };
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   gFindBar._findField.reset();
   gFindBar.onFindAgainCommand(false);
   //....
   var findToolbar = document.getElementById("FindToolbar");
   findToolbar.removeAttribute("red");
   //...
   gFindBar._findField.focus();
   //....
   gFindBar._highlightDoc(false);
}
  };
       
        
   
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //Убираем пробелы с обоих концов текста.
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        if (custombuttons.getPrefs("FindBar.Highlight")){ Highlight(event) };
        gFindBar.onFindAgainCommand(event.detail = 0);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //переключить кнопку 'Highlight'
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
      
//FindBar, автоматически закрыть(autohide Findbar).................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
function go() {
  gFindBar.close();
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (gFindBar.hidden) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  gFindBar.addEventListener('mouseover',off, false); 
  gFindBar.addEventListener("DOMAttrModified", Modoff, false);
  }
function Modoff() {
  if (!gFindBar.hidden){
  off();
  }
    };
function off() {
  window.ACRun = '';
  gFindBar.removeEventListener('mouseover',Modoff, false); 
  gFindBar.removeEventListener("DOMAttrModified", off, false);
  clearTimeout(timeoutId);
  }
gBrowser.addEventListener('mouseover',on, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){

//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if (event.altKey == false)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
event.preventDefault();
event.stopPropagation();
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();}}

//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if (event.altKey == true)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");}}

//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if (event.altKey == true)
{
if ((event.keyCode==0x48)&&(event.ctrlKey))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
} 
 }
  }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!highlightBtn.checked)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._highlightDoc(true, gFindBar._findField.value);
//..
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
highlightBtn.removeAttribute("checked");
gFindBar._highlightDoc(false);
//..
gFindBar._findField.style.color = "black";
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаг...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   
//hide Highlight
gFindBar._highlightDoc(false);

//....
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!highlightBtn.checked)
     {
     gFindBar._findField.style.color = "black";
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  = 0)
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight", true))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     if (FBvalue.length > FBNum) {var value = FBvalue};
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//Найти на странице.................  
Find = function(event){
var sel = content.getSelection().toString();
if (!!sel){
if(gFindBar.hidden){gFindBar.onFindCommand();}
//Убираем пробелы с обоих концов текста....
var newstr = sel.replace(/^\s+|\s+$/g,"");
//...
gFindBar._findField.value = newstr;
Highlight(event);
gFindBar.onFindAgainCommand(event.detail = 0);
}
else
{
Highlight(event);
gFindBar.onFindAgainCommand(false);
}
  };



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
      //Запускаем функцию Find
       Find(event);
        }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
          
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
    
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();

        

//Добавить текст(выделенный / из буфера обмена) для автовыделения.....................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);


 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   -moz-box-shadow: none !important;}

/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 


#FindToolbar[mini="true"] toolbarbutton.findbar-highlight.tabbable, #FindToolbar[mini="true"] toolbarbutton.findbar-highlight.tabbable[checked="true"]{
   -moz-appearance: none !important;
   list-style-image: none !important;
   background: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") center no-repeat !important; 
   border: 1px solid rgba(0,0,0,0.3) !important;
   height:21px !important;}

#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
  
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}

#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;
   margin-left:-3px !important}
   
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;
}  
]]>.toString());

//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1
оок, нужно в стиле лишь заменить
#FindToolbar[mini] .findbar-closebutton,
на
#FindToolbar[autohide] .findbar-closebutton,

iDev.Pi

зачем так изгаляться? есть же для этого преф middlemouse.paste для любителей вставлять текст из буфера обмена средним кликом. Причём работать это будет, само собой, везде.

Я привык мне нравится, так быстрее чем с middlemouse.paste + я добавыл поиск выделенного текста/ из буфера, удобно же.

кстати, можно сделать так: сузить текстовое поле до какого-то приемлемого минимума и расширять его по мере надобности (до какого-то приемлемого максимума).

не разумно все и так знают что ищут и смотрят на страницу а не на FindBar mini.

могу передвинуть checkbox, но на самом деле это всё самообман: у тебя он находится поверх текстового поля, а значит полезного пространства меньше ровно на ширину чекбокса, т.е. выигрышь будет лишь от padding-ов чекбокса..

все и так знают что ищут и смотрят на страницу а не на FindBar mini.

так это я специально: у меня на нетбуке, например, есть тачпад и он не то что без колеса прокрутки, в нём даже мидл-клика нет. От кнопок я отрезал текст и подровнял

да проблема, может переклучать кнопки, ну там атрибут поставыть.....

Я очень хочу что бы мой FindBar mini не менял ширыну завысимости от количество найденных совпадений, можно сделать? :)

10-03-2012 23:03:08
Как у тебя теперь работает  Автоматически закрыть?

iDev.Pi пишет:

4. Сделать фичу сохранения введённого в поиск текста между открытиями файндбара опциоинальной (т.е. чтоб можно было её включать/отключать). Сейчас текст сохраняется, но это иногда мешает и многим непривычно.

mserv пишет:

Заметил, что лупа не работает при большом количестве найденных результатов на странице.  И ещё, если происходит смена регистра найденного слова на странице, то на лупу приходится нажимать дважды. При первом щелчке происходит смена регистра в FindBar мини, а при втором осуществляется переход.

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
        if (!gFindBar.hidden) gFindBar.onFindAgainCommand(event.detail = 0);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение' 
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='   Закрыть через '
var ClearPref ='Сбросить текст'

 
//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '...' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");



//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '6')
{   
    prefs.setCharPref("FindBar.version", "6");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "Firefox");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "3");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='● ';
var n = '   ';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) autohide(event);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c: n) + AutoClose;
this.FBClose = label;
if(mi) mi.label = label;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label; 
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c : n) + 'FindBar мини'
this.FBmini = label;
if(mi) mi.label = label;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c : n) + 'Find в контекстном меню';
this.FindInMenu = label;
if(mi) mi.label = label;
};

//Очищать поле текстового ввода на Findbar при закрытии.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c : n) + 'Очищать поле текстового ввода';
this.autoClear = label;
if(mi) mi.label = label;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var label = (custombuttons.getPrefs(s)? c : n) + 'Переключать двойным средним кликом';
this.MiddleClick = label;
if(mi) mi.label = label;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var label = (custombuttons.getPrefs(s)? c : n) + AutoHighlight;
this.aHighlight = label;
if(mi) mi.label = label;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолча?нию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = n + 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label; 
if(mi) mi.label = label;
};

//Автовыделение, добавить текст(Auto Highlight, add text)..... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
//пункт меню(menuitems)
var label = n + 'Добавить текст'
this.PrefValue = label;
if(mi) mi.label = label;
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
//пункт меню(menuitems)
var label = n + ClearPref;
this.ClearPref = label;
if(mi) mi.label = label;
};

//Findbar, переклучить атрибут 'autohide'.................................
function autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
  };
//Запускаем функции f_autohide 
setTimeout(function() {autohide(event);}, 200)

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { label: this.FBClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: ''},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { label: this.FBmini, cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: ''},
  { label: this.FindInMenu, cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:''},
  { label: this.autoClear, cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:''},
  { label: this.MiddleClick, cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:''},
  { label: "separator", sItemId: ''},
  { label: this.aHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: ''},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''},
  { label: this.PrefValue, cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: this.ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd)
    mItem.setAttribute("style", "margin-left: -14px;");
     //....
    var CCsubCall = document.getElementById("custombuttons-contextpopup-subCall");
    CCsubCall.setAttribute("style", "margin-left: -4px;");
  }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, установить и удалить атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttonsUtils.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
HighBut.setAttribute("tooltiptext", "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = Очистить поле текстового ввода");
}
else
{
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
gFindBar._findField.style.color = "black";
}
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);

  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);


//Очистить поле текстового ввода на Findbar при закрытии..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
if (custombuttonsUtils.getPrefs("FindBar.autoclear")){gFindBar._findField.reset()};
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
var FBar ={

addEvList : function(event)
{
//Стоп, при открытии настройки панелей
if (window.ToggleFindRun == 'stop') return;

//добавляем обработчики для обработки мышиных событий на странице.......
//включена 'Использовать автоматическую прокрутку'...
gBrowser.addEventListener('click', function(event){if (custombuttons.getPrefs("general.autoScroll")){FBar.clickClose(event); }}, true);

//если не включена 'Использовать автоматическую прокрутку'
gBrowser.addEventListener('dblclick', function(event){if (!custombuttons.getPrefs("general.autoScroll")) FBar.clickClose(event);}, true);
},
clickClose : function(event)
{  
 //если нажатие на среднюю кнопку мыши
 if (1 == event.button)
 {  
   //Объявляем адреса для фильтра 're'
    var re = /chrome:\/\/|file:\/\/|data:text\/|data:image\/|about:/;
   //Стоп, если адрес из 're'
   var str = String(getBrowser().currentURI.spec);
   var str = str.substring(0,13);
   if (str.search(re) != -1) return;
   //Стоп, если это ссылка(if link)
   var link = this.getLink(event.target);
   if(link) return;
   //если разрешено в настройках(about:config)
   if (custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick"))
   {
   //переключить 'Поиск на странице'
   gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   if (!gFindBar.hidden)
   {
   gFindBar.onFindAgainCommand(event.detail = 0); 
   gFindBar._findField.focus();
   }
     }
  }
},
clickLink : function(event)
  {
//Объявляем ссылку'Link'............
this.getLink = function(node) {
    if(!node || !node.localName)
        return null;

    const docNode = Node.DOCUMENT_NODE; // 9
    const eltNode = Node.ELEMENT_NODE; // 1
    for(node = node; node && node.nodeType != docNode; node = node.parentNode) {
        if(
            (
                node instanceof HTMLAnchorElement
                || node instanceof HTMLAreaElement
                || node instanceof HTMLLinkElement
            )
            && node.hasAttribute("href")
            || node.nodeType == eltNode && node.hasAttributeNS("http://www.w3.org/1999/xlink", "href")
        )
            return node;
    }
    return null;
  };
}   
             };
//Запускаем функцию addEvList(run function addEvList)            
FBar.addEvList(event);             
//Запускаем функцию clickLink(run function clickLink)             
FBar.clickLink(event);



//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){ Highlight(event) };
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   gFindBar._findField.reset();
   gFindBar.onFindAgainCommand(false);
   //....
   var findToolbar = document.getElementById("FindToolbar");
   findToolbar.removeAttribute("red");
   //...
   gFindBar._findField.focus();
   //....
   gFindBar._highlightDoc(false);
}
  };
       
        
   
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //Убираем пробелы с обоих концов текста.
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        if (custombuttons.getPrefs("FindBar.Highlight")){ Highlight(event) };
        gFindBar.onFindAgainCommand(event.detail = 0);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //переключить кнопку 'Highlight'
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
      
//FindBar, автоматически закрыть(autohide Findbar).................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
function go() {
  gFindBar.close();
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (gFindBar.hidden) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  gFindBar.addEventListener('mouseover',off, false); 
  gFindBar.addEventListener("DOMAttrModified", Modoff, false);
  }
function Modoff() {
  if (!gFindBar.hidden){
  off();
  }
    };
function off() {
  window.ACRun = '';
  gFindBar.removeEventListener('mouseover',Modoff, false); 
  gFindBar.removeEventListener("DOMAttrModified", off, false);
  clearTimeout(timeoutId);
  }
gBrowser.addEventListener('mouseover',on, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){

//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if (event.altKey == false)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
event.preventDefault();
event.stopPropagation();
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();}}

//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if (event.altKey == true)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");}}

//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if (event.altKey == true)
{
if ((event.keyCode==0x48)&&(event.ctrlKey))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
} 
 }
  }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!highlightBtn.checked)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._highlightDoc(true, gFindBar._findField.value);
//..
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
highlightBtn.removeAttribute("checked");
gFindBar._highlightDoc(false);
//..
gFindBar._findField.style.color = "black";
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {


//устанавливаем флаг...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   
//hide Highlight
gFindBar._highlightDoc(false);

//....
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!highlightBtn.checked)
     {
     gFindBar._findField.style.color = "black";
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  = 0)
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     if (FBvalue.length > FBNum) {var value = FBvalue};
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
         gFindBar.onFindAgainCommand(event.detail = 0);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
          
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
    
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();

        

//Добавить текст(выделенный / из буфера обмена) для автовыделения.....................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);


 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   -moz-box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 


#FindToolbar[mini="true"] toolbarbutton.findbar-highlight.tabbable, #FindToolbar[mini="true"] toolbarbutton.findbar-highlight.tabbable[checked="true"]{
   -moz-appearance: none !important;
   list-style-image: none !important;
   background: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") center no-repeat !important; 
   border: 1px solid rgba(0,0,0,0.3) !important;
   height:21px !important;}

#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
  
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}

#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;
   margin-left:-3px !important}
   
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;
}  
]]>.toString());

//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1
кстати, а можно как-то изменить внешний вид пунктов в контекстном меню?
у тебя сейчас включённые настройки отмечаются точками, а точки - соответствуют либо списку, либо radiobutton, а у тебя простые чекбоксы там на самом деле.
так вот нельзя ли нужным настройкам - в контекстном меню чекбоксы пририсовать?

и ещё - а прикрути, пожалуйста, и настройку для автоматической вставки в поиск выделенного на странице текста - уж очень она раздражает.

11-03-2012 00:10:46
ошибка в коде:
По умолча?нию > По умолчанию

iDev.Pi пишет:

кстати, а можно как-то изменить внешний вид пунктов в контекстном меню?

Можно, но я не знаю как.

iDev.Pi пишет:

и ещё - а прикрути, пожалуйста, и настройку для автоматической вставки в поиск выделенного на странице текста - уж очень она раздражает.

Не понял, что за автоматическая вставка?

iDev.Pi пишет:

ошибка в коде:
По умолча?нию > По умолчанию

ok

bunda1 пишет:

Можно, но я не знаю как.

https://developer.mozilla.org/en/XUL/me … uitem.type

bunda1 пишет:

Не понял, что за автоматическая вставка?

выделил на странице кусок текста, нажал CTRL+F - и этот текст автоматически вставляется в поиск.

глянь, пожалуйста, мой стиль ещё раз - я его в том сообщении обновил:
сэкономил кучу пространства, поместил чекбокс как было у тебя в стиле, вырезал ненужный код, сделал сокрытие кнопки "закрыть" если включён [autohide], отступ слева остался скрыт, т.к. ты не объяснил, что значит:

bunda1 пишет:

так быстрее чем с middlemouse.paste

Включил во всём браузере middlemouse.paste и у тебя везде средний клик по текстовому полю - будет вставлять в него текст из буфера.
Если надумаешь прикрутить настройку "скрыть кнопки вперёд/назад на панели в состоянии Mini" - то нужно будет ещё один атрибут (что-то типа no-next-prev-buttons) на файндбар повесить, а в стиле надо будет дописать в правило где display:none такой вот селектор:
#FindToolbar[mini][no-next-prev-buttons] .tabbable:not(.findbar-highlight)

11-03-2012 01:29:28

bunda1 пишет:

Как у тебя теперь работает  Автоматически закрыть?

давно уже работает нормально

11-03-2012 01:31:36
кстати, могу в стиль добавить css-transitions:
сделать открытие-закрытие файндбара плавным: например, эффект проявления от прозрачного к непрозрачному (и обратно при закрытии) или эффект выезжания сверху вниз.

Infocatcher пишет:

bunda1 пишет:

Можно, но я не знаю как.

https://developer.mozilla.org/en/XUL/me … uitem.type

Не помогло, там нет примеров.

11-03-2012 12:54:40

iDev.Pi пишет:

выделил на странице кусок текста, нажал CTRL+F - и этот текст автоматически вставляется в поиск.

Так ты хочешь, чтобы CTRL+F менял текст в поле вода на панели поиска?  Извини но русский для меня иностранный язык, я не все понимаю.

iDev.Pi пишет:

глянь, пожалуйста, мой стиль ещё раз - я его в том сообщении обновил:
сэкономил кучу пространства, поместил чекбокс как было у тебя в стиле, вырезал ненужный код, сделал сокрытие кнопки "закрыть" если включён [autohide], отступ слева остался скрыт, т.к. ты не объяснил, что значит:

Для экономии пространство идеально, можно указать ссылку на него в описании кнопки.
Мне отступ слева нужен на моем стиле, не нужно чтобы он так расширялся когда там показывает количество найденных совпадений, если можешь сделай пожалуйста.

bunda1 пишет:

Так ты хочешь, чтобы CTRL+F менял текст в поле вода на панели поиска?  Извини но русский для меня иностранный язык, я не все понимаю.

Да, я знаю. Ничего страшного, я попробую объяснить иначе:
нет, я не это хочу.

сейчас если сделать следующие шаги:
1. выделить на странице какое-то слово
2. нажать ctrl+F

то будет такой результат:
Выделенное на странице слово появится в файндбаре.

Мне бы хотелось, чтобы это можно было настройкой, т.е. чтобы я мог отключить эту функцию и было так:
1. выделить на странице какое-то слово
2. нажать ctrl+F

то будет такой результат:
файндбар открывается ЧИСТЫМ.

bunda1 пишет:

можно указать ссылку на него в описании кнопки.

если честно, хотелось бы чтобы этот стиль заменил в кнопке имеющийся стиль.

bunda1 пишет:

Мне отступ слева нужен на моем стиле, не нужно чтобы он так расширялся когда там показывает количество найденных совпадений, если можешь сделай пожалуйста.

поясни пожалуйста: тебе этот отступ нужен для чего?

чтобы мидл-кликать туда для вставки в поиск текста из буфера?
для этого всё-таки лучше использовать настройку middlemouse.paste и кликать не на пустое место, а прям в текстовое поле.

или чтобы просто не происходило изменение ширины панели в момент, когда в пустое поле поиска вписывается что-то и появляется счётчик найденных фраз?
ради этого я бы мог добавить это пустое место, но: справа же кнопка с лупой всё равно появляется, а значит панель всё равно расширится - надо тогда и её сделать всегда отображаемой (даже когда она не кликабельна ещё).
это я тоже могу сделать, но если я это сделаю - ты заменишь свой стиль моим?

iDev.Pi пишет:

так вот нельзя ли нужным настройкам - в контекстном меню чекбоксы пририсовать?

Уже делаю, это оказалось легко.

Мне бы хотелось, чтобы это можно было настройкой, т.е. чтобы я мог отключить эту функцию и было так:
1. выделить на странице какое-то слово
2. нажать ctrl+F
то будет такой результат:
файндбар открывается ЧИСТЫМ.

Может я чего не догоняю, но можно же не выделять на странице какое-то слово, нажать ctrl+F и файндбар открывается ЧИСТЫМ эсли вклучено в меню Очищать поле текстового ввода

если честно, хотелось бы чтобы этот стиль заменил в кнопке имеющийся стиль.

Можем сделать переключение стилей в меню кнопки через атрибут, стиль mini/ supermini или как?

поясни пожалуйста: тебе этот отступ нужен для чего?
чтобы мидл-кликать туда для вставки в поиск текста из буфера?
для этого всё-таки лучше использовать настройку middlemouse.paste и кликать не на пустое место, а прям в текстовое поле.

Если кликнуть средним кликом на Findbar или FindBar mini, то текст в поле текстового ввода на Findbar будет заманен текстом из буфера или на выделенный текст, не надо удалять текст который уже есть в поле текстового ввода мой код заменяет его и выделенный текст на странице искать удобно. Но можно нажимать на кнопку поиска  на FindBar mini средним кликом.

bunda1 пишет:

Не помогло, там нет примеров.

А какие там нужны примеры?
Надо создать <menuitem type="checkbox" /> или <menuitem type="radio" /> и при обработке события command от пункта меню проверять menuitem.getAttribute("checked") == "true" (атрибут checked будет переключаться автоматически). Ну, и при чтении настроек делать menuitem.setAttribute("checked", someValueFromPrefs).

Примеры есть, но там много лишнего:
cookiesPermissions.js – radio
extDevTools.js – checkbox

bunda1 пишет:

Может я чего не догоняю, но можно же не выделять на странице какое-то слово, нажать ctrl+F и файндбар открывается ЧИСТЫМ эсли вклучено в меню Очищать поле текстового ввода

можно. но а если выделение на странице где-то было, ты потом переключился на другую вкладку, забыл про выделение и вернулся обратно?
просто хочется настройку, чтобы это можно было отключить, т.к. стандартный файндбар такого поведения не имеет, а значит это новая фича, а по моим убеждениям - фичи должны быть опциональны.
тем более, что ты можешь оставить по умолчанию эту фичу включённой (а кому надо - тот её сам выключит).

bunda1 пишет:

Можем сделать переключение стилей в меню кнопки через атрибут, стиль mini/ supermini или как?

да не, не нужно 2 стиля. просто в твоём кнопок вперёд-назад нет, а они нужны для людей на нетбуках (т.к. у них нет колеса прокрути и мидл-клика).
в твоём стиле кнопка сделана через background, поэтому она выглядит не как кнопка, а как иконка в квадратике.
мой стиль также чуть более компактный, чем твой (а ты говорил, что тебе особо важен минимализм) - ну да ладно.


в общем ладно, хрен с моим стилем - я тогда прошу тебя внести в свой стиль некоторые изменения:
1. добавить кнопки вперёд-назад для тех, кто у кого нет колеса на мыши.
2. переделать кнопку из background: url("base64_image") в list-style-image: url("base64_image"); -moz-image-region: auto; чтобы она выглядела по-человечески, особенно при наведении на неё курсором
3. удалить ненужный отступ слева (добавить к правилу display:none такой вот селектор - #FindToolbar[mini] toolbarspacer )

bunda1 пишет:

Если кликнуть средним кликом на Findbar или FindBar mini, то текст в поле текстового ввода на Findbar будет заманен текстом из буфера или на выделенный текст, не надо удалять текст который уже есть в поле текстового ввода мой код заменяет его и выделенный текст на странице искать удобно. Но можно нажимать на кнопку поиска  на FindBar mini средним кликом.

так ты попробуй кликнуть прям в текстовое поле - срабатывает так же, а значит и отступ не нужен.

Infocatcher пишет:

А какие там нужны примеры?
Надо создать <menuitem type="checkbox" /> или <menuitem type="radio" /> и при обработке события command от пункта меню проверять menuitem.getAttribute("checked") == "true" (атрибут checked будет переключаться автоматически). Ну, и при чтении настроек делать menuitem.setAttribute("checked", someValueFromPrefs).

<menuitem type="checkbox" /> или <menuitem type="radio" /> у меня не будет работать, у меня меню по другому построено.

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

Выделить код

Код:

//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label; 
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Очищать поле текстового ввода на Findbar при закрытии.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label; 
if(mi) mi.label = label;
};

//Автовыделение, добавить текст(Auto Highlight, add text)..... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
//пункт меню(menuitems)
var label = 'Добавить текст'
this.PrefValue = label;
if(mi) mi.label = label;
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
//пункт меню(menuitems)
var label = ClearPref;
this.ClearPref = label;
if(mi) mi.label = label;
};

//Findbar, переклучить атрибут 'autohide'.................................
function autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
  };
//Запускаем функции f_autohide 
setTimeout(function() {autohide(event);}, 200)

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: ''},
  { cek: '', label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:''},
  { cek: this.aCcek, label: 'Очищать поле текстового ввода', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:''},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:''},
  { label: "separator", sItemId: ''},
  { cek: this.AHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: ''},
  { cek: '', label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { cek: '', label: this.PrefValue, cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { lcek: '', label: this.ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    mItem.setAttribute( 'type','checkbox')
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
     //Стиль меню......
    var CCsubCall = document.getElementById("custombuttons-contextpopup-subCall");
    CCsubCall.setAttribute("style", "margin-left: 2px;");
     //
    var CCsubCall = document.getElementById("custombuttons-contextpopup-sub");
    CCsubCall.setAttribute("style", "margin-left: 2px;");
    
    //mItem.setAttribute("style", "margin-left: -14px;");
  }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


Я добавил в код

Выделить код

Код:

mItem.setAttribute( 'type','checkbox')
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)

и атрибут checked теперь переключаться автоматически + сделал проверку настроек при инициализации кнопки. Но есть проблема не всем пунктам меню нужен чекбокс.

Подскажи что делать с пунктами меню которым не нужен чекбокс, которые открывают модальние окна??

iDev.Pi пишет:

можно. но а если выделение на странице где-то было, ты потом переключился на другую вкладку, забыл про выделение и вернулся обратно?
просто хочется настройку, чтобы это можно было отключить, т.к. стандартный файндбар такого поведения не имеет

Сделаю.

iDev.Pi пишет:

в общем ладно, хрен с моим стилем - я тогда прошу тебя внести в свой стиль некоторые изменения:
1. добавить кнопки вперёд-назад для тех, кто у кого нет колеса на мыши.
2. переделать кнопку из background: url("base64_image") в list-style-image: url("base64_image"); -moz-image-region: auto; чтобы она выглядела по-человечески, особенно при наведении на неё курсором
3. удалить ненужный отступ слева (добавить к правилу display:none такой вот селектор - #FindToolbar[mini] toolbarspacer )

Хорошо, мы договорились.

iDev.Pi пишет:

так ты попробуй кликнуть прям в текстовое поле - срабатывает так же, а значит и отступ не нужен.

Это не считается, у тебя какое то расширение это делает.

bunda1 пишет:

Подскажи что делать с пунктами меню которым не нужен чекбокс, которые открывают модальние окна??

Переписать создание меню :D

Выделить код

Код:

{ cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},

То есть добавить type:'checkbox'.
И при создании меню

Выделить код

Код:

mItem.setAttribute( 'type','checkbox')

заменить на

Выделить код

Код:

if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);

bunda1 пишет:

Это не считается, у тебя какое то расширение это делает.

неа, это твоя кнопка так умеет:
запустил чистый профиль, установил Custom Buttons и твою кнопку.
1. Открываю файндбар (мини)
2. Вписываю в него что-то
3. Копирую какой-то текст в буфер
4. Мидл-кликаю по текстовому полю в файндбаре

Результат: введённый ранее текст ЗАМЕНЯЕТСЯ текстом из буфера.
Я так понимаю это из-за

Выделить код

Код:

this.onclick = function(event)
{
...
  else if(event.button == 1) 
         {
...
        goDoCommand("cmd_paste"); 
         }
};

11-03-2012 21:31:15
И да, сразу после установки твоей кнопки - происходит баг: при закрытии панели на странице автоматически подсвечивается слово Firefox.
Это из-за

Выделить код

Код:

prefs.setCharPref("FindBar.Highlight.value", "Firefox");

Infocatcher
Ты не поверишь но все работает.
Безграничная благодарность тебе, ты просто гений.

11-03-2012 21:47:23

iDev.Pi пишет:

неа, это твоя кнопка так умеет:

Я конечно это знал но решил тебя проверить Да смешно получилось что я не заметил как это появилось.

iDev.Pi пишет:

Я так понимаю это из-за

Нет, это из-за

Выделить код

Код:

gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        if (custombuttons.getPrefs("FindBar.Highlight")){ Highlight(event) };
        gFindBar.onFindAgainCommand(event.detail = 0);
}, true);

iDev.Pi пишет:

И да, сразу после установки твоей кнопки - происходит баг: при закрытии панели на странице автоматически подсвечивается слово Firefox.
Это из-за

Выделить код

Код:

prefs.setCharPref("FindBar.Highlight.value", "Firefox");

Да из-за этого.
Это не баг, так задумано но я уберу.

bunda1 пишет:

mserv пишет:

Заметил, что лупа не работает при большом количестве найденных результатов на странице.

Теперь лупа не работает, если в слове меньше четырёх букв и включить Автовыделение. В этом случае и само Автовыделение не работает, меняется только цвет иконки, а слово не выделяется и не появляется точка в меню кнопки.

mserv
Спасибо, завтра исправлю.

iDev.Pi пишет:

bunda1 пишет:

   

Если кликнуть средним кликом на Findbar или FindBar mini, то текст в поле текстового ввода на Findbar будет заманен текстом из буфера или на выделенный текст, не надо удалять текст который уже есть в поле текстового ввода мой код заменяет его и выделенный текст на странице искать удобно. Но можно нажимать на кнопку поиска  на FindBar mini средним кликом.

так ты попробуй кликнуть прям в текстовое поле - срабатывает так же, а значит и отступ не нужен.

При СКМ в текстовое поле не происходит замены текста из буфера, поэтому я тоже считаю, что отступ слева нужен, но не такой большой и можно по цифре кликать.
Проверил на чистом профиле, действительно замещает.  Видно с чем-то конфликтует, подозреваю с Autocopy+3, но не проверял.

mserv
1.Да, Toggle Find+3 конфликтует с Autocopy+3, я исправил это(мне кажется),
2. Я изменил внешний вид пунктов в контекстном меню, заменил точки чекбоксамы,
3. Исправил проблемы с двойным мидл-кликом.

Теперь лупа не работает, если в слове меньше четырёх букв и включить Автовыделение. В этом случае и само Автовыделение не работает, меняется только цвет иконки, а слово не выделяется и не появляется точка в меню кнопки.

Исправил.

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение' 
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'

 
//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '...' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");



//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Очищать поле текстового ввода на Findbar при закрытии.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//Findbar, переклучить атрибут 'autohide'......
function autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поле текстового ввода', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, установить и удалить атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttonsUtils.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
HighBut.setAttribute("tooltiptext", "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = Очистить поле текстового ввода");
}
else
{
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
gFindBar._findField.style.color = "black";
}
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);

  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);


//Очистить поле текстового ввода на Findbar при закрытии..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
if (custombuttonsUtils.getPrefs("FindBar.autoclear")){gFindBar._findField.reset()};
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
//Стоп, при открытии настройки панелей(stop, if onDestroy)
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//переключить 'Поиск на странице'
//если установлен флаг
if (_this.open){ 
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;

//сбросить флаг по таймеру
this.timer = 0;
        this.timer = setTimeout(function() {
         _this.open = false;
        }, 400);
}, false);



//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   Find(event);
   }
 else if ( event.button == 2 )
   {
   gFindBar._findField.reset();
   gFindBar.onFindAgainCommand(false);
   //....
   var findToolbar = document.getElementById("FindToolbar");
   findToolbar.removeAttribute("red");
   //...
   gFindBar._findField.focus();
   //....
   gFindBar._highlightDoc(false);
}
  };
       
        
   
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("mousedown", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //переключить кнопку 'Highlight'
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
      
//FindBar, автоматически закрыть(autohide Findbar).................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
function go() {
  gFindBar.close();
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (gFindBar.hidden) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  gFindBar.addEventListener('mouseover',off, false); 
  gFindBar.addEventListener("DOMAttrModified", Modoff, false);
  }
function Modoff() {
  if (!gFindBar.hidden){
  off();
  }
    };
function off() {
  window.ACRun = '';
  gFindBar.removeEventListener('mouseover',Modoff, false); 
  gFindBar.removeEventListener("DOMAttrModified", off, false);
  clearTimeout(timeoutId);
  }
gBrowser.addEventListener('mouseover',on, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!highlightBtn.checked)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._highlightDoc(true, gFindBar._findField.value);
//..
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
highlightBtn.removeAttribute("checked");
gFindBar._highlightDoc(false);
//..
gFindBar._findField.style.color = "black";
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!highlightBtn.checked)
     {
     gFindBar._findField.style.color = "black";
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Найти на странице.................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar.onFindAgainCommand(event.detail = 0);
};
        

//Добавить текст(выделенный / из буфера обмена) для автовыделения.....................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);


 
// FindToolbar стиль(style).......................................................................
var but = "#" +this.id;
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 


#FindToolbar[mini="true"] toolbarbutton.findbar-highlight.tabbable, #FindToolbar[mini="true"] toolbarbutton.findbar-highlight.tabbable[checked="true"]{
   -moz-appearance: none !important;
   list-style-image: none !important;
   background: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") center no-repeat !important; 
   border: 1px solid rgba(0,0,0,0.3) !important;
   height:21px !important;}

#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
  
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}

#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;
   margin-left:-3px !important}
   
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;
}  
]]>.toString());

//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1
новый баг в последней версии: не всегда при открытии файндбара он берёт фокус на себя. Иногда он открывается без фокуса.

iDev.Pi пишет:

новый баг в последней версии: не всегда при открытии файндбара он берёт фокус на себя. Иногда он открывается без фокуса.

Не подтверждаю.

3. Исправил проблемы с двойным мидл-кликом.

Ещё одна вылезла. Вставляем СКМ слово, очищаем текстовое поле, вставляем это же слово из буфера повторно, получаем сразу два слова.

mserv
такое чувство, что просто вставка срабатывает при onmousedown и onmouseup

iDev.Pi пишет:

новый баг в последней версии: не всегда при открытии файндбара он берёт фокус на себя. Иногда он открывается без фокуса.

У меня нет. Что ты нажимал.

mserv пишет:

Ещё одна вылезла. Вставляем СКМ слово, очищаем текстовое поле, вставляем это же слово из буфера повторно, получаем сразу два слова.

Это я не удачно питался заблокировать Autocopy+3 и middlemouse.paste для поле текстового ввода на Findbar. Может поиск по странице из буфера обмена запускать средним кликом только на кнопку поиска на FindBar mini или на Findbar?

bunda1 пишет:

Что ты нажимал.

я выяснил STR к багу:
0. включить настройку "Очищать поле текстового ввода"
1. ctrl+f - панель откроется.
2. вписать что-то.
3. ctrl+f - панель закроется.
4. ctrl+f - панель открывается, но уже без фокуса в ней.

Ого. Да это уже фактически серьезное дополнение. Спс автору.

Могу подкинуть идею. Сделать поле скролируемым. Т.е. наводишь мыша на поле и крутишь колесо. Если текст большой происходит прокрутка. Можно попопробовать сделать это стилем через overflow   (сам элемент скрол, полосу скрыть стилем).

И еще если возможно поле ресайзящимся, тоже сиилем через resize.

16-03-2012 10:34:35
Былобы отлично запихнуть кнопку в jetpack

Mr.Rik пишет:

Могу подкинуть идею. Сделать поле скролируемым. Т.е. наводишь мыша на поле и крутишь колесо. Если текст большой происходит прокрутка. Можно попопробовать сделать это стилем через overflow   (сам элемент скрол, полосу скрыть стилем).

Можно скролить лупу

16-03-2012 16:21:54

bunda1 пишет:

Может поиск по странице из буфера обмена запускать средним кликом только на кнопку поиска на FindBar mini или на Findbar?

Да без проблем, я и не знал о другой возможности, пока iDev.Pi не указал.  Просто раз нашёл баг, то и решил сообщить. :)

iDev.Pi пишет:

Баги:
3. Невозможно пользоваться mini на девайсах без колеса прокрутки.

Теперь L=Назад(back) R= Вперёд(Forward) на лупе если в настройках включена Кнопка - очистить

iDev.Pi пишет:

Мне бы хотелось, чтобы это можно было настройкой, т.е. чтобы я мог отключить эту функцию и было так:
1. выделить на странице какое-то слово
2. нажать ctrl+F
то будет такой результат:
файндбар открывается ЧИСТЫМ.

Я сделал.

iDev.Pi пишет:

в общем ладно, хрен с моим стилем - я тогда прошу тебя внести в свой стиль некоторые изменения:
2. переделать кнопку из background: url("base64_image") в list-style-image: url("base64_image"); -moz-image-region: auto; чтобы она выглядела по-человечески, особенно при наведении на неё курсором
3. удалить ненужный отступ слева (добавить к правилу display:none такой вот селектор - #FindToolbar[mini] toolbarspacer )

Я сделал.

Код экспериментальной кнопки  Toggle  Find+3- для инициализации:

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение' 
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");



//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.ClearButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'очистить'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.ClearButton";
togglePref(s);
//Запускаем функции ClearButton и fmini(run ClearButton, fmini)
if (id) ClearButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FCBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FCBcek, label: 'Кнопка - очистить', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поле текстового ввода', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttonsUtils.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var Rtext = custombuttons.getPrefs("FindBar.ClearButton") ? "Искать предыдущее" : "Очистить поле текстового ввода";
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = " + Rtext;
HighBut.setAttribute("tooltiptext", text );
}
else
{
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
gFindBar._findField.style.color = "black";
}
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'ClearButton'......
function ClearButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.ClearButton") ? ft.setAttribute("ClearButton", "true") : ft.removeAttribute("ClearButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);Autohide(event);ClearButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 400);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) reset;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   Find(event);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
  //Запускаем функцию findFieldClear или искать предыдущее
  custombuttons.getPrefs("FindBar.ClearButton") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };
       
        
   
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
      
//FindBar, автоматически закрыть(autohide Findbar).................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
function go() {
  gFindBar.close();
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (gFindBar.hidden) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  gFindBar.addEventListener('mouseover',off, false); 
  gFindBar.addEventListener("DOMAttrModified", Modoff, false);
  }
function Modoff() {
  if (!gFindBar.hidden){
  off();
  }
    };
function off() {
  window.ACRun = '';
  gFindBar.removeEventListener('mouseover',Modoff, false); 
  gFindBar.removeEventListener("DOMAttrModified", off, false);
  clearTimeout(timeoutId);
  }
gBrowser.addEventListener('mouseover',on, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!highlightBtn.checked)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._highlightDoc(true, gFindBar._findField.value);
//..
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
highlightBtn.removeAttribute("checked");
gFindBar._highlightDoc(false);
//..
gFindBar._findField.style.color = "black";
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!highlightBtn.checked)
     {
     gFindBar._findField.style.color = "black";
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar.onFindAgainCommand(event.detail = 0);
};

        
//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
gFindBar.onFindAgainCommand(false);
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar._findField.focus();
//....
gFindBar._highlightDoc(false);
};


//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Clear" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "ClearButton");
btn.setAttribute("tooltiptext", "L = Очистить поле текстового ввода");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event)
{
  if ( event.button != 0 ) return;
 //Запускаем функцию findFieldClear
  findFieldClear(event);
}, false);


 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([ClearButton="true"]) #ClearButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 


#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}

#ClearButton{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etXHgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEWsQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAAYgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoACCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMyMvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITjH6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF") !important;
    -moz-image-region: auto !important;
    margin-right: 1px!important;}    
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #ClearButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());


//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1 пишет:

Теперь L=Назад(back) R= Вперёд(Forward) на лупе если в настройках включена Кнопка - очистить

Спасибо, это конечно работает, но если честно, вся эта экономии нескольких пикселей не стоит тех ухищрений, на которые пришлось пойти.
Тем не менее, такой вариант меня удовлетворяет.

bunda1 пишет:

переделать кнопку из background: url("base64_image") в list-style-image: url("base64_image"); -moz-image-region: auto; чтобы она выглядела по-человечески, особенно при наведении на неё курсором

Я сделал.

Странно, у меня в стиле после этого кнопка выглядит как кнопка, а у тебя даже после исправления - как фоновая картинка: при наведении на кнопку почему-то не появляется свойственная всем кнопкам рамочка. Попозже посмотрю в чём там дело.

bunda1 пишет:

Мне бы хотелось, чтобы это можно было настройкой, т.е. чтобы я мог отключить эту функцию и было так:
    1. выделить на странице какое-то слово
    2. нажать ctrl+F
    то будет такой результат:
    файндбар открывается ЧИСТЫМ.

Я сделал.

Спасибо, работает. Я правда думал, что ты сделаешь эти 2 настройки отдельными друг от друга ("Очищать поле текстового ввода" и "автоматически искать выделенное при открытии поиска"), хотя лично меня это удовлетворяет, так как у меня всё равно выставлена галка "очищать поле текстового ввода".



Кстати, а можно переформулировать некоторые вещи? Это конечно мелочи, но ведь дьявол в мелочах...
Очень непонятно из названий некоторых настроек то, что они делают.
Проблема ещё в том, что кратко объяснить что они делают - тоже тяжело, возможно стоит добавить подсказки при наведении на них? И в подсказки вписать, например:
"Очищать поле текстового ввода" переименовать в "Очищать поисковую форму" и добавить подсказку: "Всегда открывать панель поиска только с пустой поисковой формой". "Поисковая форма" - это такой устоявшийся термин.
"Автоматически закрыть".
"Автовыделение" - "Автоматически подсвечивать найденное" - в русской локализации лисы "highlight" перевели не как "выделение" (что было бы более уместно, ведь маркер, которым текст в тетради выделяют - в английском называют "highlighter (pen)" и он "highlights", а в русском он называется "выделитель" и он "выделяет", а не "подсвечивает"), а как "подсветку", поэтому для консистентности предлагаю использовать такой же перевод (это мнение вслух, я на нём не настаиваю). + Подсказку сюда можно добавить

К "Переключать двойным средним кликом" нужно пояснение типа: "Открывать и закрывать панель поиска двойным кликом средней кнопкой мыши", т.к. не очень очевидно значение слова "переключать" (это в английском "toggle" имеет более очевидное значение: переключение чего-то между его возможными состояниями). Т.к. хоть немного более точного перевода одним словом "toggle" в этом случае, кажется, нет, то предлагаю его так и оставить, т.к. замена на "Открывать/закрывать" слишком долго, а "Откр./Закр." выглядит убого.

21-03-2012 01:51:41
обновил список

iDev.Pi пишет:

Странно, у меня в стиле после этого кнопка выглядит как кнопка, а у тебя даже после исправления - как фоновая картинка: при наведении на кнопку почему-то не появляется свойственная всем кнопкам рамочка. Попозже посмотрю в чём там дело.

Очень хорошо.

iDev.Pi пишет:

Очень непонятно из названий некоторых настроек то, что они делают.

Да согласен, и потому думаю позже сделать подробное описание настроек кнопки в 09-03-2012 19:18:31

iDev.Pi пишет:

Проблема ещё в том, что кратко объяснить что они делают - тоже тяжело, возможно стоит добавить подсказки при наведении на них?

Мысль хорошая, но для этого есть описание кнопки где это все будет более подробно и если честно не хочется загромождать код кнопки. За подсказки спасыбо, использую их при описание настроек кнопки.

iDev.Pi пишет:

"Очищать поле текстового ввода" переименовать в "Очищать поисковую форму"

ok

iDev.Pi пишет:

"Автовыделение" - "Автоматически подсвечивать найденное"

ok

iDev.Pi пишет:

Баги:
2. Auto Highlight иногда начинает подсвечивать искомые слова на странице даже если панель поиска уже закрыта.
3. Иногда файндбар открывается не перенимая на себя фокус.

У меня не наблюдается. :(

bunda1 пишет:

Мысль хорошая, но для этого есть описание кнопки где это все будет более подробно и если честно не хочется загромождать код кнопки. За подсказки спасыбо, использую их при описание настроек кнопки.

Ок, особенно если потом это всё осядет в разделе "help" у кнопки.


bunda1 пишет:

iDev.Pi пишет:

3. Иногда файндбар открывается не перенимая на себя фокус.

У меня не наблюдается. :(

Я уже писал STR:

iDev.Pi пишет:

я выяснил STR к багу:
0. включить настройку "Очищать поле текстового ввода"
1. ctrl+f - панель откроется.
2. вписать что-то.
3. ctrl+f - панель закроется.
4. ctrl+f - панель открывается, но уже без фокуса в ней.

у тебя и после выполнения этих шагов баг не воспроизводится?
просто у меня он воспроизводится стабильно, и в предыдущей версии тоже был.
надо тогда собирать дальше информацию: у меня [nightly], а у тебя? (неужто старый 3.6?)


bunda1 пишет:

iDev.Pi пишет:

2. Auto Highlight иногда начинает подсвечивать искомые слова на странице даже если панель поиска уже закрыта.

У меня не наблюдается. :(

Баг происходит не всегда. Попробую и для него STR вычислить.

iDev.Pi пишет:

Странно, у меня в стиле после этого кнопка выглядит как кнопка, а у тебя даже после исправления - как фоновая картинка: при наведении на кнопку почему-то не появляется свойственная всем кнопкам рамочка. Попозже посмотрю в чём там дело.

Ничего не трогал и у меня сам собой исчез этот баг. Магия какая-то :-/

Edit: ааа, понял: я ошибся, когда этот баг описывал - на самом деле всё в порядке, кнопка не имеет рамку, если в форму поиска ничего не вписано (соответственно, нечего искать, а значит и кнопка неактивна).
Меня смутило то, что она неактивная выглядит так же как и активная, это можно исправить, добавив ей, например, прозрачности.
Или ещё и обесцветив её, что мне больше нравится. Вот код для обесцвечивания + полупрозрачности:

Выделить код

Код:

#FindToolbar[mini] .findbar-highlight[disabled] {
    opacity: 0.3 !important;
    filter: url("chrome://mozapps/skin/extensions/extensions.svg#greyscale") !important; }

iDev.Pi пишет:

0. включить настройку "Очищать поле текстового ввода"
1. ctrl+f - панель откроется.
2. вписать что-то.
3. ctrl+f - панель закроется.
4. ctrl+f - панель открывается, но уже без фокуса в ней.
у тебя и после выполнения этих шагов баг не воспроизводится?
просто у меня он воспроизводится стабильно, и в предыдущей версии тоже был.
надо тогда собирать дальше информацию: у меня [nightly], а у тебя? (неужто старый 3.6?)

Да есть такой баг, буду исправлять. Кнопку я обычно проверяю на nightly но тут наверно что то напутал.


iDev.Pi пишет:

Или ещё и обесцветив её, что мне больше нравится. Вот код для обесцвечивания + полупрозрачности:

ok

iDev.Pi пишет:

Ок, особенно если потом это всё осядет в разделе "help" у кнопки.

ok

21-03-2012 23:19:09

iDev.Pi пишет:

Иногда файндбар открывается не перенимая на себя фокус.

Исправил.

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автоматически подсвечивать найденное' 
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");


//справка(Help)
this.setAttribute("Help", 'https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31');


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.ClearButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'очистить'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.ClearButton";
togglePref(s);
//Запускаем функции ClearButton и fmini(run ClearButton, fmini)
if (id) ClearButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FCBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FCBcek, label: 'Кнопка "очистить"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttonsUtils.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var Rtext = custombuttons.getPrefs("FindBar.ClearButton") ? "Искать предыдущее" : "Очистить поле текстового ввода";
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = " + Rtext;
HighBut.setAttribute("tooltiptext", text );
}
else
{
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
gFindBar._findField.style.color = "black";
}
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'ClearButton'......
function ClearButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.ClearButton") ? ft.setAttribute("ClearButton", "true") : ft.removeAttribute("ClearButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);Autohide(event);ClearButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) reset;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   Find(event);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
  //Запускаем функцию findFieldClear или искать предыдущее
  custombuttons.getPrefs("FindBar.ClearButton") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };
       
        
   
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
      
//FindBar, автоматически закрыть(autohide Findbar).................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
function go() {
  gFindBar.close();
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (gFindBar.hidden) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  gFindBar.addEventListener('mouseover',off, false); 
  gFindBar.addEventListener("DOMAttrModified", Modoff, false);
  }
function Modoff() {
  if (!gFindBar.hidden){
  off();
  }
    };
function off() {
  window.ACRun = '';
  gFindBar.removeEventListener('mouseover',Modoff, false); 
  gFindBar.removeEventListener("DOMAttrModified", off, false);
  clearTimeout(timeoutId);
  }
gBrowser.addEventListener('mouseover',on, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!highlightBtn.checked)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._highlightDoc(true, gFindBar._findField.value);
//..
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
highlightBtn.removeAttribute("checked");
gFindBar._highlightDoc(false);
//..
gFindBar._findField.style.color = "black";
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!highlightBtn.checked)
     {
     gFindBar._findField.style.color = "black";
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar.onFindAgainCommand(event.detail = 0);
};

        
//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
gFindBar.onFindAgainCommand(false);
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar._findField.focus();
//....
gFindBar._highlightDoc(false);
};


//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Clear" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "ClearButton");
btn.setAttribute("tooltiptext", "L = Очистить поле текстового ввода");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event)
{
  if ( event.button != 0 ) return;
 //Запускаем функцию findFieldClear
  findFieldClear(event);
}, false);


 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([ClearButton="true"]) #ClearButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 


#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
#FindToolbar[mini] .findbar-highlight[disabled] {
    filter: url("chrome://mozapps/skin/extensions/extensions.svg#greyscale") !important; }    

#ClearButton{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etXHgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEWsQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAAYgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoACCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMyMvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITjH6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF") !important;
    -moz-image-region: auto !important;
    margin-right: 1px!important;}    
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #ClearButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());


//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1 пишет:

Исправил.

Подтверждаю.
p.s.: добавь всё-таки

Выделить код

Код:

opacity: 0.3 !important;

к неактивной кнопке, так лучше выглядит.

iDev.Pi пишет:

[
p.s.: добавь всё-таки

Выделить код

Код:

opacity: 0.3 !important;

к неактивной кнопке, так лучше выглядит.

Нет, на кнопке можно нажимать СКМ, а прозрачная кнопка водит в заблуждение.

Я пожалуй сформулирую ещё один баг, хотя ты, скорей всего, не согласишься со мной, что это баг:

Твоя кнопка всегда выполняет действие "найти", т.е. совсем всегда, даже когда пользователь этого не ожидает.
Такое поведение приносит некий дискомфорт:
Случай 1.
Если ты что-то искал на одной странице и не закрыл за собой панель поиска (т.к. ты надеешься, что он сам закроется по истечению таймера), то ты вовсе не ожидаешь, что переключившись на другую вкладку, страница автоматически прокрутится докуда-то донизу, т.к. при переключении вкладки - панель поиска выполнит действие "найти", и найденный на странице поисковый запрос может оказаться где-то внизу, а потому и страница будет прокручена до того момента.

Случай 2.
Открывая-закрывая панель (если не включена настройка "Очищать поисковую форму") - при каждом повторном открытии происходит переход к следующему найденному на странице варианту, а не будь этого бага - я бы даже и не заметил тот:

iDev.Pi пишет:

1. Иногда искомое может измениться с верхнего на нижний регистр (и наоборот). Подробности в отдельном сообщении.

21-03-2012 23:47:02

bunda1 пишет:

Нет, на кнопке можно нажимать СКМ, а прозрачная кнопка водит в заблуждение.

так она неактивна только тогда, когда в поисковую форму ничего не вписано, а значит СКМ можно кликать прям на эту текстовую форму.
Ну да ладно, это мелочь на самом деле. Тем более, что себе-то я эту строку дописал :)

iDev.Pi пишет:

Если ты что-то искал на одной странице и не закрыл за собой панель поиска (т.к. ты надеешься, что он сам закроется по истечению таймера), то ты вовсе не ожидаешь, что переключившись на другую вкладку, страница автоматически прокрутится докуда-то донизу, т.к. при переключении вкладки - панель поиска выполнит действие "найти", и найденный на странице поисковый запрос может оказаться где-то внизу, а потому и страница будет прокручена до того момента.

Это же галимый баг, но у меня не наблюдается. :(

iDev.Pi пишет:

Открывая-закрывая панель (если не включена настройка "Очищать поисковую форму") - при каждом повторном открытии происходит переход к следующему найденному на странице варианту, а не будь этого бага - я бы даже и не заметил тот:

Так задумано но я попробую исправить.

iDev.Pi пишет:

так она неактивна только тогда, когда в поисковую форму ничего не вписано, а значит СКМ можно кликать прям на эту текстовую форму.
Ну да ладно, это мелочь на самом деле. Тем более, что себе-то я эту строку дописал

Как дабавыть рамку к неактывной?

bunda1 пишет:

Как дабавыть рамку к неактывной?

так у неактивной не должно быть рамки. Я даже не знаю код для добавления рамки, т.к. он где-то внутри лисы прописан. В ДОМи глянул - между состояниями обычным и :hover - разница лишь в цвете рамки (в обычном состоянии - она прозрачная). Попробовал выставить ей цвет через stylish - никакого результата. То ли рестарт просто нужен, то ли - я даже не знаю в чём дело.

iDev.Pi пишет:

Если ты что-то искал на одной странице и не закрыл за собой панель поиска (т.к. ты надеешься, что он сам закроется по истечению таймера), то ты вовсе не ожидаешь, что переключившись на другую вкладку, страница автоматически прокрутится докуда-то донизу, т.к. при переключении вкладки - панель поиска выполнит действие "найти", и найденный на странице поисковый запрос может оказаться где-то внизу, а потому и страница будет прокручена до того момента.

У меня не наблюдается, нужен пример.

bunda1
хм, и правда бага такого нет. Описал ситуацию не проверив.
Однако поиск всё равно всегда выполняется: если включить таймер закрытия панели, открыть панель поиска, ввести что-то в поиск и начать постоянное переключение между вкладками - поиск не закроется никогда, хотя фактически пользователь уже давно ничего не ищет, а занят другими делами (чтением разных страниц).

iDev.Pi
Таймер запускается если курсор на странице

Выделить код

Код:

gBrowser.addEventListener('mouseover'.........

попробую исправить.

iDev.Pi пишет:

Однако поиск всё равно всегда выполняется: если включить таймер закрытия панели, открыть панель поиска, ввести что-то в поиск и начать постоянное переключение между вкладками - поиск не закроется никогда, хотя фактически пользователь уже давно ничего не ищет, а занят другими делами (чтением разных страниц).

iDev.Pi пишет:

Открывая-закрывая панель (если не включена настройка "Очищать поисковую форму") - при каждом повторном открытии происходит переход к следующему найденному на странице варианту, а не будь этого бага - я бы даже и не заметил тот:

Я исправил.

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автоматически подсвечивать найденное' 
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");


//справка(Help)
//this.setAttribute("Help", "event.stopPropagation(); gBrowser.selectedTab = gBrowser.addTab('https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31')");


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.ClearButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'очистить'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.ClearButton";
togglePref(s);
//Запускаем функции ClearButton и fmini(run ClearButton, fmini)
if (id) ClearButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FCBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FCBcek, label: 'Кнопка "очистить"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttons.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
highlightBtn.removeAttribute("checked");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var Rtext = custombuttons.getPrefs("FindBar.ClearButton") ? "Искать предыдущее" : "Очистить поле текстового ввода";
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = " + Rtext;
HighBut.setAttribute("tooltiptext", text );
}
else
{
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
if (!!gFindBar._findField.style.color)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._findField.removeAttribute("style");
}
 }
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'ClearButton'......
function ClearButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.ClearButton") ? ft.setAttribute("ClearButton", "true") : ft.removeAttribute("ClearButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);Autohide(event);ClearButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) reset;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Искать следующее
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Запускаем функцию findFieldClear или искать предыдущее
   custombuttons.getPrefs("FindBar.ClearButton") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };
       
        
   
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
   
//FindBar, автоматически закрыть(autohide Findbar).................................      
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
function go() {
  gFindBar.close();
  window.ACRun = '';
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = 0;
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  }
function off() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  window.ACRun = '';
  clearTimeout(timeoutId);
  }  
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden) off() }, false);  
addEventListener('mouseover', function(event){ if (!gFindBar.hidden) (event.target.nodeName !== 'findbar')? on(): off() }, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!gFindBar._findField.style.color)
{
gFindBar._highlightDoc(true, gFindBar._findField.value);
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
gFindBar._highlightDoc(false);
gFindBar._findField.removeAttribute("style");
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!!gFindBar._findField.style.color)
     {
     gFindBar._findField.removeAttribute("style");
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Если нажать в главном меню Firefox на пункт меню 'Найти'.............................................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(); Find(event);");


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar._find(gFindBar._findField.value);
};

        
//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
gFindBar.onFindAgainCommand(false);
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar._findField.focus();
//....
gFindBar._highlightDoc(false);
};


//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Clear" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "ClearButton");
btn.setAttribute("tooltiptext", "L = Очистить поле текстового ввода");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event)
{
  if ( event.button != 0 ) return;
 //Запускаем функцию findFieldClear
  findFieldClear(event);
}, false);


 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([ClearButton="true"]) #ClearButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 


#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
    
   
#FindToolbar[mini] .findbar-highlight[disabled="true"]:hover{
-moz-appearance: none !important;
-moz-border-image: url("data:image/png;base64,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") 3 / 3px stretch stretch  !important;
padding: 2px 2px 1px 2px !important;}
    

#ClearButton{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etXHgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEWsQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAAYgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoACCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMyMvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITjH6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF") !important;
    -moz-image-region: auto !important;
    margin-right: 1px!important;}    
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #ClearButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());


//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1 пишет:

Я исправил.

Подтверждаю, спасибо.

23-03-2012 04:33:34
Ты всё-таки решил зачем-то добавить рамку к кнопке для состояния, когда она не нажимается.
Теперь при наведении на эту кнопку в таком состоянии - панель сдвигается на 1 пиксель вверх.

iDev.Pi пишет:

Ты всё-таки решил зачем-то добавить рамку к кнопке для состояния, когда она не нажимается.
Теперь при наведении на эту кнопку в таком состоянии - панель сдвигается на 1 пиксель вверх.

У меня нет.

bunda1 пишет:

У меня нет.

Тут понадобится подтверждение/опровержение от 3-ьего лица.
Я лично с этим багом проблем не имею, т.к. восстановил стиль из предыдущей версии кнопки.

iDev.Pi пишет:

панель сдвигается на 1 пиксель вверх.

Если речь идет про это http://rghost.ru/37171617, то да, по сравнению с предыдущей версией кнопки, появился сдвиг.

klaus65 пишет:

Если речь идет про это http://rghost.ru/37171617, то да, по сравнению с предыдущей версией кнопки, появился сдвиг.

Спасыбо.
Да, на видео ясно видно что сдвиг есть. Мистика, у меня нет такого. Придется убрать рамку от кнопки поиска. Эх :(.

Код экспериментальной кнопки  Toggle  Find+3- для инициализации:

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение'
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");


//справка(Help)
//this.setAttribute("Help", "event.stopPropagation(); gBrowser.selectedTab = gBrowser.addTab('https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31')");


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.ClearButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'очистить'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.ClearButton";
togglePref(s);
//Запускаем функции ClearButton и fmini(run ClearButton, fmini)
if (id) ClearButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FCBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FCBcek, label: 'Кнопка "очистить"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttons.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
highlightBtn.removeAttribute("checked");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var Rtext = custombuttons.getPrefs("FindBar.ClearButton") ? "Искать предыдущее" : "Очистить поле текстового ввода";
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = " + Rtext;
HighBut.setAttribute("tooltiptext", text );
}
else
{
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
if (!!gFindBar._findField.style.color)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._findField.removeAttribute("style");
}
 }
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'ClearButton'......
function ClearButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.ClearButton") ? ft.setAttribute("ClearButton", "true") : ft.removeAttribute("ClearButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);Autohide(event);ClearButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) reset;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Искать следующее
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Запускаем функцию findFieldClear или искать предыдущее
   custombuttons.getPrefs("FindBar.ClearButton") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };


//кнопка 'Highlight' на FindBar.mini всегда включена...................................................................      
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
highlightBtn.addEventListener("mouseover", function(event){
if (custombuttons.getPrefs("FindBar.mini"))
{
highlightBtn.setAttribute("disabled", "false")
}
 }, false);  
 
 
    
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
   
//FindBar, автоматически закрыть(autohide Findbar).................................      
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
function go() {
  gFindBar.close();
  window.ACRun = '';
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = 0;
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  }
function off() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  window.ACRun = '';
  clearTimeout(timeoutId);
  }  
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden) off() }, false);  
addEventListener('mouseover', function(event){ if (!gFindBar.hidden) (event.target.nodeName !== 'findbar')? on(): off() }, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!gFindBar._findField.style.color)
{
gFindBar._highlightDoc(true, gFindBar._findField.value);
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
gFindBar._highlightDoc(false);
gFindBar._findField.removeAttribute("style");
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!!gFindBar._findField.style.color)
     {
     gFindBar._findField.removeAttribute("style");
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Если нажать в главном меню Firefox на пункт меню 'Найти'.............................................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(); Find(event);");


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar._find(gFindBar._findField.value);
};

        
//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
gFindBar.onFindAgainCommand(false);
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar._findField.focus();
//....
gFindBar._highlightDoc(false);
};


//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Clear" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "ClearButton");
btn.setAttribute("tooltiptext", "L = Очистить поле текстового ввода");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event)
{
  if ( event.button != 0 ) return;
 //Запускаем функцию findFieldClear
  findFieldClear(event);
}, false);


 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([ClearButton="true"]) #ClearButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 

    
#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
 
    

#ClearButton{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etXHgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEWsQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAAYgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoACCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMyMvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITjH6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF") !important;
    -moz-image-region: auto !important;
    margin-right: 1px!important;}    
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #ClearButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());

//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1
1. Кнопка очистить лишняя. ИМХО. Было бы логично совместить её с цифрой количества совпадений.
2. Средний клик в строке вставляет ещё одно слово, не происходит замещения.
3. Двойной клик в строке писка включает автовыделение, но повторный двойной клик автовыделение не отключает.
И включенное таким способом автовыделение не сохраняется при закрытие-открытие строки поиска. Просьба, если возможно, сделать чтобы включение автовыделения через строку поиска было бы полностью аналогичным через контекстное меню кнопки.

voqabuhe
1. Т.е. ты предлагаешь пожертвовать очевидной для всех кнопкой переместив её в не очевидное место и всё это ради экономии ~20 пикселей в длину? По-моему, оно того не стоит.
2. Так надо кликать не на строку, а на кнопку поиска. Либо сначала двойной клик ЛКМ по полю, а потом уже СКМ.
3. Отменяет одинарный, а не двойной. И это во всё браузере так: хоть в адресной строке проверь.
4. Надо снять галку "Очищать поисковую форму", чтобы при повторном открытии панели - в ней остался предыдущий поисковой запрос.

iDev.Pi
1. Я предлагаю, если снять галку в меню кнопки Кнопка «очистить»  на FindBar, то её функцию передавать на число совпадений, а не на лупу как сейчас. А на лупе оставить назад - вперёд.
2. В предыдущих версиях было сразу замещение при СКМ, что удобнее. ИМХО
3. У меня сейчас никакой не отменяет, а в предыдущих версиях кнопки очистка работала.
4. Запрос остаётся, не сохраняется автовыделение, включенное двойным кликом в строке поиска.

voqabuhe
1. я это понял, просто для пользователей это немного не очевидно: откуда они будут знать, что кликать надо не на лупу, а на число совпадений? оно даже не выглядит как кнопка + у лупы и так меняющийся функционал (и меняющееся содержимое подсказки) в зависимости от выставленных настроек, но совсем уж злоупотреблять этим не надо: люди будут путаться.
Тем более выигрыш, по-моему того просто не стоит: 20 пикселей в длину панели - погоды не делают. Я даже был за то, чтобы кнопки вперёд назад не скрывать, это bunda1 такой любитель минимализма, что я его не смог переубедить.
В конце концов - решать ему, так что я всего лишь своё мнение высказываю, ему мои доводы могут показаться не столь убедительными, а твоя идея может понравиться.
2. текущее поведение - просто имитирует общие правила работы лисы с текстовыми полями. Я бы скорей bunda1 попросил бы внести такое изменение: чтобы если в форму поиска что-то вписано, то достаточно было лишь одного ЛКМ клика чтобы выделить всё что там вписано: по аналогии с адресной строкой.
3. это какая-то поломка на твоей стороне, попробуй чистый профиль - с ним всё должно работать: отмена выделения одинарным кликом.
4. Я может тебя сейчас не очень правильно понимаю, но:
Там есть минимальный лимит символов: 2, т.е. если вписать только 1 символ - то выделяться не будет, а начиная с 2-ух символов у меня выделение найденного на странице остаётся при повторном открытии.
Если же ты говорил про выделение текста в самой поисковой форме - то при открытии у меня весь ранее введённый запрос является выделенным, если у тебя нет - это опять-таки глюк на твоей стороне.

iDev.Pi
1.У пользователя будет два варианта – очевидный и неочевидный, и инструкции никто не отменял. Я и предлагаю, чтобы лупа не меняла свой функционал, зачем лишний раз запутывать? А число совпадений можно сделать кнопкой, тогда будет заметней. Мне тоже минимализм больше нравится, тут я поддерживаю bunda1. И ещё кнопки надо привести к единому стилю, а то сейчас они вместе не смотрятся. ИМХО
4. Ты наверное про автовыделение, которое включается в меню кнопки? Это у меня работает и сохраняется. А если убрать галку в меню кнопки с Автовыделение и включать выделение двойным кликом в строке поиска, вот тогда оно при закрытие-открытие не сохраняется.

voqabuhe
1. Люди FAQ-то не читают, а тут инструкции начнут читать...
4. У меня и даже с этими условиями оно сохраняется, попробуй всё-таки чистый профиль.

iDev.Pi
1. Значит будут пользоваться очевидным вариантом.
4. Что за… на чистом профиле вообще не работает. Остаётся звёздочкой, действует только как Ctrl+F:dumb:

voqabuhe
1. так ты ж предлагаешь его убрать? а если не предлагаешь - то что тебе сейчас мешает кликать СКМ на эту цифру?
4. рестарт нужен после установки

1. Я уже предлагаю, если галка стоит на Кнопка «очистить»  на FindBar, то оставить всё как есть. А если снять галку с Кнопка «очистить»  на FindBar, то её функцию передавать на число совпадений, а не на лупу как сейчас. А на лупе оставить назад - вперёд.
4. Да знаю. Заработала только после установки предыдущее версии, а потом редактировал до последней.
Короче проверил, всё также как и на основном профиле.

1. А, я теперь только понял что ты предлагаешь. Ты не учёл возможное состояние, когда в поле вбито что-то, но на странице этого не найдено - в таком случае счётчик найденного не виден, если ты предлагаешь его показывать всегда - ты против минимализма, т.к. я то думал ты предлагаешь сократить панель целиком удалив кнопку найти, а оказывается ты наоборот предлагаешь увеличить панель.
4. У нас с тобой ОС разные, может в этом дело.

1. Да, состояние когда нет вариантов я не учёл. Я не предлагал удалить кнопку найти, мне просто нравится больше вариант без кнопки Очистить, вот и хочу, чтобы его немного доработали. Тогда можно, если Кнопка «очистить»  на FindBar  отключена, повесить на лупу следующее: ЛКМ-ПКМ (вперёд-назад), а СКМ – очистить, так даже ещё удобней будет, не надо никуда дёргаться. ИМХО. А чтобы увеличивалась панель, я наоборот не хочу.

voqabuhe пишет:

А число совпадений можно сделать кнопкой, тогда будет заметней.

Нет, это трудно для меня и не очевидно для других.

voqabuhe пишет:

И ещё кнопки надо привести к единому стилю, а то сейчас они вместе не смотрятся. ИМХО

Согласен, найду нормальную кнопку «очистить» и заменю.

voqabuhe пишет:

Средний клик в строке вставляет ещё одно слово, не происходит замещения.

Это же стандартная возможность браузера, если middlemouse.paste -true. Мне кажется это удобно и привычно, как уже писал iDev.Pi можно просто кликнуть СКМ на кнопку поиска.

voqabuhe пишет:

Двойной клик в строке поиска включает автовыделение, но повторный двойной клик автовыделение не отключает.
И выключенное таким способом автовыделение не сохраняется при закрытие-открытие строки поиска. Просьба, если возможно, сделать чтобы включение автовыделения через строку поиска было бы полностью аналогичным через контекстное меню кнопки.

1. Двойной клик в строке поиска включает и выключает не автовыделение а обычную подсветку текста из панели поиска, тоже самое делает обычная кнопка Highlight на на обычном панели поиска и эта подсветка сама отключается при переключение табов или обновление страницы и так далее. Это не связано с автовыделением.
2. Переключать автовыделения двойным кликом в строке поиска - хорошо я сделаю это, но не по умолчанию, это надо будет включать через  about:config

iDev.Pi пишет:

Я бы скорей bunda1 попросил бы внести такое изменение: чтобы если в форму поиска что-то вписано, то достаточно было лишь одного ЛКМ клика чтобы выделить всё что там вписано: по аналогии с адресной строкой.

Хорошая идея, я это обязательно сделаю.

iDev.Pi пишет:

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

Если строка пустая, то СКМ непосредственно в неё, а если занята,  то на цифры или на чекбокс изменения регистра.

23-03-2012 19:32:21

1. Двойной клик в строке поиска включает и выключает не автовыделение а обычную подсветку текста из панели поиска

Пусть так, но как быть с тем, что в последней версии двойной клик её у меня не отключает?

voqabuhe пишет:

Если строка пустая, то СКМ непосредственно в неё, а если занята,  то на цифры или на чекбокс изменения регистра.

Туплю, всё верно.

2. Переключать автовыделения двойным кликом в строке поиска - хорошо я сделаю это, но не по умолчанию, это надо будет включать через  about:config

Спасибо, а через меню кнопки нельзя?

voqabuhe пишет:

Пусть так, но как быть с тем, что в последней версии двойной клик её у меня не отключает?

Не знаю, посмотри что пишет консоль ошибок, когда двойной клик не отключает.

23-03-2012 19:44:26

voqabuhe пишет:

Спасибо, а через меню кнопки нельзя?

Можно, но как будет называться пункт меню, вот в чем вопрос.

23-03-2012 19:47:34

voqabuhe пишет:

Если строка пустая, то СКМ непосредственно в неё, а если занята,  то на цифры или на чекбокс изменения регистра.

Да с этим СКМ на строке только проблемы, конфликтует с  другими CB кнопками.

bunda1 пишет:

Можно, но как будет называться пункт меню, вот в чем вопрос.

Да это вообще не вопрос, сообща чего-нибудь родим.:D  Да так и назвать как есть Автовыделение двойным кликом.

23-03-2012 20:01:33

bunda1 пишет:

Да с этим СКМ на строке только проблемы, конфликтует с  другими CB кнопками.

Так когда строка пустая, то проблем вроде нет? А вообще хватит возможности кликать по цифрам и чекбоксу.

23-03-2012 20:04:07

bunda1 пишет:

Не знаю, посмотри что пишет консоль ошибок, когда двойной клик не отключает.

Метка времени: 23.03.2012 20:03:01
Ошибка: prefs is not defined
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button48@init
Строка: 759

23-03-2012 20:10:48
bunda1
Кстати, это случилось в последних версиях.  Например, в той, что в посте №2, выделение отключается.

voqabuhe пишет:

Ошибка: prefs is not defined
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button48@init
Строка: 759

Ну тогда понятно.

Код экспериментальной кнопки  Toggle  Find+3- для инициализации:

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение'
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");


//справка(Help)
//this.setAttribute("Help", "event.stopPropagation(); gBrowser.selectedTab = gBrowser.addTab('https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31')");


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.ClearButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'очистить'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.ClearButton";
togglePref(s);
//Запускаем функции ClearButton и fmini(run ClearButton, fmini)
if (id) ClearButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FCBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FCBcek, label: 'Кнопка "очистить"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttons.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
highlightBtn.removeAttribute("checked");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var Rtext = custombuttons.getPrefs("FindBar.ClearButton") ? "Искать предыдущее" : "Очистить поле текстового ввода";
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = " + Rtext;
HighBut.setAttribute("tooltiptext", text );
}
else
{
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
if (!!gFindBar._findField.style.color)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._findField.removeAttribute("style");
}
 }
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'ClearButton'......
function ClearButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.ClearButton") ? ft.setAttribute("ClearButton", "true") : ft.removeAttribute("ClearButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function() {fmini(event);Autohide(event);ClearButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) reset;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Искать следующее
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Запускаем функцию findFieldClear или искать предыдущее
   custombuttons.getPrefs("FindBar.ClearButton") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };


//кнопка 'Highlight' на FindBar.mini всегда включена...................................................................      
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
highlightBtn.addEventListener("mouseover", function(event){
if (custombuttons.getPrefs("FindBar.mini"))
{
highlightBtn.setAttribute("disabled", "false")
}
 }, false);  
 
 
    
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//переключить кнопку 'Highlight' двойным левым кликом на на поле текстового ввода на FindBar............
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
  gFindBar.addEventListener("click", function(event){
     if ( event.button != 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
   gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})(); 

     
   
//FindBar, автоматически закрыть(autohide Findbar).................................      
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
function go() {
  gFindBar.close();
  window.ACRun = '';
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = 0;
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  }
function off() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  window.ACRun = '';
  clearTimeout(timeoutId);
  }  
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden) off() }, false);  
addEventListener('mouseover', function(event){ if (!gFindBar.hidden) (event.target.nodeName !== 'findbar')? on(): off() }, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!gFindBar._findField.style.color)
{
gFindBar._highlightDoc(true, gFindBar._findField.value);
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
gFindBar._highlightDoc(false);
gFindBar._findField.removeAttribute("style");
}
 };


//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!!gFindBar._findField.style.color)
     {
     gFindBar._findField.removeAttribute("style");
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     { 
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики.....
//обработчики для табов..
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр....
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){
if (!gFindBar.hidden) return;
Highlight(event)}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Если нажать в главном меню Firefox на пункт меню 'Найти'.............................................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(); Find(event);");


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar._find(gFindBar._findField.value);
};

        
//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
gFindBar.onFindAgainCommand(false);
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar._findField.focus();
//....
gFindBar._highlightDoc(false);
};


//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Clear" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "ClearButton");
btn.setAttribute("tooltiptext", "L = Очистить поле текстового ввода");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event)
{
  if ( event.button != 0 ) return;
 //Запускаем функцию findFieldClear
  findFieldClear(event);
}, false);


 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([ClearButton="true"]) #ClearButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 

    
#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
 
    

#ClearButton{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etXHgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEWsQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAAYgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoACCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMyMvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITjH6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF") !important;
    -moz-image-region: auto !important;
    margin-right: 1px!important;}    
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #ClearButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());

//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1 пишет:

Ну тогда понятно.

Код экспериментальной кнопки  Toggle  Find+3- для инициализации:

Ага, спасибо, заработала.

bunda1
у меня тут новая идея появилась, скажи как она тебе?
То что сейчас есть настройка - очищать поисковую форму при закрытии панели - это отлично, но часто надо однократно совершить обратное действие: т.е. я люблю когда панель у меня в общем случае открывается чистой, но иногда хочется открыть её с предыдущим запросом. Т.е. единоразово открыть её с предыдущим запросом.
Или наоборот - кто-то любит чтоб всегда оставался предыдущий запрос при открытии панели поиска, но иногда хочет открыть её намеренно пустой. Однократно.

Так вот у меня родилась идея: добавить хоткей типа CTRL+ALT+F или CTRL+SHIFT+F для открытия панели альтернативным способом. Т.е. он будет делать "обратное" от выставленного в настройках действие: если стоит галка "очищать поисковую форму" - с этим хоткеем она откроется с предыдущим запросом, если галка у этой настройки снята - то с этим хоткеем панель откроется пустой.

м?

iDev.Pi пишет:

Так вот у меня родилась идея: добавить хоткей типа CTRL+ALT+F или CTRL+SHIFT+F для открытия панели альтернативным способом. Т.е. он будет делать "обратное" от выставленного в настройках действие: если стоит галка "очищать поисковую форму" - с этим хоткеем она откроется с предыдущим запросом, если галка у этой настройки снята - то с этим хоткеем панель откроется пустой.

Хорошо, это легко.

iDev.Pi
FindList. история запросов сохраняется или за сессию, или выставляется число сохраняемых запросов.

vitalii201
мне это не нужно

iDev.Pi пишет:

Так вот у меня родилась идея: добавить хоткей типа CTRL+ALT+F или CTRL+SHIFT+F для открытия панели альтернативным способом. Т.е. он будет делать "обратное" от выставленного в настройках действие: если стоит галка "очищать поисковую форму" - с этим хоткеем она откроется с предыдущим запросом, если галка у этой настройки снята - то с этим хоткеем панель откроется пустой.

Нет, оказалась это не легко, предлагаю так - CTRL+SHIFT+F  будет всегда открывать Findbar с чистой поисковой формой.

bunda1 пишет:

Нет, оказалась это не легко

а в чём трудность? мне видится это так:
1. всегда по умолчанию сохранять старый запрос.
2. если файндбар вызывают по ctrl+f, то сделать проверку: стоит ли галка "очищать поисковую форму"?
если да - очистить форму.
если нет - открыть с предыдущим запросом.
3. если файндбар вызывают по CTRL+SHIFT+F - сделать ту же проверку, но поменять действия местами:
если да - открыть с предыдущим запросом.
если нет - очистить форму.

iDev.Pi
Если включена галка "очищать поисковую форму" то когда Findbar закрывается поисковая форма очищается, и проблема в том что не откуда взять предыдущий запрос. Можно конечно его где то записать но это такая проблема.

bunda1 пишет:

Если включена галка "очищать поисковую форму" то когда Findbar закрывается поисковая форма очищается

тогда ещё проще: перед очисткой проверить хоткей по которому была открыта панель: если CTRL+SHIFT+F - то очищать не надо.

+ если галка не стоит, но открыто по ctrl+shift+f - то очистить.

iDev.Pi пишет:

тогда ещё проще: перед очисткой проверить хоткей по которому была открыта панель: если CTRL+SHIFT+F - то очищать не надо.

А, если патом открыть Findbar кнопкой или двойным кликом.

то действовать так же, как и при CTRL+F, т.е. согласно настройке.
Т.е. обход настройки должен быть только при ctrl+SHIFT+f, во всех остальных случаях действовать согласно настройке.

Я придумал как сделать то что ты предложил, но все таки мне кажется лучше так:
1.ctrl+f - искать выделеный текст или если нет выделеного текста искать предыдущий запрос,
2. CTRL+SHIFT+F - открыть пустой файндбар.

Так легче запомнить мне и другим.

bunda1
ну т.е. люди у которых по умолчанию и так стоит настройка "очищать поисковую форму", но они хотят однократно открыть панель с предыдущим запросом - у них такой возможности не будет.
чем тебе мой вариант не понравился?

24-03-2012 22:48:35
bunda1
по такой логике проще сделать так:
ctrl+f - открыть с очищением
ctrl+alt+f - открыть сохранив предыдущий запрос
и в настройках сделать возможность поменять эти 2 хоткея местами.

iDev.Pi пишет:

чем тебе мой вариант не понравился?

Сложно запомнить.

iDev.Pi пишет:

и в настройках сделать возможность поменять эти 2 хоткея местами.

Много кода.


Мне кажется лучше так:
1.ctrl+f - искать выделеный текст или если нет выделеного текста искать предыдущий запрос и ни важно стоит ли галка "очищать поисковую форму",
2. CTRL+SHIFT+F - открыть пустой файндбар.

bunda1 пишет:

Сложно запомнить.

ну во-первых это доп. фича, тем кому она не нужна - могут её не запоминать, для них всё останется по прежнему.

bunda1 пишет:

Мне кажется лучше так:
1.ctrl+f - искать выделеный текст или если нет выделеного текста искать предыдущий запрос и ни важно стоит ли галка "очищать поисковую форму",
2. CTRL+SHIFT+F - открыть пустой файндбар.

Тогда все кто любит обычно открывать файндбар пустым - будут всегда жать на 1 кнопку больше.

bunda1 пишет:

Много кода

Тогда проще оставить всё как есть.

iDev.Pi пишет:

Тогда проще оставить всё как есть.

Поздно, я уже сделал CTRL+SHIFT+F - открыть пустой файндбар, CTR+F осталось по старому.

bunda1 пишет:

Поздно, я уже сделал CTRL+SHIFT+F - открыть пустой файндбар, CTR+F осталось по старому.

ну, помешать конечно оно никак не помешает, но лично я этой разницы даже не замечу, т.к. у меня всё равно галка стоит.

у меня почему-то кнопка поломалась: после ввода каждого символа - фокус из текстового поля уходит. Т.е. поиск набирать получается только по 1 символу.

28-03-2012 13:08:24
ну и подсветка всё-таки тоже нормально не работает

iDev.Pi пишет:

ну и подсветка всё-таки тоже нормально не работает

Да, нормально не работает когда делаешь на странице Назад(back)

iDev.Pi пишет:

у меня почему-то кнопка поломалась: после ввода каждого символа - фокус из текстового поля уходит. Т.е. поиск набирать получается только по 1 символу.
ну и подсветка всё-таки тоже нормально не работает

iDev.Pi пишет:

Я бы скорей bunda1 попросил бы внести такое изменение: чтобы если в форму поиска что-то вписано, то достаточно было лишь одного ЛКМ клика чтобы выделить всё что там вписано: по аналогии с адресной строкой.

Добавил новые возможности:
ЛКМ >ПКМ в форму поиска - удалить текст.
ЛКМ в форму поиска - выделить текст.

Код экспериментальной кнопки  Toggle  Find+3- для инициализации:

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение'
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");


//справка(Help)
//this.setAttribute("Help", "event.stopPropagation(); gBrowser.selectedTab = gBrowser.addTab('https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31')");


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.ClearButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'очистить'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.ClearButton";
togglePref(s);
//Запускаем функции ClearButton и fmini(run ClearButton, fmini)
if (id) ClearButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FCBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FCBcek, label: 'Кнопка "очистить"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttons.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
highlightBtn.removeAttribute("checked");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var Rtext = custombuttons.getPrefs("FindBar.ClearButton") ? "Искать предыдущее" : "Очистить поле текстового ввода";
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = " + Rtext;
HighBut.setAttribute("tooltiptext", text );
}
else
{
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
if (!!gFindBar._findField.style.color)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._findField.removeAttribute("style");
}
 }
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'ClearButton'......
function ClearButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.ClearButton") ? ft.setAttribute("ClearButton", "true") : ft.removeAttribute("ClearButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function(){ fmini(event); Autohide(event); ClearButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) return;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Искать следующее
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Запускаем функцию findFieldClear или искать предыдущее
   custombuttons.getPrefs("FindBar.ClearButton") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };



//кнопка 'Highlight' на FindBar.mini всегда включена...................................................................      
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
highlightBtn.addEventListener("mouseover", function(event){
if (custombuttons.getPrefs("FindBar.mini"))
{
highlightBtn.setAttribute("disabled", "false")
}
 }, false);  
 
 
    
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//Двойной клик в строке поиска FindBar мини включает и выключает обычную подсветку текста из панели поиска...........
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
gFindBar.addEventListener("click", function(event){
     if ( event.button !== 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})();


 
//ЛКМ в форму поиска - выделить текст в форме поиска............................
gFindBar._findField.addEventListener("click", function(event){
      if ( event.button !== 0 )return;
        event.preventDefault();
        event.stopPropagation()
      gFindBar._findField.select();
}, false);



//ЛКМ + ПКМ очистить поле текстового ввода на Findbar........................................................
//добавляем обработчики для обработки мышиных событий на поле текстового ввода...
//нажатие на кнопку мыши, запускаем функцию 'buttonDown'
gFindBar._findField.addEventListener("mousedown", function(event){ClearFindField.buttonDown(event); }, true);
//нажатая кнопка мыши отпущена, запускаем функцию 'buttonUp'
gFindBar._findField.addEventListener("click", function(event){ ClearFindField.buttonUp(event); }, true);//mouseup
//......
var ClearFindField = {
buttonDown : function(event)
{  
   //если нажатие на левую кнопку мыши, устанавливаем флаг
   if (0 == event.button){ this.leftButtonDown = true };
   //если нажатие на правую кнопку мыши и если установлен флаг
   if (2 == event.button && this.leftButtonDown){
   //сбросить флаг, устанавить флаг
    this.leftButtonDown = false;
    this.stopMenu = true; 
    //Очистить поле текстового ввода
    setTimeout(function(){ findFieldClear(event);}, 0);
    if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
    }
},
buttonUp : function(event)
{
  //если нажатая левая кнопка мыши отпущена
   if (event.button == 0)
   {
   //сбросить флаг
   this.leftButtonDown = false;
   }
  //если нажатая правая кнопка мыши отпущена и если установлен флаг
   if (event.button == 2 && this.stopMenu){
   event.preventDefault();
   event.stopPropagation();
   //сбросить флаг
   this.stopMenu = false; 
   } 
}   
                   };

     
   
//FindBar, автоматически закрыть(autohide Findbar).................................      
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
function go() {
  gFindBar.close();
  window.ACRun = '';
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = 0;
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  }
function off() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  window.ACRun = '';
  clearTimeout(timeoutId);
  }  
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden) off() }, false);  
addEventListener('mouseover', function(event){ if (!gFindBar.hidden) (event.target.nodeName !== 'findbar')? on(): off() }, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(!event.shiftKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+Snift+F), открывать Findbar с чистой поисковой формой(Find, clear find field).............
if ((event.ctrlKey)&&(!event.altKey)&&(event.shiftKey)&&(event.keyCode==70))
{
goDoCommand("cmd_selectNone");
findFieldClear(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!gFindBar._findField.style.color)
{
gFindBar._highlightDoc(true, gFindBar._findField.value);
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
gFindBar._highlightDoc(false);
gFindBar._findField.removeAttribute("style");
}
 };



//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!!gFindBar._findField.style.color)
     {
     gFindBar._findField.removeAttribute("style");
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     {
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики........
//отслеживаем команду Назад(back)...
window.addEventListener("command", function(event){
var command = String(event.target.getAttribute("oncommand"));
//фылтр..
if (command == 'BrowserBack();' || command == 'BrowserBack(event);' || command == 'BrowserForward();' || command == 'BrowserForward(event);'){
setTimeout(function() { Highlight(event)}, 0)
}}, false);
//обработчики для табов...
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр..
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", Highlight, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden){Highlight(event)}}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Если нажать в главном меню Firefox на пункт меню 'Найти'.............................................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(); Find(event);");


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar._find(gFindBar._findField.value);
};

        

//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Clear" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "ClearButton");
btn.setAttribute("tooltiptext", "L = Очистить поле текстового ввода");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event)
{
  if ( event.button != 0 ) return;
 //Запускаем функцию findFieldClear
  findFieldClear(event);
}, false);



//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar.onFindCommand();
//....
gFindBar._highlightDoc(false);
};

 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([ClearButton="true"]) #ClearButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 

    
#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
 
    

#ClearButton{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etXHgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEWsQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAAYgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoACCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMyMvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITjH6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF") !important;
    -moz-image-region: auto !important;
    margin-right: 1px!important;}    
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #ClearButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());


//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1 пишет:

iDev.Pi пишет:

у меня почему-то кнопка поломалась: после ввода каждого символа - фокус из текстового поля уходит. Т.е. поиск набирать получается только по 1 символу.
ну и подсветка всё-таки тоже нормально не работает

Код экспериментальной кнопки  Toggle  Find+3- для инициализации:

не. кажется это у меня профиль поломался, т.к. попробовал на другом - всё работает.

iDev.Pi
Зацени Сегодня 21:32:27
Добавил новые возможности:
ЛКМ + ПКМ в форму поиска - очистить поле текстового ввода.
ЛКМ в форму поиска - выделить текст.

Вот только что теперь делать с кнопкой  "очистить" на FindBar?

bunda1 пишет:

Зацени Сегодня 21:32:27
Добавил новые возможности:
ЛКМ + ПКМ в форму поиска - очистить поле текстового ввода.
ЛКМ в форму поиска - выделить текст.

Теперь стало невозможно править слово в строке. Оно сразу выделяется целиком и его можно только удалить.

voqabuhe пишет:

Теперь стало невозможно править слово в строке. Оно сразу выделяется целиком и его можно только удалить.

Да на всех не угадишь, сделаю это переключаемым через меню.

bunda1
угодишь: просто скопируй поведение из адресной строки: там только первый клик выделяет всё содержимое, а последующий - сбрасывает выделение, а у тебя - нет.

iDev.Pi пишет:

bunda1
угодишь: просто скопируй поведение из адресной строки: там только первый клик выделяет всё содержимое, а последующий - сбрасывает выделение, а у тебя - нет.

ok

P.S. Наверное кнопку  "очистить" на FindBar переделаю на "Вставить и перейти" - искать выделенный текст или из буфера обмена, для тех у кого нет СКМ.

bunda1
не мог бы ты подправить этот баг?

iDev.Pi пишет:

у меня почему-то кнопка поломалась: после ввода каждого символа - фокус из текстового поля уходит. Т.е. поиск набирать получается только по 1 символу.

я выяснил, что дело не у меня в профиле, а в самой найтли: на сборке от 25.03.12 - всё нормально работает, а начиная с 28.03.12 (а может быть и раньше - не помню как там на сборках от 26 и 27) - появляется этот баг.

iDev.Pi пишет:

я выяснил, что дело не у меня в профиле, а в самой найтли: на сборке от 25.03.12 - всё нормально работает, а начиная с 28.03.12 (а может быть и раньше - не помню как там на сборках от 26 и 27) - появляется этот баг.

Да у меня на найтли тоже были такие временные баги.

bunda1
у меня баг сохраняется уже несколько дней, мне кажется они чего-то просто изменили.
пока что кнопкой пользоваться вообще не возможно.

iDev.Pi пишет:

bunda1
у меня баг сохраняется уже несколько дней, мне кажется они чего-то просто изменили.
пока что кнопкой пользоваться вообще не возможно.

Завтра исправлю.

iDev.Pi пишет:

у меня баг сохраняется уже несколько дней, мне кажется они чего-то просто изменили.
пока что кнопкой пользоваться вообще не возможно.

Подтверждаю.

iDev.Pi пишет:

bunda1
у меня баг сохраняется уже несколько дней, мне кажется они чего-то просто изменили.
пока что кнопкой пользоваться вообще не возможно.

Да, они изменили код.

Код экспериментальной кнопки  Toggle  Find+3 для инициализации:

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();с
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение'
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");


//справка(Help)
//this.setAttribute("Help", "event.stopPropagation(); gBrowser.selectedTab = gBrowser.addTab('https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31')");


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '8')
{   
    prefs.setCharPref("FindBar.version", "8");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    prefs.setBoolPref("FindBar.ClearButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'очистить'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.ClearButton";
togglePref(s);
//Запускаем функции ClearButton и fmini(run ClearButton, fmini)
if (id) ClearButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FCBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FCBcek, label: 'Кнопка "очистить"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Очищать поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttons.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
highlightBtn.removeAttribute("checked");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var Rtext = custombuttons.getPrefs("FindBar.ClearButton") ? "Искать предыдущее" : "Очистить поле текстового ввода";
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = " + Rtext;
HighBut.setAttribute("tooltiptext", text );
}
else
{
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
if (!!gFindBar._findField.style.color)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._findField.removeAttribute("style");
}
 }
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'ClearButton'......
function ClearButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.ClearButton") ? ft.setAttribute("ClearButton", "true") : ft.removeAttribute("ClearButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function(){ fmini(event); Autohide(event); ClearButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) return;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Искать следующее
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Запускаем функцию findFieldClear или искать предыдущее
   custombuttons.getPrefs("FindBar.ClearButton") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };



//кнопка 'Highlight' на FindBar.mini всегда включена...................................................................      
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
highlightBtn.addEventListener("mouseover", function(event){
if (custombuttons.getPrefs("FindBar.mini"))
{
highlightBtn.setAttribute("disabled", "false")
}
 }, false);  
 
 
    
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//Двойной клик в строке поиска FindBar мини включает и выключает обычную подсветку текста из панели поиска...........
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмен
gFindBar.addEventListener("click", function(event){
     if ( event.button !== 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus();
}, false);
})();


 
/*//ЛКМ в форму поиска - выделить текст в форме поиска............................
gFindBar._findField.addEventListener("click", function(event){
      if ( event.button !== 0 )return;
        event.preventDefault();
        event.stopPropagation()
      gFindBar._findField.select();
}, false);*/



//ЛКМ + ПКМ очистить поле текстового ввода на Findbar........................................................
//добавляем обработчики для обработки мышиных событий на поле текстового ввода...
//нажатие на кнопку мыши, запускаем функцию 'buttonDown'
gFindBar._findField.addEventListener("mousedown", function(event){ClearFindField.buttonDown(event); }, true);
//нажатая кнопка мыши отпущена, запускаем функцию 'buttonUp'
gFindBar._findField.addEventListener("click", function(event){ ClearFindField.buttonUp(event); }, true);//mouseup
//......
var ClearFindField = {
buttonDown : function(event)
{  
   //если нажатие на левую кнопку мыши, устанавливаем флаг
   if (0 == event.button){ this.leftButtonDown = true };
   //если нажатие на правую кнопку мыши и если установлен флаг
   if (2 == event.button && this.leftButtonDown){
   //сбросить флаг, устанавить флаг
    this.leftButtonDown = false;
    this.stopMenu = true; 
    //Очистить поле текстового ввода
    setTimeout(function(){ findFieldClear(event);}, 0);
    if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
    }
},
buttonUp : function(event)
{
  //если нажатая левая кнопка мыши отпущена
   if (event.button == 0)
   {
   //сбросить флаг
   this.leftButtonDown = false;
   }
  //если нажатая правая кнопка мыши отпущена и если установлен флаг
   if (event.button == 2 && this.stopMenu){
   event.preventDefault();
   event.stopPropagation();
   //сбросить флаг
   this.stopMenu = false; 
   } 
}   
                   };

     
   
//FindBar, автоматически закрыть(autohide Findbar).................................      
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
function go() {
  gFindBar.close();
  window.ACRun = '';
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = 0;
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  }
function off() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  window.ACRun = '';
  clearTimeout(timeoutId);
  }  
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden) off() }, false);  
addEventListener('mouseover', function(event){ if (!gFindBar.hidden) (event.target.nodeName !== 'findbar')? on(): off() }, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(!event.shiftKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+Snift+F), открывать Findbar с чистой поисковой формой(Find, clear find field).............
if ((event.ctrlKey)&&(!event.altKey)&&(event.shiftKey)&&(event.keyCode==70))
{
goDoCommand("cmd_selectNone");
findFieldClear(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!gFindBar._findField.style.color)
{
gFindBar._highlightDoc(true, gFindBar._findField.value);
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
gFindBar._highlightDoc(false);
gFindBar._findField.removeAttribute("style");
}
 };



//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

let console=Components.classes["@mozilla.org/consoleservice;1"]
            .getService(Components.interfaces.nsIConsoleService);
console.logStringMessage(event.target)
console.logStringMessage(event)
//устанавливаем флаги...
var m = true;
if (event =='false'){var m = false};
if (event =='[object UIEvent]'){var m = false};
if (event =='[object DragEvent]'){var m = false};
if (event =='[object MouseEvent]'){var m = false};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!!gFindBar._findField.style.color)
     {
     gFindBar._findField.removeAttribute("style");
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     {
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики........
//отслеживаем команду Назад(back) и Вперёд(forward)...
window.addEventListener("command", function(event){
var command = String(event.target.getAttribute("oncommand"));
//фылтр..
if (command == 'BrowserBack();' || command == 'BrowserBack(event);' || command == 'BrowserForward();' || command == 'BrowserForward(event);'){
setTimeout(function() { Highlight(event)}, 0)
}}, false);
//обработчики для табов...
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр..
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", function(event){ var event = 'false'; Highlight(event)}, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden){Highlight(event)}}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Если нажать в главном меню Firefox на пункт меню 'Найти'.............................................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(); Find(event);");


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar._find(gFindBar._findField.value);
};

        

//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Clear" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "ClearButton");
btn.setAttribute("tooltiptext", "L = Очистить поле текстового ввода");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event)
{
  if ( event.button != 0 ) return;
 //Запускаем функцию findFieldClear
  findFieldClear(event);
}, false);



//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar.onFindCommand();
//....
gFindBar._highlightDoc(false);
};

 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([ClearButton="true"]) #ClearButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 

    
#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
 
    

#ClearButton{
    list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etXHgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEWsQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAAYgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoACCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMyMvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITjH6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF") !important;
    -moz-image-region: auto !important;
    margin-right: 1px!important;}    
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #ClearButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());


//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1
спасибо большое!
баг исчез.
новая фича с очисткой ЛКМ>ПКМ - очень понравилась.
очень бы хотелось всё-таки ещё сделать так, чтобы первый клик по поисковой форме - выделял бы всё содержимое (как адресная строка)

iDev.Pi пишет:

очень бы хотелось всё-таки ещё сделать так, чтобы первый клик по поисковой форме - выделял бы всё содержимое (как адресная строка)

Ok

Добавил новые возможности:
Теперъ можна переключать автовыделения двойным кликом в строке поиска, но не по умолчанию, это надо включать через меню кнопки.

Поменял кнопку "очистить" на кнопку "Вставить и искать"  на FindBar, для поиска выделенного на странице текста или текста из буфера обмена. Удобно для тех у кого нет средней мыши кнопки.

iDev.Pi пишет:

очень бы хотелось всё-таки ещё сделать так, чтобы первый клик по поисковой форме - выделял бы всё содержимое (как адресная строка)

Код экспериментальной кнопки  Toggle  Find+3 для инициализации:

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение'
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'



//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var Val = "\n\n"+ AutoHighlight +": "+ prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");


//справка(Help)
//this.setAttribute("Help", "event.stopPropagation(); gBrowser.selectedTab = gBrowser.addTab('https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31')");


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '10')
{   
    prefs.setCharPref("FindBar.version", "10");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    custombuttons.clearPrefs("FindBar.ClearButton");
    prefs.setBoolPref("FindBar.pasteButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
    prefs.setBoolPref("FindBar.Autohighlight.ToggleWithDoubleClick", false);
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'Вставить и искать'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.pasteButton";
togglePref(s);
//Запускаем функции pasteButton и fmini(run pasteButton, fmini)
if (id) pasteButton(event);
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FpBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.reset();
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение двойным кликом.....
if(!id || id == "dblclikHighlight") {
// переключаем настройки в about:config
s = "FindBar.Autohighlight.ToggleWithDoubleClick";
togglePref(s);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.dbcHcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FpBcek, label: 'Кнопка "Вставить и искать"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Всегда открывать пустую поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.dbcHcek, label: 'Автовыделение двойным кликом на поисковой форме', cmd: 'document.popupNode.CBlabel(this, "dblclikHighlight")', sItemId: '', type:'checkbox'},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Find
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttons.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
highlightBtn.removeAttribute("checked");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = Искать предыдущее";
HighBut.setAttribute("tooltiptext", text );
}
else
{
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
if (!!gFindBar._findField.style.color)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._findField.removeAttribute("style");
}
 }
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'pasteButton'......
function pasteButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.pasteButton") ? ft.setAttribute("pasteButton", "true") : ft.removeAttribute("pasteButton");
};
//Запускаем функции fmini(Run the function fmini)  
setTimeout(function(){ fmini(event); Autohide(event); pasteButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 



//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar..................................................
gFindBar.addEventListener("DOMAttrModified", function(event){
var _this = this;
//устанавливаем флаг
if (gFindBar.hidden){_this.clear = true}
//...
if (!custombuttons.getPrefs("FindBar.autoclear")) return;
if (gFindBar.hidden){gFindBar._findField.reset()}
if (!gFindBar.hidden)
{
//Снять выделенные на странице если флаг - true
if (_this.clear){goDoCommand("cmd_selectNone")}
//сбросить флаг
_this.clear = false;
}
 }, false);
 
 

//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Искать следующее
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Запускаем функцию findFieldClear или искать предыдущее
   custombuttons.getPrefs("FindBar.mini") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };



//кнопка 'Highlight' на FindBar.mini всегда включена...................................................................      
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
highlightBtn.addEventListener("mouseover", function(event){
if (custombuttons.getPrefs("FindBar.mini")){ highlightBtn.setAttribute("disabled", "false")}
}, false);
  
 
 
    
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//Двойной клик в строке поиска FindBar мини включает и выключает обычную подсветку текста из панели поиска...........
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмена/выделенный текст
gFindBar.addEventListener("click", function(event){
     if ( event.button !== 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick")){
        // переключаем настройки в about:config
        s = "FindBar.Highlight";
    custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
    //Изменить иконку кнопки
    ToggleImage(event);
    //переключить кнопку 'Highlight'(toggle Highlight)
    document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
    //Запускаем функцию Highlight(run function Highlight)
    Highlight(event);
    }
    else{
    if (custombuttonsUtils. getPrefs ("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        }
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus(); 
  }, false);
})();


 
//ЛКМ в форму поиска - выделить текст в форме поиска............................
gFindBar._findField.addEventListener("click", function(event){
      if ( event.button !== 0 )return;
      if(!this.FB_fFselect){ gFindBar._findField.select();}
      this.FB_fFselect = true;
}, false);
gFindBar._findField.addEventListener("blur", function(event){ this.FB_fFselect = false;
}, false);



//ЛКМ + ПКМ очистить поле текстового ввода на Findbar........................................................
//добавляем обработчики для обработки мышиных событий на поле текстового ввода...
//нажатие на кнопку мыши, запускаем функцию 'buttonDown'
gFindBar._findField.addEventListener("mousedown", function(event){ClearFindField.buttonDown(event); }, true);
//нажатая кнопка мыши отпущена, запускаем функцию 'buttonUp'
gFindBar._findField.addEventListener("click", function(event){ ClearFindField.buttonUp(event); }, true);//mouseup
//......
var ClearFindField = {
buttonDown : function(event)
{  
   //если нажатие на левую кнопку мыши, устанавливаем флаг
   if (0 == event.button){ this.leftButtonDown = true };
   //если нажатие на правую кнопку мыши и если установлен флаг
   if (2 == event.button && this.leftButtonDown){
   //сбросить флаг, устанавить флаг
    this.leftButtonDown = false;
    this.stopMenu = true; 
    //Очистить поле текстового ввода
    setTimeout(function(){ findFieldClear(event);}, 0);
    if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
    }
},
buttonUp : function(event)
{
  //если нажатая левая кнопка мыши отпущена
   if (event.button == 0)
   {
   //сбросить флаг
   this.leftButtonDown = false;
   }
  //если нажатая правая кнопка мыши отпущена и если установлен флаг
   if (event.button == 2 && this.stopMenu){
   event.preventDefault();
   event.stopPropagation();
   //сбросить флаг
   this.stopMenu = false; 
   } 
}   
                   };

     
   
//FindBar, автоматически закрыть(autohide Findbar).................................      
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
function go() {
  gFindBar.close();
  window.ACRun = '';
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = 0;
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  }
function off() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  window.ACRun = '';
  clearTimeout(timeoutId);
  }  
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden) off() }, false);  
addEventListener('mouseover', function(event){ if (!gFindBar.hidden) (event.target.nodeName !== 'findbar')? on(): off() }, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(!event.shiftKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+Snift+F), открывать Findbar с чистой поисковой формой(Find, clear find field).............
if ((event.ctrlKey)&&(!event.altKey)&&(event.shiftKey)&&(event.keyCode==70))
{
goDoCommand("cmd_selectNone");
findFieldClear(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();



//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!gFindBar._findField.style.color)
{
gFindBar._highlightDoc(true, gFindBar._findField.value);
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
gFindBar._highlightDoc(false);
gFindBar._findField.removeAttribute("style");
}
 };



//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

let console=Components.classes["@mozilla.org/consoleservice;1"]
            .getService(Components.interfaces.nsIConsoleService);
console.logStringMessage(event)
//устанавливаем флаги...
var m = true;
if (event =='false' || event =='[object UIEvent]' || event =='[object DragEvent]' || event =='[object MouseEvent]'){
var m = false
};   

//hide Highlight
gFindBar._highlightDoc(false);

//....
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
  
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!!gFindBar._findField.style.color)
     {
     gFindBar._findField.removeAttribute("style");
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     {
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики........
//отслеживаем команду Назад(back) и Вперёд(forward)...
window.addEventListener("command", function(event){
var command = String(event.target.getAttribute("oncommand"));
//фылтр..
if (command == 'BrowserBack();' || command == 'BrowserBack(event);' || command == 'BrowserForward();' || command == 'BrowserForward(event);'){
setTimeout(function() { Highlight(event)}, 0)
}}, false);
//обработчики для табов...
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр..
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", function(event){ Highlight("false")}, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden){Highlight(event)}}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if (gContextMenu.isTextSelected)
        {
          if (custombuttons.getPrefs("FindBar.contextFindWords"))
          {
          contextFind.hidden = false;
          }
          else   
          {
          contextFind.hidden = true;
          }
        }
      }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Если нажать в главном меню Firefox на пункт меню 'Найти'.............................................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(); Find(event);");


//Найти на странице....................................................  
Find = function(event){
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar._find(gFindBar._findField.value);
};

        

//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash, fmini(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Вставить и искать" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "pasteButton");
btn.setAttribute("tooltiptext", "Поиск выделенного текста/из буфера");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event){
  if ( event.button == 0 ){
        //Поиск по странице из буфера обмена/выделенный текст...
        //event.preventDefault();
        //event.stopPropagation();
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}
  }, false);



//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
gFindBar._findField.reset();
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar.onFindCommand();
//....
gFindBar._highlightDoc(false);
};

 
 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([pasteButton="true"]) #pasteButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 

    
#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
 

#pasteButton{
    list-style-image: url("chrome://browser/skin/appmenu-icons.png");
    -moz-image-region: rect(0 48px 16px 32px);
    margin-right: 3px! important;} 
       
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #pasteButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());


//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1 пишет:

Добавил новые возможности:

Кнопка стала просто шикарная :beer:
PS ты бы ещё [CB]Memory Monitor восстановил, совсем бы хорошо стало. :)

voqabuhe
Спасыбо.
Я пока не знаю как восстановить Memory Monitor, код не мой, но буду думать.

bunda1 пишет:

Код экспериментальной кнопки  Toggle  Find+3 для инициализации:

спасибо, выделение работает просто замечательно.
может всё-таки можно приделать умный хоткей ctrl+SHIFT+f который будет действовать в зависимости от состояния настройки "очищать поисковую форму"?

iDev.Pi пишет:

может всё-таки можно приделать умный хоткей ctrl+SHIFT+f который будет действовать в зависимости от состояния настройки "очищать поисковую форму"?

Хорошо, я сделаю. Тут проблема как запомнить текст из поисковой формы, можно записать в about:config но это не интересно, мне хочется другое. Хочу сделать красиво.

bunda1
погоди, лиса же по умолчанию и так это сама запоминает.
Тебе в кнопке надо лишь правильно указать случаи, когда надо это очищать.
Случаев таких будет всего два:
1. При открытии файндбара по ctrl+f, если в настройках кнопки стоит галка у "Всегда открывать пустую поисковую форму" - это уже сделано, но как я понял - очищение срабатывает сразу же при закрытии файндбара, а надо сделать так, чтобы оно срабатывало при открытии файндбара: сначала нужно выполнить проверку: как была вызвана панель? и если с shift - то очищать НЕ надо.
2. При открытии файндбара по ctrl+shift+f, если в настройках кнопки не стоит галка у "Всегда открывать пустую поисковую форму".

iDev.Pi пишет:

погоди, лиса же по умолчанию и так это сама запоминает.

Точно. Надо это использовать.

iDev.Pi пишет:

Тебе в кнопке надо лишь правильно указать случаи, когда надо это очищать.
Случаев таких будет всего два:

А вот и нет.

iDev.Pi пишет:

1. При открытии файндбара по ctrl+f, если в настройках кнопки стоит галка у "Всегда открывать пустую поисковую форму" - это уже сделано, но как я понял - очищение срабатывает сразу же при закрытии файндбара, а надо сделать так, чтобы оно срабатывало при открытии файндбара: сначала нужно выполнить проверку: как была вызвана панель? и если с shift - то очищать НЕ надо.
2. При открытии файндбара по ctrl+shift+f, если в настройках кнопки не стоит галка у "Всегда открывать пустую поисковую форму".

Да ты кругом прав но так не хочется переделывать проверенный код, много кода.
Ну в общем скоро сделаю.

А можно сделать поиск по ссылкам на странице, но не по тексту ссылки, а по её адресу?

Поясню. Обычный поиск по слову "mozilla" находит на этой странице 3 совпадения - в простом тексте и в тексте ссылки.
А на самом деле, любая ссылка на этой странице содержит в себе mozilla-russia.org

Для Оперы есть скрипт, который делает то что я хочу. Можно его как-то приспособить к ФФ?
Если что, я скрипт предоставлю.

Чайник
нажми ctrl+u на странице и там и ищи

03-04-2012 18:41:34

Чайник пишет:

А можно сделать поиск по ссылкам на странице, но не по тексту ссылки, а по её адресу? Поясню. Обычный поиск по слову "mozilla" находит на этой странице 3 совпадения - в простом тексте и в тексте ссылки.А на самом деле, любая ссылка на этой странице содержит в себе mozilla-russia.orgДля Оперы есть скрипт, который делает то что я хочу. Можно его как-то приспособить к ФФ?Если что, я скрипт предоставлю.

неа, ссылки бывают и относительные которые не будут содержать имя домена.

iDev.Pi пишет:

Чайникнажми ctrl+u на странице и там и ищи

Это можно и вместо кнопки Toggle  Find искать слово в исходнике страницы.

Однако же сделали кнопку и пользуются ею. Потому что удобно.

Чайник
Поиск ссылок по мере ввода    '  + текст
Поиск текста по мере ввода    /  + текст
Горячие клавиши - Mozilla Firefox

bunda1 пишет:

Чайник
Поиск ссылок по мере ввода    ' ' + текстПоиск текста по мере ввода    /  + текстГорячие клавиши - Mozilla Firefox
                    Отредактировано bunda1 (Сегодня 18:04:24)

:D
Это я знаю (кстати, поиск ссылок - там только один апостроф)
В том-то и дело, что "Поиск ссылок по мере ввода    ' ' + текст" ищет не в адресе, а в тексте ссылки.

Этот поиск не найдёт на странице 555619 хотя это число есть в каждой ссылке "Сообщить модератору"

Чайник
Понятно, дай скрипт Оперы. Как ты представляешь такой поиск или как там в Опере это устроена.

bunda1 пишет:

ЧайникПонятно, дай скрипт Оперы. Как ты представляешь такой поиск или как там в Опере это устроена.

Это сам скрипт
http://ompldr.org/vZDh6MQ

А это код кнопки, которая его активизирует:

Выделить код

Код:

Go to page, "javascript:ujs__SearcherToggle();

Если я правильно понял, Go to page это как в ФФ loadUri

Чайник
Ужас, скрипт на 889 строк. Я подумаю над этим.

iDev.Pi пишет:

может всё-таки можно приделать умный хоткей ctrl+SHIFT+f который будет действовать в зависимости от состояния настройки "очищать поисковую форму"?

Принимай работу. Ctrl+Snift+F также работает при открытом файндбаре.

Код экспериментальной кнопки  Toggle  Find+3 для инициализации:

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

Выделить код

Код:

  //настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event)
{
    if(event.button == 0) 
        {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        Find(event);
         }
    else if(event.button == 1) 
         {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
         }
};


//Объявляем .....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
var this_ = this;
var AutoHighlight ='Автовыделение'
var AutoClose ='Автоматически закрыть' 
var CloseTimer ='Закрыть через '
var ClearPref ='Сбросить текст'




//подсказка.............................................................................
this.showTFinfo = function() {
     //getting prefs Unicode value
     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
     var r = custombuttons.getPrefs("FindBar.Highlight")? prefs.getComplexValue("FindBar.Highlight.value",Components.interfaces.nsISupportsString).data : 'выключена';
     var Val = "\n\n"+ AutoHighlight +": "+ r;
     //обрезать подсказку для "Автовыделение"
     var HValue = Val.substring(0,50);
     var HDots =(Val.length > 50) ? '....' : "";
     //....
     this.tooltipText = "Поиск по странице" +"\n" + "Л: Показать - скрыть поиск по странице" +"\n" +"С: Поиск по странице из буфера обмена" +"\n"+ "П: Mеню + CB меню" + HValue + HDots;
}
this.setAttribute("onmouseover", "this.showTFinfo()");



//справка(Help)
//this.setAttribute("Help", "event.stopPropagation(); gBrowser.selectedTab = gBrowser.addTab('https://forum.mozilla-russia.org/viewtopic.php?pid=550855#p550855]09-03-2012 19:18:31')");


//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
if (custombuttons.getPrefs("FindBar.version") !== '10')
{   
    prefs.setCharPref("FindBar.version", "10");
    prefs.setBoolPref("FindBar.Highlight", true);
    prefs.setCharPref("FindBar.Highlight.value", "??????");
    prefs.setBoolPref("FindBar.autoclear", false);
    prefs.setBoolPref("FindBar.contextFindWords", true);
    prefs.setBoolPref("FindBar.ToggleWithDoubleMiddleClick", false);
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
  //prefs.setCharPref("ui.textHighlightForeground", "#000000");//http://coloria.net/bonus/colornames.htm
    prefs.setBoolPref("FindBar.mini", false);
    custombuttons.clearPrefs("FindBar.ClearButton");
    prefs.setBoolPref("FindBar.pasteButton", false);
    prefs.setBoolPref("FindBar.auto_Close", false);
    prefs.setCharPref("FindBar.CloseTimer", "7");//7 сек(7 sec)
    prefs.setCharPref("FindBar.AutohighlightNum", "1");
    prefs.setBoolPref("FindBar.Autohighlight.ToggleWithDoubleClick", false);
};



//настройка меню(CB menu settings)...................................................
//Объявляем .....
var c ='true';
var n = 'false';
//изменить нужный пункт меню(toggle menuitems)
//переключаем настройки в about:config(toggle preference)
this.CBlabel = function (mi, id)
{
//Автоматически закрыть(FB auto close)....
if(!id || id == "FBClose") {
//переключаем настройки в about:config
s = "FindBar.auto_Close";
togglePref(s);
//Запускаем функцию autohide
if (id) Autohide(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c: n);
this.FBCcek = cek;
if(mi) mi.cek = cek;
};

//FB auto close timer.....
if(!id || id == "CloseTimer") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
s = "FindBar.CloseTimer";
//switch auto close timer+"\n" +
    var URL = custombuttons.promptBox(AutoClose, CloseTimer+custombuttons.getPrefs(s) + ' секунд', '');
    if (URL[0] == false) return;
    else
    var timer = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref(s, timer);
})();
//пункт меню(menuitems)
var label = CloseTimer + custombuttons.getPrefs("FindBar.CloseTimer") + ' секунд';
this.CloseTimer = label;
if(mi) mi.label = label;
};

//FindBar.mini......
if(!id || id == "FBmini") {
//переключаем настройки в about:config
s = "FindBar.mini";
togglePref(s);
//Запускаем функцию fmini(run fmini)
if (id) fmini(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FBcek = cek;
if(mi) mi.cek = cek;
};

//Кнопка 'Вставить и искать'......
if(!id || id == "FBbutt") {
//переключаем настройки в about:config
s = "FindBar.pasteButton";
togglePref(s);
//Запускаем функции pasteButton и fmini(run pasteButton, fmini)
if (id) pasteButton(event);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FpBcek = cek;
if(mi) mi.cek = cek;
};

//Find в контекстном меню(Find in the context menu).....
if(!id || id == "FindInMenu") {
// переключаем настройки в about:config
s = "FindBar.contextFindWords";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.FIMcek = cek;
if(mi) mi.cek = cek;
};

//Автоматически очищать поле текстового ввода на Findbar.....
if(!id || id == "autoClear") {
// переключаем настройки в about:config
s = "FindBar.autoclear";
togglePref(s);
//Очищистить поле текстового ввода если Findbar закрыт.
if (gFindBar.hidden && custombuttons.getPrefs("FindBar.autoclear")) gFindBar._findField.value = '';
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.aCcek = cek;
if(mi) mi.cek = cek;
};

//Переключить двойным средним кликом(Toggle with double middle click).....
if(!id || id == "MiddleClick") {
// переключаем настройки в about:config
s = "FindBar.ToggleWithDoubleMiddleClick";
togglePref(s);
//изменить нужный пункт меню
var cek = (custombuttons.getPrefs(s)? c : n);
this.MCcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение двойным кликом.....
if(!id || id == "dblclikHighlight") {
// переключаем настройки в about:config
s = "FindBar.Autohighlight.ToggleWithDoubleClick";
togglePref(s);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.dbcHcek = cek;
if(mi) mi.cek = cek;
};

//Автовыделение(Switch, Auto Highlight).....
if(!id || id == "SwitchHighlight") {
// переключаем настройки в about:config
s = "FindBar.Highlight";
togglePref(s);
//Изменить иконку кнопки
if (id) ToggleImage(event);
//переключить кнопку 'Highlight'(toggle Highlight)
if (id) document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//изменить нужный пункт меню(toggle menuitems)
var cek = (custombuttons.getPrefs(s)? c : n);
this.aHcek = cek;
if(mi) mi.cek = cek;
};

//Изменить цвет для Автовыделение.....
if(!id || id == "addColor") {
(function () {
//Стоп, при инициализации кнопки
if (!id) return;
//создаем модальное окно для ввода цвета
    var URL = custombuttons.promptBox('Изменить цвет для Автовыделение', 'По умолчанию:  #ef0fff', '');
    if (URL[0] == false) return;
    else
    var color = [URL[1]];
//переключаем настройки в about:config(toggle preference)
prefs.setCharPref("ui.textHighlightBackground", color);
})();
//пункт меню(menuitems)
var label = 'Изменить цвет' + ': ' + custombuttons.getPrefs("ui.textHighlightBackground");
this.addColor = label;
if(mi) mi.label = label;
};

//Автовыделение, добавить текст....... 
if(!id || id == "AddText") {
//Запускаем функцию HighlightAdd(run function HighlightAdd)
if (id) HighlightAdd(event);
};

//Автовыделение, сбросить .....
if(!id || id == "Clear") {
//сбросить настройки в about:config
if (id) prefs.setCharPref("FindBar.Highlight.value", ""); 
//Запускаем функцию Highlight(run function Highlight)
if (id) Highlight(event);
//всплывающая подсказка
if (id) custombuttons.alertSlide(ClearPref,'????');
};

//переключаем настройки в about:config(toggle preference)....
function togglePref(s){
//Стоп, при инициализации кнопки
if (!id) return;
//переключаем настройки
custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
}
 };
//Запускаем функцию CBlabel(run CBlabel).........
this.CBlabel();


//пункти меню(Our menu items) ....
this.ss = [
  { cek: this.FBCcek, label: AutoClose, cmd: 'document.popupNode.CBlabel(this, "FBClose")', sItemId: '', type:'checkbox'},
  { label: this.CloseTimer, cmd: 'document.popupNode.CBlabel(this, "CloseTimer")', sItemId: ''},
  { label: "separator", sItemId: ''},
  { cek: this.FBcek, label: 'FindBar мини', cmd: 'document.popupNode.CBlabel(this, "FBmini")', sItemId: '', type:'checkbox'},
  { cek: this.FpBcek, label: 'Кнопка "Вставить и искать"  на FindBar', cmd: 'document.popupNode.CBlabel(this, "FBbutt")', sItemId: '', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.FIMcek, label: 'Find в контекстном меню', cmd: 'document.popupNode.CBlabel(this, "FindInMenu")', sItemId:'', type:'checkbox'},
  { cek: this.aCcek, label: 'Всегда открывать пустую поисковую форму', cmd: 'document.popupNode.CBlabel(this, "autoClear")', sItemId:'', type:'checkbox'},
  { cek: this.MCcek, label: 'Переключать двойным средним кликом', cmd: 'document.popupNode.CBlabel(this, "MiddleClick")', sItemId:'', type:'checkbox'},
  { label: "separator", sItemId: ''},
  { cek: this.dbcHcek, label: 'Автовыделение двойным кликом на поисковой форме', cmd: 'document.popupNode.CBlabel(this, "dblclikHighlight")', sItemId: '', type:'checkbox'},
  { cek: this.aHcek, label: AutoHighlight, cmd: 'document.popupNode.CBlabel(this, "SwitchHighlight")', sItemId: '', type:'checkbox'},
  { label: this.addColor, cmd: 'document.popupNode.CBlabel(this, "addColor")', sItemId: ''}, 
  { label: 'Добавить текст', cmd: 'document.popupNode.CBlabel(this, "AddText")', sItemId: ''},
  { label: ClearPref, cmd: 'document.popupNode.CBlabel(this, "Clear")', sItemId: ''}];

 
// Our Initialization function for creating the context menu, setting up menuitems and telling
var Cb = custombuttons;
this.mObj = Cb.getCbContextObj(this);
this.init = function(x) {
  x.mObj.setSub();
  var nItem = {}, mItem = {};
  document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()");
  for(var i in x.ss) {
    nItem = new x.mObj.getItem();
    nItem.id = 'Note';
    nItem.label = x.ss[i].label;
    if (nItem.label == "separator") {
        nItem = document.createElement("menuseparator");
      }
    nItem.value = String(i);
    mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild);
    this.ss[i].sItemId = mItem.id;
    mItem.setAttribute('oncommand',x.ss[i].cmd);
    if("type" in x.ss[i])
    mItem.setAttribute('type', x.ss[i].type);
    mItem.setAttribute('checked', x.ss[i].cek)
    mItem.setAttribute( 'autocheck',true)
   }
  x.mObj.getItem();
  nItem = x.mObj.getItem();
  nItem.id = 'Note';
  this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild);
}
this.init(this);


//Стоп, при открытии настройки панелей....................................................
if (window.ToggleFindRun == 'stop') return;


//Findbar, переклучить  атрибут 'mini'(Findbar, set and remove attribute 'mini')...........
//Findbar, установить и удалить 'hits'(Findbar, set and remove  'hits')...........
function fmini(event){
//FindBar, auto find 
if (!gFindBar.hidden)
{
//Findbar, фокус(Findbar, focus)
gFindBar._findField.focus();
gFindBar.onFindCommand();
}
var findToolbar = document.getElementById("FindToolbar");
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
if (custombuttons.getPrefs("FindBar.mini"))
{
//...
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
if (highlightBtn.checked)
{
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
highlightBtn.removeAttribute("checked");
};
findToolbar.setAttribute("mini", "true");
this.hits = ' ';
var text = "L = Искать следущее"+"\n" +"M = Поиск выделенного текста/из буфера" + "\n" + "R = Искать предыдущее";
HighBut.setAttribute("tooltiptext", text );
}
else
{
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
findToolbar.removeAttribute("mini")
this.hits = ' hits';
HighBut.setAttribute("tooltiptext", "Highlight");
//...
if (!!gFindBar._findField.style.color)
{
highlightBtn.setAttribute("checked", "true");
gFindBar._findField.removeAttribute("style");
}
 }
//Findbar, убрать фокус(Findbar, hide focus) 
_content.focus();
  };

//Findbar, переклучить атрибут 'autohide'......
function Autohide(event){
var f = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.auto_Close") ? f.setAttribute("autohide", "true") : f.removeAttribute("autohide");
};

//Findbar, переклучить атрибут 'pasteButton'......
function pasteButton(event){
var ft = document.getElementById("FindToolbar");
custombuttons.getPrefs("FindBar.pasteButton") ? ft.setAttribute("pasteButton", "true") : ft.removeAttribute("pasteButton");
};
//Запускаем функции fmini, Autohide, pasteButton
setTimeout(function(){ fmini(event); Autohide(event); pasteButton(event);}, 200)



//Изменить иконку кнопки.................................................................
function ToggleImage(event){
// toggle button image
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
this_.image="data:image/x-icon;base64,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";
}
else
{
this_.image="data:image/x-icon;base64,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";
}
  };
ToggleImage(event); 



//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + hits;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + hits;
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + hits;
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red').............. 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')...............
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



//FindBar, поиск колесиком мыши(FindBar, Mouse Scroll find )................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    //Найти (Find)
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);

 

//переключить 'Поиск на странице' двойным средним кликом на странице(toggle Find Bar, if Double midlle Click in page)..........
//добавляем обработчик для обработки нажатие на кнопку мыши на странице.......
gBrowser.addEventListener("mouseup", function(event){
//если нажатие на среднюю кнопку мыши
if (event.button !== 1) return;
//если разрешено в настройках(about:config)
if (!custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick")) return;
var _this = this;
//если установлен флаг
if (_this.open){ 
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//устанавливаем флаг
_this.open = true;
//сбросить флаг по таймеру
this.timer = 0;
this.timer = setTimeout(function(){ _this.open = false;}, 600);
}, false);



//Автоматически очищать поле текстового ввода на Findbar............................................
gFindBar.addEventListener("DOMAttrModified", function(event){
if (gFindBar.hidden){ gFindBar.removeAttribute("red"); this.clear = true };
if (!custombuttons.getPrefs("FindBar.autoclear")) return;
if (!this.clear) return;
if (gFindBar.hidden)
   {
   if (gFindBar._findField.value){ window.FB_fFval = gFindBar._findField.value };
   gFindBar._findField.value = '';
   }
if (!gFindBar.hidden)
   {
   findFieldClear(event);
   this.clear = false;
   }
}, false);
 
 
 
 
//findbar очистить, кликнуть правим кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar clear findText, right click on findbar's label, else Find button)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: или на иконку поиска на FindBar mini(FindBar find, left click on findbar's label, else Find button)..............  
var FindButt = document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label");
FindButt.setAttribute("onclick", "event.stopPropagation(); clickFind(event);");
//....
var HighBut = document.getAnonymousElementByAttribute( gFindBar, "anonid", "highlight");
HighBut.addEventListener("click", function(event){
  if (custombuttons.getPrefs("FindBar.mini"))
  {
  gFindBar.getElement("highlight").removeAttribute("checked");
  //.......
  clickFind(event);
  }
   }, true);
//.....................
clickFind = function(event){
 if ( event.button == 0 )
   {
   event.preventDefault();
   event.stopPropagation();
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Искать следующее
   gFindBar.onFindAgainCommand(false);
   }
 else if ( event.button == 2 )
   {
   if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
   //Запускаем функцию findFieldClear или искать предыдущее
   custombuttons.getPrefs("FindBar.mini") ? gFindBar.onFindAgainCommand(true) : findFieldClear(event);
}
  };



//кнопка 'Highlight' на FindBar.mini всегда включена...................................................................      
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
highlightBtn.addEventListener("mouseover", function(event){
if (custombuttons.getPrefs("FindBar.mini")){ highlightBtn.setAttribute("disabled", "false")}
}, false);
  
 
 
    
//Поиск по странице из буфера обмена/выделенный текст, если кликнуть средним кликом на findbar или на иконку поиска на FindBar mini .......
//Двойной клик в строке поиска FindBar мини включает и выключает обычную подсветку текста из панели поиска...........
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
//Поиск по странице из буфера обмена/выделенный текст
gFindBar.addEventListener("click", function(event){
     if ( event.button !== 1 )return; 
        event.preventDefault();
        event.stopPropagation();
        //........
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}, true);
//переключить кнопку 'Highlight'.........
gFindBar._findField.addEventListener("dblclick", function(event){
      if ( event.button != 0 )return;
        event.preventDefault();
        event.stopPropagation()
        //....
        if (!custombuttons.getPrefs("FindBar.mini")) return;
        if (custombuttons.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick")){
        // переключаем настройки в about:config
        s = "FindBar.Highlight";
    custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
    //Изменить иконку кнопки
    ToggleImage(event);
    //переключить кнопку 'Highlight'(toggle Highlight)
    document.getElementById('FindToolbar').getElement('highlight').removeAttribute("checked");
    //Запускаем функцию Highlight(run function Highlight)
    Highlight(event);
    }
    else{
    if (custombuttonsUtils. getPrefs ("FindBar.Highlight")) return;
        //Запускаем функцию toggleHighlight
        toggleHighlight(event);
        }
        //Findbar, убрать фокус(Findbar, hide focus) 
        _content.focus(); 
  }, false);
})();


 
//ЛКМ в форму поиска - выделить текст в форме поиска............................
gFindBar._findField.addEventListener("click", function(event){
      if ( event.button !== 0 )return;
      if(!this.FB_fFselect){ gFindBar._findField.select();}
      this.FB_fFselect = true;
}, false);
gFindBar._findField.addEventListener("blur", function(event){ this.FB_fFselect = false;
}, false);



//ЛКМ + ПКМ очистить поле текстового ввода на Findbar........................................................
//добавляем обработчики для обработки мышиных событий на поле текстового ввода...
//нажатие на кнопку мыши, запускаем функцию 'buttonDown'
gFindBar._findField.addEventListener("mousedown", function(event){ClearFindField.buttonDown(event); }, true);
//нажатая кнопка мыши отпущена, запускаем функцию 'buttonUp'
gFindBar._findField.addEventListener("click", function(event){ ClearFindField.buttonUp(event); }, true);//mouseup
//......
var ClearFindField = {
buttonDown : function(event)
{  
   //если нажатие на левую кнопку мыши, устанавливаем флаг
   if (0 == event.button){ this.leftButtonDown = true };
   //если нажатие на правую кнопку мыши и если установлен флаг
   if (2 == event.button && this.leftButtonDown){
   //сбросить флаг, устанавить флаг
    this.leftButtonDown = false;
    this.stopMenu = true; 
    //Очистить поле текстового ввода
    setTimeout(function(){ findFieldClear(event);}, 0);
    if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
    }
},
buttonUp : function(event)
{
  //если нажатая левая кнопка мыши отпущена
   if (event.button == 0)
   {
   //сбросить флаг
   this.leftButtonDown = false;
   }
  //если нажатая правая кнопка мыши отпущена и если установлен флаг
   if (event.button == 2 && this.stopMenu){
   event.preventDefault();
   event.stopPropagation();
   //сбросить флаг
   this.stopMenu = false; 
   } 
}   
                   };

     
   
//FindBar, автоматически закрыть(autohide Findbar).................................      
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop') (function () {
function go() {
  gFindBar.close();
  window.ACRun = '';
  }
function on() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  if (window.ACRun == 'stop') return;
  window.ACRun = 'stop';
  timeoutId = 0;
  timeoutId = setTimeout(go, custombuttons.getPrefs("FindBar.CloseTimer") + '000')
  }
function off() {
  if (!custombuttons.getPrefs("FindBar.auto_Close")) return;
  window.ACRun = '';
  clearTimeout(timeoutId);
  }  
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden) off() }, false);  
addEventListener('mouseover', function(event){ if (!gFindBar.hidden) (event.target.nodeName !== 'findbar')? on(): off() }, false);  
})();  



//FindBar, сочетания клавиш(Key config).........................................................
//Стоп, при открытии настройки панелей(stop, if onDestroy)
if (window.ToggleFindRun !== 'stop')(function () {
window.addEventListener('keydown', function (event){
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.ctrlKey)&&(!event.altKey)&&(!event.shiftKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
//переключить 'Поиск на странице'
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
Find(event);
gFindBar._findField.focus();
}
//Findbar(ctrl+ALT+F), поиск по странице из буфера обмена(find from clipboard).............
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==70))
{
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");
Find(event);
}
//Findbar(ctrl+Snift+F), открывать Findbar с чистой формой/обычный поиск (Find, clear/normal find).............
if ((event.ctrlKey)&&(!event.altKey)&&(event.shiftKey)&&(event.keyCode==70))
{
var val = (window.FB_fFval)? window.FB_fFval: '';
var sel = document.commandDispatcher.focusedWindow.getSelection().toString();
if (sel.length  !== 0){ val = sel}  
gFindBar.onFindCommand()
custombuttons.getPrefs("FindBar.autoclear")? gFindBar._findField.value = val : findFieldClear(event);
Find(event);
}
//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words)...
if ((event.ctrlKey)&&(event.altKey)&&(event.keyCode==72))
{
//Запускаем функцию HighlightAdd(run HighlightAdd) 
HighlightAdd(event);
}
 }, false);
})();


//переключить кнопку 'Highlight'(toggle Highlight)............................................
function toggleHighlight(event) {
var highlightBtn = document.getElementById('FindToolbar').getElement('highlight');
//...
if (!gFindBar._findField.style.color)
{
gFindBar._highlightDoc(true, gFindBar._findField.value);
gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
}
else 
{
gFindBar._highlightDoc(false);
gFindBar._findField.removeAttribute("style");
}
 };



//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
Highlight = function(event) {

//устанавливаем флаги...
var m = true;
if (event =='false' || event =='[object UIEvent]' || event =='[object DragEvent]' || event =='[object MouseEvent]'){var m = false
};   
//hide Highlight
gFindBar._highlightDoc(false);
//....
var FBNum = custombuttons.getPrefs("FindBar.AutohighlightNum");
var FBvalue = gFindBar._findField.value;
//.... 
if (!gFindBar.hidden)
{
  //...
  if (!!gFindBar._findField.style.color)
     {
     gFindBar._findField.removeAttribute("style");
     }
  //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red')..............
  if (FBvalue.length  == '0')
     {
     var findToolbar = document.getElementById("FindToolbar");
     findToolbar.removeAttribute("red");
     }
  //FindBar, auto find 
  if (m)
     {
      //Findbar, фокус(Findbar, focus)
      gFindBar._findField.focus();
  
      gFindBar.onFindCommand();
    
      //Findbar, убрать фокус(Findbar, hide focus) 
       _content.focus();
      }
}
//auto Highlight
if (custombuttonsUtils.getPrefs("FindBar.Highlight"))
{
  if (gFindBar.hidden)
     {
     //getting prefs Unicode value
     var value = prefs.getComplexValue("FindBar.Highlight.value",
     Components.interfaces.nsISupportsString).data;
     }
  if (!gFindBar.hidden)
     {
     var value =(FBvalue.length > FBNum)? FBvalue : "??????";
     }
//Highlight
gFindBar._highlightDoc(true, value);
}
 };   
if (window.ToggleFindRun !== 'stop') (function () {
//добавляем обработчики........
//отслеживаем команду Назад(back) и Вперёд(forward)...
window.addEventListener("command", function(event){
var command = String(event.target.getAttribute("oncommand"));
//фылтр..
if (command == 'BrowserBack();' || command == 'BrowserBack(event);' || command == 'BrowserForward();' || command == 'BrowserForward(event);'){
setTimeout(function() { Highlight(event)}, 0)
}}, false);
//обработчики для табов...
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
gBrowser.addEventListener("DOMContentLoaded", function(event){
//фылтр..
//стоп, если открыть новые таби 
if (event.target.location.href !== getBrowser().currentURI.spec) return;
//стоп, если срабатывает на фрейме
var document = event.originalTarget;
if (document instanceof HTMLDocument && this.contentWindow.document !== document) return;
Highlight(event)}, false);
//обработчики для FindBar..
gFindBar._findField.addEventListener("input", function(event){ Highlight("false")}, false);
gFindBar._findField.setAttribute("ondrop","event.stopPropagation(); Find(event); ");
gFindBar.addEventListener("DOMAttrModified", function(event){if (gFindBar.hidden){Highlight(event)}}, false);
})();



//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){
// выходим, если функция уже выполнялась
    if (document.getElementById("contextFindWords")) return;
 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
           
    menu.setAttribute("label", "Find");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:"Найти на странице",
          command:ContexFind
        },
        {
          label:"Поиск по сайту(google)",
          command:Search
        },
        {
          label:"Выделить текст на странице",
          command:HighlightSel
        },
        {
          label:"Автовыделение, добавить текст",
          command:addSel
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }
    var contextFind = document.getElementById("contextFindWords")
    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);
    
    function setMenuDisplay(aEvent) {
         custombuttons.getPrefs("FindBar.contextFindWords") ? contextFind.hidden = !gContextMenu.isTextSelected : contextFind.hidden = true;
         }
     function ContexFind(){
         gFindBar.onFindCommand();
         //Запускаем функцию Find
         Find(event);
         }
     function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
     function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var text = document.commandDispatcher.focusedWindow.getSelection();
        gFindBar._highlightDoc(true, text);
        goDoCommand("cmd_selectNone");
        }
     function addSel(){
        //Запускаем функцию HighlightAdd 
        HighlightAdd(event);
        }     
})();


//Если нажать в главном меню Firefox на пункт меню 'Найти'.............................................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(); Find(event);");


//Найти на странице....................................................  
Find = function(event){
event.preventDefault();
event.stopPropagation();
if (custombuttons.getPrefs("FindBar.Highlight")){Highlight(event)};
if (!gFindBar.hidden) gFindBar._find(gFindBar._findField.value);
};

        

//Добавить текст(выделенный / из буфера обмена) для автовыделения.......................................
function HighlightAdd(event){
//Копируем выделенный текст в буфер
document.getElementById("cmd_copy").doCommand();
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
//читаем из буфера обмена и добавляем текст для автовыделения в 'about:config'
str.data = readFromClipboard();
prefs.setComplexValue("FindBar.Highlight.value", 
Components.interfaces.nsISupportsString, str);
//всплывающая подсказка
custombuttons.alertSlide(AutoHighlight, str.data);
//...
goDoCommand("cmd_selectNone");
//Запускаем функцию Highlight(run Highlight) 
Highlight(event);
      };  



//Поле текстового ввода на Findbar мигает желтим............................
function fflash(event){
var findToolbar = document.getElementById("FindToolbar");
//Следим за иконкой статуса на FindBar
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e){
if(findstatus.getAttribute("status")=="wrapped")
{
findToolbar.setAttribute("flash", "true");
setTimeout(function() {findToolbar.removeAttribute("flash");}, 700)};
}, false)};
//Запускаем функции fflash(Run the function fflash)
document.addEventListener( "DOMContentLoaded", fflash(event), false);



//Создать кнопку "Вставить и искать" на Findbar.........................................................
var ubc=document.getAnonymousElementByAttribute( gFindBar, "anonid", "findbar-textbox");
var btn=document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
btn.setAttribute("id", "pasteButton");
btn.setAttribute("tooltiptext", "Поиск выделенного текста/из буфера");
ubc.parentNode.insertBefore(btn, ubc.nextSibling);
btn.addEventListener("click", function(event){
  if ( event.button == 0 ){
        //Поиск по странице из буфера обмена/выделенный текст...
        //event.preventDefault();
        //event.stopPropagation();
        var sel = content.getSelection().toString();
        var str =(!!sel) ? sel : readFromClipboard();
        //Убираем пробелы с обоих концов текста.
        var str = str.replace(/^\s+|\s+$/g,"");
        //...
        gFindBar._findField.value = str;
        Find(event);
}
  }, false);



//Очистить поле текстового ввода на Findbar..................................................
function findFieldClear(event){
if (gFindBar._findField.value){ window.FB_fFval = gFindBar._findField.value };
gFindBar._findField.value = '';
//....
var findToolbar = document.getElementById("FindToolbar");
findToolbar.removeAttribute("red");
//...
gFindBar.onFindCommand();
//....
gFindBar._highlightDoc(false);
};

 
 
// FindToolbar стиль(style).......................................................................
(function(css) {
      var pi = document.createProcessingInstruction(
      'xml-stylesheet',
      'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    );
    return document.insertBefore(pi, document.documentElement);
  }
)(<![CDATA[
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);


/*Find Toolbar.................*/
#FindToolbar {
    border-bottom: 1px solid grey !important; }

#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;font-weight: bold  !important;}
#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton
{display: none !important;}

#FindToolbar[red="true"] .findbar-textbox{box-shadow: 0 0 0 1em #f66 inset;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;
   box-shadow: none !important;}


/*Find Toolbar, mini......................................... */

#FindToolbar[mini="true"] .findbar-textbox{
   width: 16em !important; 
   height:21px!important;  
   padding-right: 20px !important;
   margin-right: 2px!important;
   margin-left:-4px!important}
   
#FindToolbar[mini] {
    position: fixed;
    right: 18px;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important;
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important;}
   
#FindToolbar[mini="true"] .findbar-container>checkbox{
   margin-left:-24px !important;
   margin-right: -3px !important}

#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini="true"]  label[class="checkbox-label"],
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-next, 
#FindToolbar[mini="true"]  toolbarbutton.findbar-find-previous,
#FindToolbar[mini="true"] .findbar-highlight label,
#FindToolbar[mini="true"] .findbar-closebutton,
#FindToolbar:not([pasteButton="true"]) #pasteButton,
#FindToolbar[mini="true"] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini="true"] .findbar-find-fast[anonid="match-case-status"] 
{ display: none !important;} 

    
#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    list-style-image: url("data:image/gif;base64,R0lGODlhEAAQAMQWAJmZzJlmzGZmzGZm/2aZ/5mZ/5nM/8zM/8z//5mZmWZmmf///8yZzMzMmZlmmZmZM8zMM8zMZsz/ZsyZZpmZZmZmM////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAHoAxYALAAAAAAQABAAAAVsoCUCgQCIaCoKA1G4p7q6RmEXcQoMxYEYQEMOJSAYEL+D8jC0CG6GJTKhUtiAPiSCmlK4er7FgiGzWLGIBUJRZliVCLMi0Sg7FHhq4gGJlFUNEBIQE38pExGDFIYoFIkQi4wWjhEVkiIUFQohADs=") !important;
    -moz-image-region: auto !important;}
 

#pasteButton{
    list-style-image: url("chrome://browser/skin/appmenu-icons.png");
    -moz-image-region: rect(0 48px 16px 32px);
    margin-right: 3px! important;} 
       
     
#FindToolbar[mini="true"] textbox.findbar-textbox{
   -moz-box-ordinal-group: 2 !important}
#FindToolbar[mini="true"] checkbox{ 
  -moz-box-ordinal-group: 3 !important;}
#FindToolbar[mini="true"] toolbarbutton.findbar-highlight{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] #pasteButton{
   -moz-box-ordinal-group: 4 !important;}
#FindToolbar[mini="true"] .findbar-closebutton{
   -moz-box-ordinal-group: 7 !important;}
]]>.toString());


//устанавливаем флаг
window.ToggleFindRun = 'stop';

bunda1
уииии! работает отлично :)
спасибо большое!
правда оказалось, что ctrl+shift+f уже используется адблоком, но я посмотрел по коду твоей кнопки - ты правильно сделал что и ctrl+alt+f приделал, буду им пользоваться.

мой список тает на глазах :)

Только что в консоли ошибок заметил такую ошибку:

Error: TypeError: body is null
Source File: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button22@init
Line: 466

Которая указывает на строку:

Выделить код

Код:

        var count = body.childNodes.length;

iDev.Pi
Это не критично.
Пожалуйста подумай как сделать красивый таймер закрытия на панель поиска(в CSS коде), вот я сделал код который постепено делает панель поиска прозрачным, можешь попробовать, но это не есть хорошо:

Выделить код

Код:

var CloseIndicator = function(){
    if (!arguments.callee.runTimes) arguments.callee.runTimes = 0;
    arguments.callee.runTimes++;
        
    var findBar = document.getElementById('FindToolbar');
        findBar.style.opacity = "0."+ (9 - arguments.callee.runTimes);
            
    if (arguments.callee.runTimes == custombuttons.getPrefs("FindBar.CloseTimer")) return;
    setTimeout(arguments.callee, 1000);
};
CloseIndicator();

Я думаю надо что то вроде этого Progress Bar on Tab :: Дополнения Firefox

bunda1
я думал просто число выводить и всё. Но если охота красоты - ну хз, можно и прогрессбар узенький.
Прозрачность постепенную делать не надо: можно просто сделать при уже закрытии панели плавный переход в прозрачное состояние.

iDev.Pi пишет:

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

Как это?

css transitions. выставить период транзиции на 1.5 сек - вот те и плавное угасание.

Заметил нехороший баг, кнопка не подсвечивает текст на текущей странице при обновлении или загрузке текущей страницы если Java скрипты отключены на странице расширением NoScript.
Не срабатывает: gFindBar._highlightDoc(true, value);
Может кто знает, что надо в скрытых настройках NoScript переключить что бы проблему исправить.

Баг:
иногда при открытии поиска - в него не переходит фокус.
В этот момент в консоли ошибок появляется подобная запись:
Error: TypeError: body is null
Source File: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button22@init
Line: 466

iDev.Pi
Спасибо, буду исправлять.

Toggle  Find+3(Firefox 7.0 +) Toggle  Find+3
Добавил новые возможности:
Теперь можно: Eсли это включена в настройках кнопки - автоматически выделять ссылки на страницах если адрес ссылки содержит заранее введенный текст. Eсли открыт панель поиска по странице кнопка будет автоматически выделяеть ссылки на страницах - если адрес ссылки содержит текст из поле вода на панели поиска по странице и если в тексте три или больше букв. Эта функция зависит от регистра текста.
Исправил ошибки:
Кнопка не подсвечивала текст(Автовыделение) на текущей странице при обновлении или загрузке текущей страницы если Java скрипты были отключены на странице.

Toggle  Find+3( Firefox 7.0 +) Toggle  Find+3
Исправил ошибки:
После настройки панелей не работала автоматическое закрытие поиска по странице.
Автоматическое закрытие поиска по странице иногда срабатывала после выключения её в меню кнопки.
Уменьшил потребление ресурсов.
Убрал лишний код.

bunda1
В [nightly] если Toggle Find+3 скрыта, или находится не в фокусе, то при наборе текста стала открываться стандартная панель поиска.

voqabuhe пишет:

bunda1
В [nightly] если Toggle Find+3 скрыта, или находится не в фокусе

Как это понять. Kнопка находится на закрытом панели или в панели настройки инструментов или где ?

bunda1
Да немного не правильно выразился, я имел в виду панель поиска, которую создаёт Toggle Find+3.

Так это быстрый поиск.
about:config
accessibility.typeaheadfind - false

bunda1 пишет:

Так это быстрый поиск.
about:config
accessibility.typeaheadfind - false

Это понятно. А нельзя сделать, чтобы он происходил в Toggle Find+3?

voqabuhe пишет:

Это понятно. А нельзя сделать, чтобы он происходил в Toggle Find+3?

Попробую это сделать.

bunda1
На [nightly] перестала работать кнопка «Вставить и искать».

voqabuhe пишет:

На [nightly] перестала работать кнопка «Вставить и искать».

Да, на [nightly] не работает:

Выделить код

Код:

_content.focus(); 

Буду думать, чем заменить.

11-08-2012 14:23:49
Оказывается можно заменить на:

Выделить код

Код:

window.content.focus();

bunda1 пишет:

Оказывается можно заменить на:

Спасибо :beer:

Toggle  Find+3( Firefox 7.0 +)
Исправил ошибки: На [nightly] не работали некоторые функции.

bunda1

voqabuhe пишет:

На [nightly] перестала работать кнопка «Вставить и искать».

Опять поломали:(
После сегодняшнего обновления вроде как заработала.

voqabuhe
А поконкретней можно, что показывает консоль ошибок.
Я только что проверил на [nightly], кнопка «Вставить и искать» вроде работает. :(

14-08-2012 19:00:22

voqabuhe пишет:

После сегодняшнего обновления вроде как заработала.

Ну тогда хорошо. :)

bunda1 пишет:

Ну тогда хорошо. :)

Нет всё-таки не очень хорошо.:)  Перезапускаю [nightly] всё ОК, а через какое-то время перестаёт вставлять слово кнопка «Вставить и искать». В консоли:

Метка времени: 14.08.2012 19:09:09
Ошибка: TypeError: can't access dead object
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button30@init
Строка: 1045

_content.focus();

Попробуй теперь Toggle  Find+3( Firefox 7.0 +)

bunda1
Спасибо, пока работает.

старые версии имели меньше багов.

Про какие баги речь?

bunda1
http://forum.mozilla-russia.org/viewtopic.php?pid=550901#p550901

1. Auto Highlight подсвечивает найденные на странице искомые слова, если панель поиска закрылась по таймеру.
Исправим.
2. ????????? - автоматически подсвечивается, даже если вы это не искали.
Это мелочь, исправим.
3. При повторном открытии файндбара - фокус переходит на следующее найденное слово. Для этого нужно иметь снятой галку у "Всегда открывать пустую поисковую форму".
Переход фокуса - это сам FF по умолчанию делает. Но у меня есть идея.
4. Глюк со стилями на XP: при посыле scroll up/down событий в findbar mini - текст в нём двигается вверх/вниз.
Это я не понял.

bunda1 пишет:

Это я не понял.

Мммм, баг повторить на другой машине не удалось, баг снимается, но вместо него добавляется новый, более важный.

22-09-2012 21:57:09
и дополнение к багу №3: происходит не только переход к следующему найденному на странице варианту, но также и его выделение, которое остаётся даже если потом закрыть файндбар.

iDev.Pi
Ошибки вроде исправил и добавил два новых пункта в меню:
FindBar сверху - переключает атрибут top
FindBar справа - переключает атрибут right
Может напиши нужный CSS код.

http://forum.mozilla-russia.org/uploaded/Toggle Find+3.txt

bunda1 пишет:

добавил два новых пункта в меню:
FindBar сверху - переключает атрибут top
FindBar справа - переключает атрибут right

Лучше бы вернул кнопку "Очистить поле поиска"

SendInfo пишет:

Лучше бы вернул кнопку "Очистить поле поиска"

Сейчас кнопка Toggle Find+3 дает сразу две возможности очистить поле поиска:
Можно очистить поле текстового ввода на Findbar, если кликнуть правим кликом на ярлык Найти:
Можно очистить поле текстового ввода на Findbar, если кликнуть ЛКМ + ПКМ в форму поиска.

bunda1 пишет:

Можно очистить поле текстового ввода на Findbar, если кликнуть правим кликом на ярлык Найти:

Не вижу такого. - Включен финдбар мини.

bunda1 пишет:

Можно очистить поле текстового ввода на Findbar, если кликнуть ЛКМ + ПКМ в форму поиска.

Очень неудобно.

SendInfo пишет:

Не вижу такого. - Включен финдбар мини
Очень неудобно.

На финдбар мини этого нету.
Может и неудобно, это дело вкуса. Но зачем удалять текст из поле текстового ввода, можно же кликнуть ЛКМ на поле текстового ввода и выделить текст потом писать новый.
Или поставить галочку в настройках - Всегда открывать пустую поисковую форму и потом закрыть и открыть финдбар.
Или можно нажать Ctrl+ snift+ f.

bunda1 пишет:

поставить галочку в настройках - Всегда открывать пустую поисковую форму и потом закрыть и открыть финдбар.

Тогда не работает Find - Найти на странице

bunda1 пишет:

можно нажать Ctrl+ snift+ f.

А оно надо забивать голову комбинациями хоткеев?

bunda1 пишет:

можно же кликнуть ЛКМ на поле текстового ввода и выделить текст потом писать новый.

Не всегда - случаи разные бывают. Предлагаю: кнопка "Вставить и искать " по ПКМ очищает поле текстового ввода.

SendInfo пишет:

Предлагаю: кнопка "Вставить и искать " по ПКМ очищает поле текстового ввода.

Хорошо, позже сделаю. :)

bunda1 пишет:

Может напиши нужный CSS код.

это невозможно: в старых версиях у тебя кнопка копировала элемент #FindToolbar в #appcontent и  таким образом становилось, что у #FindToolbar и у #content (где располагается содержимое просматриваемой страницы) был общий родительский элемент #appcontent, а теперь это необходимое для создания стиля условие не выполняется и поэтому #FindToolbar-у нельзя задать правильное позиционирование через стиль.

iDev.Pi
Похоже что я поспешил когда закомментировал в кнопке этот код:

Выделить код

Код:

// Панелъ поиска сверху ........................... ..........................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});

Ну тогда вот так: http://forum.mozilla-russia.org/uploade … Find+3.txt

:/
Но хочу заметить что тут http://userstyles.org/styles/browse/all/find похожие CSS коды работают без #appcontent

bunda1 пишет:

Но хочу заметить что тут http://userstyles.org/styles/browse/all/find похожие CSS коды работают без #appcontent

там позиция findbar'а задана через абсолютное значение, т.е. если у пользователя вверху не стандартное количество (или нестандартная высота) тулбаров, то findbar будет на них наезжать (или наоборот, между панелями и findbar'ом будет расстояние), там же в коде даже сказано "настройте под себя":

Выделить код

Код:

...
/*  ADJUST POSITION OF FIND BAR
If you are using small icons on the navigation bar move the find bar up by changing top: 59px;  */ 
#FindToolbar {
   position: fixed;
   top: 67px;
   right: 17px; }

/*  ADJUST POSITION OF FIND BAR IN NORMAL (UN-MAXIMIZED) WINDOW MODE
If you are using small icons on the navigation bar move the find bar up by changing top: 74px;  */
#main-window[sizemode="normal"] #FindToolbar {
   top: 82px;
   right: 18px; }
...

iDev.Pi
Теперь понятно.

bunda1 пишет:

Ну тогда вот так: http://forum.mozilla-russia.org/uploade … Find+3.txt

При использовании Find-Найти на странице для очистки поля текстового ввода приходится два ПКМ по кнопке "Вставить и искать " или предварительно убрать выделение с искомого и ПКМ.

SendInfo
Спасибо за прикольный баг, завтра исправлю.

bunda1 пишет:

Может напиши нужный CSS код.

done

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
#FindToolbar {
    border-bottom: 1px solid grey !important; }
#FindToolbar > .findbar-container > * {
    display: -moz-box !important; }
#FindToolbar > hbox > label {
    -moz-appearance: none !important;
    font-weight: bold !important; }
#find-field, .findbar-textbox {
    width: 250px !important; }
#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image,
#FindToolbar[autohide] .findbar-closebutton { 
    display: none !important; }
#FindToolbar[red] .findbar-textbox {
    box-shadow: 0 0 0 1em #f66 inset; }
#FindToolbar:not([red]) .findbar-textbox[status="notfound"] {
    background: rgba(207,219,236,0.99) !important;
    color: black !important;
    box-shadow: none !important; }
#FindToolbar[mini] .findbar-textbox {
    width: 16em !important; 
    height: 21px !important;  
    padding-right: 20px !important;
    margin-right: 2px !important;
    margin-left: -4px !important; }
#FindToolbar[mini] {
    position: fixed;
    background: menu !important;
    box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;
    border: 1px solid grey !important; }
#FindToolbar[mini][top] {
    border-top: 0 !important;
    border-radius: 0 0 8px 8px !important; }
#FindToolbar[mini][right] {
    right: 18px; }
#FindToolbar:not([top]) + #content {
    -moz-box-ordinal-group: 0 !important; }
#FindToolbar:not([top]) {
    -moz-box-ordinal-group: 1 !important; }
#FindToolbar[mini]:not([top]) {
    border-radius: 8px 8px 0 0 !important;
    margin-top: -29px !important; }
#FindToolbar[mini] .findbar-container > checkbox {
    margin-left: -24px !important;
    margin-right: -3px !important; }
#FindToolbar[mini] toolbarspacer,
#FindToolbar[mini] label[class="checkbox-label"],
#FindToolbar[mini] toolbarbutton.findbar-find-next, 
#FindToolbar[mini] toolbarbutton.findbar-find-previous,
#FindToolbar[mini] .findbar-highlight label,
#FindToolbar[mini] .findbar-closebutton,
#FindToolbar:not([pasteButton]) #pasteButton,
#FindToolbar:not([mini]) #findButton,
#FindToolbar[mini] .findbar-find-fast[anonid="find-label"],
#FindToolbar[mini] .findbar-find-fast[anonid="match-case-status"],
#FindToolbar[mini] .findbar-highlight,
#FindToolbar[mini] .findbar-highlight[checked] {
    display: none !important; }
#FindToolbar[mini] textbox.findbar-textbox {
    -moz-box-ordinal-group: 2 !important; }
#FindToolbar[mini] checkbox {
    -moz-box-ordinal-group: 3 !important; }
#FindToolbar[mini] #pasteButton {
    -moz-box-ordinal-group: 4 !important; }
#FindToolbar[mini] #findButton {
    -moz-box-ordinal-group: 5 !important; }
#pasteButton {
    list-style-image: url("chrome://browser/skin/appmenu-icons.png");
    -moz-image-region: rect(0 48px 16px 32px);
    margin-right: 3px !important; }
#findButton {
    list-style-image: url("chrome://global/skin/icons/Search-glass.png") !important;
    -moz-image-region: rect(0px, 16px, 16px, 0px); }


P.s.: обновил свой список багов.

iDev.Pi
Очень хорошо, но мини панель поиска наезжает на стандартные боковые панели слева и на Vertical Toolbar :: Firefox Extension

:blush:
И пожалуйста, сделай так что бы твой стиль скрывал панель поиска на about: страницах и тому подобных внутренних страницах.

iDev.Pi пишет:

2. Поставить галку "Автовыделене", затем на этой странице поискать по слову "Отсутствует", затем попереключаться между найденными результатами (понажимать кнопки "Next"/"Previous" или поисковой формой колесом мыши), затем закрыть файндбар. Результат: на странице остаётся выделенным 1 из найденных результатов поиска. Ожидаемый результат: выделенным на странице должно остаться то, что пользователь на ней сам вручную выделял и оставил выделенным перед тем как воспользоваться поиском по странице.

Это не мой баг, попробуй без Toggle Find+3 на стандартном панели поиска.
Не знаю как сделать чтобы выделенным на странице осталось то, что пользователь на ней сам вручную выделял и оставил выделенным перед тем как воспользоваться поиском по странице.
Легко можно запомнить старое слово, проблема в том как выделить только его, ведь на странице может быть много одинаковых слов.

И зачем это нужно ?

bunda1 пишет:

Это не мой баг, попробуй без Toggle Find+3 на стандартном панели поиска.

принято, багрепорт отзывается.

bunda1 пишет:

Очень хорошо, но мини панель поиска наезжает на стандартные боковые панели слева и на Vertical Toolbar :: Firefox Extension

Исправил.

bunda1 пишет:

about: страницах и тому подобных внутренних страницах.

А зачем это нужно?

bunda1
Расскажи, пожалуйста, чего ты вот этим правилом в стиле хотел добиться?

Выделить код

Код:

...
#FindToolbar:not([red]) .findbar-textbox[status="notfound"] {
    background: rgba(207,219,236,0.99) !important;
    color: black !important;
    box-shadow: none !important; }
...

Ведь если .findbar-textbox имеет атрибут status со значением notfound, то #FindToolbar имеет атрибут red, а значит правило не будет никогда выполняться. Или всё же есть такая ситуация, когда оно выполняется?

iDev.Pi пишет:

У меня поломалось "автовыделение". Подтвердите, кто-нибудь.

Нет, автовыделение работает: Toggle Find+3

05-10-2012 08:17:25

iDev.Pi пишет:

bunda1
Расскажи, пожалуйста, чего ты вот этим правилом в стиле хотел добиться?
#FindToolbar:not([red]) .findbar-textbox[status="notfound"] ...
Ведь если .findbar-textbox имеет атрибут status со значением notfound, то #FindToolbar имеет атрибут red, а значит правило не будет никогда выполняться. Или всё же есть такая ситуация, когда оно выполняется?

Давно добавил и сам не помню пачему, надо проверить.
Но значение notfound и атрибут red бывает по отдельности, ведь red добвляет кнопка а notfound Firefox.

bunda1 пишет:

Но значение notfound и атрибут red бывает по отдельности, ведь red добвляет кнопка а notfound Firefox.

Как мне кажется, они оба добавляют эти значения в одном и том же ряде случаев, когда искомая комбинация не найдена на странице.
Таким образом, становится не нужен не только тот кусок в стиле, но и код в кнопке, который добавляет атрибут status.

А выделение снова заработало, когда обновил кнопку по твоей последней ссылке, спасибо.

_iD пишет:

Как мне кажется, они оба добавляют эти значения в одном и том же ряде случаев, когда искомая комбинация не найдена на странице.
Таким образом, становится не нужен не только тот кусок в стиле, но и код в кнопке, который добавляeт атрибут status.

Нет, я только что это проверил. Но может не надо было добавлять атрибут red а тот же notfound

Выделить код

Код:

gFindBar._findField.setAttribute("status", "notfound");

Я подумаю об этом.

И пожалуйста, сделай так что бы твой стиль скрывал панель поиска(сверху, слева) на about:config и на chrome://browser/content/bookmarks/bookmarksPanel.xul и chrome://global/content/console.xul
А то мешает:

Скриншоты
http://s019.radikal.ru/i623/1210/e1/166f2c0a9a25.jpg  http://s42.radikal.ru/i095/1210/7a/6778482b7eac.jpg http://s57.radikal.ru/i156/1210/09/cbe71bb561e0.jpg

bunda1
правильно такой стиль нельзя сделать, т.к. нигде в DOM-дереве браузера не отображается адрес просматриваемой вкладки.
Если у тебя установлен Stylish, то прокатит такой стиль:

Выделить код

Код:

#main-window[stylish-url="about:config"] #appcontent > #FindToolbar {
    display: none !important; }

Если Stylish не установлен, то можно использовать такой стиль:

Выделить код

Код:

#main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar {
    display: none !important; }

Но он имеет 2 недостатка:
1. он чреват ложными срабатываниями: т.к. селектор в этом правиле выбран такой, который просто привязывается к title'у страницы, то на любой странице с заголовком "about:config" - файндбар не будет показываться.
2. этот стиль только для [firefox], в других [mozilla]-браузилках будет другая приписка в заголовке и стиль не сработает. От этого можно избавиться, сделав стиль более универсальным:

Выделить код

Код:

#main-window[title^="about:config"] #appcontent > #FindToolbar {
    display: none !important; }

но тогда повышается вероятность ложных срабатываний: файндбар не будет отображаться на любых страницах с заголовком не равным, а начинающимся с "about:config".

_iD пишет:

Если Stylish не установлен, то можно использовать такой стиль:

Выделить код

Код:

#main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar {
    display: none !important; }

Спасибо. Как добавить другие табы?
Так правильно?

Выделить код

Код:

#main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar,    
#main-window[title="Управление дополнениями - Mozilla Firefox"] #appcontent > #FindToolbar,
#main-window[title="Консоль ошибок - Mozilla Firefox"] #appcontent > #FindToolbar,
#main-window[title="Bookmarks tab - Mozilla Firefox"] #appcontent > #FindToolbar {
    display: none !important; }

bunda1
Да, по идее правильно, проверь.
p.s.: у тебя в стиле в конце опечатка: ненужная закрывающая квадратная скобка.

Спасибо, работает.
Запишу тебя в авторы кнопки 09-03-2012 19:18:31 :)

iDev.Pi

1. Если в поиск начать вписывать букву за буквой (так, чтобы получилась длинная абракадабра, которой точно нет на странице) - то при добавлении новых букв - цвет фона поля поиска меняется с красного (сигнализирующего о том, что на странице нет искомой фразы) на белый (сигнализирующий, что фраза на странице есть).

Исправил: Toggle Find+3

07-10-2012 00:08:27
Удалил добавленные атрибута "red" из кнопки, вместо него когда нужно добавляется status="notfound" и Firefox сам добавляет красный цвет в поисковую форму

Удалил теперь не нужный код:

Выделить код

Код:

#FindToolbar[red] .findbar-textbox {
    box-shadow: 0 0 0 1em #f66 inset; }

Удалил лишний код :):

Выделить код

Код:

#FindToolbar:not([red]) .findbar-textbox[status="notfound"] {
    background: rgba(207,219,236,0.99) !important;
    color: black !important;
    box-shadow: none !important; }

Кнопка вываливает в консоль ошибок такое предупреждение:
Warning: Use of Mutation Events is deprecated. Use MutationObserver instead.
Source File: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button22@init
Line: 647

iDev.Pi
У меня такой ошибки не наблюдается. :(
А ты какую версию Toggle Find+3 используешь, откуда? А то у меня Line: 647:

Выделить код

Код:

}, false);

и там такой ошибки быть не может.

у меня тоже 647-ая строка такая же.
может пустые строки не считаются?
event.preventDefault();
не может быть причиной?

Причина в использовании mutation events.
Там в коде два вызова .addEventListener("DOMAttrModified", ...

Спасибо, буду думать чем заменить DOMAttrModified

bunda1
на той же странице сказано:
Use Mutation Observers instead if possible.
И там всё расписано и даже пример есть.

iDev.Pi
Раньше там даже примера не было, только несколько ссылок. :)
Так что было забавно: «вы этот свой старый код лучше выкиньте, но дальше как-нибудь сами».

Самая полезная, про настройки для

Выделить код

Код:

void observe(
  Node target,
  optional MutationObserverInit options
);

The options argument allows for setting mutation observation options via object members. These are the object members that can be used:

(и далее)

А вот пример бы не помешал, где там пример? А то я на английском не очень.

bunda1

Выделить код

Код:

// выбираем целевой узел
var target = document.querySelector('#some-id');
  
// создаём наблюдателя
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });   
});
  
// конфигурируем наблюдателя
var config = { attributes: true, childList: true, characterData: true }

// делаем вызов функции, указав целевой узел и опции вызова
observer.observe(target, config);

// потом можем остановить наблюдение
observer.disconnect();

вот рабочий пример: http://jsbin.com/ivamoh/53/edit

Спасыбо за пример, полезная вещь и работает:

Выделить код

Код:

// Поле текстового ввода на Findbar мигает желтим если достигнут низ/верх страницы
// выбираем целевой узел
var target = gFindBar.getElement("find-status-icon");
  
// создаём наблюдателя
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    gFindBar.setAttribute("flash", "true");
    setTimeout(function() { gFindBar.removeAttribute("flash") }, 700)
  });   
});
  
// конфигурируем наблюдателя
var config = { attributes: true, childList: true, characterData: true }

// делаем вызов функции, указав целевой узел и опции вызова
observer.observe(target, config);

Но как то:

Выделить код

Код:

var findStatus = gFindBar.getElement("find-status-icon");
findStatus.addEventListener("DOMAttrModified" ......

был привычней и понятней.

по-моему, в битве длины кода против скорости его работы - скорость решает.
только машинные коды, только хардкор!

iDev.Pi
Ты конечно прав, но мне как то не по себе когда вижу такой код. :)

bunda1
Я так понимаю, «characterData: true» в данном случае не требуется:

characterData
    Set to true if mutations to target's data are to be observed.

и

Note: CharacterData is an abstract interface and does not exist as node. It is used by Text, Comment, and ProcessingInstruction nodes.

В общем, не про атрибуты это. :)

И если не нужно отслеживать изменение атрибутов дочерних узлов, то и «childList: true» тоже не нужен:

childList
    Set to true if mutations to target's children are to be observed.

И можно добавить
{ attributes: true, attributeFilter: ["status"] }
(или какой-том атрибут меняется?)

07-11-2012 23:08:33
А еще MutationCallback может быть не только функцией, но и объектом с методом handleMutations().
Правда, это почему-то не указано в доке. Зато можно подсунуть пустой объект и будет соответствующим образом ругаться.

07-11-2012 23:10:28
Как-то так:

Ошибка: [Exception... "'JavaScript component does not have a method named: "handleMutations"' when calling method: [nsIMutationObserverCallback::handleMutations]"  nsresult: "0x80570030 (NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED)"  location: "native frame :: <unknown filename> :: <TOP_LEVEL> :: line 0"  data: no]

Спасибо, уже меньше кода и работает:

Выделить код

Код:

// Поле текстового ввода на Findbar мигает желтим если достигнут низ/верх страницы
// создаём наблюдателя
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    gFindBar.setAttribute("flash", "true");
    setTimeout(function() { gFindBar.removeAttribute("flash") }, 700)
  });   
});
// конфигурируем наблюдателя
var config = { attributes: true, attributeFilter: ["status"] }

// делаем вызов функции, указав целевой узел и опции вызова
observer.observe(gFindBar.getElement("find-status-icon"), config );

bunda1
Можешь помочь с №5708?

bunda1
С этим тоже надо решать :

Выделить код

Код:

// Автоматически очищать поле текстового ввода на Findbar ....................................................
gFindBar.addEventListener("DOMAttrModified", function(event) {
  if ( gFindBar.hidden ) { this.clear = true };
  if ( !custombuttons.getPrefs("FindBar.autoclear") ) return;
  if ( !this.clear ) return;
       if ( gFindBar.hidden ) {
            if ( gFindBar._findField.value ) { window.FB_fFval = gFindBar._findField.value };
                 gFindBar._findField.value = '';
            }
       else 
            {
            findFieldClear(event);
            this.clear = false;
            };
}, false);

P.S. Для меня не критично.Я этой опцией не пользуюсь - удалил этот код у себя из кнопки.

Ок, решим.

iDev.Pi пишет:

Кнопка вываливает в консоль ошибок такое предупреждение:
Warning: Use of Mutation Events is deprecated. Use MutationObserver instead.

Ну вроде исправил и код оптимизировал: http://forum.mozilla-russia.org/uploaded/Toggle Find+3

iDev.Pi
Как подружить FindBar мини с  Personas :: Add-ons for Firefox - Mozilla Firefox

bunda1
это надо менять стили самих персон: если в них указан слишком конкретный путь до файндбара в правиле - ты ничего с этим не поделаешь, если у тебя путь другой.

iDev.Pi
Какие стили самих персон? :(
Мне казалось что обои это просто две файла профиле lightweighttheme-footer и lightweighttheme-header которые используются как фоновое изображение.

На [nightly] сегодня отвалилась

voqabuhe пишет:

На [nightly] сегодня отвалилась

У меня вроде работает, что пишет консоль.

А нет, у меня на Nightly сейчас куча кнопок обвалилась.

Ну все, отключили javascript.options.xml.chrome.

voqabuhe пишет:

На [nightly] сегодня отвалилась

Попробуй: http://forum.mozilla-russia.org/uploaded/Toggle Find+3 e.txt

bunda1 пишет:

Попробуй: http://forum.mozilla-russia.org/uploaded/Toggle Find+3 e.txt

Сначала вроде заработала, но не появился пункт в контекстном меню. Перезагрузился, так она вообще отвалилась и даже удалить не получалось, убрал её с панели, теперь не могу её вернуть, не хочет.

voqabuhe
Отключи инициализацию кнопок в настройках CB + рестарт и тогда удалишь.
Вот же проблема, у меня на Nightly с CB непонятно что творится не могу проверить что там с кнопкой.

bunda1 пишет:

Отключи инициализацию кнопок в настройках CB + рестарт и тогда удалишь.

Да пробовал, всё равно не удалялась, пришлось  востанавливать из резервной копии.
В консоли ошибок появляется

Ошибка: TypeError: oButton.id is undefined
Источник: chrome://custombuttons/content/cbbutton.js
Строка: 325

var nCurrentNum = oButton. id. replace (/custombuttons-button/, "");

13-12-2012 22:50:13

bunda1 пишет:

Вот же проблема, у меня на Nightly с CB непонятно что творится не могу проверить что там с кнопкой.

Да похоже CB отваливается.  У меня тоже код в одну строчку становится. Восстанавливаю кнопки из резервной копии, открываю редактор кнопки. Всё нормально, но как только жму ОК/сохранить, то после следующего открытия редактора код становится в одной строчке. Если просто закрывать редактор без сохранения, то такого не происходит.

voqabuhe
С патчем от Infocatcherа Сегодня 22:35:42 все вроде работает.

bunda1 пишет:

С патчем от Infocatcherа Сегодня 22:35:42 все вроде работает.

Ага, спасибо, работает. Только после каждого редактирования кнопки, начинают дублироваться пункты в контекстном меню страницы.

voqabuhe пишет:

Ага, спасибо, работает. Только после каждого редактирования кнопки, начинают дублироваться пункты в контекстном меню страницы.

После редактирования нужен рестарт, в кнопке так много обработчиков(18) и наблюдателей(2) и т.д., и т.п., что у меня руки не подимаютса писать код который бы блокировал их дублирование после редактирования.
Но куски кода(не все) можно положить в другую кнопку и там редактировать и проверять. Я сам так делаю. И после отладки положить обратно + рестарт.

iDev.Pi
Как сделать что бы FindBar mini автоматически сохранял расстояние до полосы прокрутки( скроллбара ). Дело в том что я уменьшил скроллбар до 8px, а FindBar mini остался на месте.

bunda1
средствами CSS такие проверки нельзя выполнять, поэтому только вручную можешь сменить в стиле что-нибудь типа "right: 16px" на 8px

Спасибо, хотя и жаль. А то бывает что люди вообще скроллбар отключают.

Панель поиска прикрепляется к верху страницы, хотя в настройках "FindBar сверху" не включена. Поменял в коде все "Top", на "Bottom"  и включил опцию "FindBar сверху" результата тоже не дало. Как опустить панель вниз.  Самое итересное, что после запуска FireFox панель поиска отображается снизу, а потом чудесным образом переезжает наверх. А можно опустить  панель поиска  в панель дополнений ( самый низ экрана) - как это сделано по умолчанию в стандартной строке поиска?

PEAKTOP пишет:

Панель поиска прикрепляется к верху страницы, хотя в настройках "FindBar сверху" не включена. Поменял в коде все "Top", на "Bottom"  и включил опцию "FindBar сверху" результата тоже не дало. Как опустить панель вниз.  Самое итересное, что после запуска FireFox панель поиска отображается снизу, а потом чудесным образом переезжает наверх. А можно опустить  панель поиска  в панель дополнений ( самый низ экрана) - как это сделано по умолчанию в стандартной строке поиска?

Не подтверждаю, у меня все заявленные настройки работают.

voqabuhe
судя по UA - у тебя браузер другой версии.

iDev.Pi пишет:

судя по UA - у тебя браузер другой версии.

Ага, но я 19.0 версию в ночнушках  уже проходил и у меня там всё работало:)

voqabuhe
похоже, что ты не понимаешь, что они не связаны.

PEAKTOP пишет:

Панель поиска прикрепляется к верху страницы, хотя в настройках "FindBar сверху" не включена. Поменял в коде все "Top", на "Bottom"  и включил опцию "FindBar сверху" результата тоже не дало. Как опустить панель вниз.  Самое итересное, что после запуска FireFox панель поиска отображается снизу, а потом чудесным образом переезжает наверх.

У меня на FF19 и Nightly22 с этим все порядке, может у тебя кнопка конфликтует с каким нибудь стилем для панели поиска или расширением. Расширение надо по очереди отключать и тогда узнаешь которое виновато.
Может попробуй экспериментальную версию кнопки:http://forum.mozilla-russia.org/uploade … riment.txt

bunda1 пишет:

Может попробуй экспериментальную версию кнопки:http://forum.mozilla-russia.org/uploade … riment.txt

C экспериментальной  версией кнопки тоже самое - панель вверху страницы. Но обратил внимание, что если открыть окно редактирования кнопки и затем закрыть его по "ОК", панель возвращается вниз, но перестает вызываться по Ctrl + F.  Повторное  открытие-закрытие меню кнопки возвращает возможность вызовачерез  Ctrl + F. Шайтан однако.
А можно опустить  панель поиска  в панель дополнений (самый низ экрана) - как это сделано по умолчанию в стандартной строке поиска FF?
немного изменил положение и текст в функции "//Показать количество совпадений на панели поиска" в экспериментальной кнопке:

код инициализации экспериментальной кнопки
// Настройка функций кликов мыши для кнопки ................................................................
this.onclick = function(e) {

     // действие при клике ЛКМ ....
     if ( e.button == 0 ) {
          gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
          Find(e);
          };
         
     // действие при клике СКМ ....   
     if ( e.button == 1 ) {
          gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
          goDoCommand("cmd_selectNone");
          goDoCommand("cmd_paste");
          Find(e);
          };
     
     // действие при клике ПКМ ....   
     if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) {
          e.preventDefault(); 
          document.getElementById(this.id + "-menuPopup").showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
          }
};



// Объявляем переменные для этой вкладки ...................................................................
var button = this;
var alertsService = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);



// Проверить наличие строк в about:config и создать если не существует ......................................
if ( custombuttons.getPrefs("FindBar.version") !== '14') {

     ["FindBar.top","FindBar.mini","FindBar.right","FindBar.auto_Close","FindBar.autoclear","FindBar.Highlight",
     "FindBar.Highlight.Link","FindBar.pasteButton","FindBar.contextFindWords","FindBar.ToggleWithDoubleMiddleClick",
     "FindBar.Autohighlight.ToggleWithDoubleClick"].forEach(function(pref) { custombuttons.setPrefs( pref, false ) });
     
     ["FindBar.version,14", "FindBar.CloseTimer,7", "ui.textHighlightBackground,#ef0fff", "FindBar.Highlight.value,"]
                              .forEach(function(pref) { custombuttons.setPrefs( pref.split(",")[0], pref.split(",")[1] ) });         
};



//this.setAttribute("Help", "alert('')");



// Блокировать повторный запуск функций и обработчиков при открытии настройки панелей ........................
if (this.hasAttribute("stop")) return;



// Подсказка для кнопки .....................................................................................
this.infoToTooltip = function() {
     // получить и обрезать подсказку для автовыделение ....
     var val = Application.prefs.getValue("FindBar.Highlight.value", 0);
     var value = val.substring(0,50) + ( (val.length > 50) ? '....' : "" );
                   
     this.tooltipText = "Поиск по странице \nЛ: Показать - скрыть поиск по странице \nС: Поиск по странице из буфера обмена"
                                        + "\nП: Mеню + CB меню \n\nАвтовыделение: " + value;               
};
this.setAttribute("onmouseover", "this.infoToTooltip()");



// Создать меню с настройками для кнопки ....................................................................
var menuPopup = document.getElementById("mainPopupSet").appendChild(document.createElement("menupopup"));
menuPopup.id = this.id + "-menuPopup";

// массив с данными для создание пунктов меню ....
this.array = [
  { label: 'Автоматически закрыть', value: 'FindBar.auto_Close', cek:''},
  { label: 'Закрыть через: |7| секунд', value: 'FindBar.CloseTimer', change:''},
  { separator: '' },
  { label: 'FindBar мини', value: 'FindBar.mini', func: toggleAttribute, cek:''},
  { label: 'FindBar сверху', value: 'FindBar.top', func: toggleAttribute, cek:''},
  { label: 'FindBar справа', value: 'FindBar.right', func: toggleAttribute, cek:''},
  { label: 'Кнопка "Вставить и искать" на FindBar', value: 'FindBar.pasteButton', func: toggleAttribute, cek:''},
  { separator: '' },
  { label: 'Find в контекстном меню', value: 'FindBar.contextFindWords', cek:''},
  { label: 'Всегда открывать пустую поисковую форму', value: 'FindBar.autoclear', func: autoClear, cek:''},
  { label: 'Переключать FindBar двойным средним кликом на странице', value: 'FindBar.ToggleWithDoubleMiddleClick', cek:''},
  { label: 'Переключать aвтовыделение двойным кликом на поисковой форме', value: 'FindBar.Autohighlight.ToggleWithDoubleClick', cek:''},
  { separator: '' },
  { label: 'Автовыделение', value: 'FindBar.Highlight', func: toggleAttribute, cek:''},
  { label: 'Автовыделение в ссылках', value: 'FindBar.Highlight.Link', cek:''},
  { label: 'Добавить текст для автовыделение', value: 'add', func: toggleHighlightValue },
  { label: 'Сбросить текст для автовыделение', value: 'clear', func: toggleHighlightValue },
  { label: 'Изменить цвет: |#ef0fff| для автовыделение', value: 'ui.textHighlightBackground', change:''}
            ];

// цикл добавляет из массива атрибуты и обработчики к пунктам меню ....
this.array.forEach(function( m ) {
     if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
     if ( "value" in m ) var p = custombuttons.getPrefs( m.value )   
     var mItem = document.createElement("menuitem"), arr = m.label.split("|");   
     mItem.setAttribute("label", ( "change" in m ) ? (arr[0] + p + arr[2]) : m.label );     
     if ( "cek" in m ) {
          mItem.setAttribute('type', 'checkbox');
          mItem.setAttribute('checked', p );
          mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');                                                     
          }             
     if ( "change" in m ) {
          mItem.addEventListener("command", function(e) {
          var val = custombuttons.promptBox( this.label, 'Отмена сохранит значение по умолчанию');
          var pref = val[0] ? val[1] : arr[1];
          custombuttons.setPrefs( m.value, pref );
          this.label = arr[0] + pref + arr[2];
                 }, false);
          };
     if ( "func" in m ) mItem.addEventListener("command", function(e) { m.func( m.value ) }, false);

     menuPopup.appendChild(mItem);
});

// добавляем стандартное контекстное меню ....
var separator = document.createElement("menuseparator");
menuPopup.appendChild( separator );
var cbContextPopup = document.getElementById("custombuttons-contextpopup");
var clone = cbContextPopup.cloneNode(true);
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + this.id + "')");
var menu = document.createElement("menu");
menu.setAttribute( "label", "Меню кнопки" );
menu.appendChild( clone );
menuPopup.appendChild( menu );




// Установить и удалить разные атрибуты для панели поиска ....................................................
function toggleAttribute( s ) {
 
  if ( s == "FindBar.Highlight" ) { gFindBar.getElement('highlight').removeAttribute("checked"); Highlight(); return };
 
  var atrr = s.substring(8);
  setTimeout(function(){ custombuttons.getPrefs( s ) ? gFindBar.setAttribute( atrr, "true")
                               : gFindBar.removeAttribute( atrr ) }, 0); 
  if ( s !== "FindBar.mini" ) return;     
  if ( custombuttons.getPrefs( s ) ) {       
       if ( gFindBar.getElement('highlight').hasAttribute("checked") ) {
            gFindBar._findField.style.color = prefs.getCharPref("ui.textHighlightBackground");
            }
       }     
  else
       {
       if ( !!gFindBar._findField.style.color ) {
             gFindBar.getElement('highlight').setAttribute("checked", "true");
             gFindBar._findField.removeAttribute("style");
             }
       }       
};
["FindBar.top", "FindBar.mini", "FindBar.right", "FindBar.pasteButton"].forEach(function(pref) { toggleAttribute( pref ) });



// Установить нужную иконку кнопки при старте браузера или при изменениях настроек автовыделения ............
var s = "FindBar.Highlight";
function toggleImage() {
    button.image = custombuttons.getPrefs( s )
    ? "data:image/x-icon;base64,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"
    : "data:image/x-icon;base64,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" 
};
toggleImage();
var ps = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).QueryInterface(Ci.nsIPrefBranch2);
ps.addObserver( s, toggleImage, false );
this.onDestroy = function() {
    ps.removeObserver( s, toggleImage, false );
};



// Приклеить элемент #FindToolbar к странице( #appcontent ) .................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



// Показать количество совпадений на панели поиска, автор кода 'slimx' .......................................
(function() {
    // add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status); //findbar-container
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = "найдено совпадений: " + matchesCount;
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = "найдено " + " \>"+ matchLimit + " совпадений";
                } else
                    this._foundMatches.value = "найдено совпадений: " + matchesCount;
                this._foundMatches.hidden = false;
               
                gFindBar._findField.removeAttribute("status", "notfound");
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
               
                gFindBar._findField.setAttribute("status", "notfound");
             }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;
        if (body == null) Components.utils.reportError('body = '+ body + ', Errors = '+ getBrowser().currentURI.spec);
        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);
        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }     
            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    // insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();
// FindBar, поиск колесиком мыши .............................................................................
gFindBar.addEventListener('DOMMouseScroll', function (e) {
     gFindBar.onFindAgainCommand(e.detail < 0); // искать следующее или предыдущее
}, false);



// Переключить поиск на странице двойным средним кликом на странице ..........................................
gBrowser.addEventListener("mouseup", function(e) {
  if ( e.button !== 1 ) return;
  if ( !custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick") ) return;
       var _this = this;
       
       if ( _this.open ) {
            gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
            Find(e);
            gFindBar._findField.focus();
            };
           
       _this.open = true;
       
       setTimeout(function() { _this.open = false }, 600); // сбросить флаг по таймеру
}, false);



// Автоматически очищать поле текстового ввода на Findbar ....................................................
function autoClear( closes ) {
  if ( !custombuttons.getPrefs("FindBar.autoclear") ) return;
       if ( closes == true) {
            if ( gFindBar._findField.value ) { window.FB_fFval = gFindBar._findField.value };
            gFindBar._findField.value = '';
            }
       if ( closes == false) { findFieldClear() };
};



/* Очистить поле текстового ввода если кликнуть правим кликом на 'Найти:'
   или поиск по странице если кликнуть левым кликом ..........................................................*/
document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label").addEventListener("click", function(e) {
  if ( e.button == 0 ) {
       gFindBar.onFindAgainCommand(false); // искать следующее
       }
  if ( e.button == 2 ) {
       findFieldClear(); // очистить поле текстового ввода
       }
}, false);



// Поиск по странице из буфера обмена, если кликнуть средним кликом на findbar ...............................
gFindBar.addEventListener("click", function(e) {
  if ( e.button !== 1 ) return;
       e.preventDefault();
       e.stopPropagation();
       
       var str = ( gClipboard.read() ).replace(/^\s+|\s+$/g,""); // убираем пробелы с обоих концов текста.

       gFindBar._findField.value = str;
       Find(e);
}, true);



/* Двойной клик в строке поиска включает и выключает автовыделение
   или обычную подсветку текста из панели поиска .............................................................*/
gFindBar._findField.addEventListener("dblclick", function(e) {
  if ( e.button !== 0 ) return;
       e.preventDefault();
       
       if ( custombuttons.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick") ) {       
            var s = custombuttons.getPrefs("FindBar.Highlight");
            custombuttons.setPrefs("FindBar.Highlight", !s);
            // переключить чекбокс у пункта меню 'Автовыделение' ....
            document.getElementsByAttribute("label", "Автовыделение")[0].setAttribute("checked", !s);           
           
            gFindBar.getElement('highlight').removeAttribute("checked"); // выключаем кнопку 'Highlight'
            Highlight(false);
            }             
       else 
            {           
            gFindBar.getElement("highlight").click();
            gFindBar._findField.style.color = ( gFindBar._findField.style.color )? "": custombuttons.getPrefs("ui.textHighlightBackground");           
            };           
       window.content.focus(); // Findbar, убрать фокус
}, false);



// ЛКМ в форму поиска - выделить текст в форме поиска ........................................................
gFindBar._findField.addEventListener("click", function(e) {
  if ( e.button !== 0 ) return;
       if ( !this.sel ) { gFindBar._findField.select() };
       this.sel = true;
}, false);
gFindBar._findField.addEventListener("blur", function() { this.sel = false }, false);



// ЛКМ + ПКМ на поле текстового ввода очищают его .................................................
["mousedown", "click"].forEach(function(type) { gFindBar._findField.addEventListener(type, clickToClear, false) });
function clickToClear(e) {

  if ( e.type == "mousedown" ) {
       if ( e.button == 0 ) this.leftButtonDown = true;
       if ( e.button == 2 && this.leftButtonDown ) {
            this.leftButtonDown = false;
            this.stopMenu = true;
            setTimeout(function(){ findFieldClear() }, 0);
            }
       }

  if ( e.type == "click" ) {
       if ( e.button == 0 ) this.leftButtonDown = false;
       if ( e.button == 2 && this.stopMenu ) {
            e.preventDefault();
            e.stopPropagation();
            this.stopMenu = false;
            }
       }     
};


     
// Автоматически закрывать панель поиска если это разрешено в 'about:config' .................................
function closeFind() {
  if ( !custombuttons.getPrefs("FindBar.auto_Close") ) return;
       gFindBar.close();
       window.ACRun = '';
  };
function autoCloseOn() {
  if ( !custombuttons.getPrefs("FindBar.auto_Close") ) return;
  if ( window.ACRun == 'stop' ) return;
       window.ACRun = 'stop';
       this.timeoutID = setTimeout( closeFind, custombuttons.getPrefs("FindBar.CloseTimer") + '000' );
  };
function autoCloseOff() {
  if ( !custombuttons.getPrefs("FindBar.auto_Close") ) return;
       window.ACRun = '';
       window.clearTimeout(this.timeoutID);
  };
window.addEventListener('mouseover', function(e) {
  if ( !gFindBar.hidden ) (e.target.nodeName !== 'findbar')? autoCloseOn(): autoCloseOff()
}, false);



// Сочетания клавиш для управление поиском на странице .......................................................
window.addEventListener('keydown', function(e) {

  // Ctrl+ f, показать - скрыть панель поиска ....
  if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       e.stopPropagation();
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
       Find(e);
       gFindBar._findField.focus();
       };
       
  // Ctrl+ alt+ f, поиск по странице из буфера обмена ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 70) ) {
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
       goDoCommand("cmd_selectNone");
       goDoCommand("cmd_paste");
       Find(e);
       };
       
  /* Ctrl+ snift+ f, открыть панель поиска с чистой поисковой формой или очистить поисковую форму или
     открыть панель поиска с предыдущим запросом/выделенным текстом или искать выделенный текст если панель поиска открыт
     если настройках кнопки включена 'Всегда открывать пустую поисковую форму' ....*/
  if ( (e.ctrlKey) && (!e.altKey) && (e.shiftKey) && (e.keyCode == 70) ) {
       var val = ( window.FB_fFval ) ? window.FB_fFval : "";
       var sel = document.commandDispatcher.focusedWindow.getSelection().toString();
       if ( sel.length !== 0 ) { val = sel }; 
       gFindBar.onFindCommand();
       custombuttons.getPrefs("FindBar.autoclear") ? setTimeout(function() { gFindBar._findField.value = val; Find(e) }, 10)
                                  : findFieldClear();
       
       };
       
  // Ctrl+ alt+ h, добавить текст(выделенный / из буфера обмена) для автовыделения ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 72) ) {
       HighlightAdd(); 
       };
 
  // поиск по мере набора если разрешено в 'about:config' и фокус на странице ....
  if ( custombuttons.getPrefs("accessibility.typeaheadfind") && ( 46 < e.keyCode && e.keyCode < 111 )
       && /body|vbox/.test(e.target.localName) ) {
       if ( !this.firstLetter ) window.onkeypress = function(e) { this.firstLetter = String.fromCharCode(e.which) };
       e.preventDefault();
       e.stopPropagation();       
       if ( !gFindBar.hidden ) return;           
       setTimeout(function() { gFindBar.onFindCommand(); gFindBar._findField.value = this.firstLetter }, 0);
       }   
}, false);



// Автоматически выделить слова или ссылки....................................................................
Highlight = function(e) {
     
  gFindBar._highlightDoc(false); // удалить выделение
  var findValue = gFindBar._findField.value; // получить текст из панели поиска
 
  if ( !gFindBar.hidden ) {
       
       if ( findValue.length == 0 ) {
            gFindBar._findField.removeAttribute("status", "notfound");
            };
           
       // Findbar, удалить атрибут 'style' .....     
       if ( !!gFindBar._findField.style.color ) {
            gFindBar._findField.removeAttribute("style")
            };
             
       // авто поиск с переклучением фокуса чтобы запустить подсчет количества совпадений ....
       if ( !/false|UIEvent|DragEvent|MutationRecord/.test(e) ) {
            gFindBar._findField.focus();
            gFindBar.onFindCommand();
            window.content.focus();
            };
  };
   
  // получаем текст для автовыделения из 'about:config' или из панели поиска ....
  if ( custombuttons.getPrefs("FindBar.Highlight") ) {   
       var value = gFindBar.hidden ? Application.prefs.getValue("FindBar.Highlight.value", 0) :
                                     ( findValue.length > 2 )? findValue: "";
       };
       
  if ( !!value ) gFindBar._highlightDoc(true, value); // выделение

  /* изменить цвет ссылок на страницах если содержат искомое слово,
     если разрешено в 'about:config' и включена автовыделение ....*/
  var links = gBrowser.contentDocument.links;
  if ( !links ) return;

  var hLink = ( custombuttons.getPrefs("FindBar.Highlight.Link") && !!value );
 
  // атрибуты для текущего таба ....
  if ( hLink || gBrowser.mCurrentTab.hasAttribute("Highlight_Link") ) {   
       hLink ? gBrowser.mCurrentTab.setAttribute("Highlight_Link", "true")
             : gBrowser.mCurrentTab.removeAttribute("Highlight_Link");
       
       /* цикл проверяет все ссылки на странице и изменяет цвет ссылки на цвет из 'about:config'
          если в ссылке найдено 'value' ....*/
       for ( var i = 0; i < links.length; i++ ) { 
                links[i].style.color = ''; // удалить выделение ссылок
                if ( hLink && String(links[i]).search(value) != -1 ) {
                     links[i].style.color = custombuttons.getPrefs("ui.textHighlightBackground");
                     }
                }
       }
};


   
/* Обработчики и наблюдатель следят за панелью поиска и загрузкой и переключением табов
   и запускают нужные коды и функции .........................................................................*/

// обработчики для табов ....
gBrowser.tabContainer.addEventListener("TabSelect", function(e) {
  // стоп, если страница загружается
  if ( gBrowser.mCurrentTab.hasAttribute("busy") ) return;
       Highlight(e);
}, false);

gBrowser.addEventListener("pageshow", function(e) {
  // стоп, если открыть другие владки в фоновом режиме
  if ( e.target.location.href !== getBrowser().currentURI.spec ) return;
       Highlight(e);
}, true);

// обработчики и наблюдатель для панели поиска ....
gFindBar._findField.addEventListener("drop", function(e) { Find(e) }, false);
gFindBar._findField.addEventListener("input", function() { Find(false) }, false);
gFindBar.getElement("find-case-sensitive").setAttribute("onclick", "Highlight(false)");

gFindBar.watch("hidden", function( prop, oldV, newV ) {
  autoClear( newV );
  if ( newV ) { autoCloseOff(); Highlight(); } // если панель поиска закрывается
  return newV;
});



// Добавляем подменю в контекстного меню на странице для выделенного текста ..................................
(function () {
 
  var menu = document.createElement("menu"); 
  var menuPopup = document.createElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu"); 
     
  menu.setAttribute("label", "Find");
  contextMenu.insertBefore(menu, document.getElementById("context-sep-properties") );
  menu.appendChild(menuPopup);

  var array = [
              { label:"Найти на странице", func: findToContex },
              { label:"Поиск по сайту(google)", func: searchToSite },
              { label:"Выделить текст на странице", func: highlightSel },
              { label:"Автовыделение, добавить текст", func: addSel }
              ];
  array.forEach(function( m ) { 
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );
       });
       
  contextMenu.addEventListener("popupshowing", function() {
     menu.hidden = !custombuttons.getPrefs("FindBar.contextFindWords") || !gContextMenu.isTextSelected;
  }, false);
         
   function findToContex() {
         gFindBar.onFindCommand();
         Find(false);
         };
         
   function searchToSite() {
        var text = escape( convertFromUnicode ("UTF-8", getSelect() ) );
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + encodeURIComponent( gBrowser.currentURI.host );
        gBrowser.selectedTab = gBrowser.addTab( searchUrl );
        };
       
   function highlightSel() {
        gFindBar._highlightDoc(false);
        gFindBar._highlightDoc(true, getSelect() );
        goDoCommand("cmd_selectNone");
        };
       
   function addSel() {
        toggleHighlightValue('add');
        }             
})();



// Найти на странице ......................................................................................... 
Find = function(e) {
  if (e) e.preventDefault();
  if (e) e.stopPropagation();
  if ( custombuttons.getPrefs("FindBar.Highlight") ) { Highlight(e) };
  if ( !gFindBar.hidden ) gFindBar._find( gFindBar._findField.value );
};



// Очистить поле текстового ввода на Findbar .................................................................
function findFieldClear() { 
  if ( gFindBar._findField.value ) { window.FB_fFval = gFindBar._findField.value };
  setTimeout(function() {
       gFindBar._findField.value = ''
       gFindBar._findField.removeAttribute("status", "notfound");
       Highlight();
       }, 0)
};       



// Добавляет или удаляет текст(выделенный / из буфера обмена) для автовыделения ..............................
function toggleHighlightValue( arg ) {
  if ( arg == 'clear' ) {
       var str = '', title = button.label, notification = "Текст для автовыделение удален";
       }       
  if ( arg == 'add' && getSelect() ) {
       var str = getSelect(), title = "Автовыделение", notification = str;
       if ( custombuttons.getPrefs("FindBar.Highlight") ) { goDoCommand("cmd_selectNone") };           
       }       
  Application.prefs.setValue("FindBar.Highlight.value", str);
  alertsService.showAlertNotification(button.image, title, notification, false, "", null, "");     
  Highlight(false);     
};

 

/* Функция отдаст выделенный текст из страницы или текстового поля,
   если текст не выделен из буфера обмена, если нет текста отдаст 'false' ................................... */
function getSelect() {
  // выделенный текст из страницы ....
  var selection = document.commandDispatcher.focusedWindow.getSelection().toString();

  // выделенный текст из текстового поля ....
  if ( selection == '' ) {
       var theBox = document.commandDispatcher.focusedElement;
       if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) {
            var startPos = theBox.selectionStart;
        var endPos = theBox.selectionEnd;
        var selection = theBox.value.substring(startPos, endPos); 
            }
       };
       
  // текст из буфера обмена ....
  if ( selection == '' ) var selection = gClipboard.read();
         
  // убираем пробелы с обоих концов текста ....
  if ( selection !== '' ) var selection = selection.toString().replace(/^\s+|\s+$/g,"");
 
  if ( selection == '') {
       var str = "Выделите или скопируйте текст!"
       alertsService.showAlertNotification(button.image, button.label, str, false, "", null, "");
       };
   
  return ( selection == '')? false: selection;
};



// Запустить поиск через Toggle Find+3 если нажать в главном меню на пункт меню 'Найти' ......................
document.getElementById("cmd_find").setAttribute("oncommand", "gFindBar.onFindCommand(), Find(e)");



// Создать кнопку "Вставить и искать" на Findbar .............................................................
var textbox = document.getAnonymousElementByAttribute(gFindBar, "anonid", "findbar-textbox");
var b = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
b.setAttribute("id", "pasteButton");
b.setAttribute("tooltiptext", "Л: Поиск выделенного текста/из буфера \nП: Очистить"); 
textbox.parentNode.insertBefore( b, textbox.nextSibling );

b.addEventListener("click", function(e) {
   if ( e.button == 0 ) {
        if ( !getSelect() ) return;
             gFindBar._findField.value = getSelect(); // вставить текст
             Find(e);
        };
   if ( e.button == 2 ) {
        // очистить поле текстового ввода
        setTimeout(function() { findFieldClear() }, 0);
        };     
}, false);



// Создать кнопку "Поиск" на Findbar .........................................................................
var paste = document.getElementById("pasteButton");
var b = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "toolbarbutton");
b.setAttribute("id", "findButton");
b.setAttribute("tooltiptext", "Л: Искать следущее \nС: Поиск текста из буфера \nП: Искать предыдущее");                             
paste.parentNode.insertBefore( b, paste.nextSibling );

b.addEventListener("click", function(e) {
   if ( e.button == 0 ) gFindBar.onFindAgainCommand(false); // искать следующее

   if ( e.button == 2 ) gFindBar.onFindAgainCommand(true); // искать предыдущее
}, false);



// Поле текстового ввода на Findbar мигает желтим если достигнут низ/верх страницы .........................
var findStatusIcon = gFindBar.getElement("find-status-icon");
var observer = new MutationObserver(function(mutations) {
  gFindBar.setAttribute("flash", findStatusIcon.getAttribute("status") == "wrapped" );
  setTimeout(function() { gFindBar.removeAttribute("flash") }, 700)
});
observer.observe(findStatusIcon, { attributes: true, attributeFilter: ["status"] } );

     
     
// Стиль для панели поиска ...................................................................................
(function(css) {
   var pi = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' +
            encodeURIComponent(css) + '"' );
   return document.insertBefore(pi, document.documentElement);
})('\
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\
\
/* панель поиска ....*/\
#FindToolbar {  border-bottom: 1px solid grey !important; }\
#FindToolbar > .findbar-container > * { display: -moz-box !important; }\
#find-field, .findbar-textbox { width: 250px !important; }\
#FindToolbar .findbar-textbox:not([style]) { color: black !important; }\
#FindToolbar > hbox > label { -moz-appearance: none !important; font-weight: bold !important; }\
\
#FindToolbar .findbar-find-fast.findbar-find-status,\
#FindToolbar .findbar-container>image,\
#FindToolbar[autohide] .findbar-closebutton {\
   display: none !important; }\
\
/* мини панель поиска ....*/\
#FindToolbar[mini] .findbar-textbox {\
   width: 16em !important;\
   height: 21px !important;\
   padding-right: 20px !important;\
   margin-right: 2px !important;\
   margin-left: -4px !important; }\
#FindToolbar[mini] {\
   position: fixed;\
   background: menu !important;\
   box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;\
   border: 1px solid grey !important; }\
#FindToolbar[mini][top] {\
   border-top: 0 !important;\
   border-radius: 0 0 8px 8px !important; }\
#FindToolbar[mini][right] {\
   right: 18px; }\
#FindToolbar:not([top]) + #content {\
   -moz-box-ordinal-group: 0 !important; }\
#FindToolbar:not([top]) {\
   -moz-box-ordinal-group: 1 !important; }\
#FindToolbar[mini]:not([top]) {\
   border-radius: 8px 8px 0 0 !important;\
   margin-top: -29px !important; }\
#FindToolbar[mini] .findbar-container > checkbox {\
   margin-left: -24px !important;\
   margin-right: -3px !important; }\
\
#FindToolbar[mini] toolbarspacer,\
#FindToolbar[mini] label[class="checkbox-label"],\
#FindToolbar[mini] toolbarbutton.findbar-find-next,\
#FindToolbar[mini] toolbarbutton.findbar-find-previous,\
#FindToolbar[mini] .findbar-highlight label,\
#FindToolbar[mini] .findbar-closebutton,\
#FindToolbar:not([pasteButton]) #pasteButton,\
#FindToolbar:not([mini]) #findButton,\
#FindToolbar[mini] .findbar-find-fast[anonid="find-label"],\
#FindToolbar .findbar-find-fast[anonid="match-case-status"],\
#FindToolbar[mini] .findbar-highlight,\
#FindToolbar[mini] .findbar-highlight[checked] {\
   display: none !important;\
}\
\
#FindToolbar[mini] textbox.findbar-textbox { -moz-box-ordinal-group: 2 !important; }\
#FindToolbar[mini] checkbox { -moz-box-ordinal-group: 3 !important; }\
#FindToolbar[mini] #pasteButton { -moz-box-ordinal-group: 4 !important; }\
#FindToolbar[mini] #findButton { -moz-box-ordinal-group: 5 !important; }\
\
/* не показывать панель поиска на страницах ....*/\
#main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar,\
#main-window[title="Управление дополнениями - Mozilla Firefox"] #appcontent > #FindToolbar,\
#main-window[title="Консоль ошибок - Mozilla Firefox"] #appcontent > #FindToolbar,\
#main-window[title="Bookmarks tab - Mozilla Firefox"] #appcontent > #FindToolbar {\
   display: none !important; }\
\
/* кнопки на панели поиска ....*/\
#pasteButton {\
   list-style-image: url("chrome://browser/skin/appmenu-icons.png");\
   -moz-image-region: rect(0 48px 16px 32px);\
   margin-right: 3px !important; }\
#findButton {\
   list-style-image: url("chrome://global/skin/icons/Search-glass.png") !important;\
   -moz-image-region: rect(0px, 16px, 16px, 0px); }\
\
');


// устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды 
this.setAttribute("stop","true");

PEAKTOP пишет:

А можно опустить панель поиска  в панель дополнений (самый низ экрана) - как это сделано по умолчанию в стандартной строке поиска FF?

Да что там у тебя с браузером что Сustom Buttons кнопки не работают как надо.

Я изменил кнопку:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ................................................................
this.onclick = function(e) {

     // действие при клике ЛКМ ....
     if ( e.button == 0 ) {
          gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
          Find(e);
          };
          
     // действие при клике СКМ ....    
     if ( e.button == 1 ) { 
          gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
          goDoCommand("cmd_selectNone");
          goDoCommand("cmd_paste");
          Find(e);
          };
     
     // действие при клике ПКМ ....    
     if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
          e.preventDefault();  
          document.getElementById(this.id + "-menuPopup").showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
          }
};



// Объявляем переменные для этой вкладки ...................................................................
var button = this; 
var alertsService = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);



// Проверить наличие строк в about:config и создать если не существует ......................................
if ( custombuttons.getPrefs("FindBar.version") !== '14') {

     ["FindBar.top","FindBar.mini","FindBar.right","FindBar.auto_Close","FindBar.autoclear","FindBar.Highlight",
     "FindBar.Highlight.Link","FindBar.pasteButton","FindBar.contextFindWords","FindBar.ToggleWithDoubleMiddleClick",
     "FindBar.Autohighlight.ToggleWithDoubleClick"].forEach(function(pref) { custombuttons.setPrefs( pref, false ) });
     
     ["FindBar.version,14", "FindBar.CloseTimer,7", "ui.textHighlightBackground,#ef0fff", "FindBar.Highlight.value,"]
                              .forEach(function(pref) { custombuttons.setPrefs( pref.split(",")[0], pref.split(",")[1] ) });         
};



//this.setAttribute("Help", "alert('')");



// Блокировать повторный запуск функций и обработчиков при открытии настройки панелей ........................
if (this.hasAttribute("stop")) return; 



// Подсказка для кнопки .....................................................................................
this.infoToTooltip = function() {
     // получить и обрезать подсказку для автовыделение ....
     var val = Application.prefs.getValue("FindBar.Highlight.value", 0);
     var value = val.substring(0,50) + ( (val.length > 50) ? '....' : "" );
                    
     this.tooltipText = "Поиск по странице \nЛ: Показать - скрыть поиск по странице \nС: Поиск по странице из буфера обмена"
                                        + "\nП: Mеню + CB меню \n\nАвтовыделение: " + value;               
};
this.setAttribute("onmouseover", "this.infoToTooltip()");



// Создать меню с настройками для кнопки ....................................................................
var menuPopup = document.getElementById("mainPopupSet").appendChild(document.createElement("menupopup"));
menuPopup.id = this.id + "-menuPopup";

// массив с данными для создание пунктов меню ....
this.array = [
  { label: 'Автоматически закрыть', value: 'FindBar.auto_Close', cek:''},
  { label: 'Закрыть через: |7| секунд', value: 'FindBar.CloseTimer', change:''},
  { separator: '' },
  { label: 'Кнопка "Вставить и искать" на FindBar', value: 'FindBar.pasteButton', func: toggleAttribute, cek:''},
  { label: 'Find в контекстном меню', value: 'FindBar.contextFindWords', cek:''},
  { separator: '' },  
  { label: 'Всегда открывать пустую поисковую форму', value: 'FindBar.autoclear', func: autoClear, cek:''},
  { label: 'Переключать FindBar двойным средним кликом на странице', value: 'FindBar.ToggleWithDoubleMiddleClick', cek:''},
  { label: 'Переключать aвтовыделение двойным кликом на поисковой форме', value: 'FindBar.Autohighlight.ToggleWithDoubleClick', cek:''},
  { separator: '' },
  { label: 'Автовыделение', value: 'FindBar.Highlight', func: toggleAttribute, cek:''},
  { label: 'Автовыделение в ссылках', value: 'FindBar.Highlight.Link', cek:''},
  { label: 'Добавить текст для автовыделение', value: 'add', func: toggleHighlightValue },
  { label: 'Сбросить текст для автовыделение', value: 'clear', func: toggleHighlightValue },
  { label: 'Изменить цвет: |#ef0fff| для автовыделение', value: 'ui.textHighlightBackground', change:''}
            ];

// цикл добавляет из массива атрибуты и обработчики к пунктам меню .... 
this.array.forEach(function( m ) {
     if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
     if ( "value" in m ) var p = custombuttons.getPrefs( m.value )   
     var mItem = document.createElement("menuitem"), arr = m.label.split("|");    
     mItem.setAttribute("label", ( "change" in m ) ? (arr[0] + p + arr[2]) : m.label );     
     if ( "cek" in m ) { 
          mItem.setAttribute('type', 'checkbox');
          mItem.setAttribute('checked', p );
          mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');                                                      
          }              
     if ( "change" in m ) {
          mItem.addEventListener("command", function(e) {
          var val = custombuttons.promptBox( this.label, 'Отмена сохранит значение по умолчанию');
          var pref = val[0] ? val[1] : arr[1];
          custombuttons.setPrefs( m.value, pref );
          this.label = arr[0] + pref + arr[2];
                 }, false);
          };
     if ( "func" in m ) mItem.addEventListener("command", function(e) { m.func( m.value ) }, false);

     menuPopup.appendChild(mItem);
});

// добавляем стандартное контекстное меню ....
var separator = document.createElement("menuseparator");
menuPopup.appendChild( separator );
var cbContextPopup = document.getElementById("custombuttons-contextpopup");
var clone = cbContextPopup.cloneNode(true);
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + this.id + "')");
var menu = document.createElement("menu");
menu.setAttribute( "label", "Меню кнопки" );
menu.appendChild( clone );
menuPopup.appendChild( menu );



// Установить и удалить разные атрибуты для панели поиска ....................................................
function toggleAttribute( s ) { 
  if ( s == "FindBar.Highlight" ) { gFindBar.getElement('highlight').removeAttribute("checked"); Highlight(); return };
  
  var atrr = s.substring(8);
  setTimeout(function(){ custombuttons.getPrefs( s ) ? gFindBar.setAttribute( atrr, "true")
                               : gFindBar.removeAttribute( atrr ) }, 0);       
};
toggleAttribute("FindBar.pasteButton");



// Установить нужную иконку кнопки при старте браузера или при изменениях настроек автовыделения ............
var s = "FindBar.Highlight";
function toggleImage() {
    button.image = custombuttons.getPrefs( s )
    ? "data:image/x-icon;base64,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"
    : "data:image/x-icon;base64,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"  
};
toggleImage();
var ps = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).QueryInterface(Ci.nsIPrefBranch2);
ps.addObserver( s, toggleImage, false );
this.onDestroy = function() {
    ps.removeObserver( s, toggleImage, false );
};



// Показать количество совпадений на панели поиска, автор кода 'slimx' .......................................
(function() {
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var count = document.createElement("label");
    count.id = 'hits';
    count.hidden = true;
    status.parentNode.insertBefore(count, status); 
    gFindBar.__proto__._foundMatches = count;
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if ( aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
             this._foundMatches.hidden = true;
             this._foundMatches.value = "";
             }
        else 
             {
             var matchesCount = this._countMatches(word).toString();
             if ( matchesCount !== "0" ) {
                  this._foundMatches.value = matchesCount + " hits"; 
                  if ( matchesCount == "-1")  this._foundMatches.value = ">100 hits";                                                        
                  this._foundMatches.hidden = false;                
                  gFindBar._findField.removeAttribute("status", "notfound");
                  }
             else 
                  {
                  this._foundMatches.hidden = true;
                  this._foundMatches.value = "";                
                  gFindBar._findField.setAttribute("status", "notfound");
                  }

             window.clearTimeout(this._updateMatchCountTimeout);
             }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;
        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);
        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }
        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }     
            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



// FindBar, поиск колесиком мыши .............................................................................
gFindBar.addEventListener('DOMMouseScroll', function (e) {
     gFindBar.onFindAgainCommand(e.detail < 0); // искать следующее или предыдущее
}, false);

 

// Переключить поиск на странице двойным средним кликом на странице ..........................................
gBrowser.addEventListener("mouseup", function(e) {
  if ( e.button !== 1 ) return;
  if ( !custombuttons.getPrefs("FindBar.ToggleWithDoubleMiddleClick") ) return;
       var _this = this;
       
       if ( _this.open ) { 
            gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
            Find(e);
            gFindBar._findField.focus();
            };
            
       _this.open = true;
       
       setTimeout(function() { _this.open = false }, 600); // сбросить флаг по таймеру
}, false);



// Автоматически очищать поле текстового ввода на Findbar ....................................................
function autoClear( closes ) { 
  if ( !custombuttons.getPrefs("FindBar.autoclear") ) return; 
       if ( closes == true) {
            if ( gFindBar._findField.value ) { window.FB_fFval = gFindBar._findField.value };
            gFindBar._findField.value = '';
            }
       if ( closes == false) { findFieldClear() };
};
 
 
 
/* Очистить поле текстового ввода если кликнуть правим кликом на 'Найти:'
   или поиск по странице если кликнуть левым кликом ..........................................................*/ 
document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label").addEventListener("click", function(e) {
  if ( e.button == 0 ) {
       gFindBar.onFindAgainCommand(false); // искать следующее
       }
  if ( e.button == 2 ) {
       findFieldClear(); // очистить поле текстового ввода
       }
}, false);



// Поиск по странице из буфера обмена, если кликнуть средним кликом на findbar ............................... 
gFindBar.addEventListener("click", function(e) {
  if ( e.button !== 1 ) return; 
       e.preventDefault();
       e.stopPropagation();
        
       var str = ( gClipboard.read() ).replace(/^\s+|\s+$/g,""); // убираем пробелы с обоих концов текста.

       gFindBar._findField.value = str;
       Find(e);
}, true);



/* Двойной клик в строке поиска включает и выключает автовыделение
   или обычную подсветку текста из панели поиска .............................................................*/ 
gFindBar._findField.addEventListener("dblclick", function(e) {
  if ( e.button !== 0 ) return;
       e.preventDefault();
        
       if ( custombuttons.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick") ) {        
            var s = custombuttons.getPrefs("FindBar.Highlight");
            custombuttons.setPrefs("FindBar.Highlight", !s);
            // переключить чекбокс у пункта меню 'Автовыделение' ....
            document.getElementsByAttribute("label", "Автовыделение")[0].setAttribute("checked", !s);           
            
            gFindBar.getElement('highlight').removeAttribute("checked"); // выключаем кнопку 'Highlight'
            Highlight(false); 
            };        
       window.content.focus(); // Findbar, убрать фокус 
}, false);


 
// ЛКМ в форму поиска - выделить текст в форме поиска ........................................................
gFindBar._findField.addEventListener("click", function(e) {
  if ( e.button !== 0 ) return;
       if ( !this.sel ) { gFindBar._findField.select() };
       this.sel = true;
}, false);
gFindBar._findField.addEventListener("blur", function() { this.sel = false }, false);



// ЛКМ + ПКМ на поле текстового ввода очищают его .................................................
["mousedown", "click"].forEach(function(type) { gFindBar._findField.addEventListener(type, clickToClear, false) });
function clickToClear(e) { 

  if ( e.type == "mousedown" ) {
       if ( e.button == 0 ) this.leftButtonDown = true;
       if ( e.button == 2 && this.leftButtonDown ) {
            this.leftButtonDown = false;
            this.stopMenu = true; 
            setTimeout(function(){ findFieldClear() }, 0); 
            }
       }

  if ( e.type == "click" ) {
       if ( e.button == 0 ) this.leftButtonDown = false;
       if ( e.button == 2 && this.stopMenu ) {
            e.preventDefault();
            e.stopPropagation();
            this.stopMenu = false; 
            }
       }     
};


     
// Автоматически закрывать панель поиска если это разрешено в 'about:config' .................................
function closeFind() {
  if ( !custombuttons.getPrefs("FindBar.auto_Close") ) return;
       gFindBar.close();
       window.ACRun = '';
  };
function autoCloseOn() {
  if ( !custombuttons.getPrefs("FindBar.auto_Close") ) return;
  if ( window.ACRun == 'stop' ) return;
       window.ACRun = 'stop';
       this.timeoutID = setTimeout( closeFind, custombuttons.getPrefs("FindBar.CloseTimer") + '000' );
  };
function autoCloseOff() {
  if ( !custombuttons.getPrefs("FindBar.auto_Close") ) return;
       window.ACRun = '';
       window.clearTimeout(this.timeoutID);
  };
window.addEventListener('mouseover', function(e) { 
  if ( !gFindBar.hidden ) (e.target.nodeName !== 'findbar')? autoCloseOn(): autoCloseOff() 
}, false); 



// Сочетания клавиш для управление поиском на странице .......................................................
window.addEventListener('keydown', function(e) {

  // Ctrl+ f, показать - скрыть панель поиска ....
  if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       e.stopPropagation();
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
       Find(e);
       gFindBar._findField.focus();
       };
       
  // Ctrl+ alt+ f, поиск по странице из буфера обмена ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 70) ) {
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
       goDoCommand("cmd_selectNone");
       goDoCommand("cmd_paste");
       Find(e);
       };
        
  /* Ctrl+ snift+ f, открыть панель поиска с чистой поисковой формой или очистить поисковую форму или
     открыть панель поиска с предыдущим запросом/выделенным текстом или искать выделенный текст если панель поиска открыт
     если настройках кнопки включена 'Всегда открывать пустую поисковую форму' ....*/
  if ( (e.ctrlKey) && (!e.altKey) && (e.shiftKey) && (e.keyCode == 70) ) {
       var val = ( window.FB_fFval ) ? window.FB_fFval : "";
       var sel = document.commandDispatcher.focused