razoo, не удобней ли использовать Locationbar² для перехода по уровням? И кнопки нет, и можно одним кликом на любой уровень перейти
Есть кнопка "Добавить страницу в закладки | Управление закладками" (ЛКМ - добавить в закладки, СКМ - открыть вкладку "Собранное", ПКМ - открыть окно "Собранное") в 2-х вариантах:
1:
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%0D%0A%20%20%3Cname%3E%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0443%20%u0432%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438%20%7C%20%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0430%u043C%u0438%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%3D%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.leftclick%20%20%20%3D%20function%28evt%29%7B%0A%09%20%20%20%20PlacesCommandHook.bookmarkCurrentPage%28true%2C%20PlacesUtils.bookmarksMenuFolderId%29%3B%0A%7D%0A%0Athis.midclick%20%20%3D%20function%28evt%29%7B%0A%20%20%20%20%20%20%20%20getBrowser%20%28%29.%20addTab%20%28%22chrome%3A//browser/content/places/places.xul%22%29%3B%0A%7D%0A%0Athis.rightclick%20%20%20%3D%20function%28evt%29%7B%0A%09PlacesCommandHook.showPlacesOrganizer%28%27AllBookmarks%27%29%3B%0A%7D%0A%0A//%20%u041E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%20gQuot%20%u0434%u0435%u043B%u0430%u0435%u0442%20%u0437%u0430%u0434%u0435%u0440%u0436%u043A%u0443%20%u0432%20%7E350%20%u043C%u0441.%0A//%20%u042D%u0442%u043E%20%u043E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%20%u0437%u0430%u0434%u0435%u0440%u0436%u043A%u0443%20%u0434%u043B%u044F%20%u0432%u043E%u043E%u0431%u0449%u0435%20%u0432%u0441%u0435%u0445%20%u043A%u043D%u043E%u043F%u043E%u043A%2C%20%u0438%u0441%u043F%u043E%u043B%u044C%u0437%u0443%u044E%u0449%u0438%u0445%20gQuot%3A%0A//%20custombuttons.%20gQuot.%20dcDelay%20%3D%200%3B%0A//%20this.setAttribute%28%27onclick%27%2C%20%27gQuot%28event%2C%20this%29%27%29%3B%0A%0A//%20%u0415%u0441%u043B%u0438%20%u0436%u0435%20%u043D%u0430%u0434%u043E%20%u0438%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u0437%u0430%u0434%u0435%u0440%u0436%u043A%u0443%20%u0434%u043B%u044F%20%u043E%u0442%u0434%u0435%u043B%u044C%u043D%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u043C%u043E%u0436%u043D%u043E%20%u043D%u0430%u043F%u0438%u0441%u0430%u0442%u044C%0Athis.%20gQuot%20%3D%20%7B%7D%3B%0Athis.%20gQuot.%20__proto__%20%3D%20custombuttons.%20gQuot%3B%0Athis.%20gQuot.%20dcDelay%20%3D%200%3B%0Athis.%20setAttribute%20%28%27onclick%27%2C%20%27this.gQuot.mHandler%28event%2C%20this%29%27%29%3B%0A%0A//%20this.style.opacity%20%3D%20%27.65%27%3B%0A//%20this.setAttribute%28%27onmouseover%27%2C%20%27custombuttons.ButtonBrt%28event%29%3B%27%20%29%3B%0A//%20this.setAttribute%28%27onmouseout%27%2C%20%27custombuttons.ButtonDim%28event%29%3B%27%20%29%3B%0A%0A//this.tooltipText%20+%3D%20%27%5Cn%20%u041B%u041A%u041C%3A%20%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0443%20%5Cn%20%u0421%u041A%u041C%3A%20%u0417%u0430%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u0431%u043E%u043A%u043E%u0432%u043E%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%20%5Cn%20%u041F%u041A%u041C%3A%20%u041C%u0435%u043D%u0435%u0434%u0436%u0435%u0440%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%27%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%0A//%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
2:
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%0D%0A%20%20%3Cname%3E%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0443%20%u0432%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438%20%7C%20%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0430%u043C%u0438%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%3D%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.url2xul%3D%20%27chrome%3A//browser/content/places/places.xul%27%3B%0Athis.onClick%3D%20function%28e%29%0A%7B%0A%09switch%20%28e.button%29%0A%09%7B%0A%09%09case%200%3A%20%0A%09%09%09PlacesCommandHook.bookmarkCurrentPage%28true%2C%20PlacesUtils.bookmarksMenuFolderId%29%3B%0A%09%09%09break%3B%0A%09%09case%201%3A%20%0A%09%09%7B%0A%09%09%09var%20t%3D%20gBrowser.mTabs%3B%0A%09%09%09var%20current%3D%20content.document.location.href%3B%0A%09%09%09var%20i%3D%20t.length%3B%0A%09%09%09if%20%28current%3D%3Dthis.url2xul%29%20gBrowser.removeCurrentTab%28%29%3B%20%0A%09%09%09else%20while%20%28true%29%0A%09%09%09%7B%0A%09%09%09%09if%20%28--i%3C0%29%20%0A%09%09%09%09%7B%0A%09%09%09%09%09if%20%28current%3D%3D%27about%3Ablank%27%29%20//%20replace%20blank%20tab%0A%09%09%09%09%09%09loadURI%28this.url2xul%29%3B%0A%09%09%09%09%09else%20//%20add%20new%20tab%20%0A%09%09%09%09%09%09gBrowser.selectedTab%3D%20gBrowser.addTab%28this.url2xul%29%3B%20%0A%09%09%09%09%09break%3B%0A%09%09%09%09%7D%3B%0A%09%09%09%09if%20%28t%5Bi%5D.linkedBrowser.currentURI.spec%3D%3Dthis.url2xul%29%20//%20popup%20loaded%0A%09%09%09%09%7B%0A%09%09%09%09%09gBrowser.selectedTab%3D%20gBrowser.tabContainer.childNodes%5Bi%5D%3B%20%0A%09%09%09%09%09break%3B%0A%09%09%09%09%7D%3B%0A%09%09%09%7D%3B%0A%09%09%7D%3B%20break%3B%0A%09%09case%202%3A%20%0A%09%09%09PlacesCommandHook.showPlacesOrganizer%28%27AllBookmarks%27%29%3B%0A%09%09%09break%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%0A%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
1-й - исправно работают клики всеми 3-мя кнопками мыши, но не нравится что по среднему клику вкладка открывается в фоне и при повторном среднем клике не закрывается (как во 2-м варианте), а открывается ещё одна вкладка.
2-й - вроде бы всё работает как надо, но правый клик кроме окна выкидывает и сворачивает меню кнопки, причем с шифтом происходит то же самое. Активировать меню кнопки возможно лишь при повторном правом клике с шифтом.
нельзя ли подправить код какого-либо из вариантов?
Отредактировано 3Jlou (05-08-2009 11:02:07)
Отсутствует
не удобней ли использовать Locationbar² для перехода по уровням?
:)
Да, я сразу подумал, что кто-нибудь мне обязательно посоветует. Ты выиграл. :)
Если серьезно, я его тоже использую (на кусочке скрина сверху даже видно уголок адресной строки, она у меня под табами).
Но Locationbar не дает «дополнительной плоскости навигации» в пределах таба, а кнопка с дропмаркером - дает.
К тому же, удобство - это иногда еще и слабость к собственным привычкам.
А я привык жамкать по кнопке.
В любом случае, спасибо
Отсутствует
Есть расширение https://lastpass.com/
Создал кнопку
Открывает сайты в LastPass в сайдбаре , но проблема в том что все treeitem-ы этого сайдбара имеют аттрибут "true" *(то есть открытые , растянутые ) а нужно "false", как сделать ?
Отредактировано vurdalak (05-08-2009 16:02:33)
Отсутствует
Подскажите как сделать часы другого цвета?
Отсутствует
razoo
Только тут скорее мой косяк: кнопка обрабатывает правильно и если нажать на саму кнопку то GoUp будет, но поскольку вариант для «вверх» у него только один – он не указывает его в меню дропмаркера. А я клацал по меню - видел, что оно пусто - и переходил на другой таб. Причем, маленький пустой квадратик, который бывает когда нет пунктов в меню - малозаметен, но пока он не закроется – я не могу перескочить на другой таб – при «скоростном кликаньи бывалого серфера» возникает «ложный эффект легкого подвисания».
Чтобы не отображалось пустое меню, в разделе "Инициализация" существующей кнопки надо заменить функцию getPaths:
this. getPaths = function (event) { var url = getBrowser (). contentDocument. location. href; url = url. match (/^([a-zA-Z]+:\/\/\/?)?([^\/]+)\/([^?]*)?(.*)$/); var domain = ""; var levels = ""; if (url) { domain = url [1] + url [2] + "/"; var path = url [3] && url [3]. split ("/") || ""; var levels = []; var curpath = ""; for (var i = 0; i < path. length; i++) { if (path [i]) { curpath = curpath + path [i] + "/"; levels. push (domain + curpath); } } levels. pop (); } if (!levels) { THIS. disabled = true; if (disabledImg) THIS. image = disabledImg; } else { THIS. disabled = false; if (enabledImg) THIS. image = enabledImg; } if (levels. length != 0) THIS. type = "menu-button"; else THIS. type = ""; return levels || []; };
в Uppity есть еще така фича:
Попробовал сделать
"Код":
"Инициализация":
var enabledImg = ""; var disabledImg = ""; var THIS = this; var id = this. id; this. clickHandler = function (event) { if (event. button == 2) return; if (event. originalTarget. nodeName == "toolbarbutton") return; else if (event. originalTarget. nodeName == "menuitem") this. uriToLoad = event. originalTarget. getAttribute ("label"); }; this. getPaths = function (event) { var url = getBrowser (). contentDocument. location. href; var hurl = getBrowser (). mCurrentTab [id] || ""; if ((hurl. indexOf (url) == 0) && (url. length < hurl. length)) url = hurl; getBrowser (). mCurrentTab [id] = url; url = makeURI (url); if (url. schemeIs ("about")) return []; var host = url. prePath + "/"; var curpath = host; var path = url. path. split ("/"); var paths = []; for (var i = 0; i < path. length; i++) { if (path [i]) { curpath += path [i] + "/"; paths. push (curpath); } } if (!url. host && (paths. length != 0)) host = paths. shift (); paths. unshift (host); THIS. host = host; if (paths. length == 0) { THIS. disabled = true; if (disabledImg) THIS. image = disabledImg; } else { THIS. disabled = false; if (enabledImg) THIS. image = enabledImg; } if (paths. length != 0) THIS. type = "menu-button"; else THIS. type = ""; return paths; }; this. createMenu = function (event) { if (event && (event. originalTarget. nodeName != "toolbarbutton")) return; var paths = this. getPaths (event); var menu = this. getElementsByTagName ("menupopup") [0]; if (menu) this. removeChild (menu); menu = ""; menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/> var menuitem; for (var i = 0; i < paths. length; i++) { menuitem = <menuitem label={paths [i]} tooltiptext={paths [i]}/> if ((paths [i] == getBrowser (). contentDocument. location. href) || (paths [i] == getBrowser (). contentDocument. location. href + "/")) { menuitem.@checked = "true"; menuitem.@type = "checkbox"; } menu.menuitem[i] = menuitem; } menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement; this. appendChild (menu); }; this. loadURL = function () { loadURI (this. uriToLoad || this. host); this. uriToLoad = ""; }; this. onUnload = function (event) { window. removeEventListener ("focus", THIS. getPaths, true); window. removeEventListener ("unload", THIS. onUnload, false); }; this. destroy = function () { this. onUnload (null); }; window. addEventListener ("focus", this. getPaths, true); window. addEventListener ("unload", this. getPaths, false); this. createMenu (null); this. setAttribute ("onclick", "this.clickHandler(event)"); this. setAttribute ("onmouseover", "this.createMenu(event,getBrowser().contentDocument.location.href)"); this. orient = "horizontal";
В разделе "Инициализация" в первых двух строках можно указать url для разрешенного/запрещенного состояний кнопки.
Добавлено 05-08-2009 18:21:52
3Jlou
Кнопка № 2, раздел "Инициализация" (целиком):
this.url2xul= 'chrome://browser/content/places/places.xul'; this.onClick= function(e) { switch (e.button) { case 0: PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId); break; case 1: { var t= gBrowser.mTabs; var current= content.document.location.href; var i= t.length; if (current==this.url2xul) gBrowser.removeCurrentTab(); else while (true) { if (--i<0) { if (current=='about:blank') // replace blank tab loadURI(this.url2xul); else // add new tab gBrowser.selectedTab= gBrowser.addTab(this.url2xul); break; }; if (t[i].linkedBrowser.currentURI.spec==this.url2xul) // popup loaded { gBrowser.selectedTab= gBrowser.tabContainer.childNodes[i]; break; }; }; }; break; case 2: if (e. shiftKey) return; e. preventDefault (); PlacesCommandHook.showPlacesOrganizer('AllBookmarks'); break; }; }; this.setAttribute('onclick','this.onClick(event);');
Добавлено 05-08-2009 18:26:22
vurdalak
Открывает сайты в LastPass в сайдбаре , но проблема в том что все treeitem-ы этого сайдбара имеют аттрибут "true" *(то есть открытые , растянутые ) а нужно "false", как сделать ?
И рад бы помочь, но не могу.
Atilla7777
Подскажите как сделать часы другого цвета?
Цвет тех часов изменить невозможно в принципе - они используют xbm-картинки, а они двухцветные.
ps. Вот здесь: http://custombuttons.mozdev.org/drupal/content/help-with-buttons-please#comment-48 под ссылкой "Digital Clock" есть часы, цвет которых можно менять. В разделе "Инициализация" в строки
displayColor: "black", displayBackground: "white", canvasBackground: "white", displayBorderColor: "black",
надо прописать нужные цвета, например
Отредактировано Anton (05-08-2009 18:48:45)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
vurdalak
Если и штатными средствами сайдбар открывается с развёрнутыми элементами дерева, то лучше, я думаю, совсем не "копать".
А так - не знаю, у меня сайдбар этот вообще не открывается. Открывается и тут же сам закрывается.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Если и штатными средствами сайдбар открывается с развёрнутыми элементами дерева, то лучше, я думаю, совсем не "копать".
Штатными средствами, если речь идет об обычных сайдбарах (хистори или букмаркс), то там запоминаются настройки.
А так - не знаю, у меня сайдбар этот вообще не открывается. Открывается и тут же сам закрывается.
Нужно в настройках включить "Показать сайты на боковой панели"
Я думаю, можна как нибудь сделать java "коллапс " итемов сайдбара или назначение нового свойства элемента (ну не знаю, любое решение хотелось бы попробовать) после выполнения команды "toggleSidebar('viewSidebar');"
Отсутствует
Штатными средствами, если речь идет об обычных сайдбарах (хистори или букмаркс), то там запоминаются настройки.
А если речь идет о сайдбаре lastpass ?
Как-то так:
toggleSidebar('viewSidebar'); var sb = document. getElementById ("sidebar"); var doc = sb. contentDocument; setTimeout ( function () { var sb = document. getElementById ("sidebar"); var doc = sb. contentDocument; var tree = doc. getElementById ("lastpass-tree"); if (!tree) return; var ti = tree. getElementsByTagName ("treeitem"); for (var i = 0; i < ti. length; i++) ti [i]. removeAttribute ("open"); }, 500 );
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Да ладно , если серьезно
В шутку я, в шутку.
P.S. Как вообще расширение то ?
Last Pass ? Не могу сказать ничего определённого, потому как постигнуть не в состоянии.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
vurdalak, я давно обратил на Lastpass внимание - удобно... но сливать свои пароли на сервак как то не решился, поэтому приходится обходиться без удобств
Отредактировано 3Jlou (05-08-2009 22:05:05)
Отсутствует
Anton, существенный недочет. Кнопка не обрабатывает субдомены.
Т.е ., например, если я нахожусь в галерее каконить художника по имени blablablart на Девианте, которая имеет адрес типа:
http://blablablart.DEVIANTART.com/gallery/#_featured--5 ,
то кнопка поднимет до уровня
http://blablablart.DEVIANTART.com/ ,
но не до http://DEVIANTART.com/
И было бы все-таки неплохо, чтобы дойдя до верхнего уровня картинка кнопки менялась.
Не нужно, чтобы кнопка деактивировалась, пускай пытается «карабкаться» дальше (все равно за пределами www жизни нет :)), главное, чтобы достижение верхнего уровня визуально обозначалось, и уход с него тоже.
А так отличная кнопка получилась – полная замена экстеншена.
Это же здорово, когда кнопкой можно заменить целое расширение.
Вот еще какой вопрос возник.
Что нужно добавить в код кнопки, открывающей определенный url, чтобы в случае, если такой таб уже открыт, она не открывала его повторно, а просто переходила к открытому?
(И к кнопкам, которые открывают в табах менеджеры закладок и скрапбука это тоже было бы логично применить.)
Отредактировано razoo (06-08-2009 12:51:46)
Отсутствует
Вот еще какой вопрос возник.Что нужно добавить в код кнопки, открывающей определенный url, чтобы в случае, если такой таб уже открыт, она не открывала его повторно, а просто переходила к открытому?(И к кнопкам, которые открывают в табах менеджеры закладок и скрапбука это тоже было бы логично применить.)
var urlToOpen = 'INSERT_YOUR_URL_HERE'; function openURI(url) { var tabs = gBrowser.tabContainer.childNodes; for (i=0; i<tabs.length; i++) { var tab = gBrowser. getBrowserForTab(tabs[i]); var location = tab.contentDocument.location.href; if (location == url) { gBrowser.selectedTab = tabs[i]; return false; } } gBrowser.selectedTab = gBrowser.addTab(url); return true; } openURI(urlToOpen);
ЗЫ: я тут только начал разбираться, так что буду рад, если гуру сего дела укажут на возможные ошибки/неточности
Отредактировано Dreyk (06-08-2009 15:35:31)
Отсутствует
Dreyk, кнопка полезная, спасибо. Тут же возникла мысль использовать кнопки открытия url'ов на всплывающих барах с помощью спец. кнопки, но в совокупности они не работают - вместо открытия (или перехода на открытую вкладу) выпадает меню кнопки.
Вот эта кнопка Popup Toolbar:
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%0D%0A%20%20%3Cname%3EPopup%20Toolbar%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAIAEBAAAAAAAABoAwAAJgAAACAgAAAAAAAAqAwAAI4DAAAoAAAAEAAAACAAAAABABgAAAAAAEADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8gzP//pRD//3Wg//8Z4P9/AAz/fwBs/38AC/9/ABL/fwAA/38n0P9/AAb/f//++A8AAf//AAH//yFw//8AACgAAAAgAAAAQAAAAAEAGAAAAAAAgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8/////P////z////8/////P////z////8/////P////z////8/////P////z////8/////P////z////8////AAP//wAD//////////////////////////////////////w%3D%3D%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20code*/%0A%0Avar%20popupToolbarName%20%3D%20%22%22%3B%0Avar%20popupToolbarId%20%3D%20%22%22%3B%0Avar%20popupId%20%3D%20%22%22%3B%0Avar%20contextPopupId%20%3D%20%22popuptoolbar-contextpopup%22%3B%0A%0Athis.type%20%3D%20%22menu%22%3B%0Athis._init%20%3D%20function%28%29%20%7B%0A%20%20popupToolbarName%20%3D%20this.label%3B%0A%20%20popupToolbarId%20%3D%20%22__customToolbar_%22%20+%20popupToolbarName.replace%28%22%20%22%2C%20%22_%22%29%3B%0A%20%20popupId%20%3D%20popupToolbarName.replace%28%22%20%22%2C%20%22%22%29.toLowerCase%28%29%20+%20%22-%22%20+%20this.type%20+%20%22popup%22%3B%0A%0A%20%20var%20popupToolbar%20%3D%20document.getElementById%28popupToolbarId%29%3B%0A%20%20if%20%28popupToolbar%29%20%7B%0A%20%20%20%20popupToolbar.setAttribute%28%22collapsed%22%2C%20%22true%22%29%3B%0A%20%20%20%20document.persist%28popupToolbarId%2C%20%22collapsed%22%29%3B%0A%20%20%7D%0A%0A%20%20var%20popup%20%3D%20document.getElementById%28popupId%29%3B%0A%20%20if%20%28popup%29%20%7B%0A%20%20%20%20popup.hidePopup%28%29%3B%0A%20%20%20%20popup.parentNode.removeChild%28popup%29%3B%0A%20%20%7D%0A%0A%20%20popup%20%3D%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%20%20popup.setAttribute%28%22id%22%2C%20popupId%29%3B%0A%20%20popup.setAttribute%28%22position%22%2C%20%22after_start%22%29%3B%0A%0A%20%20if%20%28this.type%20%3D%3D%20%22menu%22%29%20%7B%0A%20%20%20%20while%20%28this.firstChild%20%26%26%20this.firstChild.localName%20%3D%3D%20%22menupopup%22%29%20%7B%0A%20%20%20%20%20%20this.firstChild.hidePopup%28%29%3B%0A%20%20%20%20%20%20this.removeChild%28this.firstChild%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20this.appendChild%28popup%29%3B%0A%20%20%20%20popup.setAttribute%28%22onpopupshowing%22%2C%20%27this.parentNode.setPopup%28event%29%3B%27%29%3B%0A%20%20%7D%0A%20%20else%20%7B%0A%20%20%20%20popup.setAttribute%28%22onpopupshowing%22%2C%20%27document.popupNode.setPopup%28event%29%3B%27%29%3B%0A%20%20%7D%0A%0A%20%20popup.setAttribute%28%22onpopupshown%22%2C%20%27%7B%5C%0A%20%20%20%20window.addEventListener%28%22popuphidden%22%2C%20function%28e%29%20%7B%5C%0A%20%20%20%20%20%20var%20popup%20%3D%20document.getElementById%28popupId%29%3B%5C%0A%20%20%20%20%20%20if%20%28e.target%20%3D%3D%20popup%29%20%7B%5C%0A%20%20%20%20%20%20%20%20window.removeEventListener%28%22popuphidden%22%2C%20arguments.callee%2C%20false%29%3B%5C%0A%20%20%20%20%20%20%20%20return%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20var%20popupNode%20%3D%20document.popupNode%3B%5C%0A%20%20%20%20%20%20while%20%28popupNode%20%26%26%20popupNode%20%21%3D%20popup%29%20popupNode%20%3D%20popupNode.parentNode%3B%5C%0A%20%20%20%20%20%20if%20%28popupNode%20%3D%3D%20popup%29%20popup.hidePopup%28%29%3B%5C%0A%20%20%20%20%7D%2C%20false%29%3B%5C%0A%20%20%7D%27.replace%28%22popupId%22%2C%20%27%22%27%20+%20popupId%20+%20%27%22%27%29%29%3B%0A%0A%20%20popup.setAttribute%28%22onpopuphidden%22%2C%20%27%7B%5C%0A%20%20%20%20var%20popup%20%3D%20event.target%3B%5C%0A%20%20%20%20if%20%28popup.firstChild%20%26%26%20popup.firstChild.localName%20%3D%3D%20%22toolbar%22%29%20%7B%5C%0A%20%20%20%20%20%20var%20popupToolbar%20%3D%20popup.firstChild%3B%5C%0A%20%20%20%20%20%20popupToolbar.removeAttribute%28%22style%22%29%3B%5C%0A%20%20%20%20%20%20popupToolbar.setAttribute%28%22collapsed%22%2C%20%22true%22%29%3B%5C%0A%20%20%20%20%20%20document.persist%28popupToolbar.id%2C%20%22collapsed%22%29%3B%5C%0A%20%20%20%20%20%20var%20navbox%20%3D%20document.getElementById%28%22navigator-toolbox%22%29%3B%5C%0A%20%20%20%20%20%20var%20nextElement%20%3D%20navbox.firstChild%3B%5C%0A%20%20%20%20%20%20while%20%28nextElement%20%26%26%20nextElement.localName%20%21%3D%20%22toolbarset%22%29%20%7B%5C%0A%20%20%20%20%20%20%20%20if%20%28Number%28nextElement.getAttribute%28%22customindex%22%29%29%20%3E%20Number%28popupToolbar.getAttribute%28%22customindex%22%29%29%29%5C%0A%20%20%20%20%20%20%20%20%20%20break%3B%5C%0A%20%20%20%20%20%20%20%20nextElement%20%3D%20nextElement.nextSibling%3B%5C%0A%20%20%20%20%20%20%7D%5C%0A%20%20%20%20%20%20navbox.insertBefore%28popupToolbar%2C%20nextElement%29%3B%5C%0A%20%20%20%20%20%20popupToolbar.firstPermanentChild%20%3D%20null%3B%5C%0A%20%20%20%20%20%20popupToolbar.lastPermanentChild%20%3D%20null%3B%5C%0A%20%20%20%20%20%20popupToolbar.currentSet%20%3D%20popupToolbar.getAttribute%28%22currentset%22%29%3B%5C%0A%20%20%20%20%7D%5C%0A%20%20%20%20while%20%28popup.lastChild%20%26%26%20popup.lastChild.localName%20%3D%3D%20%22menuitem%22%29%5C%0A%20%20%20%20%20%20popup.removeChild%28popup.lastChild%29%3B%5C%0A%20%20%7D%27%29%3B%0A%0A%20%20var%20contextPopup%20%3D%20document.getElementById%28contextPopupId%29%3B%0A%20%20if%20%28contextPopup%29%20%7B%0A%20%20%20%20contextPopup.hidePopup%28%29%3B%0A%20%20%20%20contextPopup.parentNode.removeChild%28contextPopup%29%3B%0A%20%20%7D%0A%0A%20%20contextPopup%20%3D%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%20%20contextPopup.setAttribute%28%22id%22%2C%20contextPopupId%29%3B%0A%20%20contextPopup.setAttribute%28%22position%22%2C%20%22at_pointer%22%29%3B%0A%20%20contextPopup.setAttribute%28%22onpopupshowing%22%2C%20%27document.popupNode.setContextPopup%28event%29%3B%27%29%3B%0A%0A%20%20var%20menuitem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20menuitem.setAttribute%28%22label%22%2C%20%22Show%20Context%20Menu%20With%20Toolbar%22%29%3B%0A%20%20menuitem.setAttribute%28%22type%22%2C%20%22checkbox%22%29%3B%0A%20%20menuitem.setAttribute%28%22checked%22%2C%20this.getBoolPref%28%27showContextWithToolbar%27%29%29%3B%0A%20%20menuitem.setAttribute%28%22oncommand%22%2C%20%22document.popupNode.setBoolPref%28%27showContextWithToolbar%27%2C%20this.getAttribute%28%27checked%27%29%20%3D%3D%20%27true%27%29%3B%22%29%3B%0A%20%20contextPopup.appendChild%28menuitem%29%3B%0A%20%20contextPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0A%0A%20%20this.tooltipText%20%3D%20this.label%3B%0A%7D%0A%0Athis.setBoolPref%20%3D%20function%28name%2C%20value%29%20%7B%0A%20%20var%20prefs%20%3D%20Cc%5B%22@mozilla.org/preferences-service%3B1%22%5D.getService%28Ci.nsIPrefBranch%29%3B%0A%20%20prefs.setBoolPref%28%22custombuttons.popuptoolbar.%22%20+%20name%2C%20value%29%3B%0A%7D%0A%0Athis.getBoolPref%20%3D%20function%28name%29%20%7B%0A%20%20var%20prefs%20%3D%20Cc%5B%22@mozilla.org/preferences-service%3B1%22%5D.getService%28Ci.nsIPrefBranch%29%3B%0A%20%20return%20prefs.getPrefType%28%22custombuttons.popuptoolbar.%22%20+%20name%29%0A%20%20%20%20%20%20%20%20%26%26%20prefs.getBoolPref%28%22custombuttons.popuptoolbar.%22%20+%20name%29%3B%0A%7D%0A%0Athis.setPopup%20%3D%20function%28event%29%20%7B%0A%20%20if%20%28this.getBoolPref%28%27showContextWithToolbar%27%29%29%20%7B%0A%20%20%20%20document.popupNode%20%3D%20this%3B%0A%20%20%20%20this.setContextPopup%28event%29%3B%0A%20%20%7D%0A%0A%20%20var%20popup%20%3D%20event.target%3B%0A%20%20var%20popupToolbar%20%3D%20document.getElementById%28popupToolbarId%29%3B%0A%20%20if%20%28popupToolbar%20%26%26%20popupToolbar.parentNode%20%21%3D%20popup%20%26%26%20this.parentNode%20%21%3D%20popupToolbar%29%20%7B%0A%20%20%20%20popup.insertBefore%28popupToolbar%2C%20popup.firstChild%29%3B%0A%20%20%20%20popupToolbar.setAttribute%28%22collapsed%22%2C%20%22false%22%29%3B%0A%20%20%20%20if%20%28%21this.getBoolPref%28%27showContextWithToolbar%27%29%29%0A%20%20%20%20%20%20popupToolbar.setAttribute%28%22style%22%2C%20%22border%3A%20none%20%21important%3B%22%29%3B%0A%20%20%7D%0A%0A%20%20if%20%28%21popup.firstChild%29%20%7B%0A%20%20%20%20document.popupNode%20%3D%20this%3B%0A%20%20%20%20this.setContextPopup%28event%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.setContextPopup%20%3D%20function%28event%29%20%7B%0A%20%20var%20contextPopup%20%3D%20event.target%3B%0A%20%20while%20%28contextPopup.lastChild%20%26%26%20contextPopup.lastChild.localName%20%3D%3D%20%22menuitem%22%29%0A%20%20%20%20contextPopup.removeChild%28contextPopup.lastChild%29%3B%0A%0A%20%20var%20toolbars%20%3D%20document.getElementById%28%22navigator-toolbox%22%29.getElementsByTagName%28%22toolbar%22%29%3B%0A%20%20for%20%28var%20i%3D0%3B%20i%3Ctoolbars.length%3B%20i++%29%20%7B%0A%20%20%20%20var%20toolbarname%20%3D%20toolbars%5Bi%5D.getAttribute%28%22toolbarname%22%29%3B%0A%20%20%20%20var%20toolbarid%20%3D%20toolbars%5Bi%5D.getAttribute%28%22id%22%29%3B%0A%20%20%20%20var%20menuitem%20%3D%20contextPopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20toolbarname%29%3B%0A%20%20%20%20menuitem.setAttribute%28%22type%22%2C%20%22radio%22%29%3B%0A%20%20%20%20menuitem.setAttribute%28%22name%22%2C%20%22toolbars-radio%22%29%3B%0A%20%20%20%20menuitem.setAttribute%28%22checked%22%2C%20%28this.label%20%3D%3D%20toolbarname%29%29%3B%0A%20%20%20%20menuitem.setAttribute%28%22disabled%22%2C%20%28%22__customToolbar_%22%20+%20toolbarname.replace%28%22%20%22%2C%20%22_%22%29%20%21%3D%20toolbarid%29%20%7C%7C%20%28this.parentNode%20%3D%3D%20toolbars%5Bi%5D%29%29%3B%0A%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20%22document.popupNode.setToolbar%28this.label.toString%28%29%29%3B%22%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.setToolbar%20%3D%20function%28toolbarname%29%20%7B%0A%20%20var%20toolbar%20%3D%20document.getElementById%28%22__customToolbar_%22%20+%20toolbarname.replace%28%22%20%22%2C%20%22_%22%29%29%3B%0A%20%20if%20%28toolbar%20%26%26%20toolbar%20%21%3D%20this.parentNode%29%20%7B%0A%20%20%20%20this.label%20%3D%20toolbarname%3B%0A%20%20%20%20if%20%28toolbar.firstChild%20%26%26%20toolbar.firstChild.image%29%0A%20%20%20%20%20%20this.image%20%3D%20toolbar.firstChild.image%3B%0A%0A%20%20%20%20this._init%28%29%3B%0A%20%20%7D%0A%7D%0A%0Avar%20that%20%3D%20this%3B%0Athis.hideDropMarker%20%3D%20function%28%29%20%7B%0A%20%20var%20dropMarker%20%3D%20document.getAnonymousElementByAttribute%28that%2C%20%22class%22%2C%20%22toolbarbutton-menu-dropmarker%22%29%3B%0A%20%20if%20%28dropMarker%29%20%7B%0A%20%20%20%20dropMarker.setAttribute%28%22hidden%22%2C%20%22true%22%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20setTimeout%28that.hideDropMarker%2C%2010%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.showPopup%20%3D%20function%28event%29%20%7B%0A%20%20document.popupNode%20%3D%20this%3B%0A%20%20document.getElementById%28popupId%29.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%7D%0A%0Athis.showContextPopup%20%3D%20function%28event%29%20%7B%0A%20%20document.popupNode%20%3D%20this%3B%0A%20%20document.getElementById%28contextPopupId%29.showPopup%28this%2C%20event.screenX%2C%20event.screenY%2C%20%22context%22%2C%20%22none%22%2C%20%22none%22%29%3B%0A%7D%0A%0Athis.leftclick%20%3D%20this.showPopup%3B%0Athis.rightclick%20%3D%20this.showContextPopup%3B%0A%0Aif%20%28this.type%20%3D%3D%20%22menu%22%29%20%7B%0A%20%20this.leftclick%20%3D%20this.hideDropMarker%3B%0A%20%20this.hideDropMarker%28%29%3B%0A%7D%0A%0Athis._init%28%29%3B%0A%0A//this.setAttribute%28%27onclick%27%2C%20%27if%20%28event.target%20%3D%3D%20event.currentTarget%29%20gQuot%28event%2C%20this%29%3B%27%29%3B%0A//%u0438%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u0437%u0430%u0434%u0435%u0440%u0436%u043A%u0443%20%u0434%u043B%u044F%20%u043E%u0442%u0434%u0435%u043B%u044C%u043D%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%0Athis.%20gQuot%20%3D%20%7B%7D%3B%0Athis.%20gQuot.%20__proto__%20%3D%20custombuttons.%20gQuot%3B%0Athis.%20gQuot.%20dcDelay%20%3D%200%3B%0Athis.%20setAttribute%20%28%27onclick%27%2C%20%27this.gQuot.mHandler%28event%2C%20this%29%27%29%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
Отредактировано 3Jlou (06-08-2009 16:20:51)
Отсутствует
только начал разбираться, так что буду рад, если гуру сего дела укажут на возможные ошибки/неточности =)
Не знаю как старожилы оценят, но у меня твой код работает так как хотелось.
Первое Спасибо, запакованное в плюс :)
PS Да, слышал, что они не любят, когда их "гурами" называют :D
Отсутствует
razoo
Anton, существенный недочет. Кнопка не обрабатывает субдомены.
Насчёт "существенности" не уверен, но допустим.
И было бы все-таки неплохо, чтобы дойдя до верхнего уровня картинка кнопки менялась.
Не знаю, не знаю. Очень сложно, по моему, скажем, при переходе на http://deviantart.com загружается http://www.deviantart.com и как определить, что выше уже не подняться ?
В общем, попробовал, в раздел "Инициализация" существующей кнопки:
var enabledImg = ""; var disabledImg = ""; var topLevelImg = ""; var THIS = this; var id = this. id; this. clickHandler = function (event) { if (event. button == 2) return; if (event. originalTarget. nodeName == "toolbarbutton") return; else if (event. originalTarget. nodeName == "menuitem") this. uriToLoad = event. originalTarget. getAttribute ("label"); }; this. decodeURL = function (url) { try { url = losslessDecodeURI (makeURI (url)); } catch (e) {} return url; }; this. getDomain = function (url, level) { var uri = makeURI (url); var tlds = Components. classes ["@mozilla.org/network/effective-tld-service;1"]. getService (Components. interfaces. nsIEffectiveTLDService); var domain; try { domain = tlds. getBaseDomain (uri, level); } catch (e) { domain = uri. asciiHost; } return domain; }; this. getCBObject = function () { var cbobj = getBrowser (). mCurrentTab [id]; if (typeof (cbobj) != "object") getBrowser (). mCurrentTab [id] = {}; return getBrowser (). mCurrentTab [id]; }; this. getPaths = function (event) { var url = getBrowser (). contentDocument. location. href; var cbobj = getBrowser (). mCurrentTab [id]; cbobj = THIS. getCBObject (); var hurl = cbobj. url || url; if ((THIS. getDomain (url, 0) == THIS. getDomain (hurl, 0)) && (url. length < hurl. length)) url = hurl; cbobj. url = url; url = makeURI (url); if (url. schemeIs ("about")) return []; var host = url. prePath + "/"; var curpath = host; var path = url. path. split ("/"); var paths = []; for (var i = 0; i < path. length; i++) { if (path [i]) { curpath += path [i] + "/"; paths. push (THIS. decodeURL (curpath)); } } if (!url. host && (paths. length != 0)) host = paths. shift (); var dLevel = 0; var domains = []; var tld = ""; while (tld != THIS. getDomain (host, dLevel)) { tld = THIS. getDomain (host, dLevel++); domains. push (url. scheme + "://" + tld +"/"); } paths = domains. concat (paths); url = THIS. decodeURL (getBrowser (). contentDocument. location. href); if ((paths. indexOf (url) == -1) && (paths. indexOf (url + "/") == -1)) { for (var i = 0; i < paths. length; i++) { if (url. length < paths [i]. length) { paths. splice (i, 0, url); break; } } } THIS. host = paths [0] || host; if (paths. length == 0) { if (disabledImg) THIS. image = disabledImg; } else { if (cbobj. toplevel) { if (topLevelImg) THIS. image = topLevelImg; } else { if (enabledImg) THIS. image = enabledImg; } } if (paths. length != 0) THIS. type = "menu-button"; else THIS. type = ""; return paths; }; this. createMenu = function (event) { if (event && (event. originalTarget. nodeName != "toolbarbutton")) return; var paths = this. getPaths (event); var menu = this. getElementsByTagName ("menupopup") [0]; if (menu) this. removeChild (menu); menu = ""; menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/> var menuitem; for (var i = 0; i < paths. length; i++) { menuitem = <menuitem label={paths [i]} tooltiptext={paths [i]}/> if ((paths [i] == this. decodeURL (getBrowser (). contentDocument. location. href)) || (paths [i] == this. decodeURL (getBrowser (). contentDocument. location. href) + "/")) { menuitem.@checked = "true"; menuitem.@type = "checkbox"; } menu.menuitem[i] = menuitem; } menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement; this. appendChild (menu); }; this. loadURL = function () { var url = this. uriToLoad || this. host; if (url == this. host) this. getCBObject (). toplevel = true; else this. getCBObject (). toplevel = false; loadURI (this. uriToLoad || this. host); this. uriToLoad = ""; }; this. onUnload = function (event) { window. removeEventListener ("focus", THIS. getPaths, true); window. removeEventListener ("unload", THIS. onUnload, false); }; this. destroy = function () { this. onUnload (null); }; window. addEventListener ("focus", this. getPaths, true); window. addEventListener ("unload", this. getPaths, false); this. createMenu (null); this. setAttribute ("onclick", "this.clickHandler(event)"); this. setAttribute ("onmouseover", "this.createMenu(event,getBrowser().contentDocument.location.href)"); this. orient = "horizontal";
+ расшифровка всяких "%D0..." в URL
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Dreyk, кнопка полезная, спасибо. Тут же возникла мысль использовать кнопки открытия url'ов на всплывающих барах с помощью спец. кнопки, но в совокупности они не работают - вместо открытия (или перехода на открытую вкладу) выпадает меню кнопки.
Вот эта кнопка Popup Toolbar:
Что она должна делать ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
По поводу кнопки открытия папки: можно ли сделать так, чтобы адрес она брала из того места, куда Firefox сохраняет файлы?
Вот код:
function startProcess (path, args)
{
var file = Components. classes["@mozilla.org/file/local;1"].
createInstance (Components.interfaces.nsILocalFile);
var process = Components. classes ["@mozilla.org/process/util;1"].
createInstance (Components. interfaces. nsIProcess);
file. initWithPath (path);
if (args == "")
{
file. launch ();
return;
}
process. init (file);
if (!this. pid)
this. pid = [];
this. pid. push (process. run (false, [args], 1));
}
startProcess ("Путь сохранения", "");
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Najlus
Примерно так:
function startProcess (path, args) { ... } var dir = custombuttonsUtils. getPrefs ("browser.download.defaultFolder"); if (!dir) dir = custombuttonsUtils. getPrefs ("browser.download.lastDir"); if (!dir) dir = Components. classes ["@mozilla.org/file/directory_service;1"]. getService (Components. interfaces. nsIProperties). get ("DfltDwnld", Components. interfaces. nsILocalFile). path; startProcess (dir, "");
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
NajlusПримерно так:
Не работает
Пишет Windows не удалось найти E:\Document ans Settings\*набор странных символов*\*набор странных символов
Притом что папка сохранения находится на диске D, а не на E
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует