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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№442621-07-2012 22:41:20

Alfina
Участник
 
Группа: Members
Зарегистрирован: 23-05-2010
Сообщений: 87
UA: Firefox 15.0

Re: Custom Buttons

SendAbuse пишет

Вот кое-как слепил бесполезную, наверное, кнопочку

Как это "бесполезную"?! Это же кнопка моей мечты! :D Спасибо огромное!

Отсутствует

 

№442722-07-2012 00:36:48

skynet281978
Участник
 
Группа: Members
Зарегистрирован: 09-03-2011
Сообщений: 508
UA: Firefox 13.0

Re: Custom Buttons

SendAbuse классная кнопка.

При добавлении новых строчек и редактирования кнопки, если открыть любой установленный стиль, то кнопка  "или Вставить" постоянно дублируется справа.
Перезагрузка убирает дубли кнопки.
d68c0f360993.png
и длинные новые строчки я так понял нельзя прописать?

Отредактировано skynet281978 (22-07-2012 01:09:10)

Отсутствует

 

№442822-07-2012 01:37:03

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

Re: Custom Buttons

skynet281978 пишет

При добавлении новых строчек и редактирования кнопки, если открыть любой установленный стиль, то кнопка  "или Вставить" постоянно дублируется справа.
Перезагрузка убирает дубли кнопки.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EorPaste%20for%20Stylish%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0411%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043F%u043E%u0432%u0442%u043E%u0440%u043D%u044B%u0439%20%u0437%u0430%u043F%u0443%u0441%u043A%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u0438%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u043E%u0432%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0430%u043D%u0435%u043B%u0435%u0439%20%u043D%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0438%u0442%u044C%20%u043E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u043A%u043D%u043E%u043F%u043A%u0438%20........................%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%20%20%20%20%20if%20%28%20reason%20%3D%3D%20%22update%22%29%20this.removeAttribute%28%22stopRepeat%22%29%3B%0A%7D%3B%0Aif%20%28this.hasAttribute%28%22stopRepeat%22%29%29%20return%3B%20%0A%0A%0Avar%20items%20%3D%20%5B%0A%0A//%20%22%u041D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u0443%u043D%u043A%u0442%u0430%20%u043C%u0435%u043D%u044E%22%2C%0A//%20%22%u0422%u0435%u043A%u0441%u0442%2C%20%u043A%u043E%u0442%u043E%u0440%u044B%u0439%20%u0431%u0443%u0434%u0435%u0442%20%u0432%u0441%u0442%u0430%u0432%u043B%u0435%u043D%22%2C%0A%0A%22%21important%3B%22%2C%0A%22%21important%3B%22%2C%0A%0A%22display%3A%20none%20%21important%3B%22%2C%0A%22display%3A%20none%20%21important%3B%22%2C%0A%0A%22width%3A%20%22%2C%0A%22width%3A%20%22%2C%0A%0A%22height%3A%20%22%2C%0A%22height%3A%20%22%2C%0A%0A%22font-weight%3A%20%22%2C%0A%22font-weight%3A%20%22%2C%0A%0A%5D%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20prefs%20%3D%20Components.classes%5B%22@mozilla.org/preferences-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIPrefService%29%0A%20%20%20%20%20%20%20%20%20%20%20%20.getBranch%28%22custombutton.orPasteForStylish.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Afunction%20createButton%28%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20%22or-paste-by-cb%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0438%u043B%u0438%20%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%22%29%3B%0A%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i%20+%3D%202%29%20%7B%0A%20%20%20%20%20%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20items%5Bi%5D%29%3B%0A%20%20var%20%20commandString%20%3D%20%22insertCodeAtCaret%28%27%22%20+%20items%5Bi+1%5D%20+%20%22%27%29%22%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%20%7D%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20return%20button%3B%20%7D%0A%20%20%20%20%20%20%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20return%3B%0A%0A%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%0A%20%20%20%20hbox.insertBefore%28createButton%28%29%2C%20btn.nextElementSibling%29%3B%20%7D%7D%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//--------------------------------------------------------------------%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7B%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28%29%2C%20btn.nextElementSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28this.off%29%20%7B%20var%20b%20%3D%20doc.getElementById%28%22or-paste-by-cb%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%0Athis.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Areturn%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0A//%20%u0443%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0435%u043C%20%u0444%u043B%u0430%u0433%2C%20%u0447%u0442%u043E%u0431%u044B%20%u0444%u0443%u043D%u043A%u0446%u0438%u0438%20%u0438%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20%u043D%u0435%20%u0438%u0441%u043F%u043E%u043B%u043D%u044F%u043B%u0430%u0441%u044C%20%u0434%u0432%u0430%u0436%u0434%u044B%20%20%0Athis.setAttribute%28%22stopRepeat%22%2C%22true%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Aif%20%28%21this.off%29%20this.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.run%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№442922-07-2012 01:46:04

homo_nudus
Участник
 
Группа: Extensions
Зарегистрирован: 19-02-2007
Сообщений: 193
UA: Firefox 17.0

Re: Custom Buttons

Может, кому пригодится (хотя, наверное, такое добро всё время постят :)

Кнопка создаёт в контекстном меню подменю с настраиваемыми пользователем вставками.

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

Выделить код

Код:

'use strict';
/******************************************************************************/
// \x01 = selected text. \x02 = clipboard content.

var clips = {
    "mail":        "somebody@gmail.com",
    "link":        "<a href='\x02'>\x01</a>",
    "image":    "<img src='\x02'>",
    "bold":        "<span style='font-weight: bold'>\x01</span>",
    "italic":    "<span style='font-style: italic'>\x01</span>",
}
/******************************************************************************/
var transferService = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
transferService.addDataFlavor("text/unicode");
var clipboardService = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard);
/******************************************************************************/
var fxContext = document.getElementById("contentAreaContextMenu");
var insetsMenu = document.createElement('menu');
insetsMenu.setAttribute("label", "Insets");
insetsMenu.setAttribute("class", "menu-iconic");
insetsMenu.setAttribute("image", "data:image/gif;base64,R0lGODlhEAAQANUAAIxje4Rje3tacwAhWjlSeylSjAgxYxA5ayFSjClalCFCazFSe0p7tWuc1hBCexhKhFqMxnOl3gAxYxhKeyFShEJ7tTlrnFqUzlKEtUJjhHu172uczkprjHOl1lJzlJzO/0pje0qMxkqEtVqUxmul1nu156XW/5zW/6Xe/3OEjIyMhP/enLWljOfGlP/WnPfOnN69lIyEe//OnP///8bGxoyMjHt7e8DAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADcALAAAAAAQABAAAAYpQIZwSCwaj8ihy5UsLpvEJ1QonVaNy6w2G916k9dmGMycMsZItHldDAIAOw==");
fxContext.appendChild(insetsMenu);
var insetsMenuPopup = document.createElement('menupopup');
insetsMenu.appendChild(insetsMenuPopup);
for (let clipName in clips) {
    let menuitem = document.createElement("menuitem");
    menuitem.setAttribute("label", clipName);
    menuitem.setAttribute("tooltiptext", clips[clipName].replace(/\x01/, "\\x01").replace(/\x02/, "\\x02"));
    menuitem.addEventListener("click", function(){insetClip(this.label);}, true);
    insetsMenuPopup.appendChild(menuitem);
}
/******************************************************************************/
var checkInput = function(){
    insetsMenu.hidden = !gContextMenu.onTextInput;
}
fxContext.addEventListener("popupshowing", checkInput, true);
this.onDestroy = function() {
    fxContext.removeEventListener("popupshowing", checkInput, true);
    fxContext.removeChild(insetsMenu);
}
/******************************************************************************/
var insetClip = function(clipName){
    if (!gContextMenu.onTextInput) {
        return;
    }
    var inpt = gContextMenu.target;
    var inset = clips[clipName];
    var inptValue = inpt.value;
    var selStart = inpt.selectionStart;
    var selEnd = inpt.selectionEnd;
    var scrollY = inpt.scrollTop;
    var scrollX = inpt.scrollLeft;
    if (inset.indexOf("\x01") > -1) {
        inset = inset.replace(/\x01/g, inptValue.substring(selStart, selEnd));
    }
    if (inset.indexOf("\x02") > -1) {
        let clipboardString = "";
        clipboardService.getData(transferService, clipboardService.kGlobalClipboard);
        let str = new Object(), strLength = new Object();
        try {
            transferService.getTransferData("text/unicode", str, strLength);
            if (str) {
                str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
            }
            if (str) {
                clipboardString = str.data.substring(0, strLength.value / 2);
            }
        } catch (ex) {}
        inset = inset.replace(/\x02/g, clipboardString)
    }
    inpt.value = inptValue.substring(0, selStart) + inset + inptValue.substring(selEnd, inptValue.length);
    inpt.selectionStart = inpt.selectionEnd = selStart + inset.length;
    inpt.scrollTop = scrollY;
    inpt.scrollLeft = scrollX;
    inpt.focus();
}
/******************************************************************************/


В начале кода задаём список позиций меню, одна позиция - одна вставка, в формате ассоциированного массива (ключ-название : значение-код). Чтобы не выдумывать редкие условные обозначения, я взял два непечатных символа для обозначения выделенного текста (\x01, мнемонический приём — единица похожа на курсор) и содержимого буфера обмена (\x02, мнемонический приём — двойка значит удвоение, копирование). При вставке они будут заменяться на соответствующие элементы.

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

Отредактировано homo_nudus (23-07-2012 08:58:07)

Отсутствует

 

№443022-07-2012 01:53:51

skynet281978
Участник
 
Группа: Members
Зарегистрирован: 09-03-2011
Сообщений: 508
UA: Firefox 13.0

Re: Custom Buttons

bunda1не сработало, также дублирует. Дубль-кнопка добавляется каждый раз при нажатии Ок, независимо о того редактировал её или нет.

Отредактировано skynet281978 (22-07-2012 01:55:23)

Отсутствует

 

№443122-07-2012 02:06:49

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

Re: Custom Buttons

Ну тогда не знаю :(

Отредактировано bunda1 (22-07-2012 02:07:06)

Отсутствует

 

№443222-07-2012 02:11:21

skynet281978
Участник
 
Группа: Members
Зарегистрирован: 09-03-2011
Сообщений: 508
UA: Firefox 13.0

Re: Custom Buttons

bunda1 а у тебя что не дублирует?

Отсутствует

 

№443322-07-2012 02:23:12

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

Re: Custom Buttons

Дублирует, я ошибся.

Отсутствует

 

№443422-07-2012 02:37:33

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 14.0

Re: Custom Buttons

bunda1 пишет
Выделить код

Код:

// Блокировать повторный запуск функций и обработчиков при открытии настройки панелей но разрешить обновление кнопки ........................
this.onDestroy = function(reason) {
     if ( reason == "update") this.removeAttribute("stopRepeat");
};
if (this.hasAttribute("stopRepeat")) return;

...

// устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды  
this.setAttribute("stopRepeat","true");

Это все лечение симптомов, а не самой проблемы.
Все равно при правке кнопки будет тот же самый эффект. А так еще и перезапускаться придется.
Так что если уж использовать onDestroy(), то с пользой – чтобы он все подчищал за кодом инициализации.

Например, так:

Выделить код

Код:

--- stylishMenu.js
+++ stylishMenu-mod.js
@@ -1,24 +1,13 @@
-var items = [
+var items = {
 
-// "Название пункта меню",
-// "Текст, который будет вставлен",
+// "Название пункта меню": "Текст, который будет вставлен",
+"!important;": "!important;",
+"display: none !important;": "display: none !important;",
+"width: ": "width: ",
+"height: ": "height: ",
+"font-weight: ": "font-weight: "
 
-"!important;",
-"!important;",
-
-"display: none !important;",
-"display: none !important;",
-
-"width: ",
-"width: ",
-
-"height: ",
-"height: ",
-
-"font-weight: ",
-"font-weight: ",
-
-]
+};
 //====================================================================================
 
 var prefs = Components.classes["@mozilla.org/preferences-service;1"]
@@ -42,11 +31,11 @@
 var  menupopup = document.createElementNS(kXULNS, "menupopup");
      button.appendChild(menupopup);
 
-for (var i = 0; i < items.length; i += 2) {
+for (var label in items) if (items.hasOwnProperty(label)) {
 
   var  menuitem = document.createElementNS(kXULNS, "menuitem");
-       menuitem.setAttribute("label", items[i]);
-  var  commandString = "insertCodeAtCaret('" + items[i+1] + "')";
+       menuitem.setAttribute("label", label);
+  var  commandString = "insertCodeAtCaret(" + JSON.stringify(items[label]) + ")";
        menuitem.setAttribute("oncommand", commandString);
        menupopup.appendChild(menuitem); }
 
@@ -115,3 +104,14 @@
 return; }
 
 this.run();
+
+this.onDestroy = function() {
+    var on = !this.off;
+    if(on)
+        this.off = true;
+    this.run();
+    if(on) {
+        this.off = false;
+        prefs.setBoolPref("off", false);
+    }
+};

Плюс более удобный формат настроек и можно записывать строки «как есть».

Добавлено 22-07-2012 02:39:09
Только это несколько криво, лучше переделать архитектуру, чтобы не приходилось с восстановлением настройки возиться.

Отредактировано Infocatcher (22-07-2012 02:39:09)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№443522-07-2012 18:55:07

SendAbuse
Участник
 
Группа: Members
Зарегистрирован: 08-03-2012
Сообщений: 113
UA: Firefox 11.0

Re: Custom Buttons

Всем спасибо за обсуждение кнопки.
Infocatcher, тебе отдельная благодарность за onDestroy, помогает почти всегда,
а если держать её постоянно включённой то, наверное, вообще всегда.

okkamas_knife, специально для тебя, зацени черновик кнопки:

Итак, названия пунктов меню и текст для вставки
записываются, хранятся и редактируются на вкладке "Справка (H)".

Хранятся блоками разделёнными сепаратором.
Сепаратор - это отдельная строка
( указывается в начале кода Инициализаии, у меня по дефолту это
  около 86 звёздочек, вроде смотрится... ).

Между сепараторами - блок данных, в котором:
   первая строка - название пункта меню
   остальное - текст для вставки

На самом деле всё просто, вот она сама на себе:
vZXRyaQ

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECustomPaste%20for%20CustomButtons%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//rq7///////////////////////9eXv////////////9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/////////////////////////////Xl7/////////////Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////+urv//Xl7//15e//9eXv//Xl7/////////////Xl7//15e//9eXv//Xl7/////////////3Nz//9jY/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////9eXv/////////////c3P//2Nj/////////////Xl7//15e//9eXv//Xl7//66u////////////////////////Xl7/////////////////////////////rq7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%20theSeparator%20%3D%20%22%5Cn%22%20+%0A%22**************************************************************************************%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%22%3B%0A%0Avar%20items%20%3D%20this.Help.split%28theSeparator%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Athis.imageOn%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//rq7///////////////////////9eXv////////////9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/////////////////////////////Xl7/////////////Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////+urv//Xl7//15e//9eXv//Xl7/////////////Xl7//15e//9eXv//Xl7/////////////3Nz//9jY/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////9eXv/////////////c3P//2Nj/////////////Xl7//15e//9eXv//Xl7//66u////////////////////////Xl7/////////////////////////////rq7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.imageOff%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P/JyfD//////////////////////5ub4P///////////5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D///////////////////////////+bm+D///////////+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P///////////5ub4P+bm+D/m5vg/5ub4P///////////////////////////8nJ8P+bm+D/m5vg/5ub4P+bm+D///////////+bm+D/m5vg/5ub4P+bm+D////////////o6Pr/5ub6////////////m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P///////////5ub4P+bm+D/m5vg/5ub4P///////////////////////////5ub4P///////////+jo+v/m5vr///////////+bm+D/m5vg/5ub4P+bm+D/ycnw//////////////////////+bm+D////////////////////////////JyfD/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20prefs%20%3D%20Components.classes%5B%22@mozilla.org/preferences-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIPrefService%29%0A%20%20%20%20%20%20%20%20%20%20%20%20.getBranch%28%22custombutton.CustomPasteForCuctomButtons.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0A%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Avar%20place%20%3D%20null%3B%0Avar%20part1%20%3D%20%22%22%3B%0Avar%20part2%20%3D%20%22%22%3B%0Avar%20startPos%20%3D%200%3B%0A%0Afunction%20createButton%28aDoc%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.style.fontWeight%3D%20%22bold%22%3B%0A%20%20%20%20%20button.style.color%3D%20%22rgb%280%2C0%2C255%29%22%3B%0A%20%20%20%20%20button.style.maxHeight%3D%20%2220px%22%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20%22custom-paste-for-custom-buttons%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0412%20%u0441%20%u0442%20%u0430%20%u0432%20%u0438%20%u0442%20%u044C%22%29%3B%0A//-------------------------------------------------------------%0A%20%20%20%20%20button.onmouseover%20%3D%20function%28%29%7B%0A%0A%20%20%20%20%20%20%20%20%20%20var%20focusedElement%20%3D%20aDoc.commandDispatcher.focusedElement%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28focusedElement.nodeName%20%21%3D%20%22html%3Atextarea%22%29%20return%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20place%20%3D%20focusedElement%3B%0A%20%20%20%20%20%20%20%20%20%20var%20text%20%3D%20place.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20startPos%20%3D%20place.selectionStart%3B%0A%20%20%20%20%20%20%20%20%20%20var%20%20%20endPos%20%3D%20place.selectionEnd%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20part1%20%3D%20text.substring%280%2C%20startPos%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20part2%20%3D%20text.substring%28endPos%2C%20text.length%29%3B%20%7D%0A//--------------------------------------------------------------%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%0A%20%20var%20label%20%3D%20items%5Bi%5D.split%28%22%5Cn%22%2C1%29%3B%0A%20%20var%20insertText%20%3D%20items%5Bi%5D.replace%28label%20+%20%22%5Cn%22%2C%20%22%22%29%3B%0A%20%20%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20label%29%3B%0A%20%20%20%20%20%20%20menuitem.insertText%20%3D%20insertText%3B%0A//-------------------------------------------------------------%0A%20%20%20%20%20%20%20menuitem.inserter%20%3D%20function%20inserter%28aText%29%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20place.value%20%3D%20part1%20+%20aText%20+%20part2%3B%0A%20%20%20%20%20%20%20%20%20%20place.selectionStart%20%3D%20place.selectionEnd%20%3D%20startPos%20+%20aText.length%3B%0A%20%20%20%20%20%20%20%20%20%20place.focus%28%29%3B%20%7D%0A//-------------------------------------------------------------%0A%20var%20%20commandString%20%3D%20%22inserter%28event.target.insertText%29%22%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%0A%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20button%3B%20%7D%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20pattern%20%3D%20/chrome%3A%5C/%5C/custombuttons%5C/content%5C/editor.xul/%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%20%28%21RegExp%28pattern%29.test%28doc.location.href%29%29%20return%3B%0A%0Avar%20tabs%20%3D%20doc.getElementsByTagName%28%22tabs%22%29%3B%0A%20%20%20%20tabs%5B0%5D.appendChild%28createButton%28doc%29%29%3B%20%7D%7D%3B%0A%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//--------------------------------------------------------------------%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21RegExp%28pattern%29.test%28doc.location.href%29%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7Bvar%20tbs%20%3D%20doc.getElementsByTagName%28%22tabs%22%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tbs%5B0%5D.appendChild%28createButton%28doc%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28this.off%29%20%7B%20var%20b%20%3D%20doc.getElementById%28%22custom-paste-for-custom-buttons%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%20this.image%20%3D%20this.imageOff%3B%20return%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%20//%20thanks%20for%20Infocatcher%2C%20again%0A%20%20%20%20var%20on%20%3D%20%21this.off%3B%0A%20%20%20%20if%28on%29%20this.off%20%3D%20true%3B%0A%20%20%20%20this.run%28%29%3B%0A%20%20%20%20if%28on%29%20%7B%20this.off%20%3D%20false%3B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%7D%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20this.imageOff%3B%0Aif%20%28%21this.off%29%20this.image%20%3D%20this.imageOn%3B%0A%0Athis.run%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B.getElementById%28%22%0A.getElementById%28%22%0A**************************************************************************************%0AMulti-Sring-Construction%0AString%2001%3B%0A%20%20%20%20String%2002%3B%0A%20String%2003%3B%0A%0AString%2004%3B%0A**************************************************************************************%0AAny%20Code%20%28bonus%29%0A/*Initialization%20Code*/%0A%0Afunction%20clickTabUpFringe%28event%29%20%7B%20var%20target%20%3D%20event.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20%20pageY%20%3D%20event.pageY%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20if%20%28%28pageY%20%3C9%29%20%26%26%20%28target.className%20%3D%3D%20%27tabbrowser-tab%27%29%29%20%7B%0A%20%20%0A%20%20%20%20%20%20target.click%28%29%3B%20%7D%7D%0A%0Awindow.addEventListener%28%22mousemove%22%2C%20clickTabUpFringe%2C%20true%29%3B%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№443622-07-2012 22:12:59

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 14.0

Re: Custom Buttons

okkamas_knife пишет

1 плохо что она двоится и троится итд..

Только если открыть второе и более окно.

Добавлено 22-07-2012 22:15:02
Проще всего добавить проверку наличия кнопки перед ее добавлением.
А иначе придется как-то определять, какая из кнопок (в каком окне) должна работать.

Отредактировано Infocatcher (22-07-2012 22:15:02)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№443722-07-2012 22:27:26

SendAbuse
Участник
 
Группа: Members
Зарегистрирован: 08-03-2012
Сообщений: 113
UA: Firefox 11.0

Re: Custom Buttons

okkamas_knife

1.  Это да :(. Но у меня, если кнопка всегда включена, она не двоится, а у тебя ?

2.  Ну дак это же CustomButtons :), находишь строчку:
     button.setAttribute("label", "В с т а в и т ь"); и меняй как душе угодно :D
     ( кстати id через строку наверх )

3.  Ты что их вручную набираешь и подсчитываешь ?  :usch:
      Тройной клик на сепараторе, Ctrl+C, курсор в нужную позицию,
      Ctrl+V, ENTER   -  сепаратор готов. ( это всё на вкладке Справка )

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

Так что - правь под себя как захочешь. :)

Отсутствует

 

№443822-07-2012 23:44:15

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

Re: Custom Buttons

Насчет двоится. Помогите разобраться. Взял за основу кнопку bunda1 "Очистить  поле поиска" (не помню на какой странице). Захотел повесить на кнопку "searchbar-engine-button" по правому клику вызов окна "Поиск по текущему сайту". Если использовать код:

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

Выделить код

Код:

//Вызвать окно поиска по текущему сайту по правому клику на  searchbar-engine-button ...............

(function() {
//........
var searchwindows = function(event) {
        if (event.button != 2)
            return;
        //отключать реакцию по умолчанию
       event.preventDefault(); 
        event.stopPropagation();
        //очистить
      this. showSearchDialog = function (callback, url)
{
    XML. ignoreProcessingInstructions = false;
    var dialog = <>
        <?xml-stylesheet href="chrome://global/skin/"?>
        <?xml-stylesheet href="resource://gre/res/html.css"?>
        <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                id="dlg02"
                title="Поиск на сайте"
                onload="windowController.init()"
                ondialogaccept="return windowController.accept();">
            <script type="application/x-javascript">
                <![CDATA[
                    var windowController =
                    {
                        init: function ()
                        {
                            var stb = document. getElementById ("sitetb");
                            stb. value = window. arguments [1];
                            window. sizeToContent ();
                        },
                        
                        accept: function ()
                        {
                            var text = document. getElementById ("texttb"). value;
                            var url = document. getElementById ("sitetb"). value;
                            window. arguments [0] (text, url, true);
                        }
                    };
                ]]>
            </script>
            <vbox flex="1">
                <grid>
                    <columns>
                        <column/>
                        <column flex="1"/>
                    </columns>
                    <rows>
                        <row align="center">
                            <label value="Текст"/>
                            <textbox id="texttb" flex="1"/>
                        </row>
                        <row align="center">
                            <label value="Website"/>
                            <textbox id="sitetb" flex="1"/>
                        </row>
                    </rows>
                </grid>
            </vbox>
        </dialog>
    </>;
    window. openDialog ("data:application/vnd.mozilla.xul+xml," + dialog. toXMLString (), "", "chrome,dependent,minimizable,resizable=yes,centerscreen,dialog=yes", callback, url);
};
this. searchGoogle = function (text, url, encode)
{
    if (encode)
    {
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
    }
    var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
    getBrowser (). addTab (searchUrl);
};

var focusedWindow = document. commandDispatcher. focusedWindow;
    var text = focusedWindow. getSelection (). toString ();
    var doc = getBrowser (). contentDocument;
    try { var url = doc. location. hostname; }
      catch(e) { var url = ""; }
   
     this. showSearchDialog (this. searchGoogle, url); 
  
    };
            
//Объявляем 'searchbar' ...
var searchbar = document.getElementById("searchbar");
        
// добавляем обработчик для кнопки поиска..........
document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-engine-button")
    .addEventListener("click", searchwindows, false);

// устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды  
this.setAttribute("stopRepeat","true");

}());

// удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    removeEventListener("dblclick", NewTabHome, false, gBrowser.mTabContainer);
};

//удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    removeEventListener("dblclick", TabPin, false, gBrowser.mTabContainer);
};


то окно вызова поиска по текущему сайту двоится.

Если использовать вот этот код в отдельно взятой кнопке:

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

Выделить код

Код:

//Вызвать окно поиска по текущему сайту по правому клику на  searchbar-engine-button ...............
// Блокировать повторный запуск функций и обработчиков при открытии настройки панелей но разрешить обновление кнопки ........................
this.onDestroy = function(reason) {
     if ( reason == "update") this.removeAttribute("stopRepeat");
};

if (this.hasAttribute("stopRepeat")) return; 
//........
var searchwindows = function(event) {
        if (event.button != 2)
            return;
        
        //отключать реакцию по умолчанию
       event.preventDefault(); 
        event.stopPropagation();

        //очистить
      this. showSearchDialog = function (callback, url)
{
    XML. ignoreProcessingInstructions = false;
    var dialog = <>
        <?xml-stylesheet href="chrome://global/skin/"?>
        <?xml-stylesheet href="resource://gre/res/html.css"?>
        <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                id="dlg02"
                title="Поиск на сайте"
                onload="windowController.init()"
                ondialogaccept="return windowController.accept();">
            <script type="application/x-javascript">
                <![CDATA[
                    var windowController =
                    {
                        init: function ()
                        {
                            var stb = document. getElementById ("sitetb");
                            stb. value = window. arguments [1];
                            window. sizeToContent ();
                        },
                        
                        accept: function ()
                        {
                            var text = document. getElementById ("texttb"). value;
                            var url = document. getElementById ("sitetb"). value;
                            window. arguments [0] (text, url, true);
                        }
                    };
                ]]>
            </script>
            <vbox flex="1">
                <grid>
                    <columns>
                        <column/>
                        <column flex="1"/>
                    </columns>
                    <rows>
                        <row align="center">
                            <label value="Текст"/>
                            <textbox id="texttb" flex="1"/>
                        </row>
                        <row align="center">
                            <label value="Website"/>
                            <textbox id="sitetb" flex="1"/>
                        </row>
                    </rows>
                </grid>
            </vbox>
        </dialog>
    </>;
    window. openDialog ("data:application/vnd.mozilla.xul+xml," + dialog. toXMLString (), "", "chrome,dependent,minimizable,resizable=yes,centerscreen,dialog=yes", callback, url);
};

this. searchGoogle = function (text, url, encode)
{
    if (encode)
    {
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
    }
    var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
    getBrowser (). addTab (searchUrl);
};

var focusedWindow = document. commandDispatcher. focusedWindow;
    var text = focusedWindow. getSelection (). toString ();
    var doc = getBrowser (). contentDocument;
    try { var url = doc. location. hostname; }
      catch(e) { var url = ""; }
   
     this. showSearchDialog (this. searchGoogle, url); 
  
    };
            
//Объявляем 'searchbar' ...
var searchbar = document.getElementById("searchbar");
        
// добавляем обработчик для кнопки поиска..........
document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-engine-button")
    .addEventListener("click", searchwindows, false);

// устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды  
this.setAttribute("stopRepeat","true");

// удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    removeEventListener("dblclick", NewTabHome, false, gBrowser.mTabContainer);
};

//удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    removeEventListener("dblclick", TabPin, false, gBrowser.mTabContainer);
};


то работает вызов окна без замечаний.
Если использовать this.onDestroy в первом варианте, то код не работает
Я все кнопки, которые bunda1 делал только для инициализации, складываю в одну кнопку, поэтому не охота использовать второй вариант.

Но тут возникают вопросы:
1. Почему двоится это окно (чисто теоретически).
2. Как сделать первый вариант без удвоения окон.
3. Как сделать, ради интереса, повесить эту функцию на среднюю кнопку "search-go-button" (так как у меня и открывается окно поиска и открывается поиск в новой вкладке поисковика).

Также собрал (если кому интересно) с разных форумов в одну кнопку вариант расширения контекстного меню кнопок (лишнее можно выкинуть).

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

Выделить код

Код:

/*Initialization Code*/
/*Дополнительные пункты в контекстном меню кнопки*/

const cbNamespace = "http://xsms.nm.ru/custombuttons/";
const nsIFilePicker = Ci.nsIFilePicker;
const nsILocalFile = Ci.nsILocalFile;

function $(aId) {
  return document.getElementById(aId);
}

var lastDirectory = {
  _lastDir: null,

  get path() {
    if (!this._lastDir || !this._lastDir.exists()) {
      try {
        this._lastDir = cbu.ps.getComplexValue("custombuttons.XML.lastDir",
                                               nsILocalFile);
        if (!this._lastDir.exists())
          this._lastDir = null;
      }
      catch(e) {}
    }
    return this._lastDir;
  },

  set path(aValue) {
    if (!aValue || !aValue.exists() || !aValue.isDirectory())
      return;
    this._lastDir = aValue.clone();
    cbu.ps.setComplexValue("custombuttons.XML.lastDir",
                           nsILocalFile, this._lastDir);
  }
}

function saveFile(aFileName, aStrData) {
  var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  fp.appendFilters(nsIFilePicker.filterXML);
  fp.init(window, "Export button to XML file", nsIFilePicker.modeSave);
  fp.defaultString = aFileName;
  fp.displayDirectory = lastDirectory.path;
  var res = fp.show();
  if (res == nsIFilePicker.returnOK || res == nsIFilePicker.returnReplace) {
    lastDirectory.path = fp.file.parent.QueryInterface(nsILocalFile);
    var ostream = Cc["@mozilla.org/network/file-output-stream;1"].
                  createInstance(Ci.nsIFileOutputStream);
    ostream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0);
    var charset = "UTF-8";
    var os = Cc["@mozilla.org/intl/converter-output-stream;1"].
             createInstance(Ci.nsIConverterOutputStream);
    os.init(ostream, charset, 4096, 0x0000);
    os.writeString(aStrData);
    os.close();
  }
}

function readFile(aFile) {
  var data = "";
  var fstream = Cc["@mozilla.org/network/file-input-stream;1"].
                createInstance(Ci.nsIFileInputStream);
  fstream.init(aFile, -1, 0, 0);
  var charset = "UTF-8";
  const replacementChar = Ci.nsIConverterInputStream
                            .DEFAULT_REPLACEMENT_CHARACTER;
  var is = Cc["@mozilla.org/intl/converter-input-stream;1"].
           createInstance(Ci.nsIConverterInputStream);
  is.init(fstream, charset, 1024, replacementChar);
  var str = {};
  while (is.readString(4096, str) != 0) {
    data += str.value;
  }
  is.close();

  return data;
}

function stringToDOM(aString) {
// https://developer.mozilla.org/en/Parsing_and_serializing_XML
  var parser = new DOMParser();
  var dom = parser.parseFromString(aString, "text/xml");
  if (dom.documentElement.nodeName == "parsererror") {
    return null;
  } else {
    return dom;
  }
}

function importXMLtoButton(aStrXMLData) {
  loadURI("custombutton://" + escape(aStrXMLData));
}

function getCBOverlay() {
  var dirsvc = Cc["@mozilla.org/file/directory_service;1"].
               getService(Ci.nsIProperties);
  var file = dirsvc.get("ProfD", Ci.nsIFile);
  file.append("custombuttons");
  file.append("backup");
  file.append("buttonsoverlay.xul.bak");
  return file;
}

this.viewCBOverlay = function viewCBOverlay() {
  var fileURL = Cc["@mozilla.org/network/io-service;1"].
                getService(Ci.nsIIOService).getProtocolHandler("file").
                QueryInterface(Ci.nsIFileProtocolHandler).
                getURLSpecFromFile(getCBOverlay());
  gBrowser.selectedTab = gBrowser.addTab("view-source:" + fileURL);
}


this.importFromCBOverlay = function importFromCBOverlay(aTitle) {
  var id = custombuttons.promptBox(aTitle, "Введитете номер id кнопки:");
  if (!id[1] || id[1] == "") return;
  id = "custombuttons-button" + id[1];

  var dom = stringToDOM(readFile(getCBOverlay()));
  var button = dom.getElementById(id);
  if (!button) {
    custombuttons.alertBox(aTitle, "Копка Id " + id + " не найдена!");
    return;
  }
  var cbName = button.getAttribute("cb-name") ||
               button.getAttribute("label");
  var cbImage = button.getAttribute("image") ||
                button.getAttribute("cb-stdicon") || "";
  var cbMode = button.getAttribute("mode") || "";
  var cbInitCode = button.getAttribute("cb-init");
  var cbCode = button.getAttribute("cb-oncommand");
  var cbKey = button.getAttribute("accelkey") || "";
  var cbHelp = button.getAttribute("Help") || "";
  var cbAttr = button.getAttribute("attributes");
  var cbXML = <custombutton xmlns:cb={cbNamespace}>
                <name>{cbName}</name>
                <image>{cbImage}</image>
                <mode>{cbMode}</mode>
                <initcode>{cbInitCode}</initcode>
                <code>{cbCode}</code>
                <accelkey>{cbKey}</accelkey>
                <help>{cbHelp}</help>
                <attributes>{cbAttr}</attributes>
              </custombutton>;
  var xml = "<?xml version='1.0' encoding='UTF-8'?>" + cbXML.toString();
  //inspectDOMDocument(stringToDOM(xml));
  importXMLtoButton(xml);
}

this.checkDocumentForCBXML = function checkDocumentForCBXML(aDocument) {
  if (((aDocument.contentType == "text/xml") ||
       (aDocument.contentType == "application/xml"))&&
      (aDocument.documentElement.localName == "custombutton")) {
    var serializer = new XMLSerializer();
    var xml = serializer.serializeToString(aDocument);
    importXMLtoButton(xml);
  } else {
    this.loadXML();
  }
}

this.saveXML = function saveXML(aStrURI) {
  var cbURI = (aStrURI != undefined) ? aStrURI : readFromClipboard();
  if (!cbURI || !/^custombutton\:\/\//.test(cbURI)) {
    custombuttons.uChelpButton(this);
    return;
  }

  var cbXML = cbURI.replace(/^custombutton\:\/\//, "");
  var decodeXML = unescape(cbXML);
  var btnName = decodeXML.match(/\<name\/?.+/).toString();
  var name = "untitled";
  if (!/\<name\/\>/.test(btnName)) {
    name = btnName.replace(/\<\/?\w+\>/g, "").toString();
  }
  var image = decodeXML.match(/\<image\/?.+/).toString();
  var icon = "";
  if (!/\<\image.*\[\].*\>$/.test(image)) {
    icon = image.match(/[^\[\]]+/g)[2].toString()
                .replace(/custombuttons\-stdicon\-\d/, "").toString();
  }

  var xmlTemplate = "custombuttons/\"\n\
              xmlns:html=\"http://www.w3.org/1999/xhtml\">\n\
  <html:head>\n\
    <html:title><![CDATA[" + name + "]]></html:title>\n\
    <html:link rel=\"shortcut icon\" href=\"" + icon + "\"/>\n\
    <html:style type=\"text/css\"><![CDATA[\n\
body { font-size: medium; margin: 0; }\n\
body, code:before, help:before, initcode:before {\n\
  font-family: \"Verdana\", sans-serif;\n\
}\n\
#wrapper { position: fixed; top: 1em; right: 1em; text-align: center; }\n\
p { font-size: small; text-align: center; }\n\
#button {\n\
  background-color: rgb(85, 168, 2);\n\
  background-image: linear-gradient(to bottom, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -moz-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -o-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  background-image: -webkit-linear-gradient(top, rgb(147, 200, 94),\
 rgb(85, 168, 2));\n\
  border: 1px solid rgb(58, 116, 4);\n\
  border-radius: .5em;\n\
  -moz-border-radius: .5em;\n\
  -webkit-border-radius: .5em;\n\
  padding: 0;\n\
  margin-bottom: 1em;\n\
  box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -moz-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -o-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
  -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\
}\n\
#button a {\n\
  color: #000;\n\
  text-shadow: -1pt -1px 0pt rgba(255, 255, 255, .5);\n\
  padding: 1em;\n\
  text-decoration: none;\n\
}\n\
:-moz-any-link:focus {\n\
  color: white;\n\
  outline-color: transparent;\n\
  text-decoration: none;\n\
}\n\
#button a, code, code:before, initcode, initcode:before, help, help:before {\
\n  display: block;\n\
}\n\
#credits { position: fixed; bottom: 1em; right: 1em; font-size: small; }\n\
custombutton { background-color: rgb(171, 171, 171); margin: 1em; }\n\
date, image, mode, accelkey { display: none; }\n\
name { font-weight: bold; font-size: x-large; }\n\
code:before, help:before, initcode:before {\n\
  font-weight: bold;\n\
  font-size: large;\n\
  margin: 0 0 1em;\n\
  padding: .5em;\n\
}\n\
code:before { content: \"CODE\"; }\n\
help:before { content: \"Help\"; }\n\
initcode:before { content: \"Initialization Code\"; }\n\
code, initcode, help {\n\
  background-color: rgb(255, 255, 255);\n\
  border: 1px inset rgb(170, 170, 170);\n\
  font: medium monospace;\n\
  margin: 1em 1em 2em 0;\n\
  padding: 1em;\n\
  text-align: left;\n\
  width: 840px;\n\
  white-space: pre-wrap;\n\
  word-wrap: break-word;\n\
}\n\
.clear { clear: both; }\n\
]]></html:style>\n\
  </html:head>\n\
  <html:body>\n\
    <html:div id=\"wrapper\">\n\
      <html:div id=\"button\">\n\
        <html:a href=\"" + cbURI + "\" rel=\"nofollow\" title=\"Установить " +
        name +"\">\n\
        <![CDATA[Install this button]]>\n\
        </html:a>\n\
      </html:div>\n\
      <html:a href=\"https://addons.mozilla.org/addon/custom-buttons/\
?src=external-custombuttons-xml\">\n\
        <![CDATA[What's this?]]>\n\
      </html:a>\n\
      <html:div id=\"credits\">\n\
        <html:a href=\"" + topicURL +"\">\n\
          <![CDATA[Custom Buttons XML]]><html:br/>\
<![CDATA[Exporter/Importer]]>\n\
        </html:a>\n\
      </html:div>\n\
    </html:div>\n\
  </html:body>";

  // Inspect unformatted XML as DOM, for debugging only
  //inspectDOMDocument(stringToDOM(decodeXML)); return;

  decodeXML = decodeXML.replace(/custombuttons\/\"\>/, xmlTemplate);

  // Inspect formatted XML as DOM, for debugging only
  //inspectDOMDocument(stringToDOM(decodeXML)); return;

  name += ".xml";
  saveFile(name, decodeXML);
}

this.loadXML = function loadXML() {
  var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  fp.init(window, "Импорт из  XML файла и установить как новую кнопку",
          nsIFilePicker.modeOpen);
  fp.appendFilters(nsIFilePicker.filterXML);
  fp.appendFilter("All Files", "*.*");
  fp.displayDirectory = lastDirectory.path;
  if (fp.show() == nsIFilePicker.returnOK) {
    if (fp.file && fp.file.exists()) {
      lastDirectory.path = fp.file.parent.QueryInterface(nsILocalFile);
    }
  } else {
    return;
  }
  var xmlData = readFile(fp.file);
  var xmlDOM = stringToDOM(xmlData).documentElement;
  if (!xmlDOM) {
    //Application.console.log(xmlDOM);
    custombuttons.alertBox("Импорт не удачный", "Не XML файл!");
    return;
  }

  if ((xmlDOM.localName == "custombutton") &&
      ((xmlDOM.getAttribute("xmlns:cb") == cbNamespace) ||
       (xmlDOM.getAttribute("xmlns") == cbNamespace))) {
    importXMLtoButton(xmlData);
  } else {
    custombuttons.alertBox("Импорт не удачный", "XML не содержит Custom Buttons!");
  }
}

this.clipboard = "";

this.copyImageURI = function copyImageURI() {
    var btn = document.popupNode;
    if (!btn) return;
    cbu.gClipboard.write(btn.image);
  custombuttons.alertSlide(btn.name, "Изображение кнопки скопировано в буфер обмена");
}

this.copyToHTMLCode = function copyToHTMLCode() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = "<p><div id=\"install\" style=\"background: transparent -moz-linear-gradient(center top , rgb(224, 102, 255) 30%, rgb(125, 38, 205) 55%); text-shadow: 0pt -1px 0pt rgb(122, 55, 139); border: 1px outset rgb(85, 26, 139); border-radius: 1em; padding: 0; width: 240px; text-align: center;\"><a href=\"" + btn.URI + "\" style=\"display: block; padding: 1em; color: #ffffff; text-decoration: none;\" title=\"Click here to install " + btn.name + "\" rel=\"nofollow\"><img src=\"" + btn.image + "\" alt=\"" + btn.name + "\" style=\"vertical-align: middle; float: left;\"/>" + btn.name + "</a></div></p>";
  cbu.gClipboard.write(code);
  custombuttons.alertSlide(btn.name, "HTML кнопки скопировано в буфер обмена");
}

this.copyToBBCode = function copyToBBCode() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = "[url=" + btn.URI + "][B]" + btn.name + "[/B][/url]";
  cbu.gClipboard.write(code); //.toXMLString());
  custombuttons.alertSlide(btn.name, "BBCode кнопки скопировано в буфер обмена");
}

this.saveImageURI = function saveImageURI() {
  var btn = document.popupNode;
  if (!btn) return;
  if (btn.image != "") saveImageURL(btn.image, btn.name);
  else custombuttons.alertBox("Эта кнопка не имееет изображения!");
}
 
this.copyButtonsCodeText = function copyButtonsCodeText() {
  var btn = document.popupNode;
  if (!btn) return;
  var code = ((btn.cbCommand == "") || (btn.Command == "/*CODE*/"))
              ? ""
              : ("\n/*CODE*/\n" + btn.cbCommand + "\n");
    var init = ((btn.cbInitCode == "") || (btn.cbInitCode == "/*Initialization Code*/"))
              ? ""
              : ("\n/*Initialization Code*/\n" + btn.cbInitCode);
    cbu.gClipboard.write(code + init);
    custombuttons.alertSlide(btn.name, "Code + INIT Code copied to Clipboard");
}



this.saveToHTMLCode = function saveToHTMLCode() {
var btn = document.popupNode;
  var xml = <html xmlns={xhtmlns}>
    <head>
      <title>{btn.name + ' for Custom Buttons'}</title>
      <link rel='icon' type='image/vnd.microsoft.icon' href={btn.image}/>
      <style type='text/css'><![CDATA[pre { border: 1px solid #aaa; }]]></style>
    </head>
    <body>
      <section id='install'><h1>{btn.name}</h1><a href={btn.URI}>Install</a></section>
      <section id='init'><h2>Initialization Code</h2><pre>{btn.cbInitCode}</pre></section>
      <section id='code'><h2>Code</h2><pre>{btn.cbCommand}</pre></section>
      <section id='help'><h2>Help</h2><pre>{btn.Help}</pre></section>
    </body>
  </html>;
  var html = '<!DOCTYPE html>\n' + xml.toXMLString();
  var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
  var stream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
  fp.appendFilters(fp.filterHTML); 
  fp.defaultExtension = 'htm'; fp.init(window, 'Сохранить как HTML', 1);
  fp.defaultString = btn.name + ' ' + aDate();
  if(fp.show() != fp.returnCancel) {
    if(fp.file.exists()) fp.file.remove(true); fp.file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666); 
    stream.init(fp.file, 0x02, 0x200, false);  
    var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream);
    converter.init(stream, "windows-1251", 0, 0);
    converter.writeString(html);
    converter.close();
  }
  
  custombuttons.alertSlide("Кнопка: " + btn.name, "сохранена");
}


var Cc = Components.classes, Ci = Components.interfaces;
var mrw = mostRecentWindow('navigator:browser');
var css = '@-moz-document url("chrome://browser/content/browser.xul"){' + this.Help + '}';
var uri = makeURI('data:text/css,' + encodeURIComponent(css));
var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
if (!sss.sheetRegistered(uri, sss.USER_SHEET)) sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
this.idMIonclick = function idMIonclick() {
  var btn = document.popupNode.id;
  var box = custombuttons.confirmBox("Копировать в буфер", btn, "Да", "Нет");
  if (box) {
    custombuttons.cbService.writeToClipboard(btn);
    custombuttons.alertSlide(btn, "Скопирована в буфер");
} }
function  mostRecentWindow(windowType) {
  return Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getMostRecentWindow(windowType);
}

function aDate() {
  var date = new Date(), tds = date.toDateString();
  if(tds.indexOf('May') != -1) var dStr = tds.substring(4, 7) + ' ' + tds.substring(8, 10) + ', ' + tds.substring(11, 15);
  else var dStr = tds.substring(4, 7) + '. ' + tds.substring(8, 10) + ', ' + tds.substring(11, 15);
  var tts = date.toTimeString(), tStr = tts.substring(0, 8);
  return dStr + '  ' + tStr.replace(/:/g, '');
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Context menus ///////////////////////////////
/////////////////////////////////////////////////////////////////////////////

function addMenuItem(aNewIDs, aNodeIDs, aLabel, aIcon, aCommand) {
  for (var i = 0; i < aNewIDs.length; i++) {
    // Remove previously created menuitems if any
    if ($(aNewIDs[i])) $(aNewIDs[i]).parentNode.removeChild($(aNewIDs[i]));

    // Added 'Export to XML' menuitem to CB contextmenu
    let mi = cbu.makeXML(<menuitem xmlns={xulns}
                  id={aNewIDs[i]} class="menuitem-iconic"
                  image={aIcon} label={aLabel}
                  oncommand={aCommand}/>);

    if (i == 0)
      mi.setAttribute("observes", "custombuttons-contextbroadcaster-primary");

    if ($(aNodeIDs[i])) {
      if ($(aNodeIDs[i]).nextSibling) {
        $(aNodeIDs[i]).parentNode.insertBefore(mi, $(aNodeIDs[i]).nextSibling);
      } else {
        $(aNodeIDs[i]).parentNode.appendChild(mi);
      }
    }
  }
}

var loadImg = "data:image/x-icon;base64,\
AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAA\
AAAAAAD///8B////Af///wH///8B////AQAAAB+yg2l71ZRt+daTa//Wk2v/1pNr/9aTa//Wk2v/\
v4NlywYEAycAAAAX////Af///wH///8B////Af///wHdo4M53Zx3/+Sgef/innb/4p52/+Kedv/l\
o3r/5aR6/+mqgfvPj27N////Af///wH///8B////Af///wH///8B4KSD8+mmff/opH3/56N6/+Wh\
ef/no3r/66qB/8KBXf/Fg1//0Y5s78+Pbqn///8B////Af///wH///8B////AeGlg//trIX/7ayE\
/+6thP/urIX/9bWL/8eFYf/GhF//yYZh/9SPa/nkn3j/////Af///wH///8B////Af///wHkn3j/\
76+G/+6uh//vrob/76+G//W3jP/GhF//y4di/9ONZ//XkWr/5J94/////wH///8B////Af///wH/\
//8B5J94/++wif/wsIj/8LGJ//CxiP/0toz/y4di/8+KZf/vroP/766D/+SfeP////8B////Af//\
/wH///8B////AeSfeP/xs4v/8bOL//Cziv/ws4v/87WL/9CNa+3QjWvt3p96/96fev/en3r/////\
Af///wH///8B////Af///wHkn3j/8rWN//K2jf/ytY3/8rWN//O2jvfdo4Lj0I5sJdCObCXQjmwl\
0I5sJf///wH///8B////Af///wH///8B5J94//O3j//zuI//87iP//O4j//zuZDx3aOD7////wH/\
//8B////Af///wHdo4M/5J94/+SfeP/kn3j/5J94/++2j//zupH/9LqR//O6kv/0upL/87qR/+Sf\
eP/kn3j/5J94/+SfeP////8B////Af///wHkoXr/9cCY//W8k//0vJT/9L2T//S8lP/0vZT/9LyU\
//S8lP/1vJT/9cCY/+Shev////8B////Af///wH///8B9b+WC+SjfP/2yqP/9b+W//a/lf/2v5X/\
9b6V//W+lv/1vpX/9sqj/+SjfP////8B////Af///wH///8B////Af///wH2wZgX5aZ+//fTrP/2\
wJj/9sCY//bAmP/2wZj/99Os/+Smf/////8B////Af///wH///8B////Af///wH///8B////Af//\
/wHkqYH/99ax//fCmv/3wpn/99aw/+Sogf////8B////Af///wH///8B////Af///wH///8B////\
Af///wH///8B////AeWrhP/317L/99ey/+WrhP////8B////Af///wH///8B////Af///wH///8B\
////Af///wH///8B////Af///wH///8B5a2F/+Wthf////8B////Af///wH///8B////Af///wH/\
//8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\
//8AAP//AAD//w==";

var saveImg = "data:image/x-icon;base64,\
AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAA\
AAAAAAD///8B////Af///wH///8BAAAAHQAAACUXaE1dE55y/xOecv8XaE1dAAAAJQAAAB3///8B\
////Af///wH///8B////Af///wH///8B////Af///wEmrX85F6J2/xHEj/8RxI//GKF2/yatfzn/\
//8B////Af///wH///8B////Af///wH///8B////Af///wEmrX85Hqd6/xHHkv8Rx5L/EceS/xHH\
kv8ep3r/Jq1/Of///wH///8B////Af///wH///8B////Af///wEhs4RJJq1//xHHkv8Rx5L/EceS\
/xHHkv8Rx5L/EciT/yatgP8mrX85////Af///wH///8B////Af///wEjsYJBLLKE/xHNlv8RyJP/\
EciT/xHIk/8RyJP/EciT/xHKlf8Rzpn/LLOE/yatfzn///8B////Af///wEmrX85MbaH/xTcqP8V\
3qv/Fd2q/xHKlf8RypX/EcqV/xHKlf8W4a7/Fd6r/xTZpf8xtof/Jq1/Of///wEmrX1pMbaH/zG3\
iP8xt4j/MbeI/xfWov8RzJj/EcyY/xHMmP8RzJj/H8SR/zG3iP8xt4j/MbeI/zG2h/8mrX85////\
Af///wH///8B////Af///wEuuov/Ec+a/xHPmv8Rz5r/FNCc/xbUoPEisH7v////Af///wH///8B\
////Af///wH///8B////Af///wH///8BLrqL/xHTnv8R057/EdOe/xXUoP8a2KT3H7J/4ymaaSUp\
mmklKZppJSmaaSX///8B////Af///wH///8B////AS66i/8R1aH/EdWh/xHVof8U1qL/Idyp/ySh\
b+0koW/tJKJw6ySlc+0noG/5////Af///wH///8B////Af///wEuuov/Edej/xHXo/8R16P/Edej\
/yzgsP8ZsH//GrOB/xm6hv8ZwI3/JqFw6////wH///8B////Af///wH///8BLrqL/xHapf8R2qX/\
Edql/xHapf895bf/KbCC/yCpef8gsH7/Hb6M/yidbNP///8B////Af///wH///8B////ASPNmv8Y\
3ar/Edyn/xHcp/8V3aj/VerA/1DNpP8moHH/JqJz/yG7ifsvv5L/////Af///wH///8B////Af//\
/wEizJn1b+/J/2nux/9k7cX/b+/J/3Dvyf9r7cb/MJ9x/yype/8jt4XzL7+S/////wH///8B////\
Af///wH///8BFL+KOTjWp/9B6Lv/Oea4/zjmuP9G6Lz/WuzD/1rcs/9B0aT7L7+S/////wH///8B\
////Af///wH///8B////Af///wEXwo5lFMWQzxPFkNUTxZDZE8WQ0xXEkNcmxJPVQsie/////wH/\
//8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\
//8AAP//AAD//w==";

var saveImg1 = "data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA==";
var saveImg2 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAADbAAADpcAAA//AAANVwAAD/8AAAKsAAAD/AAAP//AAAP8AAAD/AAAD/8AAAwDAAAP/wAAA/wAAAP8AAA";
var saveImg3 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEH4j6xB8IesQeHDrEHD4axBh/CsQYf4rEGH8KxBw+GsQeHDrEHwh6xB+I+sQf//rEH//6xB//+sQQ==";
var saveImg4 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAA/wAAAP8AAA";
var saveImg5 = "data:application/file;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAFwAAAGkAAABzAAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAADkAAAAP////AQAAAIdgZmj/YWlt/2FobP9haGz/YGhr/2Boa/9fZ2v/X2dr/15mav9dZWn/XGRo/0ZNUP8AAACdAAAAFf///wEAAACr2tzc/9ve4P/a3t//1dnZ/7S2tf+foJz/m5ya/6apqP/O0tP/09fZ/9DV1v+hqq//AAAAuQAAABX///8BAAAAq+3u7//e4eL/ub29/2hnXv9oVUX/U0As/zgxGf83Lx3/YWBX/7a5uv/S1tj/o6yx/wAAALkAAAAV////AQAAAKv29/f/19na/1dUQf9jXDv/dmtJ/4FoSP9VQiL/V0Ek/008Iv9HQTP/yc3P/6Wus/8AAAC5AAAAFf///wEAAACr+Pj4/5uamP9tY0L/g31b/6GLa/+McVH/eFY5/4xwUv9yXkD/RTki/4uMiv+nsLT/AAAAuQAAABX///8BAAAAq/n6+v+FfXL/waSM/8qznf/DrZP/ooFi/7WfhP+qh2//blk9/1A+Iv9aWlH/pK2x/wAAALkAAAAV////AQAAAKv6+/v/d3Rr/9zCsP/RxbH/z8Wu/9fJt//Qvab/qItv/5iOb/9tYUH/VVJK/6Wtsf8AAAC5AAAAFf///wEAAACr+/z8/4mHff+3pI//3NK//+HXxf/m3Mz/5trJ/9rMuf+bgWT/d14//2hnYP+osbX/AAAAuQAAABX///8BAAAAq/z9/f/FxL7/j4l+//Xw5f/29ez/8/Dl/+DMuv/VuaP/poZn/2dFKv+srav/oamt/wAAALkAAAAV////AQAAAKv+/v7/+/z8/5iZjf+5uqr/6+PW/+3i1P/kzL3/vZR+/4NhSf+Qh3z/z9HS/4qQkv8AAAC1AAAAFf///wEAAACr/v7+//7+/v/u7u3/tbiv/5WSgP+DfGj/e25Z/29gTv+sppz/vr6+/5aYmP90eHr/AAAApwAAABP///8BAAAAq/////////////////7+/v/9/f3//f39//v8/P/5+fn/1dXV/2pqav9TU1P/QUFB/wEBAYkAAAAJ////AQAAAKv7+/v//////////////////v7+//7+/v/+/v7/+vr6/9fY2P/V1tb/7Ozs/4KCgv8EBAQrAAAAA////wEAAACFlJSU/6ioqP+qqqr/qqqq/6qqqv+qqqr/qKio/6anp/2kpaX9o6Oj/4qKitUZGRk9////Af///wH///8BAAAAFQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABTBAQEUx8fH1dfX18z////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==";
var saveImg6 = "data:image/png;base64," + 
  "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKklEQVR42mNkQAMNDAxCQMoTiB2BWAEq/ACI9wPxdqD8O2T1jGia" + 
  "o4HUEgb8IAaobimGAUDBGiDVzEAcqAWqb4EbQKTNWF3CCPXzW5ho/f//YDqHkZFhCpQNA7lAMV4gzY4QEmZEtx1mgCtQ8W4o2xLI" + 
  "Pg5lJwDZUghDYkAGzAEyktENMAQqPA9l6wDZEkB6D6Yhc0EG7AGynfEZYAxkawHpxVC+A5CvC6RFGBj2Em2AIZCeg8Q3BtLSUAMI" + 
  "egGkwQBIz8U0YC7OQEQ2wAjIPoekGRQTUC/E4IxGkMKzaNEI8jso4chDbGdgA0UjekJ6A8S3gRikFWQyKOF/higGR50UFLPBEhLM" + 
  "9AZoUv4F1cAA1QTi/2SAJFkQnxdCoyZlJEPIz0xIhpCUnQFx83abgfUZOQAAAABJRU5ErkJggg==";


// Add 'Export to XML' menuitem to CB contextmenu
let cIDs = ["custombuttons-contextpopup-exportXML",
            "custombuttons-contextpopup-exportXML-sub"];
let bIDs = ["custombuttons-contextpopup-bookmarkButton",
            "custombuttons-contextpopup-bookmarkButton-sub"];

addMenuItem(cIDs, bIDs, "Экспорт в XML", saveImg,
            "document.getElementById('" + this.id
          + "').saveXML(('triggerNode' in this.parentNode) "
          + "? this.parentNode.triggerNode.URI "
          + ": document.popupNode.URI);");


let fIDs = ["custombuttons-contextpopup-copyImageURI",
            "custombuttons-contextpopup-copyImageURI-sub"];
let b2IDs = ["custombuttons-contextpopup-copyURI",
            "custombuttons-contextpopup-copyURI-sub"];            
addMenuItem(fIDs, b2IDs, "Копировать изображение кнопки в формате base64", saveImg1,
            "document.getElementById('" + this.id
          + "').copyImageURI();");
let f1IDs = ["custombuttons-contextpopup-saveButtonImage",
            "custombuttons-contextpopup-saveButtonImage-sub"];
addMenuItem(f1IDs, bIDs, "Сохранить изображение кнопки", saveImg1,
            "document.getElementById('" + this.id
          + "').saveImageURI();");  
let f2IDs = ["custombuttons-contextpopup-copyButtonsCodeText",
            "custombuttons-contextpopup-copyButtonsCodeText-sub"];
addMenuItem(f2IDs, b2IDs, "Копировать код кнопки как текст", saveImg2,
            "document.getElementById('" + this.id
          + "').copyButtonsCodeText();");                    
let f3IDs = ["custombuttons-contextpopup-copyAsHTML",
            "custombuttons-contextpopup-copyAsHTML-sub"];
addMenuItem(f3IDs, b2IDs, "Копировать код кнопки как HTML ссылку", saveImg3,
            "document.getElementById('" + this.id
          + "').copyToHTMLCode();");
let f4Ds = ["custombuttons-contextpopup-copyToBBCode",
            "custombuttons-contextpopup-copyToBBCode-sub"];
addMenuItem(f4Ds, b2IDs, "Копировать код кнопки как BBcode сылку", saveImg4,
            "document.getElementById('" + this.id
          + "').copyToBBCode();");          
let f5Ds = ["custombuttons-contextpopup-saveAsHTML",
            "custombuttons-contextpopup-saveAsHTML-sub"];
addMenuItem(f5Ds, bIDs, "Сохранить код кнопки как HTML файл", saveImg5,
            "document.getElementById('" + this.id
          + "').saveToHTMLCode();");
let f6Ds = ["custombuttons-contextpopup-getButtonId",
            "custombuttons-contextpopup-getButtonId-sub"];
let b1IDs = ["custombuttons-contextpopup-remove",
            "custombuttons-contextpopup-remove-sub"];            
addMenuItem(f6Ds, b1IDs, "Показать Id кнопки", saveImg6,
            "document.getElementById('" + this.id
          + "').idMIonclick(content.document);");

var iconADD = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADg0lEQVR42l2Tf0wbZRjHv29717vrD7rKaMUx3MrAiib+KGKI6bK4TZ0hujlYNCFsiYgZxLgshLmEzA11Ya6wwEaiZEV+bMwYTMxmlikbE0RnJtERtGhNmcDWDRi0Be6u7fVar2cg0yd5k/eP5/N9n+/zvA/B/6Kurv5xSZYrzWbzZo5j1snxBJkLLf49ey90VZLjbZ1tTSP355PlS21tLWMwmhvtdvveAueTmowMEzREQowXEVpYwsTUNIZHxhNjvqnTDAm+6/F4IisCKdhms33tcrm25OVtgF5P4c6CH2yCAyQtFpdE5QiYC4Zxc2Ieg9duDIghaVtvb5OoChyp/+jUtpe2VufnO1S4Y6gFH39zBJRM49jOT5BN50KIiFjiY+CFKAIzIi73f3+692zzWyTl2eHIHSkuflGTlsYCyRgq2kvBPC0gLsn46YIXh19ogSWehWhM+tevxoCBH0eT3t9GC8iBg++37Cl//Z2cnDWgFM8RIYI/Q37s++oNPOZaD2ExguFLPry3yY30xFqV1+qMWBQYeD7rbCNHG5p+r6zYlW9RXo+KEdWvFCcIxCdQc6EcjqJsRUTEr1f8OLipURXRMSYQ3YNo7zzjJyeaW/ndZS/rWYpW4SWlAoGPgGhp8Nwcas6XIce5Rqksij9+uA3Pjj6EF+KgjZnoOfdlnLgbTwplpZu5FLAMpxrGKw0L03dRd7EK+c9lgeF08F+/g46dQ5ie5aEzPIT2jh6Z1B066i3bteVRimYhitEVeEaewAdX9mFDYSY4PYPJ0Wkce7ULZNYCmktXLGTC7T4+Tir21raWvrKxympdjZgUU+F5BHDo2yrYn7KB1etwa+wejm/vgi6UjkiMgsmSjZkgUH/4gIfsrtz/xCP2h38pLHBoCNGqXe72NyDA+MAZGNz9Kwj3a90qzAtJBVamxVpxpufz5OB3/c+qH6m8ouZTV5Gz0mZNg55TytXdwMmhD0EltWgqOQt2waZYS0JvsoJmM+D13cSJxobOnwc69qgCJSX7OW4VdclVVLhxbZYVdns2GLMEjjJhOsBDjCZBM6tAqDSM+cbReqr5WvDW3Fav9wt+ZZlSImDkltzcvDcLnM8Qi+UBBdKBplhoKAPmQyL6+i4mBwf6u/hZoToF/2cbl6N4R7UzCbxtWW193mg0rUskNAiGw5O3pyb7Y9FY2/BQ9/X78/8Bls+GdDCWYq8AAAAASUVORK5CYII=";
var addMI = document.getElementById('custombuttons-contextpopup-addnewbutton');
var addMI1 = document.getElementById('custombuttons-contextpopup-addnewbutton-sub');
addMI.setAttribute('image', iconADD);
addMI1.setAttribute('image', iconADD);


let xIDs = ["custombuttons-contextpopup-importnewbutton",
            "custombuttons-contextpopup-importnewbutton-sub"];
let aIDs = ["custombuttons-contextpopup-addnewbutton",
            "custombuttons-contextpopup-addnewbutton-sub"];
addMenuItem(xIDs, aIDs, "Добавить новую кнопку из XML файла\u2026", loadImg,
            "document.getElementById('" + this.id +
            "').checkDocumentForCBXML(content.document);");

let aIDs = ["toolbar-context-menu", "menu_viewPopup", "menu_View_Popup"];
let yIDs = [aIDs[0] + "-importnewbutton",
            aIDs[1] + "-importnewbutton",
            aIDs[2] + "-importnewbutton"];
let zIDs = [aIDs[0] + "-addnewbutton",
            aIDs[1] + "-addnewbutton",
            aIDs[2] + "-addnewbutton"];
for (var i = 0; i < aIDs.length; i++) {
  if ($(aIDs[i])) {
    $(aIDs[i]).querySelector("[oncommand^='custombuttons.']").id = zIDs[i];
    // because the "Add new button..." in toolbar contextmenu
    // and View menu don't have IDs
  }
}
addMenuItem(yIDs, zIDs, "Добавить новую кнопку из XML файла\u2026", "",
            "document.getElementById('" + this.id +
            "').checkDocumentForCBXML(content.document);");

// Remove contextmenu items when this button is deleted
this.onDestroy = function() {
  let kIDs = [this.id + "-checkForUpdate", this.id + "-checkForUpdate-sub"];
  $(kIDs[0]).parentNode.removeEventListener("popupshowing",
                                            initCbPopup, false);
  for (var i = 0; i < 3; i++) {
    $(kIDs[i]) && $(kIDs[i]).parentNode.removeChild($(kIDs[i]));
    $(cIDs[i]) && $(cIDs[i]).parentNode.removeChild($(cIDs[i]));
    $(f6IDs[i]) && $(f6IDs[i]).parentNode.removeChild($(f6IDs[i]));
    $(xIDs[i]) && $(xIDs[i]).parentNode.removeChild($(xIDs[i]));
    $(yIDs[i]) && $(yIDs[i]).parentNode.removeChild($(yIDs[i]));
  }
}

//---------- Remove old traces if any ----------//
let tbitem = $(this.id + "-toolbaritem");
tbitem && tbitem.parentNode.removeChild(tbitem);
let css = "\
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\
#navigator-toolbox:not([customizing=\"true\"]) #" + this.id + ",\
#navigator-toolbox[customizing=\"true\"] #" + this.id + "-toolbaritem\
{ display: none; }";
let sss = Cc["@mozilla.org/content/style-sheet-service;1"].
          getService(Ci.nsIStyleSheetService);
let uri = makeURI("data:text/css," + encodeURIComponent(css), null, null);
if (sss.sheetRegistered(uri, sss.USER_SHEET)) {
  sss.unregisterSheet(uri, sss.USER_SHEET);
}

this.initPopup = function initPopup(aNode) {
  this.querySelector("[oncommand*='inspectCBOverlay']")
      .hidden = !("inspectDOMNode" in window);
}


/*Показать Вставить и вырезать в контекстном меню кнопки*/
const CB = custombuttons;
const CBS = CB.cbService;
const sCBCtxtMenu = CB2const.sCBCtxtMenu;

var cbCtxtMenu = $(sCBCtxtMenu);

this.clipboard = "";

var items = [
  { id: sCBCtxtMenu + "-cut",
    label: "Вырезать",
    command: "c",
    icon: "data:image/png;base64,\
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI\
WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QocFh0xaEFkXgAAArRJREFUOMuFk11Ik1EYx59z3nev\
r9vUfaXbbPgVaHjRVRB0YZRJV0XeZCIRaGmWWKhpgZAElaV9gYgQlBjoEPRKkCS6DAK1MG0zNvJj\
7zZ1m+51X+92zttNzmFa5+78/w8//s/znIMg5TzrfXIOAN7zPO9tunm7dI/Xz7LspTvNrbpUHade\
GIYZu9XYrI1Go8t9/a87Uz0Fq7hw5nS55sWrnk8HAggh/E+HHdfV1lcQQo7t6E97HpeZc82m7ZCI\
KKUnDgRgjENLS7+AT0tDsVisdCcFy7JThYWF4HF7KKXU8a8EFTabDVZdK6iutr44kUic6nnePVBS\
UqJAgMHhdAAAWA8E3G299xljvLy4aAc+jUeSJB3X6/TXZAqwvrFGAWCiraXj4YEAAABKaeXCjwV5\
bc0DjTeaVPFEHIliEObm5iQA6Npb/xegraVjGmM8ZF+00WBwC2s0GhDcgizL8ru2lo7p/wL+pJia\
nZnGTqcD0jkeMt8ORhBCb/arRXuFMaOxl1B6Pb65qSblZTIz+REVGHNAIHQLITRQ6fG07wsYM5k6\
437/g6MmEyQoRd6tTdkX3h5mZVRVkJ3D8BxHJVkG5/o6KLKyrla63UPJFsbN5hrJ5+sqNhrpwsrK\
VDASlgJBEdfEaU2UIzqWwTQQEhOO1dUPR/R6EvP5BsfN5t2XOmowCPNFRWSEYe4DAMxYLCGrUpnY\
8UcYhnzJNQcBAIYxbv+Wn09GDQZhd4ixmF6SJFJFyKMJleqlgmV5hLE9OWmOm1Hz6arJjIy+y5R2\
gyxTIMSwC+A4Qa1UMl/z8mImna5pXhC8iszMK8mPpNU2fHe5Ng4fOtQwa7HECKUYMA4AADAAANVa\
rc/l95/0SxIbAJA5tfrsRUFI7twqiu7q7GyPNxDI8YfDGl8k4lOoVOetouj+DaDzOgfcNME8AAAA\
AElFTkSuQmCC" },
  { id: sCBCtxtMenu + "-paste",
    label: "Вставить",
    command: "p",
    icon: "chrome://custombuttons/skin/paste1.png" }
];

for (var i = 0; i < items.length; i++) {
  $(items[i].id) && cbCtxtMenu.removeChild($(items[i].id));
  let m = menuitem(items[i].id,
                   items[i].label + " кнопку",
                   items[i].command == "c" ? "cut();" : "paste();",
                   items[i].icon);
  switch (items[i].command) {
    case "c":   m.cut =   cut.bind(); break;
    case "p": m.paste = paste.bind();
  }
}

cbCtxtMenu.addEventListener("popupshowing", popupShowing, false);
cbCtxtMenu.removeEventListener("popuphiding", popupShowing, false);

function $(aId) {
  return document.getElementById(aId);
}

function menuitem(aId, aLabel, aCommand, aIcon) {
  var x = <menuitem xmlns={xulns} id={aId} label={aLabel}
                    class="menuitem-iconic" image={aIcon}
                    oncommand={aCommand}/>;
  var s = $(sCBCtxtMenu + CB2const.sCBCtxtMenuSep2);
  return cbCtxtMenu.insertBefore(cbu.makeXML(x), s);
}

function popupShowing(aEvent) {
  //LOG(aEvent.target.id);
  var button = "triggerNode" in aEvent.target ? aEvent.target.triggerNode
                                              : document.popupNode;
  var copied = /^custombutton:\/\//.test(self.clipboard);
  $(items[0].id).hidden = copied || button == self;
  $(items[1].id).hidden = !copied;
}

function convertURItoDOM(aURL) {
  var string = unescape(aURL.replace(/^custombutton\:\/\//, "").toString());
  var dom = (new DOMParser()).parseFromString(string, "text/xml");
  if (dom.documentElement.nodeName == "parsererror") {
    return null;
  } else {
    return dom.documentElement;
  }
}

function getParamValue(aDocument, aNodeName) {
  var result = "";
    var node = aDocument.getElementsByTagName(aNodeName)[0];
    if (!node) return result;
    if (!node.firstChild || (node.firstChild &&
        (node.firstChild.nodeType == node.TEXT_NODE))) {
      result = node. textContent;
    } else {  // CDATA
      result = node.firstChild.textContent;
    }
  return result;
}

function getButtonParameters(aButtonLink, aURL) {
  var dom = convertURItoDOM(aURL);
  var params = CBS.getButtonParameters(aButtonLink).wrappedJSObject;
  params.name             = getParamValue(dom, "name")
  params.image            = getParamValue(dom, "image") ||
                            getParamValue(dom, "stdicon");
  params.code             = getParamValue(dom, "code")
  params.initCode         = getParamValue(dom, "initcode")
  params.help             = getParamValue(dom, "help")
  params.accelkey         = getParamValue(dom, "accelkey")
  params.mode             = getParamValue(dom, "mode")
  params.wrappedJSObject  = params;
  return params;
}

function cut(aButton) {
  if (!aButton) {
    aButton = "triggerNode" in cbCtxtMenu ? cbCtxtMenu.triggerNode
                                          : document.popupNode;
  }
  self.clipboard = aButton.URI;
  var toolbarID = aButton.parentNode.id;
  var buttonID = aButton.id;
  var buttonsToRemove = document.getElementsByAttribute("id", buttonID);
  var removeFromOverlay = buttonsToRemove.length == 1;
  CBS.removeButton(aButton, removeFromOverlay);
  CB.persistCurrentSets(toolbarID, buttonID, null);
}

function paste(aButton) {
  if (!aButton) {
    aButton = "triggerNode" in cbCtxtMenu ? cbCtxtMenu.triggerNode
                                          : document.popupNode;
  }
  CB.cloneButton(aButton, true);
  var newButton = CB.makeButtonLink("update", aButton.nextSibling.id);
  var url = self.clipboard;
  var params = getButtonParameters(newButton, url);
  //inspectObject(params);
  CBS.installButton(params);
  self.clipboard = "";
}

this.onDestroy = function(aReason) {
  cbCtxtMenu.removeEventListener("popupshowing", popupShowing, false);
  for (var i = 0; i < items.length; i++) {
    $(items[i].id) && cbCtxtMenu.removeChild($(items[i].id));
  }
}

Отредактировано Andrey_Krropotkin (23-07-2012 00:19:00)

Отсутствует

 

№443923-07-2012 00:19:24

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

Re: Custom Buttons

Также чуть изменил кнопку Troubleshoot Custom Buttons:

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

Выделить код

Код:

/*Initialization code*/
var dialog;
var defaultFavicon = "http://forum.mozilla-russia.org/uploaded/custombuttons_button.png";
var checkFavicon = "data:image/png;base64," +
  "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAltJREFUOMtt0l9olXUcx/HX8zzThHh07cLQ" +
  "JSZoozXNONMonYxI6zhwhnVnGQldqASZKN50USgWE0ThgCEiZV2JyNDpEnXMLhbuNBC7SOnfVHQj5p/Hmmw+53hxzo7T9bv5Xfy+" +
  "78/v8/1+P4EnT7NqvIOMVEYkRF6q16hjegxBsVgMgiAoBk/AWRyQminyf2cguzi7veOrjg+xBD8H4+Cd2A7xNJLZxDUkMISrTH8Q" +
  "O7e3R/3z9TCKVSWBJitEOsFC1BOXpZOyfhzFOptPeW3O6wqFgh9Of7/7/bc/2BJoVi11CbVewXziMhiX4SSkY/lx2VktYOOejXJH" +
  "cwOmeKlKqkWk1jTiholNJ/iu6VAF/iL/uVx3jsiz7lsdlqdNLcaNdMxF2+Jd1s5bB/Zd2qOt70tmVcoyoUijiPq6F7SvPGNp7fLK" +
  "69b5m322YBs4fOVbn/R8WppJTbkgkqmSKsD+1gOWzmwyMDzgp+unrZm71q5X28Dxv9tt6N70uLsUkUIo0iuiMFIADc80aH7uLd8s" +
  "OygQ6L7RZf3ZVoqJeAweqmjlSynDyH+joK76RUdWtJsUTvLLP3nvda4ynD5aJ6VMPBL41wmp/puDN0FVWGVyONnlO79pPbXS8IOk" +
  "YhuSX3EL3JA6Frrgrsj6vit9Fdlr967KnnzTnfuDkrEwFUgu4iJK/X/svFulxP/lj5qG6hkL5r7c2D/Yb82Od12+9runUkYS/MnI" +
  "hbL1IkJf65Lz+ObR5A0cFJld/kXlhtR1fOS8H8eQYEL0FpnqaS3IoBGhVK9IHid0uT2+/CEAYcfQrHKJYQAAAABJRU5ErkJggg==";
var uncheckFavicon = "data:image/png;base64," +
  "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAeJJREFUOMudk81qU1EUhb+7krYZaIkUhQQc" +
  "qLVG30BKCyoOOtFROgiJZuxTXF/CcaEhhtyROCoO/C19BNOgM0mgk6IpGNN713WQUKMVU1yjczjrfJyz914Bf6hef5wbDn/clFTA" +
  "FJVVAPTiOO4lSdKJouj7tD+Y3lQqletID7DPAwjwyakAjjLi5XajsX8KUK1W7xmvYTD0wR2hHgjjonAJVJjY95rN5s4JYHNz81o2" +
  "m60BiWO/Kd0q7YZh6OnXhWGobvfTbfBdICNlnjca2/tBvV7PjYajJ4hF269brdZb/qFqpbpqfB84GgwGzzQajVaQFiUOkiT5wAwt" +
  "ryzvjb/IuXw+XxJQmJRqP4qiZBYgDENjdwDSlIKMixIEQabHGSWpB2DSooRSm/+SHaca00SaJMWzX3RxPBnqyXYfjKUb5XI5M7MG" +
  "T0MBpQmor8PDwy7wFfvS3Nzc+ixA52NnVVJB0sCJO8G4t5WrhkeSbPv98XH8Lorav3WkXC5nFhZya3ayBmQcu9lqt7q/RrlSuWNY" +
  "BwKkAxx34thfEGSz85eBEvbFiX232Wy+OhWmWq12JU3Th7bz0xHyZGX7mx2/aLfbn/+aRoCNjY2FpQtLK4gCdjE2QVb0YtPP5ea7" +
  "W1tbw2n/Tyf84OJw4lGJAAAAAElFTkSuQmCC";
var checkStyle = 'background:#FFF1AE url("' + checkFavicon + '") no-repeat left center;color:black;padding-left:24px';
var uncheckStyle = 'background:white url("' + uncheckFavicon + '") no-repeat left center;color:black;padding-left:24px';

function createURI(node) {
  var name = node.getAttribute("name") || node.getAttribute("label") || "";
  var image = node.getAttribute("image") || node.getAttribute("cb-stdicon") || "";
  var mode = node.getAttribute("cb-mode") || 0;
  var initcode = node.getAttribute("cb-init") || "";
  var code = node.getAttribute("cb-oncommand") || "";
  var accelkey = node.getAttribute("cb-accelkey") || "";
  var help = node.getAttribute("Help") || "";
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "chrome://custombuttons/content/nbftemplate.xml", false);
  xhr.send(null);
  var doc = xhr.responseXML;
  setText(doc, "name", name, 0);
  setText(doc, "image", image, 1);
  setText(doc, "mode", mode, 0);
  setText(doc, "initcode", initcode, 1);
  setText(doc, "code", code, 1);
  setText(doc, "accelkey", accelkey, 1);
  setText(doc, "help", help, 1);
  var ser = new XMLSerializer();
  var data = ser.serializeToString(doc);
  return "custombutton://" + escape(data);
}
function setText(doc, nodeName, text, make_CDATASection) {
  var node = doc.getElementsByTagName(nodeName)[0], cds;
  if (!node) return;
  if (make_CDATASection) {
    try {
      cds = doc.createCDATASection(text || "");
    } catch(e) {
      cds = doc.createTextNode(text || "");
    }
    node.appendChild(cds);
  } else {
    node.textContent = text;
  }
}

function aDate() {
var t=new Date();
var y=1900+t.getYear();
var min=t.getMinutes(); if (min<10){min="0"+min};
var h=t.getHours();
var m=t.getMonth();switch(m){case 0: m="Jan";break;case 1: m="Feb";break;case 2: m="Mar";break;case 3: m="Apr";break;case 4: m="May";break;case 5: m="Jun";break;case 6: m="Jul";break;case 7: m="Aug";break;case 8: m="Sep";break;case 9: m="Oct";break;case 10: m="Nov";break;default: m="Dec";}
var d=t.getDate();
var curdate=y+"-"+d+"-"+m+"_"+h+"-"+min;
var myfilename="my_cbuttons_"+curdate;
return myfilename;
}

this.close = function() {
dialog.close();
}




  const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  var data = <window onload={'opener.document.getElementById("' + this.id + '").load()'} title={"Инструменты CB"} xmlns={xulNS}>
    <keyset>
      <key keycode="VK_ESCAPE" oncommand="close()"/>
    </keyset>
    <vbox flex="1">
      <listbox flex="1" id="listbox" height="555" width="500" context="menupopup" onclick={'opener.document.getElementById("' + this.id + '").handle(event)'}
      tooltiptext = "L=Выбрать 
M=Выбрать все 
R=Копировать/Сохранить как…">
      <listhead>
          <listheader label="Label" width="300"
          tooltiptext = "Активные кнопки выделены жирным шрифтом"/>
          <listheader label="Id"
          tooltiptext = "Активные кнопки выделены жирным шрифтом"/>
        </listhead>
        <listcols>
          <listcol/>
          <listcol flex="1"/>
        </listcols>
      </listbox>
      <popupset>
        <menupopup id="menupopup">
          <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA==" label="Копировать изображение кнопки в base64"
            oncommand={'opener.document.getElementById("' + this.id + '").copyIMG()'}/>
          <menuitem class="menuitem-iconic" image="chrome://custombuttons/skin/copy.png" label="Копировать кнопку в буфер обмена"
            oncommand={'opener.document.getElementById("' + this.id + '").copyURI()'}/>
          <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAA/wAAAP8AAA" label="Копировать кнопку как BBcode ссылку"
            oncommand={'opener.document.getElementById("' + this.id + '").copyBBCode()'}/>
           <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAADbAAADpcAAA//AAANVwAAD/8AAAKsAAAD/AAAP//AAAP8AAAD/AAAD/8AAAwDAAAP/wAAA/wAAAP8AAA" label="Копировать кнопку как текст"
            oncommand={'opener.document.getElementById("' + this.id + '").copyButtonsCodeText()'}/>
           <menuitem class="menuitem-iconic" image="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEH4j6xB8IesQeHDrEHD4axBh/CsQYf4rEGH8KxBw+GsQeHDrEHwh6xB+I+sQf//rEH//6xB//+sQQ==" label="Копировать кнопку как HTML ссылку"
            oncommand={'opener.document.getElementById("' + this.id + '").copyHTML()'}/>
          <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA==" label="Сохранить изображение кнопки"
            oncommand={'opener.document.getElementById("' + this.id + '").saveIMG()'}/>
          <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAFwAAAGkAAABzAAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAADkAAAAP////AQAAAIdgZmj/YWlt/2FobP9haGz/YGhr/2Boa/9fZ2v/X2dr/15mav9dZWn/XGRo/0ZNUP8AAACdAAAAFf///wEAAACr2tzc/9ve4P/a3t//1dnZ/7S2tf+foJz/m5ya/6apqP/O0tP/09fZ/9DV1v+hqq//AAAAuQAAABX///8BAAAAq+3u7//e4eL/ub29/2hnXv9oVUX/U0As/zgxGf83Lx3/YWBX/7a5uv/S1tj/o6yx/wAAALkAAAAV////AQAAAKv29/f/19na/1dUQf9jXDv/dmtJ/4FoSP9VQiL/V0Ek/008Iv9HQTP/yc3P/6Wus/8AAAC5AAAAFf///wEAAACr+Pj4/5uamP9tY0L/g31b/6GLa/+McVH/eFY5/4xwUv9yXkD/RTki/4uMiv+nsLT/AAAAuQAAABX///8BAAAAq/n6+v+FfXL/waSM/8qznf/DrZP/ooFi/7WfhP+qh2//blk9/1A+Iv9aWlH/pK2x/wAAALkAAAAV////AQAAAKv6+/v/d3Rr/9zCsP/RxbH/z8Wu/9fJt//Qvab/qItv/5iOb/9tYUH/VVJK/6Wtsf8AAAC5AAAAFf///wEAAACr+/z8/4mHff+3pI//3NK//+HXxf/m3Mz/5trJ/9rMuf+bgWT/d14//2hnYP+osbX/AAAAuQAAABX///8BAAAAq/z9/f/FxL7/j4l+//Xw5f/29ez/8/Dl/+DMuv/VuaP/poZn/2dFKv+srav/oamt/wAAALkAAAAV////AQAAAKv+/v7/+/z8/5iZjf+5uqr/6+PW/+3i1P/kzL3/vZR+/4NhSf+Qh3z/z9HS/4qQkv8AAAC1AAAAFf///wEAAACr/v7+//7+/v/u7u3/tbiv/5WSgP+DfGj/e25Z/29gTv+sppz/vr6+/5aYmP90eHr/AAAApwAAABP///8BAAAAq/////////////////7+/v/9/f3//f39//v8/P/5+fn/1dXV/2pqav9TU1P/QUFB/wEBAYkAAAAJ////AQAAAKv7+/v//////////////////v7+//7+/v/+/v7/+vr6/9fY2P/V1tb/7Ozs/4KCgv8EBAQrAAAAA////wEAAACFlJSU/6ioqP+qqqr/qqqq/6qqqv+qqqr/qKio/6anp/2kpaX9o6Oj/4qKitUZGRk9////Af///wH///8BAAAAFQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABTBAQEUx8fH1dfX18z////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==" label="Сохранить кнопку как HTML файл"
            oncommand={'opener.document.getElementById("' + this.id + '").SaveButton()'}/>
        </menupopup>
      </popupset>
      <hbox>
        <button label="Сохранить избранное" oncommand={'opener.document.getElementById("' + this.id + '").exportHTML()'}
            oncontextmenu={'opener.document.getElementById("' + this.id + '").exportHTML(),opener.document.getElementById("' + this.id + '").close()'}
            tooltiptext = "Left - Сохранить выбранные кнопки
Right - Сохранить выбранные кнопки и закрыть окно"/>
        <button label="Сохранить все" oncommand={'opener.document.getElementById("' + this.id + '").archiveall()'}
            oncontextmenu={'opener.document.getElementById("' + this.id + '").archiveall(),opener.document.getElementById("' + this.id + '").close()'}
            tooltiptext = "Left - Сохранить все кнопки    
Right - Сохранить все кнопки и закрыть окно"/>
        <button label="Выбрать все" oncommand={'opener.document.getElementById("' + this.id + '").handle1()'}
            tooltiptext = "Выбрать все кнопки"/>
            <button label="Выбрать папку" oncommand={'opener.document.getElementById("' + this.id + '").setFolder()'}
          tooltiptext = "Назначить папку для сохранения файлов с кнопками"/>
        <button label="Считать кнопки" oncommand={'opener.document.getElementById("' + this.id + '").setFolder1()'}
          tooltiptext = "Открыыть файл с кнопками из заданной папки"/>
      </hbox>
      <hbox>  
        <spacer flex="1"/>
        <button label="Новая кнопка" oncommand={'opener.document.getElementById("' + this.id + '").newbutton()'}
            tooltiptext = "Создать новую кнопку рядом с выбранной"/>
              <button label="Удалить" oncommand={'opener.document.getElementById("' + this.id + '").delete()'}
            tooltiptext = "Удалить выбранную кнопку"/>
        <button label="Клонировать" oncommand={'opener.document.getElementById("' + this.id + '").clone()'}
            tooltiptext = "Клонировать рядом с собой выбранную кнопку"/>        
        <button label="Редактировать" oncommand={'opener.document.getElementById("' + this.id + '").edit()'}
            tooltiptext = "Редактировать выбранную кнопку"/>
      <spacer flex="1"/>
      </hbox>
      <hbox>  
        <spacer flex="1"/>
        <button label="Инспектор DOM" oncommand={'opener.document.getElementById("' + this.id + '").inspect()'}
            oncontextmenu={'opener.document.getElementById("' + this.id + '").inspect(),opener.document.getElementById("' + this.id + '").close()'}
            tooltiptext = "Left - Открыть кнопку в Инспекторе DOM   
Right - Открыть кнопку в Инспекторе DOM и закрыть окно"/>
        <button label="Просмотр" oncommand={'opener.document.getElementById("' + this.id + '").view()'}
            oncontextmenu={'opener.document.getElementById("' + this.id + '").view(),opener.document.getElementById("' + this.id + '").close()'}
            tooltiptext = "Left - Просмотреть в новой вкладке код,свойтва, атрибуты   
Right - Просмотреть в новой вкладке код,свойтва,атрибуты и закрыть окно"/>
        <button label="Открыть архив" oncommand={'opener.document.getElementById("' + this.id + '").viewCBOverlay()'}
          tooltiptext = "Открыть файл buttonsoverlay.xul.bak в новой вкладке"/>
        <button label="Кнопки из архива" oncommand={'opener.document.getElementById("' + this.id + '").importFromCBOverlay()'}
          tooltiptext = "Установить кнопки из файла buttonsoverlay.xul.bak. Надо знать id"/>
      <spacer flex="1"/>
      </hbox>
    </vbox>
  </window>;
  var bool = XML.prettyPrinting;
  XML.prettyPrinting = false;
  data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>' + data.toXMLString();
  XML.prettyPrinting = bool;
  
this.leftclick = function(event) { 
  var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data);
  var feature = "chrome,centerscreen,dialog=no";
  dialog = window.openDialog(url, "", feature);
}

this.reopen = function() {
dialog.close();
  var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data);
  var feature = "chrome,centerscreen,dialog=no";
  dialog = window.openDialog(url, "", feature);
}

this.load = function() {
var aList = [], node = /custombuttons-button\d+/;
var nodeList = document.getElementsByClassName("toolbarbutton-1 chromeclass-toolbar-additional");
for(var i = 0; i < nodeList.length; i++) if(nodeList[i].id.match(node)) aList.push(nodeList[i]);

aList.sort(function (a, b) {
a = a.getAttribute("label");
b = b.getAttribute("label");
if(a < b) return -1;
if(a > b) return 1;
return 0;
})
for(var i = 0; i < aList.length; i++) createItem(aList[i]);

var bList = [], node = /custombuttons-button\d+/;
var nodeList = custombuttons.palette.getElementsByClassName("toolbarbutton-1 chromeclass-toolbar-additional");
for(var i = 0; i < nodeList.length; i++) if(nodeList[i].id.match(node)) bList.push(nodeList[i]);
bList.sort(function (a, b) {
a = a.getAttribute("label");
b = b.getAttribute("label");
if(a < b) return -1;
if(a > b) return 1;
return 0;
})
for(var i = 0; i < bList.length; i++) createItem(bList[i]);

  function createItem(button) {
    var item = document.createElement("listitem");
    item.checked = false;
    item.setAttribute("style", uncheckStyle);
    item.setAttribute("value", button.id);
    var cell = document.createElement("listcell");
    cell.setAttribute("class", "listcell-iconic");
    cell.setAttribute("image", button.getAttribute("image") || getImage(button.getAttribute("cb-stdicon")));
    cell.setAttribute("label", button.getAttribute("name") || button.getAttribute("label") || "");
     // Style these three
if(button.getAttribute("initialized")) cell.style.fontWeight = "bold";
if(button.getAttribute("initialized")) cell.style.fontSize = "12px";
if(button.getAttribute("initialized")) cell.style.textShadow = "#999 2px 2px 2px";
if(!button.getAttribute("initialized")) cell.style.color = "#666";
    item.appendChild(cell);
    var cell = document.createElement("listcell");
      cell.setAttribute("label", nodeList[i].id);
      item.appendChild(cell);
    dialog.document.getElementById("listbox").appendChild(item);
  }
  function getImage(s) {
    if (s == "custombuttons-stdicon-1") return "chrome://custombuttons/skin/button.png";
    if (s == "custombuttons-stdicon-2") return "chrome://custombuttons/skin/stdicons/rbutton.png";
    if (s == "custombuttons-stdicon-3") return "chrome://custombuttons/skin/stdicons/gbutton.png";
    if (s == "custombuttons-stdicon-4") return "chrome://custombuttons/skin/stdicons/bbutton.png";
    return defaultFavicon;
  }
  dialog.document.getElementById("listbox").focus();
  dialog.document.getElementById("listbox").selectAll();
}

 function toggleChoice(item) {
    item.checked = !item.checked;
    if (item.checked) item.setAttribute("style", checkStyle);
    else item.setAttribute("style", uncheckStyle);
  }
  
this.handle = function(event) {
  var listbox = dialog.document.getElementById("listbox");
  if (event.button == 0)
    toggleChoice(listbox.selectedItem);
  if (event.button == 1)
    for (var i = 0; i < listbox.itemCount; i++)
      toggleChoice(listbox.getItemAtIndex(i));
}

this.handle1 = function(event) {
  var listbox = dialog.document.getElementById("listbox");
      for (var i = 0; i < listbox.itemCount; i++)
      toggleChoice(listbox.getItemAtIndex(i));
}

this.copyURI = function() {
  var listbox = dialog.document.getElementById("listbox");
  var button = document.getElementById(listbox.selectedItem.getAttribute("value"));
  var href, text;
  if (button) {
    href = button.URI;
    text = button.name;
  } else {
    var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
    for (var i = 0; i < nodeList.length; i++) {
      if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) {
        href = createURI(nodeList[i]);
        text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
        break;
      }
    }
  }
  custombuttons.cbService.writeToClipboard(href);
  custombuttons.alertSlide(text, "Код был скопирован в буфер обмена");
}

this.copyBBCode = function() {
  var listbox = dialog.document.getElementById("listbox");
  var button = document.getElementById(listbox.selectedItem.getAttribute("value"));
  var href, text;
  if (button) {
    href = button.URI;
    text = button.name;
  } else {
    var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
    for (var i = 0; i < nodeList.length; i++) {
      if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) {
        href = createURI(nodeList[i]);
        text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
        break;
      }
    }
  }
  custombuttons.cbService.writeToClipboard("Install [url=" + href + "][img]" + defaultFavicon + "[/img][B] " + text + "[/B][/url]");
  custombuttons.alertSlide(text, "BBCode был скопирован в буфер обмена");
}


this.copyButtonsCodeText = function copyButtonsCodeText() {
   var listbox = dialog.document.getElementById("listbox");
  var btn = document.getElementById(listbox.selectedItem.getAttribute("value"));
 if (!btn) return;
  var code = ((btn.cbCommand == "") || (btn.Command == "/*CODE*/"))
              ? ""
              : ("\n/*CODE*/\n" + btn.cbCommand + "\n");
    var init = ((btn.cbInitCode == "") || (btn.cbInitCode == "/*Initialization Code*/"))
              ? ""
              : ("\n/*Initialization Code*/\n" + btn.cbInitCode);
    cbu.gClipboard.write(code + init);
    custombuttons.alertSlide(btn.name, "Code + INIT Code скопированы в буфер обмена");

}

this.copyHTML = function() {
  var listbox = dialog.document.getElementById("listbox");
  var button = document.getElementById(listbox.selectedItem.getAttribute("value"));
  var href, src, text;
  if (button) {
    href = button.URI;
    src = button.image;
    text = button.name;
  } else {
    var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
    for (var i = 0; i < nodeList.length; i++) {
      if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) {
        href = createURI(nodeList[i]);
        src = nodeList[i].getAttribute("image");
        text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
        break;
      }
    }
  }
  if (!src) src = defaultFavicon;
  custombuttons.cbService.writeToClipboard('<a href="' + href + '"><img alt="" src="' + src + '">' + " " + text + "</a>");
  custombuttons.alertSlide(text, "HTML был скопирован в буфер обмена");
}

this.copyIMG = function() {
  var listbox = dialog.document.getElementById("listbox");
  var button = document.getElementById(listbox.selectedItem.getAttribute("value"));
  var href, src, text;
  if (button) {
    src = button.image;
    text = button.name;
  } else {
    var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
    for (var i = 0; i < nodeList.length; i++) {
      if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) {
        src = nodeList[i].getAttribute("image");
        text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
        break;
      }
    }
  }
  if (!src) custombuttons.alertBox(text + "\n" + "Эта кнопка не имеет изображения!");
  else {custombuttons.cbService.writeToClipboard(src);
        custombuttons.alertSlide(text, "Изображение кнопки было скопировано в буфер обмена");
  }
}

this.saveIMG = function() {
  var listbox = dialog.document.getElementById("listbox");
  var button = document.getElementById(listbox.selectedItem.getAttribute("value"));
  var href, src, text;
  if (button) {
    src = button.image;
    text = button.name;
  } else {
    var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
    for (var i = 0; i < nodeList.length; i++) {
      if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) {
        src = nodeList[i].getAttribute("image");
        text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
        break;
      }
    }
  }
  if (!src) custombuttons.alertBox(text + "\n" + "Эта кнопка не имеет изображения!");
  else saveImageURL(src, text);
}

this.SaveButton = function() {
  var listbox = dialog.document.getElementById("listbox");
  var id = listbox.selectedItem.getAttribute("value");
  var btn = document.getElementById(id);
  var btnname, btnimage, btnURI, btncbInitCode, btncbCommand, btnHelp;
  if (btn) {
    btnname = btn.name;
    btnimage = btn.image;
    btnURI = btn.URI;
    btncbInitCode = btn.cbInitCode;
    btncbCommand = btn.cbCommand;
    btnHelp = btn.Help;
  } else {
    var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
    for (var i = 0; i < nodeList.length; i++) {
      if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) {
        btnimage = nodeList[i].getAttribute("image");
        btnname = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
        btnURI = createURI(nodeList[i]);
        btncbInitCode = nodeList[i].getAttribute("cb-init");
        btncbCommand = nodeList[i].getAttribute("cb-oncommand");
        btnHelp = nodeList[i].getAttribute("Help");
        break;
      }
    }
  }
  if (!btnimage) btnimage = defaultFavicon;
  
  var xml = <html xmlns={xhtmlns}>
    <head>
      <title>{btnname + ' for Custom Buttons'}</title>
      <link rel='icon' type='image/vnd.microsoft.icon' href={btnimage}/>
      <style type='text/css'><![CDATA[pre { border: 1px solid #aaa; }]]></style>
    </head>
    <body>
      <section id='install'><h1>{btnname}</h1><a href={btnURI}>Install</a></section>
      <section id='init'><h2>Initialization Code</h2><pre>{btncbInitCode}</pre></section>
      <section id='code'><h2>Code</h2><pre>{btncbCommand}</pre></section>
      <section id='help'><h2>Help</h2><pre>{btnHelp}</pre></section>
    </body>
  </html>;
  var html = '<!DOCTYPE html>\n' + xml.toXMLString();
  var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
  var stream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
  fp.appendFilters(fp.filterHTML); 
  fp.defaultExtension = 'htm'; fp.init(window, 'Save As HTML', 1);
  fp.defaultString = btnname + ' ' + aDate();
  if(fp.show() != fp.returnCancel) {
    if(fp.file.exists()) fp.file.remove(true); fp.file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666); 
    stream.init(fp.file, 0x02, 0x200, false);  
    var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream);
    converter.init(stream, "windows-1251", 0, 0);
    converter.writeString(html);
    converter.close();
  }
  custombuttons.alertSlide("Кнопка: " + btn.name, "сохранена");
}

this.newbutton = function() {
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
    createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  var out = new Array();
  var listbox = dialog.document.getElementById("listbox");
  for (var i = 0; i < listbox.itemCount; i++) {
    if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) {
      var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"));
       custombuttons. cloneButton(document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")));
        var newButtonLink = custombuttons. makeButtonLink ("update",  document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")).nextSibling. id );
        var params = custombuttons. cbService. getButtonParameters (newButtonLink). wrappedJSObject;
        params. image = "";
        params. name = ""
        params. code = "";
        params. initCode = "";
        params. wrappedJSObject = params;
         custombuttons. cbService. installButton (params);
         this.reopen();
    }
  }
}
this.edit = function() {
  var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
    createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  var out = new Array();
  var listbox = dialog.document.getElementById("listbox");
  for (var i = 0; i < listbox.itemCount; i++) {
    if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) {
      var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"));
       custombuttons.editButton(document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")));
       
    }
  }
}
this.clone = function() {
  var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
    createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  var out = new Array();
  var listbox = dialog.document.getElementById("listbox");
  for (var i = 0; i < listbox.itemCount; i++) {
    if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) {
      var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"));
       custombuttons.cloneButton(document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")));
       this.reopen();
    }
  }
}
this.delete = function() {
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
    createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  var out = new Array();
  var listbox = dialog.document.getElementById("listbox");
  for (var i = 0; i < listbox.itemCount; i++) {
    if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) {
      var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"));
      var id = listbox.getItemAtIndex(i).getAttribute("value");
      var oRemovedButton = document.getElementById(id);
      var sParentToolbarId = oRemovedButton.parentNode.id;
      var sRemovedButtonId = oRemovedButton.getAttribute("id");
      var cButtonsToRemove = document.getElementsByAttribute("id", sRemovedButtonId);
      var bRemoveFromOverlay = cButtonsToRemove.length == 1;
       custombuttons.cbService.removeButton(oRemovedButton, bRemoveFromOverlay);
        custombuttons.persistCurrentSets(sParentToolbarId, sRemovedButtonId, null);
        this.reopen();
    }
  }  
}




this.view = function() {
var listbox = dialog.document.getElementById("listbox");
var id = listbox.selectedItem.getAttribute("value");
   var box = custombuttons.confirmBox3("CB TOOLS", "Просмотр в новой вкладке:", "Код", "Свойства", "Атрибуты");
    if (box == 0)  this.link();
    if (box == 2)  this.attr();
    if (box == 1)  this.prop();
  this.reopen();
}


var br = getBrowser();

function openTab(arr) {
  for (var i = 0; i < arr.length; i++) {
    var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    converter.charset = "UTF-8";
    arr[i] = converter.ConvertFromUnicode(arr[i]);
    arr[i] = arr[i].replace(/&/g, "&amp;");
    arr[i] = arr[i].replace(/>/g, "&gt;");
    arr[i] = arr[i].replace(/</g, "&lt;");
    arr[i] = arr[i].replace(/"/g, "&quot;");
    arr[i] = arr[i].replace(/'/g, "&apos;");
  }
  var data = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//En">';
  data += "<html><head><title>" + arr[1] + "</title>";
  data += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
  data += "</head><body><pre>" + arr.join("\n\n") + "</pre></body></html>";
  var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
  if (info.name == "Firefox" || info.name == "SeaMonkey") {
    br.selectedTab = br.addTab("data:text/html;charset=utf-8;base64," + btoa(data));
  }
  if (info.name == "Thunderbird") {
    openContentTab("data:text/html;charset=utf-8;base64," + btoa(data));
  }
}

this.attr = function() {
var listbox = dialog.document.getElementById("listbox");
var id = listbox.selectedItem.getAttribute("value");
   var node = document.getElementById(id);
  var out = new Array();
  out.push('windowtype="' + document.documentElement.getAttribute("windowtype") + '" id="' + id + '"');
  out.push("Атрибуты");
  for (var i = 0; i < node.attributes.length; i++) {
    if (node.attributes[i].nodeName == "cb-oncommand" ||
        node.attributes[i].nodeName == "cb-init"      ||
        node.attributes[i].nodeName == "Help") {
      out.push(node.attributes[i].nodeName + " " + typeof node.attributes[i].nodeValue + "\n" + "[omitted]");
    } else {
      out.push(node.attributes[i].nodeName + " " + typeof node.attributes[i].nodeValue + "\n" + node.attributes[i].nodeValue);
    }
  }
  openTab(out);
}

this.prop = function() {
var listbox = dialog.document.getElementById("listbox");
var id = listbox.selectedItem.getAttribute("value");
   var node = document.getElementById(id);
  var out = new Array();
  out.push('windowtype="' + document.documentElement.getAttribute("windowtype") + '" id="' + id + '"');
  out.push("Свойства");
  for (var i in node) {
    if (i == "cbCommand"  ||
        i == "cbInitCode" ||
        i == "Help"       ||
        i == "URI") {
      out.push(i + " " + typeof node[i] + "\n" + "[omitted]");
    } else {
      out.push(i + " " + typeof node[i] + "\n" + node[i]);
    }
  }
  openTab(out);
}

this.link = function() {
var listbox = dialog.document.getElementById("listbox");
var id = listbox.selectedItem.getAttribute("value");
  var out = new Array();
  out.push('windowtype="' + document.documentElement.getAttribute("windowtype") + '" id="' + id + '"');
  out.push("Код");
  out.push(unescape(document.getElementById(id).URI));
  openTab(out);
}

this.inspect = function() {
  if (typeof(inspectDOMDocument) == "undefined") {
    custombuttons.alertBox(this.label, "DOM Инспектор не установлен.");
    return;
  }
var listbox = dialog.document.getElementById("listbox");
var id = listbox.selectedItem.getAttribute("value");
inspectDOMNode(document.getElementById(id));
}

const cEICB = "Export.Import.CB.type.HTML";
const cPathEI = "C:\\Custom Buttons\\Сохранение кнопок\\";
const cPathSetMsg = "Надо установить путь для чтения/записи кнопок";
const csImpT = "Импорт кнопок из HTML";
const csSetIET = "Каталог для Экспорта/Импорта кнопок в/из HTML";
//*********************************************************************
//chkPath проверяет путь и тд, можно добовлять проверки, тк не всё проверяется.
//return = -10 ошибка в определении синтаксиса пути (не используется)
//return = -2  ошибочный путь или его не существует (почти не используется)
// return = -1 ошибка настройки (для совместимости)
// return = 0  требуется создать и определить путь
// return = 1  всё ОК

function chkPath(cPth){
var vPth = Application.prefs.getValue(cEICB, cEICB), res = -10; //предустановка
if (vPth == cEICB ){
       Application.prefs.setValue(cEICB, cPathEI); // Создали и путь по умолчанию из определения
       res = 1; //Переменная существует и определена
       }
 else if (typeof(vPth) != "string")
       res = -1; //Переменная определена и не того типа, значит она не наша
   else {
        //Пробуем проверить путь - ответ в исключении.
        var file = Components.classes["@mozilla.org/file/local;1"].
                 createInstance(Components.interfaces.nsILocalFile);
    try {
        file.initWithPath(cPth);
         if (!file.isDirectory() ) res = 0; //Такого пути нет надо создавать
                 else  res = 1; // Путь есть
         }
    catch(e) {
             res = -2;
             }
        }
 return res;
}


this.setFolder = function() { 

var sPathEI=Application.prefs.getValue(cEICB, 0);
if (chkPath(sPathEI) == -1) {
              custombuttons. alertBox (csSetIET, "переменная   "+cEICB+" уже существует и занята")
              return; //Нельзя создавать тк переменная уже занята
              };
// Диалог создания и установки пути
var fp = Components.classes["@mozilla.org/filepicker;1"]
    .createInstance(Components.interfaces.nsIFilePicker);
fp.init(window, csSetIET, fp.modeGetFolder);
var dd = Components.classes["@mozilla.org/file/local;1"]
    .createInstance(Components.interfaces.nsILocalFile);
dd.initWithPath(sPathEI);
fp.displayDirectory = dd;
if(fp.show() == fp.returnCancel) return;
   else
    {
    sPathEI = fp.file.path
    Application.prefs.setValue(cEICB, sPathEI+=(sPathEI[sPathEI.length-1] != "\\")?"\\":"");
    custombuttons. alertBox (csSetIET, "Установлен путь для записи/чтения \n " + sPathEI);
    }
}

this.setFolder1 = function(){
if (chkPath(Application.prefs.getValue(cEICB, 0)) != 1) custombuttons. alertBox (csImpT, cPathSetMsg);
  else
  {
   var mydir=Application.prefs.getValue(cEICB, 0); //, myfilename = GenFileName();
   var fp = Components.classes["@mozilla.org/filepicker;1"]
      .createInstance(Components.interfaces.nsIFilePicker);
   fp.init(window, csImpT, fp.modeOpen);
   var dd = Components.classes["@mozilla.org/file/local;1"]
       .createInstance(Components.interfaces.nsILocalFile);
   dd.initWithPath(mydir);
   fp.displayDirectory = dd;
   if(fp.show() != fp.returnCancel) getBrowser (). selectedTab = getBrowser (). addTab (fp.file.path);
  }
}

this.exportHTML = function() {
  var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
    createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  var out = new Array();
  var listbox = dialog.document.getElementById("listbox");
  for (var i = 0; i < listbox.itemCount; i++) {
    if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) {
      var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"));
      var href = button.URI;
      var src = button.image;
      var text = button.name;
      if (!src) src = defaultFavicon;
      out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>');
    }
  }
  var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
  for (var i = 0; i < nodeList.length; i++) {
    if (nodeList[i].id.search("custombuttons-button") == 0 && document.getElementById(nodeList[i].id) == null) {
      for (var j = 0; j < listbox.itemCount; j++) {
        if (listbox.getItemAtIndex(j).checked && nodeList[i].id == listbox.getItemAtIndex(j).getAttribute("value")) {
          var href = createURI(nodeList[i]);
          var src = nodeList[i].getAttribute("image");
          var text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
          if (!src) src = defaultFavicon;
          out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>');
        }
      }
    }
  }
  var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  fp.init(window, "", fp.modeSave);
  fp.defaultString = aDate() + ".htm";
  fp.appendFilters(fp.filterHTML);
  fp.appendFilters(fp.filterAll);
  if (fp.show() == fp.returnCancel) return;
  var stream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  stream.init(fp.file, 0x02|0x08|0x20, parseInt("666", 8), 0);
  var data = document.getElementById(this.id).getAttribute("Help").
    replace("<ol>", new Date() + "\n" + "<ol>" + "\n" + out.join("\n"));
  stream.write(data, data.length);
  stream.close();
  custombuttons.alertSlide("Кнопки", "сохранены");
}

this.archiveall = function() {
  var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  var out = new Array();
  out.push("<hr><strong>Active buttons</strong><hr>");
  var nodeList = document.getElementsByTagName("toolbarbutton");
  for (var i = 0; i < nodeList.length; i++) {
    if (nodeList[i].id.search("custombuttons-button") == 0) {
      var href = nodeList[i].URI;
      var src = nodeList[i].image;
      var text = nodeList[i].name;
      if (!src) src = defaultFavicon;
      out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>');
       
    }
  }
  
 out.push("<hr><strong>Not active buttons</strong><hr>");

  var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton");
  for (var i = 0; i < nodeList.length; i++) {
    if (nodeList[i].id.search("custombuttons-button") == 0 && document.getElementById(nodeList[i].id) == null) {
      var href = createURI(nodeList[i]);
      var src = nodeList[i].getAttribute("image");
      var text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || "";
      if (!src) src = defaultFavicon;
      out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>');
    }
  }
  var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  fp.init(window, "", fp.modeSave);
  fp.defaultString = aDate() + ".htm";
  fp.appendFilters(fp.filterHTML);
  fp.appendFilters(fp.filterAll);
  if (fp.show() == fp.returnCancel) return;
  var stream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  stream.init(fp.file, 0x02|0x08|0x20, parseInt("666", 8), 0);
  var data = document.getElementById(this.id).getAttribute("Help").
    replace("<ol>", new Date() + "\n" + "<ol>" + "\n" + out.join("\n"));
  stream.write(data, data.length);
  stream.close();
  custombuttons.alertSlide("Все кнопки", "сохранены");
}

function readFile(file) {
  var data = "";
  var fstream = Cc["@mozilla.org/network/file-input-stream;1"].
                createInstance(Ci.nsIFileInputStream);
  fstream.init(file, -1, 0, 0);
  var charset = "UTF-8";
  const replacementChar = Ci.nsIConverterInputStream
                            .DEFAULT_REPLACEMENT_CHARACTER;
  var is = Cc["@mozilla.org/intl/converter-input-stream;1"].
           createInstance(Ci.nsIConverterInputStream);
  is.init(fstream, charset, 1024, replacementChar);
  var str = {};
  while (is.readString(4096, str) != 0) {
    data += str.value;
  }
  is.close();
  return data;
}

function stringToDOM(aString) {
// https://developer.mozilla.org/en/Parsing_and_serializing_XML
  var parser = new DOMParser();
  var dom = parser.parseFromString(aString, "text/xml");
  if (dom.documentElement.nodeName == "parsererror") {
    return null;
  } else {
    return dom;
  }
}

function getCBOverlay() {
  var dirsvc = Cc["@mozilla.org/file/directory_service;1"].
               getService(Ci.nsIProperties);
  var file = dirsvc.get("ProfD", Ci.nsIFile);
  file.append("custombuttons");
  file.append("backup");
  file.append("buttonsoverlay.xul.bak");
  return file;
}
this.viewCBOverlay = function viewCBOverlay() {
  var fileURL = Cc["@mozilla.org/network/io-service;1"].
                getService(Ci.nsIIOService).getProtocolHandler("file").
                QueryInterface(Ci.nsIFileProtocolHandler).
                getURLSpecFromFile(getCBOverlay());
  gBrowser.selectedTab = gBrowser.addTab("view-source:" + fileURL);
}

function importXMLtoButton(aStrXMLData) { loadURI("custombutton://" + escape(aStrXMLData));  }

this.importFromCBOverlay = function importFromCBOverlay(aTitle) {
  var id = custombuttons.promptBox(aTitle, "Введитете номер id кнопки:");
  if (!id[1] || id[1] == "") return;
  id = "custombuttons-button" + id[1];
  var dom = stringToDOM(readFile(getCBOverlay()));
  var button = dom.getElementById(id);
  if (!button) {
    custombuttons.alertBox(aTitle, "Копка Id " + id + " не найдена!");
    return;
  }
  var cbName = button.getAttribute("cb-name") ||
               button.getAttribute("label");
  var cbImage = button.getAttribute("image") ||
                button.getAttribute("cb-stdicon") || "";
  var cbMode = button.getAttribute("mode") || "";
  var cbInitCode = button.getAttribute("cb-init");
  var cbCode = button.getAttribute("cb-oncommand");
  var cbKey = button.getAttribute("accelkey") || "";
  var cbHelp = button.getAttribute("Help") || "";
  var cbAttr = button.getAttribute("attributes");
  var cbXML = <custombutton xmlns:cb={cbNamespace}>
                <name>{cbName}</name>
                <image>{cbImage}</image>
                <mode>{cbMode}</mode>
                <initcode>{cbInitCode}</initcode>
                <code>{cbCode}</code>
                <accelkey>{cbKey}</accelkey>
                <help>{cbHelp}</help>
                <attributes>{cbAttr}</attributes>
              </custombutton>;
  var xml = "<?xml version='1.0' encoding='UTF-8'?>" + cbXML.toString();
  //inspectDOMDocument(stringToDOM(xml));
  importXMLtoButton(xml);
}
this.setAttribute("onclick", "custombuttons.gQuot.mHandler(event, this)");

Отсутствует

 

№444023-07-2012 01:00:43

SendAbuse
Участник
 
Группа: Members
Зарегистрирован: 08-03-2012
Сообщений: 113
UA: Firefox 11.0

Re: Custom Buttons

okkamas_knife пишет

может предусмотреть какимто образом вставку сепаратора?

Я тут подумал, и если делать просто, прямо в лоб, то можешь так:

Нужно вставить нижепоследущий код. Варианты:

1.  Если хочешь видеть этот пункт первым, то вставляй после
     этой строки:    button.appendChild(menupopup);

2.  Если хочешь видеть этот пункт последним, то вставляй до
     этой строки:    return button; }

P.S. Насчет названия пункта меню - это добрая шутка, не обижайся, сам придумай :)

vZXR5cw

Выделить код

Код:

var  menuitem = document.createElementNS(kXULNS, "menuitem");
       menuitem.setAttribute("label", "С Е П А Р А Т О Р");
  var  separatorString = theSeparator.substring(1, theSeparator.length);
       menuitem.insertText = separatorString;

       menuitem.inserter = function inserter(aText) { 

          place.value = part1 + aText + part2;
          place.selectionStart = place.selectionEnd = startPos + aText.length;
          place.focus(); }

 var  commandString = "inserter(event.target.insertText)";
       menuitem.setAttribute("oncommand", commandString);
       menupopup.appendChild(menuitem);

Отсутствует

 

№444123-07-2012 12:08:50

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 17.0

Re: Custom Buttons

bunda1
Autocopy+3 на [nightly] перестала копировать даже двойным кликом.

Отсутствует

 

№444223-07-2012 19:42:13

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

Re: Custom Buttons

voqabuhe пишет

Autocopy+3 на [nightly] перестала копировать даже двойным кликом.

Проверил Autocopy+3 на nightly (FF 17.0a1) и у меня все работает
Ты используешь последнюю версию Autocopy+3
В настройках кнопки все нужные функции включены ?
Что показывает консоль ошибок ?

Отсутствует

 

№444323-07-2012 21:19:27

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 17.0

Re: Custom Buttons

bunda1 пишет

Проверил Autocopy+3 на nightly (FF 17.0a1) и у меня все работает
Ты используешь последнюю версию Autocopy+3 ?
В настройках кнопки все нужные функции включены ?
Что показывает консоль ошибок ?

Обновил кнопку, копирование по двойному клику заработало. Возможно при переезде на новый профиль действительно восстановил из резервной копии не последнюю версию кнопки. А вот копировать выделением всё равно не хочет. Консоль ошибок молчит

Отсутствует

 

№444423-07-2012 22:44:54

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

Re: Custom Buttons

Andrey_Krropotkin пишет

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

Я бы добавил поиск выделенного текста.

Выделить код

Код:

// Вызвать окно поиска по текущему сайту по правому клику на  searchbar-engine-button ...............

// настройка функций кликов мыши ...................................................
var searchwindows = function(event) {
    
        // правым кликом на кнопке ....
        if ( event.button == 2) {
            
            // отключать реакцию по умолчанию
            event.preventDefault(); 
            event.stopPropagation();
       
            // создаем модальное окно для ввода текста ....
            var URL = custombuttons.promptBox('Поиск по сайту', 'Bведите текст ....', '');
            var text = ([URL[1]].toString().length >0)? [URL[1]]: false;
            if (text == false) return;

            // поиск вашего текста по сайту .... 
            text = escape (convertFromUnicode ("UTF-8", text));
            var host = gBrowser.currentURI.host;
            url = encodeURIComponent (host);
            var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
            gBrowser.selectedTab = gBrowser.addTab(searchUrl);
            // gBrowser.loadOneTab(searchUrl, null, null, null, true, false);   
            }
};   

            
// объявляем 'searchbar', 'searchButton' ....
var searchbar = document.getElementById("searchbar");
var searchButton = document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-engine-button");

// удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    searchButton.removeEventListener("click", searchwindows, false);
};
        
// добавляем обработчик для кнопки поиска ..........
searchButton.addEventListener("click", searchwindows, false);
Andrey_Krropotkin пишет

Также собрал (если кому интересно) с разных форумов в одну кнопку вариант расширения контекстного меню кнопок (лишнее можно выкинуть).

За это спасибо.

Отредактировано bunda1 (23-07-2012 23:21:27)

Отсутствует

 

№444523-07-2012 23:46:53

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

Re: Custom Buttons

bunda1 спасибо. Все работает отлично.

Отсутствует

 

№444625-07-2012 01:52:49

SendAbuse
Участник
 
Группа: Members
Зарегистрирован: 08-03-2012
Сообщений: 113
UA: Firefox 11.0

Re: Custom Buttons

Если ещё актуально, то вот новый, переосмысленный вариант
кнопки "или Вставить" для Stylish.

Изменения:

1.  Теперь не "двоится", не плодит дубликаты (надеюсь...)

2.  Для снятия ограничений по длине и количеству строк
     и, имхо, для удобства и наглядности
     пользовательские настройки перенесены на вкладку "Справка (H)".
     Принцип использования изложен здесь
     Напомню, сепаратор можно изменить в коде кнопки,
     главное, чтобы он был уникален.

3.  id CustomButton кнопки и id кнопки "или Вставить" ею создаваемой
     теперь связаны общим номером.
     Зачем: Вдруг  кому-то понадобится в окошке Stylish вторая (третья,...)
                 кнопка "или Вставить" с другими пунктами и вставками.
                 Достаточно клонировать сабж и перезаполнить
                 вкладку Справка новыми пунктами.

Всем заинтересованным просьба оценить, достойна ли кнопка называться Готовой.
( UPD: Нет, эту не берите, "правильная" - далее, на следующей странице ! )

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EorPaste%20for%20Stylish%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20theSeparator%20%3D%20%22%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%22%3B%0A%20%20%20%20theSeparator%20%3D%20%22%5Cn%22%20+%20theSeparator%20+%20%22%5Cn%22%3B%0A%0Avar%20items%20%3D%20this.Help.split%28theSeparator%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Athis.imageOn%20%20%3D%20%22data%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%22%3B%0A%0Athis.imageOff%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.image%20%3D%20this.imageOn%3B%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20cbIdNumber%20%3D%20this.id.replace%28%22custombuttons-button%22%2C%20%22%22%29%3B%0Avar%20insertButtonId%20%3D%20%22or-paste-by-cb%22%20+%20cbIdNumber%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20prefs%20%3D%20Components.classes%5B%22@mozilla.org/preferences-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIPrefService%29%0A%20%20%20%20%20%20%20%20%20%20%20%20.getBranch%28%22custombutton.orPasteForStylish.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Afunction%20createButton%28aWindow%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20insertButtonId%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0438%u043B%u0438%20%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%22%29%3B%0A%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%20%20%20%20%20%0A%20%20%20%20%20aWindow.textStorage%20%3D%20%5B%5D%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i++%29%20%7B%0A%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%0A%20%20var%20%20%20%20%20%20label%20%3D%20items%5Bi%5D.split%28%22%5Cn%22%2C1%29%3B%0A%20%20var%20insertText%20%3D%20items%5Bi%5D.replace%28label%20+%20%22%5Cn%22%2C%20%22%22%29%3B%0A%20%20%0A%20%20%20%20%20%20%20aWindow.textStorage.push%28insertText%29%20%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20label%29%3B%0A%0A%0A%20%20var%20%20Arg%20%3D%20%22this.ownerDocument.defaultView.textStorage%5B%22%20+%20i%20+%20%22%5D%22%3B%0A%20%20var%20%20commandString%20%3D%20%22insertCodeAtCaret%28%22%20+%20Arg%20+%20%22%29%22%3B%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%20%7D%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20return%20button%3B%20%7D%0A%20%20%20%20%20%20%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Afunction%20isButtonAlredyPresent%28aDoc%29%20%7B%20//%20advice%20by%20Inforcatcher%0A%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%21%21aDoc.getElementById%28insertButtonId%29%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20return%3B%0A%0A%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%0A%20%20%20%20if%20%28%21isButtonAlredyPresent%28doc%29%29%20%7B%0A%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%20%7D%7D%7D%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7B%20if%20%28%20isButtonAlredyPresent%28doc%29%29%20%20continue%3B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28this.off%29%20%20%7B%20var%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20%28b%29%20%7B%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%20this.image%20%3D%20this.imageOff%3B%20return%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%20//%20thanks%20for%20Infocatcher%2C%20again%0A%20%20%20%20var%20on%20%3D%20%21this.off%3B%0A%20%20%20%20if%28on%29%20this.off%20%3D%20true%3B%0A%20%20%20%20this.run%28%29%3B%0A%20%20%20%20if%28on%29%20%7B%20this.off%20%3D%20false%3B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%28%21this.off%29%20this.image%20%3D%20this.imageOn%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20this.imageOff%3B%0A%0Athis.run%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%21important%3B%0A%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Adisplay%3A%20none%20%21important%3B%0Adisplay%3A%20none%20%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Awidth%3A%20%0Awidth%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Afont-weight%3A%20%0Afont-weight%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0AREAD%20ME%20%21%21%21%0A%0A%u042D%u0442%u043E%20%u043F%u0440%u0438%u043C%u0435%u0440%20%u041C%u043D%u043E%u0433%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%20%u0438%20%u0414%u043B%u0438%u043D%u043D%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%0A%u043F%u043E%u0441%u043B%u0435%20%u043F%u0440%u043E%u0447%u0442%u0435%u043D%u0438%u044F%2C%20%u0438%u0441%u043F%u044B%u0442%u0430%u043D%u0438%u044F%20%u0438%20%u043E%u0441%u043E%u0437%u043D%u0430%u043D%u0438%u044F%20-%20%u0443%u0434%u0430%u043B%u0438%u0442%u0435%20%u0435%u0433%u043E%0A%28%u0430%20%u043F%u043E%u0441%u043A%u043E%u043B%u044C%u043A%u0443%20%u044D%u0442%u043E%20%u043F%u043E%u0441%u043B%u0435%u0434%u043D%u0438%u0439%20%u043F%u0443%u043D%u043A%u0442%2C%20%u0442%u043E%20%u0438%20%u0441%u0435%u043F%u0430%u0440%u0430%u0442%u043E%u0440%20%u043F%u0435%u0440%u0435%u0434%20%u043D%u0438%u043C%29%0A%0A%u041D%u0443%20%u0441%u0442%u0440%u043E%u043A%2C%20%u043A%u0430%u043A%20%u0412%u044B%20%u0432%u0438%u0434%u0438%u0442%u0435%20%u043C%u043D%u043E%u0433%u043E%2C%20%u0430%20%u0432%u043E%u0442%20%u0438%20%u0434%u043B%u0438%u043D%u043D%u0430%u044F%20%u0441%u0442%u0440%u043E%u043A%u0430%3A%0A%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%28%u044D%u0442%u043E%2C%20%u043A%u0441%u0442%u0430%u0442%u0438%2C%20%u0441%u0442%u0430%u0440%u0430%u044F%20%u0438%u043A%u043E%u043D%u043A%u0430%2C%20%u0431%u0435%u0437%20%u0434%u0443%u0440%u0430%u0446%u043A%u043E%u0439%20gif-%u0430%u043D%u0438%u043C%u0430%u0446%u0438%u0438.%0A%20%u0442%u043E%u0447%u043A%u0430%20%u0441%20%u0437%u0430%u043F%u044F%u0442%u043E%u0439%20%u0432%20%u043A%u043E%u043D%u0446%u0435%20%u0435%u0441%u0442%u044C.%29%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано SendAbuse (25-07-2012 08:21:27)

Отсутствует

 

№444725-07-2012 04:15:25

Alfina
Участник
 
Группа: Members
Зарегистрирован: 23-05-2010
Сообщений: 87
UA: Firefox 16.0

Re: Custom Buttons

SendAbuse пишет

Всем заинтересованным просьба оценить, достойна ли кнопка называться Готовой.

Всё отлично, кнопка не двоится. Редактировать пункты теперь удобно.
НО! Заметила такой косяк: при клонировании кнопки и создании в ней новых пунктов меню, выбираю пункт из новой кнопки, а вставляется тот, который в первой кнопке.

Вот так это выглядит:

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

Отредактировано Alfina (25-07-2012 04:54:47)

Отсутствует

 

№444825-07-2012 08:00:29

SendAbuse
Участник
 
Группа: Members
Зарегистрирован: 08-03-2012
Сообщений: 113
UA: Firefox 11.0

Re: Custom Buttons

Alfina пишет

выбираю пункт из новой кнопки, а вставляется тот, который в первой кнопке.

Да, точно, виноват  :dumb:
Огромное спасибо за оперативный ответ.
Вот вроде исправил:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EorPaste%20for%20Stylish%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20theSeparator%20%3D%20%22%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%22%3B%0A%20%20%20%20theSeparator%20%3D%20%22%5Cn%22%20+%20theSeparator%20+%20%22%5Cn%22%3B%0A%0Avar%20items%20%3D%20this.Help.split%28theSeparator%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Athis.imageOn%20%20%3D%20%22data%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%22%3B%0A%0Athis.imageOff%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.image%20%3D%20this.imageOn%3B%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20cbIdNumber%20%3D%20this.id.replace%28%22custombuttons-button%22%2C%20%22%22%29%3B%0Avar%20insertButtonId%20%3D%20%22or-paste-by-cb%22%20+%20cbIdNumber%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20prefs%20%3D%20Components.classes%5B%22@mozilla.org/preferences-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIPrefService%29%0A%20%20%20%20%20%20%20%20%20%20%20%20.getBranch%28%22custombutton.orPasteForStylish.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Afunction%20createButton%28aWindow%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20insertButtonId%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0438%u043B%u0438%20%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%22%29%3B%0A%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%20%20%20%20%20%0Avar%20%20str%20%3D%20%22aWindow.textStorage%22%20+%20cbIdNumber%20+%20%20%22%20%3D%20%5B%5D%3B%22%3B%0A%20%20%20%20%20eval%28str%29%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i++%29%20%7B%0A%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%0A%20%20var%20%20%20%20%20%20label%20%3D%20items%5Bi%5D.split%28%22%5Cn%22%2C1%29%3B%0A%20%20var%20insertText%20%3D%20items%5Bi%5D.replace%28label%20+%20%22%5Cn%22%2C%20%22%22%29%3B%0A%20%20%0A%20%20%20%20%20%20%20str%20%3D%20%22aWindow.textStorage%22%20+%20cbIdNumber%20+%20%22.push%28insertText%29%22%3B%0A%20%20%20%20%20%20%20eval%28str%29%3B%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20label%29%3B%0A%0A%0A%20%20var%20%20Arg%20%3D%20%22this.ownerDocument.defaultView%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%22.textStorage%22%20+%20cbIdNumber%20+%20%22%5B%22%20+%20i%20+%20%22%5D%22%3B%0A%20%20var%20%20commandString%20%3D%20%22insertCodeAtCaret%28%22%20+%20Arg%20+%20%22%29%22%3B%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%20%7D%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20return%20button%3B%20%7D%0A%20%20%20%20%20%20%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Afunction%20isButtonAlredyPresent%28aDoc%29%20%7B%20//%20advice%20by%20Inforcatcher%0A%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%21%21aDoc.getElementById%28insertButtonId%29%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20return%3B%0A%0A%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%0A%20%20%20%20if%20%28%21isButtonAlredyPresent%28doc%29%29%20%7B%0A%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%20%7D%7D%7D%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7B%20if%20%28%20isButtonAlredyPresent%28doc%29%29%20%20continue%3B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28this.off%29%20%20%7B%20var%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20%28b%29%20%7B%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%20this.image%20%3D%20this.imageOff%3B%20return%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%20//%20thanks%20for%20Infocatcher%2C%20again%0A%20%20%20%20var%20on%20%3D%20%21this.off%3B%0A%20%20%20%20if%28on%29%20this.off%20%3D%20true%3B%0A%20%20%20%20this.run%28%29%3B%0A%20%20%20%20if%28on%29%20%7B%20this.off%20%3D%20false%3B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%28%21this.off%29%20this.image%20%3D%20this.imageOn%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20this.imageOff%3B%0A%0Athis.run%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%21important%3B%0A%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Adisplay%3A%20none%20%21important%3B%0Adisplay%3A%20none%20%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Awidth%3A%20%0Awidth%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Afont-weight%3A%20%0Afont-weight%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0AREAD%20ME%20%21%21%21%0A%0A%u042D%u0442%u043E%20%u043F%u0440%u0438%u043C%u0435%u0440%20%u041C%u043D%u043E%u0433%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%20%u0438%20%u0414%u043B%u0438%u043D%u043D%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%0A%u043F%u043E%u0441%u043B%u0435%20%u043F%u0440%u043E%u0447%u0442%u0435%u043D%u0438%u044F%2C%20%u0438%u0441%u043F%u044B%u0442%u0430%u043D%u0438%u044F%20%u0438%20%u043E%u0441%u043E%u0437%u043D%u0430%u043D%u0438%u044F%20-%20%u0443%u0434%u0430%u043B%u0438%u0442%u0435%20%u0435%u0433%u043E%0A%28%u0430%20%u043F%u043E%u0441%u043A%u043E%u043B%u044C%u043A%u0443%20%u044D%u0442%u043E%20%u043F%u043E%u0441%u043B%u0435%u0434%u043D%u0438%u0439%20%u043F%u0443%u043D%u043A%u0442%2C%20%u0442%u043E%20%u0438%20%u0441%u0435%u043F%u0430%u0440%u0430%u0442%u043E%u0440%20%u043F%u0435%u0440%u0435%u0434%20%u043D%u0438%u043C%29%0A%0A%u041D%u0443%20%u0441%u0442%u0440%u043E%u043A%2C%20%u043A%u0430%u043A%20%u0412%u044B%20%u0432%u0438%u0434%u0438%u0442%u0435%20%u043C%u043D%u043E%u0433%u043E%2C%20%u0430%20%u0432%u043E%u0442%20%u0438%20%u0434%u043B%u0438%u043D%u043D%u0430%u044F%20%u0441%u0442%u0440%u043E%u043A%u0430%3A%0A%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%28%u044D%u0442%u043E%2C%20%u043A%u0441%u0442%u0430%u0442%u0438%2C%20%u0441%u0442%u0430%u0440%u0430%u044F%20%u0438%u043A%u043E%u043D%u043A%u0430%2C%20%u0431%u0435%u0437%20%u0434%u0443%u0440%u0430%u0446%u043A%u043E%u0439%20gif-%u0430%u043D%u0438%u043C%u0430%u0446%u0438%u0438.%0A%20%u0442%u043E%u0447%u043A%u0430%20%u0441%20%u0437%u0430%u043F%u044F%u0442%u043E%u0439%20%u0432%20%u043A%u043E%u043D%u0446%u0435%20%u0435%u0441%u0442%u044C.%29%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№444925-07-2012 15:52:17

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 14.0

Re: Custom Buttons

SendAbuse пишет

Вот вроде исправил:

Выделить код

Код:

var  str = "aWindow.textStorage" + cbIdNumber +  " = [];";
     eval(str);

=>

Выделить код

Код:

aWindow["textStorage" + cbIdNumber] = [];

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№445025-07-2012 20:08:48

SendAbuse
Участник
 
Группа: Members
Зарегистрирован: 08-03-2012
Сообщений: 113
UA: Firefox 11.0

Re: Custom Buttons

Infocatcher, :D , исправил только кнопку, а не свою голову :dumb: :lol:
Ты прав как всегда, теперь вижу какую бяку написал :usch:
но ведь будет работать и так :rolleyes:
или это реально чем-то опасно ? :whistle:

Отсутствует

 

Board footer

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