Custom Buttons

Автор: Yan
Участники проекта: Anton
Домашняя страница: http://xsms.nm.ru/custombuttons/
Описание: Позволяет добавлять собственные кнопки на панели инструментов.

http://forum.mozilla.ru/uploaded/download.png
Установить


Для создания новой кнопки нужно:
[uli]Зайти в меню Вид -> Добавить новую кнопку....[/uli][uli]Заполнить поля Имя и Код.(Поле Картинка можно оставить пустым, тогда у кнопки будет стандартная картинка: http://forum.mozilla.ru/uploaded/custombuttons_button.png)[/uli][uli]Код из поля Инициализация выполняется единовременно при загрузке окна браузера. Его также можно оставить пустым.[/uli][uli]Затем кнопку можно будет добавить на панель инструментов через Вид -> Панели инструментов -> Настроить...[/uli]

Расширение реализует протокол "custombutton", с помощью которого можно устанавливать кнопки прямо с web-страниц. Некоторые кнопки, включая кнопки BBCode, доступны на страничке расширения.

Давно мечтал о ББ-тулбаре....
НО

Удаление кнопок пока не прикрутил.

это как то жостко.

буду внимательно следить за разработкой)

Yan
удаление кнопок прикрутил? а то так тестить боязно.:)

Хм... а чем Customizable Toolbar Buttons не подходил?

Lynxx
замудрёность тьюторила... или его англаязычность :)

Крыска
Очевидно у нас разные понятия о замудренности ;)

Lynxx
все люди разные :)

Yan молодец! Поздравляю (я то наверное могу это сделать со знанием темы)! Очень классный код и перспективный!
Я и не сомневался, что у тебя классное расширение получится!

Я кстати также твое участие в своем расширении всех версий обязательно позиционирую (как и обещал!).

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

Да еще! Если не против, могу предложить интеграцию части того что ты сделал в мое расширение. Тем более, что мы с тобой работаем в схожем направлении. Я тоже нечто подобное для своего сделал и думал через месяцок выпустить. Но откровенно, твой код по прямее будет. Короче если есть желание опять скооперироваться пиши в личку, - я обрисую конфигурацию.

Yan
ну отпишись о ходе разработки? как оно там?

Крыска

удаление кнопок прикрутил? а то так тестить боязно.:)

Пока нет.. Не было меня в городе, ничего не делал. Расширение можно тестить - кнопки удаляются через about:config сбрасыванием параметра custombuttons.button*.
Раз интерес к расширению есть - то обязательно доведу до ума.
Lynxx

Хм... а чем Customizable Toolbar Buttons не подходил?

Тем, что все создаваемые кнопки находятся в одном месте - их не распихать по нужным углам.
hex
Код ужасен - буду переписывать. Выкладывать на mozilla.org рано, да я и сам справлюсь, так что помощь с "выходом на международный уровень" однозначно не потребуется, спасибо.
Что касается твоего расширения.. Если честно, то у меня (да и не только у меня) есть большие вопросы по поводу него. Распространение только по e-mail, рекламные кнопки... Всё это рядовому пользователю чуждо, и неприятно. Так что у меня нет желания участвовать в его разработке каким-либо образом.

Yan написал:

hex
Код ужасен - буду переписывать. Выкладывать на mozilla.org рано, да я и сам справлюсь, так что помощь с "выходом на международный уровень" однозначно не потребуется, спасибо.
Что касается твоего расширения.. Если честно, то у меня (да и не только у меня) есть большие вопросы по поводу него. Распространение только по e-mail, рекламные кнопки... Всё это рядовому пользователю чуждо, и неприятно. Так что у меня нет желания участвовать в его разработке каким-либо образом.

Понял! Спасибо за добрые слова и в мой адрес и в адрес моего расширения! Дальновидная политика, молодец!
Все сделаю как ты просил.
Учитывая что расширение такое плохое, принял решение не отягощать им форум во избежании народного гнева.

hex
Зачем же так бурно реагировать на чьё-либо личное мнение? Тем более если сам с ним не согласен.
P.S. Вопрос риторический, тема закрыта. Ибо оффтоп.

Супер

:beer:
теперь бы сюда перегнать расширение BBcode  :angel:

:whiteflag:
кнопки слетают каждый раз. ставлю в статусную строку 3 кнопки и после перезагрузки их уже нет.

:whistle: удаление кнопок можно с таким глюком не прикручивать :D

Крыска

ставлю в статусную строку 3 кнопки и после перезагрузки их уже нет.

Статусная строка по умолчанию не предназначена для кнопок, вот и слетают. :) Потом посмотрю, как расширения реализуют добавление кнопок, и попробую исправить. Кстати, а что используется? AIOS?

Yan
ссылка на мой ФФ в подписи :)
у меня вверху только одна строка: там и меню и кнопки и поиск и адресная вместе. каждое место на вес золота.
Поставил туда. посмотрим.

ссылка на мой ФФ в подписи :)

А я подписи отключил. :) Пойду в профиле погляжу..

у меня вверху только одна строка: там и меню и кнопки и поиск и адресная вместе. каждое место на вес золота.

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

Поэтому редкие кнопки (bbcode, например) я вынес на панель закладок

т.е. в панель АИОС?

кстати на основной панели работает.

Крыска

т.е. в панель АИОС?

Нет, именно Панель закладок. А на панели навигации как раз меню,... А там, где меню, там и адресное поле, и кнопки, и закладки...

Сделал alpha2.

Изменения:
1. Добавил удаление кнопок. :)
2. Добавил совместимость со Status Buttons и All-In-One-Sidebar.
К сожалению, кнопки слева и справа от вкладок по-прежнему распологать нелязя, т.к. эти 2 маленькие панельки не полностью эмулируются AIOS как стандартные toolbar'ы, и не имеют необходимого свойства currentset, так что с этим ничего не поделаешь....
3. Добавил реализацию протокола "custombutton". Теперь кнопки можно устанавливать прямо с web-страниц (a-la Opera).
4. Сделал кнопки для расширения BBCode, и еще несколько других. Их можно установить со страницы расширения.
5. Убрал из расширения кнопки по умолчанию. Теперь все кнопки надо устанавливать либо с web-страниц, либо создавать вручную.

Вроде всё.

А можно как нибудь по простому объяснить, что нужно вставлять в поле Code? Например если я хочу создать кнопку для вызова расширения FireFTP ...

Было бы ещё шоколадно сделать плавающую (float) панель для размещения на ней кнопок.

Ура! ПОлная поддержка ББкод! Теперь я доволен :P:heart: Панель Ббкодов имею и через контекстное лазить не надо :)

BraVo123

А можно как нибудь по простому объяснить, что нужно вставлять в поле Code?

Код тот же, что и для настройки горячих клавиш в keyconfig.
Поэтому можно почитать в wiki и тему Горячие клавиши.
И там, и там много всего полезного.
В частности, строки:

# Ставим расширение MenuManipulator.
# Установив расширение, запускаем Firefox.
# Заходим в «Инструменты → Расширения → MenuManipulator».
# В MenuManipulator напротив настраиваемой команды смотрим значение command или oncommand.
# Копируем его (Edit → Ctrl+C).
# В поле /* CODE */ пишем значение того самого command или oncommand, которые мы смотрели при помощи MenuManipulator (например, gBrowser.reloadAllTabs()

Вместо MenuManipulator можно воспользоваться DOM Inspector. Правда, это порядком сложнее.

Yan, спасибо за исчерпывающий ответ :) .

Yan , я конечно уже извращаюсь, но всётаки, картинка для кнопки, может быть только одна или можно несколько втавить (отжатая кнопк, нажатая кнопка, неактивная кнопка)

BraVo123
В принципе одна. Но если очень хочется, то всё можно сделать через JavaScript.
Например, вставить код типа

Код:

if (!this.checked){
 this.checked=true;
 this.image="file:///F:/knopki/variant1.png";
}else{
 this.checked=false;
 this.image="file:///F:/knopki/variant2.png";
}

this в коде указывает на саму кнопку.

Пока у этого способа много недостатков (например, теряется состояние кнопки при перезагрузке браузера), но в alpha3 я планировал что-то с этим сделать.

Yan, не стоит использовать абсолютных путей...

Dark-Demon

Yan, не стоит использовать абсолютных путей...

Где? В коде для смены картинки? Если да, то почему?

Где? В коде для смены картинки? Если да, то почему?

Ну например, я использую PortableFireFox .... :) (в том числе)
З.Ы. Конечно можно и base64 конвертнуть ...

BraVo123

Ну например, я использую PortableFireFox .... smile (в том числе)
З.Ы. Конечно можно и base64 конвертнуть ...

Ну это уже от желания пользователя зависит.. Если надо - придется конвертить.
Можно, конечно, попробовать запихнуть картинку на chrome://, т.е. в папку расширения.. Но тогда при установке новой версии всё потрется.. Так что выхода я пока не вижу..

Лучше в профиле создавать папку и кидать туда картинки.
А если указывать через file:///f:/... то возникает траблы.
Напр. в unix-подобных системах нет никакого диска f: (и c: тоже нет)

Напр. в unix-подобных системах нет никакого диска f: (и c: тоже нет)

Ну так для юникс-подобных систем свой путь и вводить. Типа file:///home/yan/......

Кстати, можно вообще хоть из нета картинки использовать. Типа http://forum.mozilla.ru/favicon.ico.

Повторюсь, это уже как пользователю удобнее будет. От меня тут мало что зависит. Что человек напишет в полях Image и Code, такая кнопка у него и получится.

Anton прислал мне код для конвертации картинок в base64, так что проблемы с абсолютными путями отпадают. :D

Кроме этого, в alpha3 я добавил поле Initialization. В него вписывается код, который будет выполнен один раз при загрузке браузера. Например, это может быть код, устанавливающий начальное состояние кнопки, меняющий её тип, её свойства.
Это позволит создавать кнопки с довольно сложным функционалом. Для примера я сделал часики http://xsms.nm.ru/custombuttons/icons/clocks88.xbm и Cookie button (по аналогии с одноименным расширением).

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

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

Крыска
При добавлении кнопки из окна настройки панелей инструментов кнопка инициализируется не сразу. Нужно по ней кликнуть, и всё заработает. :)

Интересная иконка: http://xsms.nm.ru/custombuttons/icons/clocks88.xbm
На кнопке тоже так будет?

раз 20 щёлкал. у меня не работает.
а вот как только переустановил кнопку, то заработала :)

А можно сделать кнопку scrapbook'a "захватить"?

INFOMAN написал:

Интересная иконка: http://xsms.nm.ru/custombuttons/icons/clocks88.xbm
На кнопке тоже так будет?

ага. так и работает :)

Yan написал:

...часики...

Устанавливаются почему-то только при отключенном JavaScript - мол, кнопка недоступна, установите необходимое расширение. Но работают без этого расширения.

INFOMAN

Интересная иконка: http://xsms.nm.ru/custombuttons/icons/clocks88.xbm
На кнопке тоже так будет?

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

раз 20 щёлкал. у меня не работает.
а вот как только переустановил кнопку, то заработала

Странно. :( Надо будет мне получше потестировать установку кнопок..

А можно сделать кнопку scrapbook'a "захватить"?

Да:

Code:

var menuItem=document.getElementById('ScrapBookContextMenu4');
menuItem.click();

Image:

chrome://scrapbook/skin/capture_entire_as.png

Anton

Устанавливаются почему-то только при отключенном JavaScript - мол, кнопка недоступна, установите необходимое расширение.

Это я перемудрил со скриптом. :( Сейчас подправил.

Yan
а как код операции находить?:blush:

Крыска

а как код операции находить?

В общем случае как и в keyconfig.
Но в случае со Scrapbook не все эти способы подходят, т.к. в самом коде Scrapbook используется обработка нажатого пункта меню. Т.е. один и тот же код, но для разных пунктов меню.
Поэтому в этом случае нужно имитировать клик по пункту меню.
ID пункта меню можно узнать через DOM Inspector, или выполнив в кнопке код:

Код:

var ar=document.getElementsByAttribute('label','Захватить как...');
alert(ar[0].id);

Ну и потом вписать этот ID в код:

var menuItem=document.getElementById('ScrapBookContextMenu4');
menuItem.click();

Сделал для себя кнопку Proxy On/Off, а заодно и Offline Button. Если кому понадобится - установка там же.

Yan
Респект за полезное расширение!
Вопросы|предложения:
1. Что конкретно делает операция "конвертации картинок в base64"?
К примеру, если я назначаю кнопке какой-то значок, расположенный на диске, а затем удаляю значок с диска, то кнопка остается с назначенным значком. Это как понимать? Куда прописывается иконка кнопки?
2. Может стоит конфирмить удаление кнопки, я уже парочку с трудом сделанных кнопок потер.
3. Планируется ли ввести возможность настройки всплывающих подсказок кнопок, обработки событий, соотвествующих разным нажатиям на кнопку (middle click, rught click)?
4.  И еще, предлагаю открыть ветку, посвященную Custom Buttons в разделе Extensions на forums.mozillazine.org. Расширение в рабочем состоянии, местные умельцы быстро кнопок наклепают.

И еще, предлагаю открыть ветку, посвященную Custom Buttons в разделе Extensions на forums.mozillazine.org. Расширение в рабочем состоянии, местные умельцы быстро кнопок наклепают.

прально... пора выходить на мировой уровень :iron:

Куда прописывается иконка кнопки?

Предполагаю, что прямо в кнопку в виде data:image/png;base64.....

Dimanish написал:

...умельцы быстро кнопок наклепают.

А чтобы "умельцам" было проще, пусть само расширение компонует ссылки для установки кнопок.

Dimanish

Что конкретно делает операция "конвертации картинок в base64"

INFOMAN правильно сказал. Конвертация в base64 позволяет хранить картинку в самом коде кнопки.

Может стоит конфирмить удаление кнопки, я уже парочку с трудом сделанных кнопок потер.

Обязательно сделаю.

Планируется ли ввести возможность настройки всплывающих подсказок кнопок, обработки событий, соотвествующих разным нажатиям на кнопку (middle click, rught click)?

Никаких нововведений и не требуется. Всё это можно сделать и сейчас в коде инициализации.
Например:

this.tooltipText='Всплывающая подсказка';
this.onclick=function(event){
if (event.button==1){
  alert('Средняя кнопка');
}
}

А вот правую кнопку лучше не обрабатывать, а то тогда контекстное меню не отроешь, и кнопку отредактировать можно будет только через about:config.

И еще, предлагаю открыть ветку, посвященную Custom Buttons в разделе Extensions на forums.mozillazine.org. Расширение в рабочем состоянии, местные умельцы быстро кнопок наклепают.

Про рабочее состояние говорить рано. Например, вчера нашел баг, из-за которого кнопки могли пропадать, или наоборот, появляться лишние.

P.S. base64

Anton

А чтобы "умельцам" было проще, пусть само расширение компонует ссылки для установки кнопок.

Так контекстное меню -> Copy URI копирует в буфер ссылку. :)
Правда, протокол custombuttons:// на форумах резаться наверняка будет...
P.S. Ну да, режется...

Yan написал:

...
Так контекстное меню -> Copy URI копирует в буфер ссылку. :)
...

:blush:
невнимательность, блин...

Бесплатных хостингов, на которых можно повесить страницу с кнопками, пока хватает.

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

Anton

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

Да, пожалуй так лучше будет. Сделаю.

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

Я сделаю так, чтоб окно всё равно было поверх других, но при этом была возможность копировать текст со страниц, и вообще работать с браузером. (как в Adblock Plus 0.7 отсоединённая панель со списком элементов). Так удобно будет?

Yan
ага.

Yan написал:

Я сделаю так, чтоб окно всё равно было поверх других, но при этом была возможность копировать текст со страниц, и вообще работать с браузером...Так удобно будет?

Конечно, будет удобней, если окно будет всегда наверху.

custombuttons 0.0.1 beta

Изменения:
- исправлен баг с пропаданием/случайным появлением кнопок;
- подтверждение при удалении кнопки;
- по-другому открывается окно редактирования кнопки;
- русификация;
- изменил стандартную иконку и добавил иконки в контекстное меню;

Сварганил парочку кнопок:
toggle JavaScript

Код:

custombutton://ara%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAABcMAAAXDABsIpz7QAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAACqklEQVR4nG3TzWucVRTH8e/v3HOfecvLZGqGaQKmllKmWg1J1cyibu2ioihuXCjWnYSi/4Euu9KquJGCoqWKIMZUMBErKhGCaLrRLiy+QtugdKCDGZOZeeZxkUwI6tncxeVzzrlcfqrc9Th7ah9QAVaAEQBJg7uWBT+OaLrHm8EjSPgeXAM+BBogZIYkzAQIID+UpT8W+ulak3gSWAewPZPfBzVkthHcCTHiMW55zG3FfJ5yDJxrX+WN9tXZar+7lMHooEEN+BjpATMjeGzJ7JFg9nxSKPaTYik3qfTF5ea3V6a7Leq9Dd669f3BPNmnkI0bUAYaZoaFQHB3T5LFwvDoZ0mhWNiv9MwnN74+MZJ27xy8tUz6QlYsmSe5SQe+lAxZ2F47yZmFEJJiaWg47fHOLyuPAYcH+PWJ2eZ7+w7Ne6cz1KO77KCyzAjueEyI2w2Y7rSG56+vMdbb3MXnJmd+/qB29KD3+xVJyNRxSX0LRghOSBJCkrN3f/18dLy3+fJQ2tn9oi8qB968sP+eZySdQXowSDNZRuoy9c1sw9xL7rE7KrIDW60lwdEBfmWqwWK1fkrwF3AReFtm50Pwu02yTSlcErp/LOstn/39q7LgvgF+darRX6zWU2ATOA08K3FF4geZuQOrSKcvX7t0az0WZ2vd9u7a5yem1z6q1p8E/gSWds4nQA6MSGq5pOeGSX+75oX1yW67NsCvTc11FqpH7gAuA08Dp4AMOATMAw8DdTf3dqHf++5vhWMDfPb2OS5WjwCMAV3gAv+tVZm1DLj+h8UT8+Mz3/yUG+GliWMs3HYYyJLtgcT/wSvAQ8AN1e59CknEfLFWir6Q5YtznuSw4MiE0L/xKvAoO2Ham8b1juykZ1kl7fVWQCNGQAY7aWwBx4EmcHOA/gEb272+WkeOLAAAAABJRU5ErkJggg%3D%3D%5D%5Bswitch%28this.PS.getBoolPref%28this.pref%29%29%7B%0A%09case%20true%3A%20this.PS.setBoolPref%28this.pref%2C0%29%3Bbreak%3B%0A%09case%20false%3A%20this.PS.setBoolPref%28this.pref%2C1%29%3Bbreak%3B%0A%7D%5D%5Bthis.pref%3D%27javascript.enabled%27%3B%0Athis.setState%3Dfunction%28%29%7B%0A%20var%20state%3Dthis.PS.getBoolPref%28this.pref%29%3B%0A%20if%20%28state%3D%3D1%29%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAABcMAAAXDABsIpz7QAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAACUklEQVR4nG2TsWueVRjFf+c8z/u++ZIQQoqiCIIgIhRRUUrQboJTRJAK2sm1lA4KiquTOul/IEipYAfBdslQREgh1MUlHXS3WVrwk2jSfO99HL4vpWIP3OVefudcnnOvNk6f4yGdAjaAHWANQNLJ2dSRZxH3Mru7kR1I5EPwE8APwCYI2UjCFiCApYLfoG4BbwP7wAODU8D3oE1ZB3asKAJLR3ag8FCt5j7FmWrtesEbgj/zQbK0aRlnToHzYT/TLU0+d+SkjbNP+8nyrWrlw4O/VmVflLQN9VYC68CmbewgMlP2j0vLq6ed+XVVfZbD0pfZ9d+JutMNw0dV9dPx0T832jg+lcDPkpGD6DqyH+yI6JdXVjWfxZ4jAJ6j6j3gndbGWbVhdcbxdoLWZROZZNfTzQ3oul4g3MWrwlfbOHtF8k3gNbdAErLup6TmMBFJ9D3RD54PLkFC8AkgR/5aVa9L+gLpzZBermJMWc32gTNXMrvjyK7Z1rw+ADXg48Wb2ASuAd/KvhyRL1jyoRQ3hM7IcT3C67YBHS/6b8AIHAKXgAsStyX2ZKeBXaRLOQy/ROYeaF/SDHgauAq8CDwJ3Aa2gfdBCVqTNNXjL51/Nvvh934y+WqYrHzT9QPR9Y/JvgYcASvAB8AeUIsbXQQuVGvPpzP/rqpd4MPFOtF9YBk4Bq7wf+3Knhr4A2qrtXaztZGqolUB1c8D6R4B7wBbwB0vNu6CzrVx3B3HGdVGWqs5/ohk4N05w39+4z6wVVUb42y2A1ozgQyLNqbAWeDeCQzwL0hNudpWhtFVAAAAAElFTkSuQmCC%27%3B%0A//%20%20this.checked%3Dtrue%3B%0A%20%7Delse%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAABcMAAAXDABsIpz7QAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAACqklEQVR4nG3TzWucVRTH8e/v3HOfecvLZGqGaQKmllKmWg1J1cyibu2ioihuXCjWnYSi/4Euu9KquJGCoqWKIMZUMBErKhGCaLrRLiy+QtugdKCDGZOZeeZxkUwI6tncxeVzzrlcfqrc9Th7ah9QAVaAEQBJg7uWBT+OaLrHm8EjSPgeXAM+BBogZIYkzAQIID+UpT8W+ulak3gSWAewPZPfBzVkthHcCTHiMW55zG3FfJ5yDJxrX+WN9tXZar+7lMHooEEN+BjpATMjeGzJ7JFg9nxSKPaTYik3qfTF5ea3V6a7Leq9Dd669f3BPNmnkI0bUAYaZoaFQHB3T5LFwvDoZ0mhWNiv9MwnN74+MZJ27xy8tUz6QlYsmSe5SQe+lAxZ2F47yZmFEJJiaWg47fHOLyuPAYcH+PWJ2eZ7+w7Ne6cz1KO77KCyzAjueEyI2w2Y7rSG56+vMdbb3MXnJmd+/qB29KD3+xVJyNRxSX0LRghOSBJCkrN3f/18dLy3+fJQ2tn9oi8qB968sP+eZySdQXowSDNZRuoy9c1sw9xL7rE7KrIDW60lwdEBfmWqwWK1fkrwF3AReFtm50Pwu02yTSlcErp/LOstn/39q7LgvgF+darRX6zWU2ATOA08K3FF4geZuQOrSKcvX7t0az0WZ2vd9u7a5yem1z6q1p8E/gSWds4nQA6MSGq5pOeGSX+75oX1yW67NsCvTc11FqpH7gAuA08Dp4AMOATMAw8DdTf3dqHf++5vhWMDfPb2OS5WjwCMAV3gAv+tVZm1DLj+h8UT8+Mz3/yUG+GliWMs3HYYyJLtgcT/wSvAQ8AN1e59CknEfLFWir6Q5YtznuSw4MiE0L/xKvAoO2Ham8b1juykZ1kl7fVWQCNGQAY7aWwBx4EmcHOA/gEb272+WkeOLAAAAABJRU5ErkJggg%3D%3D%27%3B%0A//%20%20this.checked%3Dfalse%3B%0A%20%7D%0A//alert%28%27jh%27%29%3B%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B

toggle Java

Код:

custombutton://ara%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAABcMAAAXDABsIpz7QAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAACpElEQVR4nF2TT2icdRCGn/n3+751t38SMBQMxNZGm0qhFMEepA20tqVG8FDwIIgRBCke1JpehB5KLx68Si+Siwfx4EmC4KX0YoVKhRKCJLVNirUU026arGSz+fbnIVltOjC3eeYdZt6R/pfP8ETUgSPAl8AIsCYiAElgRtTOichVi2ghgpqjT8BDwA/AFMiIqCLuSS2SRkIjjWA6lTdqhnqQbuYgcBkYRRVzJzyIiCpSWomUHkcqVs90l/LZ9QejiFxW80FArTawfxvwHXBc3VFzzAIrEqkoK1QnVe3rd9oPXv28+fuOw50m4r7317TzkIh878CBDWXDVDEPLAoiBR4pOuvrV67fnqp3kUElA3Csvcg3fXtHV7MecGBSRFAz1BOeCqIo8ZQwDy4sXj8BjCtZAGZrfXy8+yjdrFi7Pemgw6KKmWMRRFHgZYFFwVjzDqce/vH+5p6Ye6afc8Ov07IgqgrJeVhFaKsb5o6nwKPAPTHWnGdi4RqyCd8td7Q+e+kkrVRiaqg6nlJbUUFVUXfME+rOG8073YmFn9Gce9f67ZN9p6aXvQAEEVAVVB1VkQLRjSZqnbcfzc2dX7j2H/wwaveAY4+itvK/ZQRRQVQLB2ZVZFhUeevx3fZH92/s6Y39Z7l9+Yvdr52dbgwosJMtIYjIrIroOAhvrtzL5+/faPTgZU+3L+05+uF0Y6ANfAXsB/LWHjLuanazzOtXP1i6daR351u1vjyx72R9ycuLQAk8C6StE3BFRG5a47mDnY7oT780dh0aXf37+b9Sg09fPCHLqawD/SDbAXsK/hEYBxZl1yvvEkWJqA69oNW3rbJx+J/aNswcUQGEp5WB94B5egZh42XnF7x+fEnjdLeqZqqqInfzGuS1TXAGOA2M9WCAfwFy6bThwAwC4wAAAABJRU5ErkJggg%3D%3D%5D%5Bswitch%28this.PS.getBoolPref%28this.pref%29%29%7B%0A%09case%20true%3A%20this.PS.setBoolPref%28this.pref%2C0%29%3Bbreak%3B%0A%09case%20false%3A%20this.PS.setBoolPref%28this.pref%2C1%29%3Bbreak%3B%0A%7D%5D%5Bthis.pref%3D%27security.enable_java%27%3B%0Athis.setState%3Dfunction%28%29%7B%0A%20var%20state%3Dthis.PS.getBoolPref%28this.pref%29%3B%0A%20if%20%28state%3D%3D1%29%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAABcMAAAXDABsIpz7QAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAACKUlEQVR4nHWSMYudRRSGn/c9Z+a7axBENAYsopgVdyUggq1skSoEbGy3SBdrf4eFCBaCbK9oIbKkvLGws0qxxVaB/ALZSPbu/eZY3Lt4FXybaeZ5Zt45o9c//Jyd3AA+Bb4CDoCVJIAuOJPjS0m/RWsvkHAk3oFvA78Cp6AD2SizO1p367j1A8Kntdlz+xqKvZuHBt4GvgPuYRORZCSROWe2vyLzZUSWM23Hu4gPHPkEuIi9m4evAj8A95yJI4loxNTp02LGPrHj+5wW72frt9walu4AH0v6OYG7wBEOwiayEW2i9Ua23q7W66XDP7a+OIZi1KD6mvXq6qhG3U3gRBKOwNnJPtGmBdk7kY1+I/dkq8ZYbARQY0bRmC8vTxK8r23vaI02TeRiItpEOlDYIHAUgKqoCuxAVfspcemMKTLJ3sg2kdmJSGyDVLtzDkFVMEpk75fGwjbOJLKzechY214hAK4Ful4ksIWd2NKEvJE4rhTxuxyfIX29Zd7aSl7+cw8hC9lTAueW9mUjx5+yfxI6Bc6Bj4A/gDeA1/hXhKRzS364OUkFvAL1BfDLdrzfAB34FjjcqbN16GE64umgllXjqJj3atSdinpH6BPgBbAA3tyKdrOU9NRIF1QdV/G4RlFVVFVC3YJ6b/vN/ws/Bo6BCwOj9ek51KMaY1nzmhozNYr/yRJ4BDwHhrddAJ5RPKiq+2Oez+Z5pkatoFZb8Ay4DzwAnl3b/gZOa6bN/Lu7HAAAAABJRU5ErkJggg%3D%3D%27%3B%0A//%20%20this.checked%3Dtrue%3B%0A%20%7Delse%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAABcMAAAXDABsIpz7QAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAACpElEQVR4nF2TT2icdRCGn/n3+751t38SMBQMxNZGm0qhFMEepA20tqVG8FDwIIgRBCke1JpehB5KLx68Si+Siwfx4EmC4KX0YoVKhRKCJLVNirUU026arGSz+fbnIVltOjC3eeYdZt6R/pfP8ETUgSPAl8AIsCYiAElgRtTOichVi2ghgpqjT8BDwA/AFMiIqCLuSS2SRkIjjWA6lTdqhnqQbuYgcBkYRRVzJzyIiCpSWomUHkcqVs90l/LZ9QejiFxW80FArTawfxvwHXBc3VFzzAIrEqkoK1QnVe3rd9oPXv28+fuOw50m4r7317TzkIh878CBDWXDVDEPLAoiBR4pOuvrV67fnqp3kUElA3Csvcg3fXtHV7MecGBSRFAz1BOeCqIo8ZQwDy4sXj8BjCtZAGZrfXy8+yjdrFi7Pemgw6KKmWMRRFHgZYFFwVjzDqce/vH+5p6Ye6afc8Ov07IgqgrJeVhFaKsb5o6nwKPAPTHWnGdi4RqyCd8td7Q+e+kkrVRiaqg6nlJbUUFVUXfME+rOG8073YmFn9Gce9f67ZN9p6aXvQAEEVAVVB1VkQLRjSZqnbcfzc2dX7j2H/wwaveAY4+itvK/ZQRRQVQLB2ZVZFhUeevx3fZH92/s6Y39Z7l9+Yvdr52dbgwosJMtIYjIrIroOAhvrtzL5+/faPTgZU+3L+05+uF0Y6ANfAXsB/LWHjLuanazzOtXP1i6daR351u1vjyx72R9ycuLQAk8C6StE3BFRG5a47mDnY7oT780dh0aXf37+b9Sg09fPCHLqawD/SDbAXsK/hEYBxZl1yvvEkWJqA69oNW3rbJx+J/aNswcUQGEp5WB94B5egZh42XnF7x+fEnjdLeqZqqqInfzGuS1TXAGOA2M9WCAfwFy6bThwAwC4wAAAABJRU5ErkJggg%3D%3D%27%3B%0A//%20%20this.checked%3Dfalse%3B%0A%20%7D%0A//alert%28%27jh%27%29%3B%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B]

Yan, поправь переключалку прокси, а то у тебя там отладочный алярм по клику выскакивает :)
Еще, есть проблемы с AIOS, а точнее с его тулбоксами по краям таббара, - кнопки там держатся только до перезагрузки, после чего убегают обратно в "Настройки панелей инструментов".
Переключалка прокси, кстати, тоже безконца со статусбара убегает, только рандомно как-то...
Еще было бы неплохо убрать пункт меню "Вид - Add new button" и добавить соответствующую кнопку в "Настройки панелей инструментов".
Неплохо было бы сделать "менеджер кнопок", который бы автоматом обновлял список доступных кнопок...

ссылка в последнем посте у тебя битая...

Dark-Demon

Yan, поправь переключалку прокси, а то у тебя там отладочный алярм по клику выскакивает smile

Ой. Какой кошмар! :)

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

Есть такое. Подправить скорее всего не удастся, это связано в реализацией этих панелей в AIOS.

Переключалка прокси, кстати, тоже безконца со статусбара убегает, только рандомно как-то...

А это вроде как раз тот баг, что я в бете исправил. Но возможно и нет, надо будет последить еще...

Еще было бы неплохо убрать пункт меню "Вид - Add new button" и добавить соответствующую кнопку в "Настройки панелей инструментов".

Я изначально думал так сделать, но потом отказался в пользу нынешнего решения по нескольким причинам:
1. Программная реализация довольно объёмна, могут быть непредвиденные баги. Т.е. надёжнее добавить кнопку в браузер ДО открытия окна настройки.
2. В окне настройки у всех кнопок отсутствуют котнекстные меню. Поэтому получится, что добавил кнопку, а удалить её оттуда нельзя будет, как и отредактировать. Можно, конечно, покопаться поглубже, но не факт, что итоговая реализация будет выглядеть адекватно.

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

Неплохо было бы сделать "менеджер кнопок", который бы автоматом обновлял список доступных кнопок...

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

P.S. Большое спасибо за bug-reports, побежал исправлять. :)

Dark-Demon
Подправил твои кнопки и поместил на страницу.

А чем тебе в кнопках  this.checked не угодили? Удобней ведь с ними?
Да, и если в кнопке обе картинки задаются в коде, то заполнение Image получается излишним - только "вес" кнопки раздувает.

Как устанавливать приведенные мной кнопки: трижды щелкните по урлу (он должен весь выделиться), скопируйте его в строку адресса и нажмите "перейти".

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

А еще весьма полезной была бы функция бекапа всех кнопок в одну html страничку...

>А чем тебе в кнопках  this.checked не угодили? Удобней ведь с ними?
ага, удобней, только у меня из-за этого вся тема в раскарячку :) статусбар меняет высоту, кнопка чуть двигается, да и вообще, тема у меня темная, а фон у кнопок слишком светлый получается...

Dark-Demon

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

Я поставлю галочку "Не показывать больше".

А еще весьма полезной была бы функция бекапа всех кнопок в одну html страничку...

Разумно. Пожалуй, сделаю.

P.S. Кнопки всё-таки пропадают из строки состояния.. ( Буду искать..

Пока вот что нашел: если после кнопок в статусбаре поставить разделитель (separator), то кнопки пропадать не будут...

>Да, и если в кнопке обе картинки задаются в коде, то заполнение Image получается излишним
+- килобайт - это не существенно ;) хотя, я бы сделал так: на кнопке нарисована одна картинка, а во включенном состоянии на нее сверху накладывается другая. тогда можно было бы сделать два значка "J" и "JS" и один значек "/", который и накладывать на них.
Кстати, хранить картинки, имхо, лучше в profile/chrome/buttons/

Я себе, кстати, сделал в firefox/chrome/ директорию local и добавил вот такой вот простенький манифест:

Код:

content local local/

И теперь ее содержимое доступно по chrome://local/content/*
Очень удобно так хранить дополнительные файлы без привязки к абсолютным путям...

>надёжнее добавить кнопку в браузер ДО открытия окна настройки.
Ну так это ж как раз самое простое :) Надо только заоверлеить chrome://global/content/customizeToolbar.xul который лежит в toolkit.jar

>В окне настройки у всех кнопок отсутствуют котнекстные меню.
и что. никак его не добавить? :/ ну тогда можно удалять в два хода: переносим на тулбар, жмем правую кнопку.
А вообще, имхо, стоит отказаться от контекстной менюшки. Для настроек кнопок юзать спец менеджер, а в остальном они должны вести себя как самые обычные кнопки.

>Всё-таки суть расширения не в наборе кнопок, а в возможности добавлять их самому.
Ну, не все способны свою кнопку забацать... А ставить кучу расширений реализующих пустяковые функции - не есть гуд. Сравни к примеру объем кода расширения quickJava и объем кода тех двух кнопок, что я выложил.

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

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

А еще весьма полезной была бы функция бекапа всех кнопок в одну html страничку...

я страничку с кнопками сохранил в СкрапБуке. теперь при необходимости достать могу :)

Dark-Demon

+- килобайт - это не существенно wink хотя, я бы сделал так: на кнопке нарисована одна картинка, а во включенном состоянии на нее сверху накладывается другая. тогда можно было бы сделать два значка "J" и "JS" и один значек "/", который и накладывать на них.

Это уже как автор кнопки напишет - так и будет. Можно и так.

Кстати, хранить картинки, имхо, лучше в profile/chrome/buttons/

А формат тогда какой применять? rdf? Что-то я не вижу преимуществ. Кнопки-то не по шаблону создаются, а через DOM.

Ну так это ж как раз самое простое smile Надо только заоверлеить chrome://global/content/customizeToolbar.xul который лежит в toolkit.jar

Эх.. Если бы всё так просто было... Там совсем другая система.
Кнопки все хранятся в document.getElementById("navigator-toolbox").palette главного окна браузера.
А при открытии окна насройки они оттуда достаются через JS и добавляются в окно через DOM. Причем куски этого кода перекрываются кодом из AIOS, если тоже что-то там начать перекрывать, то можно нарваться на несовместимость расширений.
Так что оверлеями там никак не обойтись, тем более кнопки создаются динамически.

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

Я все эти варианты уже рассматривал, ковырялся в browser.js, customizeToolbar.js, в AIOS, потом посмотрел на все эти хитрости, решил, что затраченные усилия результат не окупят, и сделал так, как есть сейчас.

А вообще, имхо, стоит отказаться от контекстной менюшки. Для настроек кнопок юзать спец менеджер, а в остальном они должны вести себя как самые обычные кнопки.

А по мне, так наоборот, контекстное меню - самый удобный способ управления кнопками. Кнопку можно отредактировать в пару кликов, и тут же проверить работоспособность.

Ну, не все способны свою кнопку забацать... А ставить кучу расширений реализующих пустяковые функции - не есть гуд. Сравни к примеру объем кода расширения quickJava и объем кода тех двух кнопок, что я выложил.

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

А если не секрет, чем преобразовывать ссылки custombuttons?

Philip
В смысле чем?
Если само расширение установлено, то при нажати на ссылку выскочит предложение установить кнопку.
Если имеется в виду, как создать эту ссылку, то контекстное меню на кнопке, и "Копировать код в буфер". Скопируется ссылка, готовая для вставки на страницу.

Окно - то, что надо. Даже свернуть/развернуть кнопочки появились (я хотел попросить, но забыл).
Спасибо.

Yan, нет, я про то, что если я захочу сделать подобную ссылку, как можно конвертировать например кириллицу в ASCII символы.

Anton
Ну с этим-то проблем никаких не было. :)
Philip
Главное кнопку сделать. Остальное всё автоматом.
Когда она будет готова, кликнуть по ней правой кнопкой, и выбрать "Копировать код в буфер". Ссылка скопируется в буфер обмена, и её останется только вставить туда, куда надо.

Yan, точно! я как-то и не заметил. Извиняюсь. Очень удобно!

>Кнопки все хранятся в document.getElementById("navigator-toolbox").palette главного окна браузера.
Не, ты меня не понял. В настройке панелей есть три недрегендропящихся кнопки: "Добавить новую панель", "Восстановить" и "Готово". Так вот оверлеем можно создать еще одну  такую же кнопку с надписью "Создать кнопку".
Гм.. надо как-то различать эти два вида кнопок... Эти три штуки можно называть "статичными кнопками"...

я страничку с кнопками сохранил в СкрапБуке. теперь при необходимости достать могу

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

ps: рулез, BBкодные кнопки работают в QuickNote! :rock:

Кстати, иконки для кнопок я взял из QuickJava...

Dark-Demon
Нет, ну со статичными кнопками чтоб проблемы были, это надо сильно постараться. :)
Я про то, что если делать так, как ты говоришь, то помимо тех сложностей, что я уже описал, могут возникнуть непредвиденные проблемы.
Например, как с пропаданием кнопок. Ну откуда я мог знать, что AIOS из правого статусбара специально зачем-то удаляет последний элемент? Правильно, ниоткуда. Так вот, если начать ковырять скрипт добавления кнопок в окно настройки панелей, то боюсь, что таких "приятностей" может много оказаться, ибо и в AIOS, и в самом Firefox кода, отвечающего за это дело, немало, а штудировать его весь что-то не хочется..
По-моему, чем расширение проще будет, тем надежнее, а значит лучше.

P.S. Сейчас выложу новую версию.

Новая версия:
http://xsms.nm.ru/custombuttons/files/custombuttons.xpi

Fixed:
- пропадание кнопок в статусбаре

Dark-Demon

ps: рулез, BBкодные кнопки работают в QuickNote!

Ага, даже в адресной строке. :)

Yan
а может автообновление бы? а то вручную лень.....:rolleyes:

Опять новая версия: :)
http://xsms.nm.ru/custombuttons/files/custombuttons.xpi

Fixed:
- пропадание кнопок в таббаре
Теперь должна быть полная совместимость с AIOS.

Крыска

а может автообновление бы? а то вручную лень.....roll

Доделаю версию 0.0.1, и сделаю. А то мне пока тоже лень заморачиваться с новыми номерами для каждой версии и править update.rdf.

Yan

А то мне пока тоже лень заморачиваться с новыми номерами для каждой версии и править update.rdf.

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

Крыска
Вот именно, что с такими частыми апдейтами мне и влом. :)

Yan
Хочу сделать кнопку для сохранения страниц при помощи Scrapbook http://forum.mozilla.ru/uploaded/scrmainsave.png
В зависимости от того, выделен ли текст или нет, при нажатии на левую кнопку мышки на кнопке происходит быстрое сохранение страницы|выделения, щелчок средней кнопки мыши вызывает диалог "Сохранить как..." для сохранения выделенной области|страницы целиком.
Как распознать выделен ли текст на странице?

Dimanish

Код:

var focusedWindow = content;
var reference = focusedWindow.getSelection();
if (!reference.isCollapsed){
 alert('выделения нет');
}else{
 alert('выделение есть');
}

Dimanish
Кстати, там совсем не обязательно определять, есть ли выделение, или нет. Scrapbook сам это делает.
Вот код такой кнопки:
(надо вставить в Инициализацию)

this.onclick=function(event){
switch (event.button){
  case 0:document.getElementById('ScrapBookMenubarItem1').click();break;
  case 1:document.getElementById('ScrapBookMenubarItem2').click();break;
}
}

Brrrr... Тут была дикая опечатка. Исправил. Извиняюсь...

Dimanish, а что, дрегондроп не рулит?

Dimanish
Блин, в предыдущем коде я дико опечатался. Исправил.

Yan
Вот так сделал:

Код:

/*Initialization Code*/
this.onclick=function(event){
/*левая кнопка мыши*/
if (event.button==0){
 var focusedWindow = content;
 var reference = focusedWindow.getSelection();
 if (!reference.isCollapsed){
 sbBrowserOverlay.execCapture(true, true, false, event.originalTarget.id); /*выделение есть*/
}else{
 sbBrowserOverlay.execCapture(false,false,false, event.originalTarget.id); /*выделения нет*/
}}
/*средняя кнопка мыши*/
if (event.button==1){
 var focusedWindow = content;
 var reference = focusedWindow.getSelection();
 if (!reference.isCollapsed){
 sbBrowserOverlay.execCapture(true, true, true , event.originalTarget.id);
}else{
 sbBrowserOverlay.execCapture(false,false,true , event.originalTarget.id);
}}}

Все работает.

Dark-Demon

ни капельки не рулит :)

Dark-Demon
Мне кнопкой удобнее

Так. я что-то не доехал. Вроде же сделали, что б окно можно было свернуть при создании кнопки... а не пашет.
версия от 21 в 14,10

Крыска
Окно можно свернуть|развернуть только при редактировании кнопки.
Yan может поправишь?

Dimanish

Вот так сделал:
...

Ну я в такие дебри не полез. :)
Немного упростил:

Код:

this.onclick=function(event){
 if (event.button<=1){
 var sel=!content.getSelection().isCollapsed;
  sbBrowserOverlay.execCapture(sel,sel,(event.button==1),event.originalTarget.id);
 }
}

Крыска

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

Ой, а про создание я и забыл... :( Что-то я рассеян в последнее время. Подправлю, конечно.

Окно можно свернуть|развернуть только при редактировании кнопки.
Yan может поправишь?

Подправил.

Так. столько кнопок для скрапбук наворатили. Теперь объясните действие каждой, в чём отличия?

Крыска
Да один и тот же:

Dimanish написал:

В зависимости от того, выделен ли текст или нет, при нажатии на левую кнопку мышки на кнопке происходит быстрое сохранение страницы|выделения, щелчок средней кнопки мыши вызывает диалог "Сохранить как..." для сохранения выделенной области|страницы целиком.

А различия в реализации.

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

Dimanish
Если еще такое будет, то надо бы:
1) Заглянуть в JS-консоль.
2) Запустить DOM-инспектор, найти в нём кнопку, переключиться из режима "DOM node" в режим "Javascript Object", и посмотреть, чему равно свойство onclick.

Тогда может быть станет что-то ясно..

Yan
Попробую посмотреть.
Еще вопросы|предложения:
1. Как сделать кнопку для запуска стороннего приложения?
2. Можно ли сделать кнопку с выпадающим меню, как в Опере?
3. Может кнопки, сделанные Custom Buttons, сбрасывать в отдельное окно, а не в общее со всеми кнопками?

Dimanish

1. Как сделать кнопку для запуска стороннего приложения?
2. Можно ли сделать кнопку с выпадающим меню, как в Опере?

Вчера как раз сделал себе кнопку "External Applications" с выпадающим меню для запуска сторонних приложений:

Код:

custombutton://External%20Applications%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%5D%5B%5D%5Bvar%20apps%3Dnew%20Array%3B%0A//------menu%20items--------%0Aapps.push%28%5B%27Proxomitron%27%2C%27D%3A/Program%20files/ProxN45_nohlp/Proxomitron.exe%27%5D%29%3B%0Aapps.push%28%5B%27Notepad%27%2C%27c%3A/windows/notepad.exe%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Opera%27%2C%27D%3A/Program%20files/Opera9/Opera.exe%27%5D%29%3B%0Aapps.push%28%5B%27IE%27%2C%27c%3A/Program%20files/Internet%20Explorer/IEXPLORE.EXE%27%5D%29%3B%0A//------/menu%20items-------%0A%0Avar%20nMItem%3Dfunction%28label%2Cpath%2Cargs%2Cobj%29%7B%0A%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%3Dobj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%29%27%29%3B%0A%20%20return%20m%3B%0A%7D%0Athis.startProcess%3Dfunction%28path%2Cargs%29%7B%0Avar%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0Avar%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20.getService%28Components.interfaces.nsIProcess%29%3B%0A%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%20%0A//%20file.launch%28%29%3B%0A%20process.init%28file%29%3B%0A%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Athis.orient%3D%22vertical%22%3B%0Avar%20mP%3Ddocument.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3Bi%3Capps.length%3Bi++%29%7B%0A%20if%20%28apps%5Bi%5D%20%3D%3D%27separator%27%29%7B%0A%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%7Delse%7B%0A%20%20if%20%28%21apps%5Bi%5D%20%5B2%5D%29%20apps%5Bi%5D%20%5B2%5D%3D%27%27%3B%0A%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2Capps%5Bi%5D%20%5B1%5D%2Capps%5Bi%5D%20%5B2%5D%2Cthis%29%29%3B%0A%20%7D%0A%7D%0Athis.appendChild%28mP%29%3B%0A%0A

(Для установки кнопки нужно выделить код и вставить его в адресную строку)

3. Может кнопки, сделанные Custom Buttons, сбрасывать в отдельное окно, а не в общее со всеми кнопками?

Вряд ли возможно что-то приемлемое. Кнопки на самом деле добавляются не в окно, а в "спец. хранилище", откуда окно их потом "подцепляет". Если писать своё окно с кнопками, то очень многие стандартные функции (типа drag'n'drop, сохранение положения на тулбарах) придется заново переписать. Лишний код, лишнее время, лишние баги.. К тому же совместимость с другими расширениями ухудшится (с тем же AIOS, например).

Yan
Теперь понял как создавать менюшки. Спасибо.
Мне бы просто кнопку для запуска приложения, например, Proxomitron.
При этом приложение должно быть запущено с определенным параметром -  Dimanish.cfg, т.е. с моим набором настроек прокса:
командная строка - "C:\Program Files\Proxomitron\Proxomitron.exe" Dimanish.cfg

И еще, кнопка Scrapbook (и видимо остальные также) перестает работать после того, как открываешь окно "Настройка панелей инструментов", в котором находятся все кнопки. Стоит открыть окно редактирования кнопки и нажать "OK" или перезапустить браузер - все становится нормально.
Видимо, не совсем верно функционирует /*Initialization Code*/.

Dimanish

Мне бы просто кнопку для запуска приложения, например, Proxomitron.
При этом приложение должно быть запущено с определенным параметром -  Dimanish.cfg, т.е. с моим набором настроек прокса:
командная строка - "C:\Program Files\Proxomitron\Proxomitron.exe" Dimanish.cfg

Код:

var path='C:\\Program Files\\Proxomitron\\Proxomitron.exe';
var arguments=['Dimanish.cfg'];

var file = Components.classes['@mozilla.org/file/local;1']
    .createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);
 file.initWithPath(path); 
 process.init(file);
 process.run(false,arguments,arguments.length);

Также можно в предыдущей кнопке указать аргументы запуска третьим параметром:

Код:

...
apps.push(['Opera','D:/Program files/Opera9/Opera.exe','http://forum.mozilla.ru/viewtopic.php?pid=109351#p109351']);
...

И еще, кнопка Scrapbook (и видимо остальные также) перестает работать после того, как открываешь окно "Настройка панелей инструментов", в котором находятся все кнопки. Стоит открыть окно редактирования кнопки и нажать "OK" или перезапустить браузер - все становится нормально.
Видимо, не совсем верно функционирует /*Initialization Code*/.

Мда... Именно так. :(
Странный глюк. Через DOM-инспектор посмотрел - все свойства на месте, всё должно работать. А на деле не работает. Не знаю даже, где у этого бага корни искать. :(

Хм... отличная идея с плагином для кнопок но есть парочка мелких замечаний и вопросов:
1. Почему только русский язык? Я использую ФФ 1.5.0.3 русский и лолифокс 0.2.2 английский (нет пока русского да и не хочу). В первом все смотрится нормально, но вот во втором... ну неуместно как-то смотрится русский текст Ж). Просто локаль добавь, а?
2. А можно окно редактирования в сайдбар запихнуть? Во всяко случае интересная возможность, как по мне. (Это должно быть опционально).
3. Чья-то кнопка "Панель закладок" действует до первого перезапуска (лолифокс, он кстати на бонэхо построен).
4. Можно ли в коде кнопки генерировать окно с элементами управления и сохранять установки в нем и как это сделать (просто есть проапгрейдить часы до часов с кукушкой, что б каждые пол часа сигнал издавали, но так, что бы это можно было бы настраивать)?
5. Можно ли перехватывать нажатие правой кнопкой мыши по кнопке, но при этом не заменять меню на свое а дополнять его новыми пунктами и реструктурировать старые (например вынести их в подменю)?

Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1a2) Gecko/20060513 lolifox/0.2.2

Вообщем, плюнул и перевел сам Ж).
Для повторения моего фокуса требуется изменить приведенные ниже файлы так как я укажу в поле кода.
1. Переименовать chrome\custombuttons\locale\en-US в chrome\custombuttons\locale\ru-RU
2. Добавить в файл chrome.manifest строку, указывающую на русскую локализацию как показано тут

Код:

overlay    chrome://browser/content/browser.xul    chrome://custombuttons/content/overlay.xul
content    custombuttons    chrome/custombuttons/content/custombuttons/

locale    custombuttons    en-US    chrome/custombuttons/locale/en-US/custombuttons/
locale    custombuttons    ru-RU    chrome/custombuttons/locale/ru-RU/custombuttons/

skin    custombuttons    classic/1.0    chrome/custombuttons/skin/classic/
style    chrome://browser/content/browser.xul    chrome://custombuttons/skin/custombuttons.css
style    chrome://global/content/customizeToolbar.xul    chrome://custombuttons/skin/custombuttons.css

3. Файл chrome\custombuttons\locale\ru-RU\custombuttons\custombuttons.properties

Код:

RemoveConfirm=Удалить кнопку "%s"?
ButtonAddedAlert=Кнопка была успешно создана. Вы можете добавить её на любую панель инструментов через меню "Вид -> Панели инструментов -> Настроить..."
InstallConfirm=Установить кнопку "%s"?
ButtonErrors=Кнопка не может быть создана, потому что содержит ошибки!

4. Создать папку chrome\custombuttons\locale\en-US
5. Потом создать папку chrome\custombuttons\locale\en-US\custombuttons
6. Создать в ней файл chrome\custombuttons\locale\en-US\custombuttons\custombuttons.dtd

Код:

<!ENTITY custombuttons.viewMenu_Item                 "Add new button...">
<!ENTITY custombuttons.buttonPopup.edit             "Edit...">
<!ENTITY custombuttons.buttonPopup.remove             "Delete">
<!ENTITY custombuttons.buttonPopup.clone             "Clone">
<!ENTITY custombuttons.buttonPopup.copyURI             "Copy code to clipboard">

7. Так же создать chrome\custombuttons\locale\en-US\custombuttons\custombuttons.properties

Код:

RemoveConfirm=Delete button "%s"?
ButtonAddedAlert=The button was successfully created.\nYou can add it to any toolbar via "View -> Toolbars -> Customize..."
InstallConfirm=Do you wish to install "%s" button?
ButtonErrors=The button can not be created because it contains errors!

8. И еще chrome\custombuttons\locale\en-US\custombuttons\editor.dtd

Код:

<!ENTITY editor.dialog.title        "Edit bitton">
<!ENTITY editor.name                "Name:">
<!ENTITY editor.name.tooltiptext        "Use this to create label and popup help for button">
<!ENTITY editor.image            "Image:">
<!ENTITY editor.select            "Browse...">
<!ENTITY editor.base64            "⇒ base64">
<!ENTITY editor.base64.tooltiptext        "Convert image in base64 format (data:image/png;base64,...)">
<!ENTITY editor.code                "Code">
<!ENTITY editor.code.tooltiptext        "Executing when button pressed">
<!ENTITY editor.initCode            "Initialize">
<!ENTITY editor.initCode.tooltiptext    "Executing when browser loaded">
<!ENTITY editor.code.defaultValue        "/*CODE*/">
<!ENTITY editor.initCode.defaultValue    "/*Initialization Code*/">

Вот так вот примерно Ж). Люблю я длинные посты. Если есть ашЫпки в переводе, то исправьте и отпишите.

З.Ы. Спасибо афтару за отличный плагин!
З.З.Ы. 3 строки английского перевода уже были в плагине в файле chrome\custombuttons\locale\en-US\custombuttons\custombuttons.properties. Только как то странно они были объявлены... Вот так примерно:

Код:

InstallConfirm_en=ффф Do you wish to install "%s" button?

Для чего это было??? Вообщем выкинул.

Lain_13

1. Почему только русский язык? Я использую ФФ 1.5.0.3 русский и лолифокс 0.2.2 английский (нет пока русского да и не хочу). В первом все смотрится нормально, но вот во втором... ну неуместно как-то смотрится русский текст Ж). Просто локаль добавь, а?

Так не успел еще. Beta всё-таки. Пока отлов багов считаю более важным.

2. А можно окно редактирования в сайдбар запихнуть? Во всяко случае интересная возможность, как по мне. (Это должно быть опционально).

Попробую.

3. Чья-то кнопка "Панель закладок" действует до первого перезапуска (лолифокс, он кстати на бонэхо построен).

Наверное, кнопка-то работает, но панель не сохраняет положение. Так? Чтобы сохранялось, надо посложнее код писать..

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

Окно - вряд ли. Сложно. А вот разные параметры можно в коде кнопки через JS задавать.

5. Можно ли перехватывать нажатие правой кнопкой мыши по кнопке, но при этом не заменять меню на свое а дополнять его новыми пунктами и реструктурировать старые (например вынести их в подменю)?

Вообще, можно всё. :) Надо знать JS и DOM. Будет время - напишу примерчик.

P.S. За перевод спасибо. Я его немного подправлю, и потом добавлю.

Yan
Может добавишь поддержку Flock? У меня стоит это расширение, вроде работает.

stoneflash
Поставлю Flock, погляжу..

При запуске лолифокса (напомню, это бонэхо) в консоли джаваскрипта выдается:

Код:

Warning: Warning: Ignoring unrecognized chrome manifest instruction.
Source File: file:///C:/Documents%20and%20Settings/YGolovanyov/Application%20Data/altimit-dev/lolifox/Profiles/yr0p9crz.default/extensions/custombuttons@xsms.org/chrome.manifest
Line: 1

Интересно, в оригинальной версии это есть? или это я напортачил 1 строчку добавив. Хотя нет, я строку 1 не правил... значит ашипка где-то в ней...

Ошибку локализовал и исправил, дело в том, что 1я строка была пустой, а это, видимо, недопустимо. Просто удаляем переход на новую строку в первой строке и все будет нормально работать.

установить мою модификацию (версия 0.0.1.1).

Так же там изменен стиль оформления данных о плагине. Данные о дате и времени билда перемещены в окно информации о претензии. В окне расширений виден ТОЛЬКО номер билда. Кстати, обычно в названии плагина номер его версии вообще не пишут, для этого есть поле "версия". В дальнейем наверное информацию о версии и билде желательно размещать там и только там (иначе в окне информации о плагине заголовок просто НЕ ВЛЕЗАЕТ в окно).

Yan
хочу конопочек :blush:

Просьба не путать, это не флейм.
Sergeys

Крыска, а какие кнопочки интересуют?

Dark-Demon
я и не знаю. заранее не знаешь, что пригодиться пока не увидишь в работе.
а вообще есть кнопка переключения между альбомами скрапбука.... но я сомневаюсь, что её можно реализовать.

переделанный image show-hide. переключает между тремя режимами.

Код:

custombutton://image%20show-hide%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC%5D%5Bswitch%28this.PS.getIntPref%28this.pref%29%29%7B%0A%09case%201%3A%20this.PS.setIntPref%28this.pref%2C2%29%3Bbreak%3B%0A%09case%202%3A%20this.PS.setIntPref%28this.pref%2C3%29%3Bbreak%3B%0A%09case%203%3A%20this.PS.setIntPref%28this.pref%2C1%29%3Bbreak%3B%0A%7D%5D%5Bthis.pref%3D%27permissions.default.image%27%3B%0Athis.setState%3Dfunction%28%29%7B%0Aswitch%28this.PS.getIntPref%28this.pref%29%29%7B%0Acase%201%3A%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACp0lEQVR42mL4//8/g3zm6f8AAcQAYvz4uuc/QACBeSAOQAAx/P75/X/ukY//AQIILHXhz///lZe//wfJAgQQWOBui9D/P78t/6ftffcfIIAYYKbA9AIEEIjDWnPtx3+YIEAAMXz7/P7/75+v/mcADQQJAAQQ0HTt/y9nqv73W/caLAAQQDAzWC8CbWq89et//fWf/5HNBAgguIJzIKdc+v6/7Py3/8Wnv/wvPPkZrAgggMAKfv+c8P/f+8r//x+mAZ03/X/g5nf/sw68BysACCCIH78p///zSeb/n4ci/39d4P+/4+f//0d//QcrAAggFH8gY5A4CAMEEFxB0+1f/xtu/vxfc+X7f5CDYYoAAgiuoP7Gz//VV378r7j4HdkkVoAAgisA6Sy/8O1/ydmvYB+c+g02hRUggBgaw6T+g4Iegq//B/Fzj376fwLiSFaAAAIr+HI17f//l4X//9+JAyvIPPjh/3GoAoAAAit4MEns/71Gof+f1hmCFaQCownqTVaAAAIr+PNb4f+fFxL//9wUACsAScIUAAQQA8y/IA7IsSAvgvAFKD4PxdjCCIQBAgjDgAvQSK0DRmrtNWDQXAUFzTewxjNAn5/8/R/FIIAAwjAAZFsdMEFVAcMUFPkgzaAEUAoKvlOfkYMQ7AWAAAJrBvmLEC4Aasw/DsTHPiG7ghUggOAG/PkFTCG/p/3//6P///+PLf//vwamrsc5///+WQc2IHLX+//Zhz/+zz4EjwKwAQABBDfg90/d/w+mSvx/DEztPy+G//9/K/r//6vBwBhoBhvgv/HN//T97/9n7Hv//xiSAQABhDDgl8b/B33C/++3C/6/38T//34d7//7Vdz//0Kjzm/dq/9pe979T939Fp6UQQYABBDRYSAZdghrkgcIMAD5xMj+kGsEXgAAAABJRU5ErkJggg%3D%3D%27%3B%0A%20%7D%3B%20break%3B%0Acase%202%3A%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC%27%3B%0A%20%7D%3B%20break%3B%0Acase%203%3A%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACdklEQVR42mL4//8/g3zm6f8AAcQAYvz69es/QACBeSAOQAAx/Pnz5//Z20/+AwQQWOrHv///n7x89R8kCxBAYIEuXdb/f//+/X/w8oP/AAHEADMFphcggEAc1pdv3vyHCQIEEMPPnz//gwy8dPcpWAAggMCmnzp16v+Rqw/BAgABBDOD9RfQpncf3v1/9RahHSQHEEBwBd+BCh4DnXLv6Yv/Nx89/3/l/jOwIoAAAisAGXv9+vX/MOedvvn4//Frj8AKAAII7keQBAj//v37//M///8/+/0frAAggFD8gYxB4iAMEEBwBR8+vvv/5v1bYJC8/v/733+4IoAAgit4/e7t/+evX/9/9OIVskmsAAEEV/D01ev/D56//H/78Yv/1x48+//uD9gUVoAAYlizZg04pGAYxD8PjIbXUAUAAQRWMMmA9f+VK1f+dwK9CeKfuP7o/0uoAoAAAivo02f9f+7cuf9tOhAFh4DR9BziTVaAAAIrgIUBCIP4IEloOLACBBADzL8gDsixIC+C4uUnFP+AYmxhBMIAAYRhwE9wpL79/wYYLKCIfQEMmofPIUHz6e///2///EcxCCCAMAwA2fYCmKCeATWC0uFDYNDdf/by/50nL/5fBQbf5ftP/7//CzeEFSCAwJpB/iKErwJTz6V7T/9fBCZMJFewAgQQ3ABQAE0BBjcoyCcAQxUUsj16rP///fsHNuAcMG7OAFPZqRuP/79CMgAggOAGgCIRpBEUX6BkCYqWDh1WeMiD4u4oMBeAcsILJAMAAgjFgF6gjSDNII2gOG3RRhhw+MrD/wcvPfi//+J9eFIGGQAQQESHAa4kDxBgAMjdAQviliYiAAAAAElFTkSuQmCC%27%3B%0A%20%7D%3B%20break%3B%0A%7D%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B

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

Yan, что-то у тебя на сайте оформление полетело... черные буквы на тёмно синем фоне плохо смотрятся...

Dark-Demon

а нафига несколько альбомов? там же можно дерево папок соорудить...

кхм... а тормоза не мешают? :whistle:

Yan

var path='C:\\Program Files\\Proxomitron\\Proxomitron.exe';
var arguments=['Dimanish.cfg'];

var file = Components.classes['@mozilla.org/file/local;1']
    .createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);
file.initWithPath(path);
process.init(file);
process.run(false,arguments,arguments.length);

Proxomitron ругается:
http://forum.mozilla.ru/uploaded/pr1212s.png
и запускается с настройками по-умолчанию.
При этом Firefox виснет пока не закроешь Proxomitron.

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

Я поставлю галочку "Не показывать больше".

Можно ещё добавить к сообщению кнопку "настроить сейчас", которая откроет окно с кнопками.

А вообще, имхо, стоит отказаться от контекстной менюшки. Для настроек кнопок юзать спец менеджер, а в остальном они должны вести себя как самые обычные кнопки.

А по мне, так наоборот, контекстное меню - самый удобный способ управления кнопками. Кнопку можно отредактировать в пару кликов, и тут же проверить работоспособность.

Имхо, скоро появятся странички с большим количеством кнопок, доступных для установки(эта например). И пользователю не придётся делать кнопки самому, только пользоватся ими.
Идея с менеджером не такая уж и плохая. Можно будет увидеть сразу все кнопки, установленные расширением, быстро удалить, отредактировать их. В меню можно оставить один пункт "Manage Custom Buttons".

После установки, расширение не появляется в менеджере расширений. FF 2.0a3

Отличное расширение.

после того как настраиваю тулбар все меню остается серым (не активным)
при отключении расширения все норм.
это только у меня так?

fit to width - выравнивает текущую страницу по ширине окна. Полезно для убирания горизонтального скролла на некоторых сайтах при открытом сайдбаре.

Код:

custombutton://fit%20to%20width%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAFVBMVEX///8AzP8AAAAAzP8Amf8AAMwAAACWs84cAAAAB3RSTlMAd3f/////1grLHQAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADA1LzI4LzA2GvIWfQAAAEpJREFUeJxjYMAErKGhgRCGi0uIAJjhbBxiCGO4AIUUgIzQ0AAmhiQgw9gkQI0hTRXECEpDiChAGExgXUAGxEAXlwCIFUDtWOwGAHj3ENTzyS3QAAAAAElFTkSuQmCC%5D%5Bvar%20s%3Dcontent.document.styleSheets%5B0%5D%3B%0As.insertRule%28%27*%20%7Bmin-width%3A0%21important%3B%20white-space%3Anormal%21important%3B%20margin%3A0%21important%3B%20padding%3A0%21important%3B%20float%3Anone%3B%7D%27%2C0%29%3B%0As.insertRule%28%27div%2Ctable%2Ctbody%2Ctr%2Ctd%2Cp%2Col%2Cul%2Ch1%2Ch2%2Ch3%2Chr%20%7Bmax-width%3A99%25%21important%3B%7D%27%2C0%29%3B%0As.insertRule%28%27table%2Ctbody%2Ctr%2Ctd%20%7Bdisplay%3Ablock%21important%7D%27%2C0%29%3B%0A%0Avar%20i%3D%20content.document.images%3B%0Afor%20%28var%20j%3D0%3B%20j%3Ci.length%3B%20j++%29%20%7B%0A%20%20var%20k%3D%20content.window.innerWidth/i%5Bj%5D.width*.95%3B%0A%20%20if%20%28k%3C1%29%20%7Bi%5Bj%5D.width*%3Dk%3B%20i%5Bj%5D.height*%3Dk%3B%7D%3B%0A%7D%0A%0A%0A%5D%5B

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

Lain_13

Ошибку локализовал и исправил, дело в том, что 1я строка была пустой, а это, видимо, недопустимо. Просто удаляем переход на новую строку в первой строке и все будет нормально работать.

установить мою модификацию (версия 0.0.1.1).

Так же там изменен стиль оформления данных о плагине. Данные о дате и времени билда перемещены в окно информации о претензии. В окне расширений виден ТОЛЬКО номер билда. Кстати, обычно в названии плагина номер его версии вообще не пишут, для этого есть поле "версия". В дальнейем наверное информацию о версии и билде желательно размещать там и только там (иначе в окне информации о плагине заголовок просто НЕ ВЛЕЗАЕТ в окно).

Гм. Может это, с самодеятельностью чуток поаккуратнее? :)
Я понимаю, что есть время, желание, хочется помочь - это всегда приветствуется. Но что касается выпуска новых версий - это всё-таки моя прерогатива.
Нехорошо как-то получается. Я еще 0.0.1 до финала не довел, а ты уже 0.0.1.1 выпустил. Вот поставит пользователь себе твою 0.0.1.1, и будет думать, что у него стоит последняя версия, в то время как последней на самом деле будет 0.0.1 final. (0.0.1<0.0.1.1). К тому же я в финальных версиях дату сборки уберу, совсем путаница будет.
Что касается стиля билда - так надо, я так решил, и мне так удобнее.
Ну и самое важное: твоя сборка в Firefox 1.5.0.x не работает...

Dimanish

Proxomitron ругается:
...
и запускается с настройками по-умолчанию.
При этом Firefox виснет пока не закроешь Proxomitron.

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

petrovich

Можно ещё добавить к сообщению кнопку "настроить сейчас", которая откроет окно с кнопками.

Да, я так и хотел сделать.

Идея с менеджером не такая уж и плохая. Можно будет увидеть сразу все кнопки, установленные расширением, быстро удалить, отредактировать их. В меню можно оставить один пункт "Manage Custom Buttons".

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

После установки, расширение не появляется в менеджере расширений. FF 2.0a3

Спасибо, посмотрю, что они там поменяли..

Cwer

после того как настраиваю тулбар все меню остается серым (не активным)
при отключении расширения все норм.
это только у меня так?

Нет, должно быть всё нормально.
Какие расширения установлены?
На новом профиле то же самое?

Dimanish

И еще, кнопка Scrapbook (и видимо остальные также) перестает работать после того, как открываешь окно "Настройка панелей инструментов", в котором находятся все кнопки. Стоит открыть окно редактирования кнопки и нажать "OK" или перезапустить браузер - все становится нормально.

Как исправить баг не знаю, но можно задавать обработчик onclick не через свойство, а через атрибут. Т.е. вместо:


Неправильно:

this.onclick=function(event){
switch (event.button){
  case 0:alert('левая кнопка');break;
  case 1:alert('средняя кнопка');break;
}
}

писать надо так:


Правильно:

this.onclickFunction=function(event){
switch (event.button){
  case 0:alert('левая кнопка');break;
  case 1:alert('средняя кнопка');break;
}
}
this.setAttribute('onclick','this.onclickFunction(event);');

Так обработка onclick пропадать не будет.

Yan
Спасибо за ответ.

Ещё раз: отличная работа.

Ну и самое важное: твоя сборка в Firefox 1.5.0.x не работает...

Подтверждаю.

Dimanish написал:

Yan
...
Proxomitron ругается:
...
и запускается с настройками по-умолчанию.
При этом Firefox виснет пока не закроешь Proxomitron.

Надо указать путь к конфигурационному файлу, т. е., если он в каталоге proxomitron'а, то

...
var arguments=['C:\\Program Files\\Proxomitron\\Dimanish.cfg'];
...

А опишите собствено говоя для чего данное расширение

Anton

Надо указать путь к конфигурационному файлу, т. е., если он в каталоге proxomitron'а, то

Точно, спасибо. Странно, что из командной строки без пути запускается, а из FF-нет.

petrovich

После установки, расширение не появляется в менеджере расширений. FF 2.0a3

Не подтверждаю. Скачал FF 2.0a3, создал новый профиль - всё успешно установилось. Другие расширения ставятся успешно?

WaRdeN69

А опишите собствено говоя для чего данное расширение

Yan написал:

Описание: Позволяет добавлять собственные кнопки на панели инструментов.

Что-то не ясно? :)

из командной строки без пути запускается, а из FF-нет.

У меня и из командной строки не запускается без указания пути.



p.s. :blush: хочется шрифт вроде Courier и tab/shift-tab на отступы, а в userchrome лень не пускает...

Не подтверждаю. Скачал FF 2.0a3, создал новый профиль - всё успешно установилось. Другие расширения ставятся успешно?

Это мой косяк. Раньше в Firefox расширения сортировались соответственно порядку установки(первым поставил - первым в списке), теперь по алфовиту. Вот не туда и посмотрел. Всё нормально, расширение в списке присутствует.

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

так можно такое сотворить или нет?

petrovich написал:

Yan
Спасибо за ответ.

Ещё раз: отличная работа.

Ну и самое важное: твоя сборка в Firefox 1.5.0.x не работает...

Подтверждаю.

Ну вот! Меня разбанили. Сам виноват, много оффтопика...
1. Искренне извинияюсь перед автором этого замечательного расширения и перед всеми остальными участниками форума, за свое наглое вмешательство.
2. Да, действительно не работает, потому, что я лопухнулся и сохранил chrome.manifest и install.rdf в формате UTF-8... С ЗАГОЛОВКОМ... А это 3 кракозябры, на которые ФФ2.0 не обращает внимания, а вот ФФ1.5 от этого клинит по черному.
3. Пока ты не выпустил финальную версию выкладываю Lain_fix_2. По крайней мере исправлю свой баг Ж).
4. Жду Custom_Buttons_0.0.1_final :). Да и все остальные, я думаю, тоже.

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

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

Dark-Demon написал:

...как получить содержимое буфера обмена?

http://forum.mozilla.ru/viewtopic.php?pid=77068#p77068
(http://xulplanet.com/tutorials/xultu/clipboard.html)

Спасибо, вот что получилось...

Код:

custombutton://BB%3A%20%u043F%u043E%u043B%u0443%u0436%u0438%u0440%u043D%u044B%u0439%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAQABAAAAg4AAMIHEiwoMGDCBMaBMCwIcOEDQVGPDhx4sKHASwWdKhxI8aOAytivAhA4kiCHEEqXMmypcuBAQEAOw%3D%3D%5D%5B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bb%5D%22%3B%0Avar%20close%3D%22%5B/b%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%0Aif%28event.button%3D%3D1%29%0A%20%20%7B%0Avar%20clip%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.getService%28Components.interfaces.nsIClipboard%29%3B%0Avar%20trans%20%3D%20Components.classes%5B%22@mozilla.org/widget/transferable%3B1%22%5D.createInstance%28Components.interfaces.nsITransferable%29%3B%0Atrans.addDataFlavor%28%22text/unicode%22%29%3B%0Aclip.getData%28trans%2Cclip.kGlobalClipboard%29%3B%0Avar%20str%20%3D%20new%20Object%28%29%3B%0Avar%20strLength%20%3D%20new%20Object%28%29%3B%0Atrans.getTransferData%28%22text/unicode%22%2Cstr%2CstrLength%29%3B%0Aif%20%28str%29%20str%20%3D%20str.value.QueryInterface%28Components.interfaces.nsISupportsString%29%3B%0Aif%20%28str%29%20pastetext%20%3D%20str.data.substring%280%2CstrLength.value%20/%202%29%3B%0A%20%20%7D%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

Код:

custombutton://BB%3A%20%u043F%u043E%u0434%u0447%u0435%u0440%u043A%u043D%u0443%u0442%u044B%u0439%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAHt7ewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAIALAAAAAAQABAAAAg+AAUIHEiwoMGDBwEoBCBgIcOEDxtGNKhwYEWEFyUi1CgwI8WIHgtmDElQYQABAUiWdLix5UeHC13KnElTYEAAOw%3D%3D%5D%5B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bu%5D%22%3B%0Avar%20close%3D%22%5B/u%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%0Aif%28event.button%3D%3D1%29%0A%20%20%7B%0Avar%20clip%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.getService%28Components.interfaces.nsIClipboard%29%3B%0Avar%20trans%20%3D%20Components.classes%5B%22@mozilla.org/widget/transferable%3B1%22%5D.createInstance%28Components.interfaces.nsITransferable%29%3B%0Atrans.addDataFlavor%28%22text/unicode%22%29%3B%0Aclip.getData%28trans%2Cclip.kGlobalClipboard%29%3B%0Avar%20str%20%3D%20new%20Object%28%29%3B%0Avar%20strLength%20%3D%20new%20Object%28%29%3B%0Atrans.getTransferData%28%22text/unicode%22%2Cstr%2CstrLength%29%3B%0Aif%20%28str%29%20str%20%3D%20str.value.QueryInterface%28Components.interfaces.nsISupportsString%29%3B%0Aif%20%28str%29%20pastetext%20%3D%20str.data.substring%280%2CstrLength.value%20/%202%29%3B%0A%20%20%7D%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

Код:

custombutton://BB%3A%20%u043A%u0443%u0440%u0441%u0438%u0432%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAHt7e4SEhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAMALAAAAAAQABAAAAgyAAcIHEiwoMGDCBMqBMCQoUKBDAU8HBDA4USGASZWBDBxAEaNFh9+XNgwZMeTKFMqDAgAOw%3D%3D%5D%5B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bi%5D%22%3B%0Avar%20close%3D%22%5B/i%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%0Aif%28event.button%3D%3D1%29%0A%20%20%7B%0Avar%20clip%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.getService%28Components.interfaces.nsIClipboard%29%3B%0Avar%20trans%20%3D%20Components.classes%5B%22@mozilla.org/widget/transferable%3B1%22%5D.createInstance%28Components.interfaces.nsITransferable%29%3B%0Atrans.addDataFlavor%28%22text/unicode%22%29%3B%0Aclip.getData%28trans%2Cclip.kGlobalClipboard%29%3B%0Avar%20str%20%3D%20new%20Object%28%29%3B%0Avar%20strLength%20%3D%20new%20Object%28%29%3B%0Atrans.getTransferData%28%22text/unicode%22%2Cstr%2CstrLength%29%3B%0Aif%20%28str%29%20str%20%3D%20str.value.QueryInterface%28Components.interfaces.nsISupportsString%29%3B%0Aif%20%28str%29%20pastetext%20%3D%20str.data.substring%280%2CstrLength.value%20/%202%29%3B%0A%20%20%7D%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

Код:

custombutton://BB%3A%20%u0446%u0438%u0442%u0430%u0442%u0430%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACCklEQVR42mL8//8/AyUAIICYGCgEAAFEsQEAAUSxAQABxAIiurq6OM+cOZPPx8fHaWZm1rp8+fLEDx8+aGVmZrZKSEgwT5s2rRPIFwKyj/38+fPbmzdvvHh5eV/v27cvGiCAwAY8fPgwfvfu3Q3e3t5Vx48fD7hy5UonNzf3opcvX34FSiuePHkyEGgAj6ys7P9v3759fPv2rSsPD88nkF6AAAJ7YceOHbFSUlLb+fn5Jx09ejRORkbmkomJSVVtbe1XZmZmVmBMMYLUsbOzf/n37x9YDysr63cQDRBAYM6TJ09kfv/+fXbz5s18QNO1vn//fnHNmjVfQHKioqLP/fz85ggKCr4DGsAVEhKyXkND4yJQPTtIHiCAGKDp4BnQSYcUFBSagBoeA/k3gC5Ki42N5QXJL1y4kEdVVfWks7PzBhA/NTW1AqjuHYgNEECwWPj79etXWyYmpkigLT+AfHU2NrbYI0eO8IEkga7i//HjhxQQXwfxgeJqwAB9BWIDBBDMAHagZoa/f/8yAp3GBhL4/Pnz36CgoH8LFizgX7Vq1XSggQympqbLBQQEEq5fvx6hq6u7AqQOIIDAsQAMtBPAwBIGmvoAaAsH0GnvhYWFL8rJyf3g5OQUBrrun7q6egGQfQsY1VE6OjozgXITQXoBAoiR0rwAEEAUp0SAAKLYAIAAotgAgAADANuDzfQSUmlqAAAAAElFTkSuQmCC%5D%5B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bquote%5D%22%3B%0Avar%20close%3D%22%5B/quote%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%0Aif%28event.button%3D%3D1%29%0A%20%20%7B%0Avar%20clip%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.getService%28Components.interfaces.nsIClipboard%29%3B%0Avar%20trans%20%3D%20Components.classes%5B%22@mozilla.org/widget/transferable%3B1%22%5D.createInstance%28Components.interfaces.nsITransferable%29%3B%0Atrans.addDataFlavor%28%22text/unicode%22%29%3B%0Aclip.getData%28trans%2Cclip.kGlobalClipboard%29%3B%0Avar%20str%20%3D%20new%20Object%28%29%3B%0Avar%20strLength%20%3D%20new%20Object%28%29%3B%0Atrans.getTransferData%28%22text/unicode%22%2Cstr%2CstrLength%29%3B%0Aif%20%28str%29%20str%20%3D%20str.value.QueryInterface%28Components.interfaces.nsISupportsString%29%3B%0Aif%20%28str%29%20pastetext%20%3D%20str.data.substring%280%2CstrLength.value%20/%202%29%3B%0A%20%20%7D%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

Код:

custombutton://BB%3A%20%u043A%u043E%u0434%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAA60lEQVR42mL8//8/AyUAIICYGCgEAAFEsQEAAYQNKQHxfyieABWrRRJTQlYMEEBYNc9YtR2MoRoYsIjBDQEIIKyavTOb0RWC5ZJrJ2PIAQQQTs2g2EHH2AwBCCCQIIeNkweGzTgMwHAJQACBBLkUdC3BArqOgSDBSAaIE7AZADdk6dYD/+W0Tf8DBBAoGhk5GX+AZbx8A0DUMjwhDRK/C9TMsGzLYYZHV08zAAQQiqkgV5T3LcQV0nCbkb0KEEAYCnAYglMzQABhjUo0QxjwaQYIIEIpMQcqNgFXSgQIIEZKcyNAAFGcmQACDAB0jLqYK4uYbwAAAABJRU5ErkJggg%3D%3D%5D%5B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bcode%5D%22%3B%0Avar%20close%3D%22%5B/code%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%0Aif%28event.button%3D%3D1%29%0A%20%20%7B%0Avar%20clip%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.getService%28Components.interfaces.nsIClipboard%29%3B%0Avar%20trans%20%3D%20Components.classes%5B%22@mozilla.org/widget/transferable%3B1%22%5D.createInstance%28Components.interfaces.nsITransferable%29%3B%0Atrans.addDataFlavor%28%22text/unicode%22%29%3B%0Aclip.getData%28trans%2Cclip.kGlobalClipboard%29%3B%0Avar%20str%20%3D%20new%20Object%28%29%3B%0Avar%20strLength%20%3D%20new%20Object%28%29%3B%0Atrans.getTransferData%28%22text/unicode%22%2Cstr%2CstrLength%29%3B%0Aif%20%28str%29%20str%20%3D%20str.value.QueryInterface%28Components.interfaces.nsISupportsString%29%3B%0Aif%20%28str%29%20pastetext%20%3D%20str.data.substring%280%2CstrLength.value%20/%202%29%3B%0A%20%20%7D%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

Код:

custombutton://BB%3A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABpUlEQVR42p2TP0gbURzHPxebwyEJVBw6aKZAxOUcbYYOpS0IRSgljVBMOLgxZA64SBY30RDp0HuEDraBQodChrQI/UNj3XRRoreYQfo3NF4kSo9ct4dHcsX4pvd77/v9/B7vva8CUKlU3E6nw7DDMAxFMU3TTSQSxGKxocyWZVGv1wkAvmYhBJqmoaoqmqYhhMBxHLrdrvTc8OsghODt6zXq7zZQ1RG6Z39YNPI4jkM6nZa6gB+gWCzy8sUGI73vXPz+SOB8j2crjyiVSh6dPIGqqn2Qm5P3aO0vyzoSHqXRaAwGAHxb0nFOmrKeKG8xNr3MZmmBubtTnNrnxONxf4Bz0uTv8ZFH8OnrLndmZ3j/ymD1+Wey2axnP/C/pyoUCuwc/gQgV/jCw8c5MpnM1QDlZpv780/40bLR8+tEo1F0Xe/T+QJ+PXjKwXELgPFbk9RqNarVap/OcwcT5S05317N8ebDvqz1/DrJZJJ2uz0YcDkLoVCI2zNTV/rSEuC6rly0bXuguNfrARAMBr0Ay7KuFaZIJIICYJqmO2yUw+EwqVRK+QdtIZCYwfQIRQAAAABJRU5ErkJggg%3D%3D%5D%5B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bimg%5D%22%3B%0Avar%20close%3D%22%5B/img%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%0Aif%28event.button%3D%3D1%29%0A%20%20%7B%0Avar%20clip%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.getService%28Components.interfaces.nsIClipboard%29%3B%0Avar%20trans%20%3D%20Components.classes%5B%22@mozilla.org/widget/transferable%3B1%22%5D.createInstance%28Components.interfaces.nsITransferable%29%3B%0Atrans.addDataFlavor%28%22text/unicode%22%29%3B%0Aclip.getData%28trans%2Cclip.kGlobalClipboard%29%3B%0Avar%20str%20%3D%20new%20Object%28%29%3B%0Avar%20strLength%20%3D%20new%20Object%28%29%3B%0Atrans.getTransferData%28%22text/unicode%22%2Cstr%2CstrLength%29%3B%0Aif%20%28str%29%20str%20%3D%20str.value.QueryInterface%28Components.interfaces.nsISupportsString%29%3B%0Aif%20%28str%29%20pastetext%20%3D%20str.data.substring%280%2CstrLength.value%20/%202%29%3B%0A%20%20%7D%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

Код:

custombutton://BB%3A%20%u0433%u0438%u043F%u0435%u0440%u0441%u0441%u044B%u043B%u043A%u0430%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAKIAAGZmZgAAAP///8zMzP///////////////yH5BAEAAAQALAAAAAAQABAAAAMxSLrc/jBKCYK16lpAqhBDaH3hEHimpoqBEJhkWJkpq17iXFZnaXK8S0bDmRiPyGQyAQA7%5D%5B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Burl%5D%22%3B%0Avar%20close%3D%22%5B/url%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20theBox.value.substring%28startPos%2C%20endPos%29%3B%0Aif%28event.button%3D%3D1%29%0A%20%20%7B%0Avar%20clip%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboard%3B1%22%5D.getService%28Components.interfaces.nsIClipboard%29%3B%0Avar%20trans%20%3D%20Components.classes%5B%22@mozilla.org/widget/transferable%3B1%22%5D.createInstance%28Components.interfaces.nsITransferable%29%3B%0Atrans.addDataFlavor%28%22text/unicode%22%29%3B%0Aclip.getData%28trans%2Cclip.kGlobalClipboard%29%3B%0Avar%20str%20%3D%20new%20Object%28%29%3B%0Avar%20strLength%20%3D%20new%20Object%28%29%3B%0Atrans.getTransferData%28%22text/unicode%22%2Cstr%2CstrLength%29%3B%0Aif%20%28str%29%20str%20%3D%20str.value.QueryInterface%28Components.interfaces.nsISupportsString%29%3B%0Aif%20%28str%29%20pastetext%20%3D%20str.data.substring%280%2CstrLength.value%20/%202%29%3B%0A%20%20%7D%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

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

Имхо, в расширении необходимо сделать common-секцию для скриптов, т. е., скриптов, общих для всех кнопок.



Две кнопки для преобразования текстовых ссылок 'custombutton://' в реальные ссылки:

Код:

custombutton://%u041F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u0442%u044C%20%u043A%u043E%u0434%u044B%20custombuttons%20%u0432%20%u0441%u0441%u044B%u043B%u043A%u0438%20%28%u0441%u0442%u0440%u043E%u0433%u043E%u0435%20%u043F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u043D%u0438%u0435%29%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfWBgMQBxbn9GxKAAAAB3RJTUUH1gYDEBMzV1+MKAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADNQTFRF////mZmZMzMzZmZmzMzM/8yZ/5mZ/8xm/8wA///M/8wz/8zMzJmZ/5kA/5lmZmYz/5kzCyXdoQAAAAF0Uk5TAEDm2GYAAAB6SURBVHjaTc5bFsIgDATQCZOIJdZ2/6t1oNHKRwj3kAcaeZAVDACRXdcWAfiEI/rogT5GFCg9E3kqLGDu+1slmVXCiHwBNvMLsA7d/IY5QEO9YNMYNdRCVj/6c24iaQURD1xCB5qZ2uEWPVevryj+ARvXOj+oxBrrCD73jALvj0npfgAAAABJRU5ErkJggg%3D%3D%5D%5Bvar%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0Avar%20cbcodes%20%3D%20doc.%20evaluate%0A%28%0A%20%20%20%20%22//text%28%29%5Bstarts-with%28.%2C%27custombutton%3A//%27%29%5D%22%2C%0A%20%20%20%20doc%2C%20null%2C%20XPathResult.%20ORDERED_NODE_SNAPSHOT_TYPE%2C%20null%0A%29%3B%0Avar%20i%2C%20cn%2C%20cnt%2C%20cnf%2C%20nn%2C%20t%2C%20titletext%3B%0Afor%20%28i%20%3D%200%3B%20i%20%3C%20cbcodes.%20snapshotLength%3B%20i++%29%0A%7B%0A%20%20%20%20cn%20%3D%20cbcodes.%20snapshotItem%20%28i%29%3B%0A%20%20%20%20cnt%20%3D%20cn.%20textContent%3B%0A%20%20%20%20cnf%20%3D%20cnt.%20split%20%28%22%255D%255B%22%29%3B%0A%20%20%20%20if%20%28cnf.%20length%20%21%3D%204%29%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20titletext%20%3D%20unescape%20%28cnf%20%5B0%5D.%20replace%20%28/custombutton%3A%5C/%5C//%2C%20%22%22%29%29%3B%0A%20%20%20%20title%20%3D%20title.%20replace%20%28/%25%28u.%7B4%7D%29/g%2C%20%22%5C%241%22%29%3B%0A%20%20%20%20var%20converter%20%3D%20Components.classes%5B%27@mozilla.org/intl/texttosuburi%3B1%27%5D.createInstance%28Components.interfaces.nsITextToSubURI%29%3B%0A%20%20%20%20title%20%3D%20converter.UnEscapeAndConvert%28%27windows-1251%27%2C%20title%29%3B%0A%20%20%20%20nn%20%3D%20doc.%20createElement%20%28%22a%22%29%3B%0A%20%20%20%20nn.%20setAttribute%20%28%22href%22%2C%20cn.%20textContent%29%3B%0A%20%20%20%20t%20%3D%20doc.%20createElement%20%28%22img%22%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22src%22%2C%20unescape%20%28cnf%20%5B1%5D%29%20%7C%7C%20%22chrome%3A//custombuttons/skin/button.png%22%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22class%22%2C%20%22toolbarimg%22%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22title%22%2C%20titletext%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22alt%22%2C%20titletext%29%3B%0A%20%20%20%20nn.%20appendChild%20%28t%29%3B%0A%20%20%20%20cn.%20parentNode.%20replaceChild%20%28nn%2C%20cn%29%3B%0A%7D%5D%5B

Код:

custombutton://%u041F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u0442%u044C%20%u043A%u043E%u0434%u044B%20custombuttons%20%u0432%20%u0441%u0441%u044B%u043B%u043A%u0438%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfWBgMQBxbn9GxKAAAAB3RJTUUH1gYDEBMzV1+MKAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADNQTFRF////mZmZMzMzZmZmzMzM/8yZ/5mZ/8xm/8wA///M/8wz/8zMzJmZ/5kA/5lmZmYz/5kzCyXdoQAAAAF0Uk5TAEDm2GYAAAB6SURBVHjaTc5bFsIgDATQCZOIJdZ2/6t1oNHKRwj3kAcaeZAVDACRXdcWAfiEI/rogT5GFCg9E3kqLGDu+1slmVXCiHwBNvMLsA7d/IY5QEO9YNMYNdRCVj/6c24iaQURD1xCB5qZ2uEWPVevryj+ARvXOj+oxBrrCD73jALvj0npfgAAAABJRU5ErkJggg%3D%3D%5D%5Bvar%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0Avar%20cbcodes%20%3D%20doc.%20evaluate%0A%28%0A%20%20%20%20%22//text%28%29%5Bcontains%28.%2C%27custombutton%3A//%27%29%5D%22%2C%0A%20%20%20%20doc%2C%20null%2C%20XPathResult.%20ORDERED_NODE_SNAPSHOT_TYPE%2C%20null%0A%29%3B%0Avar%20i%2C%20j%2C%20cn%2C%20cnt%2C%20cnf%2C%20nn%2C%20t%2C%20titletext%3B%0Afor%20%28i%20%3D%200%3B%20i%20%3C%20cbcodes.%20snapshotLength%3B%20i++%29%0A%7B%0A%20%20%20%20cn%20%3D%20cbcodes.%20snapshotItem%20%28i%29%3B%0A%20%20%20%20cnt%20%3D%20cn.%20textContent.%20match%20%28/custombutton%3A%5C/%5C/.+/%29%3B%0A%20%20%20%20for%20%28j%20%3D%200%3B%20j%20%3C%20cnt.%20length%3B%20j++%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20cnf%20%3D%20cnt%20%5Bj%5D.%20split%20%28%22%255D%255B%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cnf.%20length%20%21%3D%204%29%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20titletext%20%3D%20unescape%20%28cnf%20%5B0%5D.%20replace%20%28/custombutton%3A%5C/%5C//%2C%20%22%22%29%29%3B%0A%20%20%20%20%20%20%20%20title%20%3D%20title.%20replace%20%28/%25%28u.%7B4%7D%29/g%2C%20%22%5C%241%22%29%3B%0A%20%20%20%20%20%20%20%20var%20converter%20%3D%20Components.classes%5B%27@mozilla.org/intl/texttosuburi%3B1%27%5D.createInstance%28Components.interfaces.nsITextToSubURI%29%3B%0A%20%20%20%20%20%20%20%20title%20%3D%20converter.UnEscapeAndConvert%28%27windows-1251%27%2C%20title%29%3B%0A%20%20%20%20%20%20%20%20nn%20%3D%20doc.%20createElement%20%28%22a%22%29%3B%0A%20%20%20%20%20%20%20%20nn.%20setAttribute%20%28%22href%22%2C%20cn.%20textContent%29%3B%0A%20%20%20%20%20%20%20%20t%20%3D%20doc.%20createElement%20%28%22img%22%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22src%22%2C%20unescape%20%28cnf%20%5B1%5D%29%20%7C%7C%20%22chrome%3A//custombuttons/skin/button.png%22%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22class%22%2C%20%22toolbarimg%22%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22title%22%2C%20titletext%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22alt%22%2C%20titletext%29%3B%0A%20%20%20%20%20%20%20%20nn.%20appendChild%20%28t%29%3B%0A%20%20%20%20%20%20%20%20if%20%28j%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20cn.%20parentNode.%20replaceChild%20%28nn%2C%20cn%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20cn.%20parentNode.%20appendChild%20%28nn%29%3B%0A%20%20%20%20%7D%0A%7D%5D%5B

первая работает только в тех текстовых узлах, текст которых начинается с 'custombutton://' (как в этой теме), т. е.

Код:

[code]custombutton://...[/code]

но не в

Код:

[code]any text ... custombutton://...[/code]

вторая кнопка ищет все 'custombutton://' в текстовых узлах и заменяет соответствующие текстовые узлы набором ссылок.

скриншот, показывающий пример работы: http://forum.mozilla.ru/uploaded/cbtext … ertor2.png

Неплохо бы прикрутить поддержку Thunderbird.

Anton, за кнопки спасибо. Но есть бага. Твой же собственный пост они не обработали! (предидущий про ббкод отлично). В чем же фокус?

Lain_13 написал:

...есть бага. Твой же собственный пост они не обработали! (предидущий про ббкод отлично). В чем же фокус?

Хм. Не знаю. У меня всё работает, вот скрин: http://forum.mozilla.ru/uploaded/cbtext … ertor3.png. Подробней можно ?

Anton, прикольно :) только надобно иконку подправить, а то у нее вместо белого цвета - прозрачность.
а можешь сделать кнопку, которая бы кроме этих ещё и прочие текстовые ссылки преобразовывала бы в гиперссылки?
с примерно таким регекспом:
/[A-Za-z]+:\/\/\S+/
и назвать ее я думаю стоит "найти ссылки".

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

А нельзя ли как-нибудь сделать кнопочку для запуска jar-файла из chrome?

stoneflash, а закладки не годятся?

Простенький редактор кода для расширения: http://forum.mozilla.ru/uploaded/codeeditor.zip
xbl из архива "подшивается" через userChrome.css примерно так:

Код:

textbox#code,textbox#initCode
{
    -moz-binding: url("file://P:/xul/codeeditor.xml#code_editor_binding");
    font-family: monospace !important;
}

Клавиши:

Ctrl+Shift+AКомментирует или снимает комментарий текущей строки / выделения
TabВставляет символ табуляции / Табулирует выделение
Shift+TabСнимает уровень табуляции с текущей строки / выделения
EnterВставляет перевод строки и создаёт отступ, равный отступу предыдущей строки



Кстати, к вопросу

...как получить содержимое буфера обмена?

недавно обнаружил в browser.js функцию readFromClipboard. Так что, просто

Код:

var str = readFromClipboard ();



Кнопка, загружающая с помощью ILO только те изображения, которые попали в выделение:

Код:

custombutton://ILO%3A%20load%20images%20from%20selection%5D%5B%5D%5Bvar%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0Avar%20sel%20%3D%20doc.%20defaultView.%20getSelection%20%28%29%3B%0Avar%20r%20%3D%20sel.%20getRangeAt%20%280%29%3B%0Avar%20imgs%20%3D%20doc.%20evaluate%0A%28%0A%09%22//img%22%2C%0A%09doc%2C%20null%2C%20XPathResult.%20ORDERED_NODE_SNAPSHOT_TYPE%2C%20null%0A%29%3B%0Avar%20i%3B%0Afor%20%28i%20%3D%200%3B%20i%20%3C%20imgs.%20snapshotLength%3B%20i++%29%0A%09if%20%28r.%20intersectsNode%20%28imgs.%20snapshotItem%20%28i%29%29%29%0A%09%09ILO.%20loadImg%20%28imgs.%20snapshotItem%20%28i%29%29%3B%5D%5B

Anton написал:

Lain_13 написал:

...есть бага. Твой же собственный пост они не обработали! (предидущий про ббкод отлично). В чем же фокус?

Хм. Не знаю. У меня всё работает, вот скрин: http://forum.mozilla.ru/uploaded/cbtext … ertor3.png. Подробней можно ?

вот так вот у меня эта бага выглядит...
http://forum.mozilla.ru/uploaded/baga_w … placer.PNG

Lain_13 написал:

...
вот так вот у меня эта бага выглядит...

Поэкспериментировал с настройками браузера, ILO, форума - воспроизвести не удаётся. Так что никаких идей пока нет.

Anton

Две кнопки для преобразования текстовых ссылок 'custombutton://' в реальные ссылки:

Простенький редактор кода для расширения: http://forum.mozilla.ru/uploaded/codeeditor.zip

Класс. Очень удобно. Спасибо. Не против, что я включу твой код в расширение?

Новый build.
Именения:
- моноширинный шрифт
- англ. локализация
- xbl от Anton'а, делающий более удобным редактирование кода.

P.S. Сдавал сессию, времени не было..

Yan написал:

...Не против, что я включу твой код в расширение?

Конечно не против, забирай.

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

Anton
Я неправильно выразился — я имел в виду только xbl.

Рулёз, обновил (кода меньше=>должно быть ещё быстрее; вроде исправил глюк с "забыванием", когда кнопка переставала что-либо делать и требовала открытия редактора и последующего его закрытия кнопкой ОК):
B

Код:

custombutton://BB%3A%20%u043F%u043E%u043B%u0443%u0436%u0438%u0440%u043D%u044B%u0439%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAQABAAAAg4AAMIHEiwoMGDCBMaBMCwIcOEDQVGPDhx4sKHASwWdKhxI8aOAytivAhA4kiCHEEqXMmypcuBAQEAOw%3D%3D%5D%5Bthis.onclick%28%29%3B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bb%5D%22%3B%0Avar%20close%3D%22%5B/b%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

U

Код:

custombutton://BB%3A%20%u043F%u043E%u0434%u0447%u0435%u0440%u043A%u043D%u0443%u0442%u044B%u0439%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAHt7ewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAIALAAAAAAQABAAAAg+AAUIHEiwoMGDBwEoBCBgIcOEDxtGNKhwYEWEFyUi1CgwI8WIHgtmDElQYQABAUiWdLix5UeHC13KnElTYEAAOw%3D%3D%5D%5Bthis.onclick%28%29%3B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bu%5D%22%3B%0Avar%20close%3D%22%5B/u%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

I

Код:

custombutton://BB%3A%20%u043A%u0443%u0440%u0441%u0438%u0432%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAHt7e4SEhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAMALAAAAAAQABAAAAgyAAcIHEiwoMGDCBMqBMCQoUKBDAU8HBDA4USGASZWBDBxAEaNFh9+XNgwZMeTKFMqDAgAOw%3D%3D%5D%5Bthis.onclick%28%29%3B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bi%5D%22%3B%0Avar%20close%3D%22%5B/i%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

QUOTE

Код:

custombutton://BB%3A%20%u0446%u0438%u0442%u0430%u0442%u0430%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACCklEQVR42mL8//8/AyUAIICYGCgEAAFEsQEAAUSxAQABxAIiurq6OM+cOZPPx8fHaWZm1rp8+fLEDx8+aGVmZrZKSEgwT5s2rRPIFwKyj/38+fPbmzdvvHh5eV/v27cvGiCAwAY8fPgwfvfu3Q3e3t5Vx48fD7hy5UonNzf3opcvX34FSiuePHkyEGgAj6ys7P9v3759fPv2rSsPD88nkF6AAAJ7YceOHbFSUlLb+fn5Jx09ejRORkbmkomJSVVtbe1XZmZmVmBMMYLUsbOzf/n37x9YDysr63cQDRBAYM6TJ09kfv/+fXbz5s18QNO1vn//fnHNmjVfQHKioqLP/fz85ggKCr4DGsAVEhKyXkND4yJQPTtIHiCAGKDp4BnQSYcUFBSagBoeA/k3gC5Ki42N5QXJL1y4kEdVVfWks7PzBhA/NTW1AqjuHYgNEECwWPj79etXWyYmpkigLT+AfHU2NrbYI0eO8IEkga7i//HjhxQQXwfxgeJqwAB9BWIDBBDMAHagZoa/f/8yAp3GBhL4/Pnz36CgoH8LFizgX7Vq1XSggQympqbLBQQEEq5fvx6hq6u7AqQOIIDAsQAMtBPAwBIGmvoAaAsH0GnvhYWFL8rJyf3g5OQUBrrun7q6egGQfQsY1VE6OjozgXITQXoBAoiR0rwAEEAUp0SAAKLYAIAAotgAgAADANuDzfQSUmlqAAAAAElFTkSuQmCC%5D%5Bthis.onclick%28%29%3B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bquote%5D%22%3B%0Avar%20close%3D%22%5B/quote%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

CODE

Код:

custombutton://BB%3A%20%u043A%u043E%u0434%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAA60lEQVR42mL8//8/AyUAIICYGCgEAAFEsQEAAYQNKQHxfyieABWrRRJTQlYMEEBYNc9YtR2MoRoYsIjBDQEIIKyavTOb0RWC5ZJrJ2PIAQQQTs2g2EHH2AwBCCCQIIeNkweGzTgMwHAJQACBBLkUdC3BArqOgSDBSAaIE7AZADdk6dYD/+W0Tf8DBBAoGhk5GX+AZbx8A0DUMjwhDRK/C9TMsGzLYYZHV08zAAQQiqkgV5T3LcQV0nCbkb0KEEAYCnAYglMzQABhjUo0QxjwaQYIIEIpMQcqNgFXSgQIIEZKcyNAAFGcmQACDAB0jLqYK4uYbwAAAABJRU5ErkJggg%3D%3D%5D%5Bthis.onclick%28%29%3B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bcode%5D%22%3B%0Avar%20close%3D%22%5B/code%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

IMG

Код:

custombutton://BB%3A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABpUlEQVR42p2TP0gbURzHPxebwyEJVBw6aKZAxOUcbYYOpS0IRSgljVBMOLgxZA64SBY30RDp0HuEDraBQodChrQI/UNj3XRRoreYQfo3NF4kSo9ct4dHcsX4pvd77/v9/B7vva8CUKlU3E6nw7DDMAxFMU3TTSQSxGKxocyWZVGv1wkAvmYhBJqmoaoqmqYhhMBxHLrdrvTc8OsghODt6zXq7zZQ1RG6Z39YNPI4jkM6nZa6gB+gWCzy8sUGI73vXPz+SOB8j2crjyiVSh6dPIGqqn2Qm5P3aO0vyzoSHqXRaAwGAHxb0nFOmrKeKG8xNr3MZmmBubtTnNrnxONxf4Bz0uTv8ZFH8OnrLndmZ3j/ymD1+Wey2axnP/C/pyoUCuwc/gQgV/jCw8c5MpnM1QDlZpv780/40bLR8+tEo1F0Xe/T+QJ+PXjKwXELgPFbk9RqNarVap/OcwcT5S05317N8ebDvqz1/DrJZJJ2uz0YcDkLoVCI2zNTV/rSEuC6rly0bXuguNfrARAMBr0Ay7KuFaZIJIICYJqmO2yUw+EwqVRK+QdtIZCYwfQIRQAAAABJRU5ErkJggg%3D%3D%5D%5Bthis.onclick%28%29%3B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Bimg%5D%22%3B%0Avar%20close%3D%22%5B/img%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

URL

Код:

custombutton://BB%3A%20%u0433%u0438%u043F%u0435%u0440%u0441%u0441%u044B%u043B%u043A%u0430%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAKIAAGZmZgAAAP///8zMzP///////////////yH5BAEAAAQALAAAAAAQABAAAAMxSLrc/jBKCYK16lpAqhBDaH3hEHimpoqBEJhkWJkpq17iXFZnaXK8S0bDmRiPyGQyAQA7%5D%5Bthis.onclick%28%29%3B%5D%5Bthis.onclick%3Dfunction%28event%29%0A%7B%0Aif%28event.button%3C2%29%0A%7B%0Avar%20open%3D%22%5Burl%5D%22%3B%0Avar%20close%3D%22%5B/url%5D%22%3B%0Avar%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0Avar%20startPos%20%3D%20theBox.selectionStart%3B%0Avar%20endPos%20%3D%20theBox.selectionEnd%3B%0Avar%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0Avar%20oPosition%20%3D%20theBox.scrollTop%3B%0Avar%20oHeight%20%3D%20theBox.scrollHeight%3B%0Avar%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0Atext%20+%3Dopen+pastetext+close%3B%0Atext%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0AtheBox.value%20%3D%20text%3B%0AtheBox.selectionStart%20%3D%20startPos%3B%0AtheBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0Avar%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0AtheBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%7D%3B%0A%7D%3B

Насчёт преобразованием ссылок надо подумать - имхо, лучше не делать автоматическое распознавание

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

Dark-Demon

кода меньше=>должно быть ещё быстре

Хм, ты про что?

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

Кто исправил, ты?
Что-то не заметно.

Самое интересное, что кнопка Online\Offline работает после открытия/закрытия панели инструментов.
Странно.
custombutton://Online%5COffline%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH1AsRFQ8FNxF8qQAAAAlwSFlzAABOIAAATiABFn2Z3gAAAARnQU1BAACxjwv8YQUAAAJMSURBVHjajVJLiJJhFP1+/VPH9wNERXHAohEfCLaJgjAJgxIicBFtomULaedKZtOyhbpRlB4uahUkhGmQLcIoDbPJxERRVDQfqKmjqPxa949pmBjNLpzFvd+957uce7BSqfSi1WpdrtVqqFwuxx0OxzWE0AD9Z1CdTmeQRqOdmM/nlHQ6reRyuXOTybTg8XhbOI7v93q9xb8IcDqdTh2NRojNZqN6vY4Fg8Hd2Wy22+/3UaVSIZrN5h7Es0Qi4U2lUsc2wzudzgLDMAo0omq1ivx+P4KNEIvFQiKRCFepVEa5XG6E/M50OrVms9m9owSY3W6PgQYXyWH4sQ+/v4Kt9gFCBoMhl0gkJ61Wq1Amk6FAIPAlFotdgLkfhxt4PJ7rFArlynK5ZEA+A7w8aKAA6LlcTqbRaB5JpdLzoM8O1M4AXh8SkIrD8NMV+ixsNttPs9l8WygUnm2326RGE5L0Lw3Wqet2u01KpfIh6LFdKBRQJBIhisXiB3j6tJHA5XJdNRgMz4fDIR4Oh1EymRzk8/k3kN+D5+8bCcRi8X3wBe7z+RaZTOYrCPwYyk8AnWNnXEUwGAzkcELU7XYbMHwXSm8By5VOXLPBOb1ef0qtVnMFAgFOpVI/NhqN4apebFXRaDTuaLXadxaLRQgnRjBMwBXegwZxwDdwbgv8Mo5Go/GVBGSQDgTzPNDpdHpwIsZkMhE4EU0mk98Yj8fI6/VeWktwEDyFQnGDz+ff5HA4GtCFBw4lDYYIgkChUOjWJoI/sQXYBpwmSY/UP/8CL+z76C73PLQAAAAASUVORK5CYII%3D%5D%5BBrowserOffline.toggleOfflineStatus%28%29%3B%5D%5Bthis.pref%3D%27browser.offline%27%3B%0Athis.setState%3Dfunction%28%29%7B%0A%20var%20state%3Dthis.PS.getBoolPref%28this.pref%29%3B%0A%20if%20%28state%3D%3Dtrue%29%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH1AsRBRYGKT4newAAAAlwSFlzAABOIAAATiABFn2Z3gAAAARnQU1BAACxjwv8YQUAAAMPSURBVHjajVNrSFNhGH7P2XFnJzenW6bO5WUTRFPMhiCE17QMmjowK+hH+CcI8UeB9keUfkRQURCoKIEjyX5EiBooKBTOVPKamEHmZVPZ3P3u2XZm7/5NlOiD53C+93vf5718z0dsbm6OmEymGoPBAFtbW7q2trZ6AHDCfy5ee3u7ls/nxwQCAXJpaSk9Li4uUFFRwYnFYoaiKI/NZuP+RUDRNM1zu90gFAphb2+P0Gq1HSzLdtjtdtjZ2QkZjcYVXB/n5ua6FxYWTlRGmc1mjiAIEh1Br9dDb28vYEUQGxsLUqmUUiqVKrlcrsL9g8PDQ/Xa2tpKNAHR0tIyiTOojARjRjtmH8eqPAiJQCCQJycnZ6nVaolMJoO+vr4fk5OTZRjniCYRFyYktHYWFPykSfI+7hMixDUA9EhZWU99Skpdc3Pz1ODg4JFGo2HxrOpYC8MqlVhRWX5fceO6ovjVm4YnU7r31VYr72qtWlvYWHdL9nW6cTMvL85ktUZm5MMY+hgBQcc8yiwpVjAcC2V3NFWPve5PQoKwF9aU3mSCPsjJzUz4/nkURoOh0MbGxizGLB67xn3Dri7RaC5KS01UMkccpJ1PUqSmpVxgIAx+swUGxqag32Z3Li4vjzscjk6M+X2MYAcgYNjeHpIcWFUZ5+KV9FEYeKEQ+GxO6J/4xr3Q766urq+/xuE+Rf8/J64x8qkG8PP8fmfQ4UJh8OEICYJuHzgtVodRr29FlwlE+FQldiBJTnbWQMXlokYBSYAPSViXF/jhMORL4s8ofWyqJ0X2ZdtiOVXeRJdU8rL+WvlDIWb2ef3QrZs1k2FwNV3KVzI8Erxo+8ByIXtJ6YzL5dIhfqFyTdiSd2xsTMdTcNwu5WcbztK0sGtq1vzswNKz4vE+SLI7LqbRAsXMvgkslVdIqVyejmosQclr8L3cxf+m+fn5aSJSxm2AQhGfetsfCI0EAZ6jyZMNIKqNod4NC5hYfkYGIxKJclHaYlQoGYkJ4ZyGhobuEVHtJCK8CF+UjUGIEG5EBiI7otyo8+W/+YhULvaZc0MAAAAASUVORK5CYII%3D%27%3B%0A%20%20this.checked%3Dtrue%3B%0A%20%20this.tooltipText%3D%27%u0410%u0432%u0442%u043E%u043D%u043E%u043C%u043D%u043E%27%3B%0A%20%7Delse%7B%0A%20%20this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH1AsRFQ8FNxF8qQAAAAlwSFlzAABOIAAATiABFn2Z3gAAAARnQU1BAACxjwv8YQUAAAJMSURBVHjajVJLiJJhFP1+/VPH9wNERXHAohEfCLaJgjAJgxIicBFtomULaedKZtOyhbpRlB4uahUkhGmQLcIoDbPJxERRVDQfqKmjqPxa949pmBjNLpzFvd+957uce7BSqfSi1WpdrtVqqFwuxx0OxzWE0AD9Z1CdTmeQRqOdmM/nlHQ6reRyuXOTybTg8XhbOI7v93q9xb8IcDqdTh2NRojNZqN6vY4Fg8Hd2Wy22+/3UaVSIZrN5h7Es0Qi4U2lUsc2wzudzgLDMAo0omq1ivx+P4KNEIvFQiKRCFepVEa5XG6E/M50OrVms9m9owSY3W6PgQYXyWH4sQ+/v4Kt9gFCBoMhl0gkJ61Wq1Amk6FAIPAlFotdgLkfhxt4PJ7rFArlynK5ZEA+A7w8aKAA6LlcTqbRaB5JpdLzoM8O1M4AXh8SkIrD8NMV+ixsNttPs9l8WygUnm2326RGE5L0Lw3Wqet2u01KpfIh6LFdKBRQJBIhisXiB3j6tJHA5XJdNRgMz4fDIR4Oh1EymRzk8/k3kN+D5+8bCcRi8X3wBe7z+RaZTOYrCPwYyk8AnWNnXEUwGAzkcELU7XYbMHwXSm8By5VOXLPBOb1ef0qtVnMFAgFOpVI/NhqN4apebFXRaDTuaLXadxaLRQgnRjBMwBXegwZxwDdwbgv8Mo5Go/GVBGSQDgTzPNDpdHpwIsZkMhE4EU0mk98Yj8fI6/VeWktwEDyFQnGDz+ff5HA4GtCFBw4lDYYIgkChUOjWJoI/sQXYBpwmSY/UP/8CL+z76C73PLQAAAAASUVORK5CYII%3D%27%3B%0A%20%20this.checked%3Dfalse%3B%0A%20%20this.tooltipText%3D%27%u0412%20%u0441%u0435%u0442%u0438%27%3B%0A%20%7D%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B

Dimanish

Самое интересное, что кнопка Online\Offline работает после открытия/закрытия панели инструментов.
Странно.

У меня нормально работает, проверил.
Dark-Demon

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

Не, таким способом это не исправить.
Исправляется это только через назначение атрибута onclick. (см. ранее)

Upd.
Кстати,

только ссылки надо без реферера открывать (не зря же их ввиде текста сделали...)

- это про что?

Yan

У меня нормально работает, проверил.

Я и написал, что работает.

Dimanish
А, сразу не понял. Понятно. Там нет обработчика onclick, вот и работает нормально.

Yan, ну не знаю, после того, как я написал this.onclick(); в коде, кнопки склерозом страдать перестали...
Dimanish, я про предложенный Антоном readFromClipboard(), вместо того громоздкого кода...

Dark-Demon
Тест:
1. Ставим отсюда кнопку "B", открываем настройку панелей, перетягиваем кнопку на панель. Закрываем настройку.
2. Кнопка пока не проинициализирована. Для инициализации кликаем по ней один раз. На следующий начинает работать как надо. Пока всё нормально.
3. Открываем окно настройки панелей, и тут же его закрываем.
4. Кликаем по кнопке....

Результат - кнопка не работает..

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

Как лечится я говорил выше.
В принципе есть и другие решения, но они хуже.

подтверждаю :( ладно, приду домой - исправлю.

Версия 0.0.1.1
Изменения:
- пофиксено несколько багов
- поддержка Flock
- экспериментальная поддержка Thunderbird

Yan написал:

Версия 0.0.1.1
Изменения:
- пофиксено несколько багов
- поддержка Flock
- экспериментальная поддержка Thunderbird

Ян! Спасибо за новую версию, но вот, что я заметил. Полазил по разным расширениям и во всех обозначение русской локали идет как ru-RU. Именно такое обозначение я сделал в своей версии. Для Польской и английских окалей у тебя все прописано коррекно, но почему для русской прописано просто ru? И хоть расширение работает, но может лучше придерживаться какого-то стандартного обозначения? Просто мало ли каким боком это потом выйдет...

Lain_13
Начиная с Firefox 1.5 русская локаль обозначается как ru.
В этом можно убедиться на примере официальной локализации для Firefox:
http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/1.5.0.4/win32/xpi/ru.xpi
Зачем изменили обозначение - не знаю, но раз изменили, то IMHO последний вариант более "стандартный".

Извини, отстал от жизни. Ж)
з.ы. Честно говоря странно они придумали... Как я понял первая половина соотетствовала языку, а вторая его модификации. en - английский, US - United States, т.е. соединенные штаты... Интересно, с чего это им в голову стукнуло менять оформление названий?.. Или они решили таким вот макаром поменять в дальнейшем для всех языков не имеющих модификаций?..

Lain_13
Идея описана на http://wiki.mozilla.org/L10n:Simple_locale_names
Вкратце суть такова - если на одном языке говорят в нескольких странах и язык в этих странах более-менее един (то есть нет сильных различий в терминологии применительно к браузеру), то нет смысла указывать для языка код страны. Таким образом одна локализация будет работать в нескольких странах сразу.
Русский язык более-менее един во всех странах, где на нём говорят, поэтому когда мне предложили изменить с ru-RU на ru, я согласился.

P.S. А вообще зачинщиками изменений выступили немцы. Им оказалось лень делать отдельные локализации для Австрии (de-AT) и Германии (de-DE).

P.P.S Заканчиваю оффтопить :)

Версия 0.0.1.2
Основные изменения:
- в редактор кнопок добавил горячую клавишу F9, по которой происходит выполнение кода.
Работает только в поле Код (в Инициализации не работает). Думаю, так удобнее будет тестировать.
- добавил кнопку Apply. Опять же, для более удобного тестирования кнопок. По умолчанию скрыта. Для показа нужно в about:config создать параметр custombuttons.settings.editor.showApplyButton, и устаносить его в true.

P.S. По совету Dimanish создал тему на forums.mozillazine.org.

Та, я смотрю мой пост не прошёл... тогда реплей...
Исправленные BB-кнопки:

Код:

custombutton://%u041F%u043E%u043B%u0443%u0436%u0438%u0440%u043D%u044B%u0439%20%20%20%28L%20-%20%u043E%u0431%u0440%u0430%u043C%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0435%3B%20C%20-%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u043E%u0431%u0440%u0430%u043C%u043B%u0451%u043D%u043D%u043E%u0435%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%29%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAQABAAAAg4AAMIHEiwoMGDCBMaBMCwIcOEDQVGPDhx4sKHASwWdKhxI8aOAytivAhA4kiCHEEqXMmypcuBAQEAOw%3D%3D%5D%5B%5D%5Bthis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3C2%29%0A%09%7B%0A%09%09var%20open%3D%22%5Bb%5D%22%3B%0A%09%09var%20close%3D%22%5B/b%5D%22%3B%0A%09%09var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%09%09var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%09var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%09var%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0A%09%09var%20oPosition%20%3D%20theBox.scrollTop%3B%0A%09%09var%20oHeight%20%3D%20theBox.scrollHeight%3B%0A%09%09var%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0A%09%09text%20+%3Dopen+pastetext+close%3B%0A%09%09text%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0A%09%09theBox.value%20%3D%20text%3B%0A%09%09theBox.selectionStart%20%3D%20startPos%3B%0A%09%09theBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0A%09%09var%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0A%09%09theBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Код:

custombutton://%u041F%u043E%u0434%u0447%u0435%u0440%u043A%u043D%u0443%u0442%u044B%u0439%20%20%20%28L%20-%20%u043E%u0431%u0440%u0430%u043C%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0435%3B%20C%20-%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u043E%u0431%u0440%u0430%u043C%u043B%u0451%u043D%u043D%u043E%u0435%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%29%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAHt7ewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAIALAAAAAAQABAAAAg+AAUIHEiwoMGDBwEoBCBgIcOEDxtGNKhwYEWEFyUi1CgwI8WIHgtmDElQYQABAUiWdLix5UeHC13KnElTYEAAOw%3D%3D%5D%5B%5D%5Bthis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3C2%29%0A%09%7B%0A%09%09var%20open%3D%22%5Bu%5D%22%3B%0A%09%09var%20close%3D%22%5B/u%5D%22%3B%0A%09%09var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%09%09var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%09var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%09var%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0A%09%09var%20oPosition%20%3D%20theBox.scrollTop%3B%0A%09%09var%20oHeight%20%3D%20theBox.scrollHeight%3B%0A%09%09var%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0A%09%09text%20+%3Dopen+pastetext+close%3B%0A%09%09text%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0A%09%09theBox.value%20%3D%20text%3B%0A%09%09theBox.selectionStart%20%3D%20startPos%3B%0A%09%09theBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0A%09%09var%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0A%09%09theBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Код:

custombutton://%u041A%u0443%u0440%u0441%u0438%u0432%20%20%20%28L%20-%20%u043E%u0431%u0440%u0430%u043C%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0435%3B%20C%20-%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u043E%u0431%u0440%u0430%u043C%u043B%u0451%u043D%u043D%u043E%u0435%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%29%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAPcAAAAAAHt7e4SEhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAMALAAAAAAQABAAAAgyAAcIHEiwoMGDCBMqBMCQoUKBDAU8HBDA4USGASZWBDBxAEaNFh9+XNgwZMeTKFMqDAgAOw%3D%3D%5D%5B%5D%5Bthis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3C2%29%0A%09%7B%0A%09%09var%20open%3D%22%5Bi%5D%22%3B%0A%09%09var%20close%3D%22%5B/i%5D%22%3B%0A%09%09var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%09%09var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%09var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%09var%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0A%09%09var%20oPosition%20%3D%20theBox.scrollTop%3B%0A%09%09var%20oHeight%20%3D%20theBox.scrollHeight%3B%0A%09%09var%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0A%09%09text%20+%3Dopen+pastetext+close%3B%0A%09%09text%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0A%09%09theBox.value%20%3D%20text%3B%0A%09%09theBox.selectionStart%20%3D%20startPos%3B%0A%09%09theBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0A%09%09var%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0A%09%09theBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Код:

custombutton://%u0426%u0438%u0442%u0430%u0442%u0430%20%20%20%28L%20-%20%u043E%u0431%u0440%u0430%u043C%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0435%3B%20C%20-%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u043E%u0431%u0440%u0430%u043C%u043B%u0451%u043D%u043D%u043E%u0435%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%29%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACCklEQVR42mL8//8/AyUAIICYGCgEAAFEsQEAAUSxAQABxAIiurq6OM+cOZPPx8fHaWZm1rp8+fLEDx8+aGVmZrZKSEgwT5s2rRPIFwKyj/38+fPbmzdvvHh5eV/v27cvGiCAwAY8fPgwfvfu3Q3e3t5Vx48fD7hy5UonNzf3opcvX34FSiuePHkyEGgAj6ys7P9v3759fPv2rSsPD88nkF6AAAJ7YceOHbFSUlLb+fn5Jx09ejRORkbmkomJSVVtbe1XZmZmVmBMMYLUsbOzf/n37x9YDysr63cQDRBAYM6TJ09kfv/+fXbz5s18QNO1vn//fnHNmjVfQHKioqLP/fz85ggKCr4DGsAVEhKyXkND4yJQPTtIHiCAGKDp4BnQSYcUFBSagBoeA/k3gC5Ki42N5QXJL1y4kEdVVfWks7PzBhA/NTW1AqjuHYgNEECwWPj79etXWyYmpkigLT+AfHU2NrbYI0eO8IEkga7i//HjhxQQXwfxgeJqwAB9BWIDBBDMAHagZoa/f/8yAp3GBhL4/Pnz36CgoH8LFizgX7Vq1XSggQympqbLBQQEEq5fvx6hq6u7AqQOIIDAsQAMtBPAwBIGmvoAaAsH0GnvhYWFL8rJyf3g5OQUBrrun7q6egGQfQsY1VE6OjozgXITQXoBAoiR0rwAEEAUp0SAAKLYAIAAotgAgAADANuDzfQSUmlqAAAAAElFTkSuQmCC%5D%5B%5D%5Bthis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3C2%29%0A%09%7B%0A%09%09var%20open%3D%22%5Bquote%5D%22%3B%0A%09%09var%20close%3D%22%5B/quote%5D%22%3B%0A%09%09var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%09%09var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%09var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%09var%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0A%09%09var%20oPosition%20%3D%20theBox.scrollTop%3B%0A%09%09var%20oHeight%20%3D%20theBox.scrollHeight%3B%0A%09%09var%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0A%09%09text%20+%3Dopen+pastetext+close%3B%0A%09%09text%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0A%09%09theBox.value%20%3D%20text%3B%0A%09%09theBox.selectionStart%20%3D%20startPos%3B%0A%09%09theBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0A%09%09var%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0A%09%09theBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Код:

custombutton://%u041A%u043E%u0434%20%20%20%28L%20-%20%u043E%u0431%u0440%u0430%u043C%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0435%3B%20C%20-%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u043E%u0431%u0440%u0430%u043C%u043B%u0451%u043D%u043D%u043E%u0435%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%29%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAA60lEQVR42mL8//8/AyUAIICYGCgEAAFEsQEAAYQNKQHxfyieABWrRRJTQlYMEEBYNc9YtR2MoRoYsIjBDQEIIKyavTOb0RWC5ZJrJ2PIAQQQTs2g2EHH2AwBCCCQIIeNkweGzTgMwHAJQACBBLkUdC3BArqOgSDBSAaIE7AZADdk6dYD/+W0Tf8DBBAoGhk5GX+AZbx8A0DUMjwhDRK/C9TMsGzLYYZHV08zAAQQiqkgV5T3LcQV0nCbkb0KEEAYCnAYglMzQABhjUo0QxjwaQYIIEIpMQcqNgFXSgQIIEZKcyNAAFGcmQACDAB0jLqYK4uYbwAAAABJRU5ErkJggg%3D%3D%5D%5B%5D%5Bthis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3C2%29%0A%09%7B%0A%09%09var%20open%3D%22%5Bcode%5D%22%3B%0A%09%09var%20close%3D%22%5B/code%5D%22%3B%0A%09%09var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%09%09var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%09var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%09var%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0A%09%09var%20oPosition%20%3D%20theBox.scrollTop%3B%0A%09%09var%20oHeight%20%3D%20theBox.scrollHeight%3B%0A%09%09var%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0A%09%09text%20+%3Dopen+pastetext+close%3B%0A%09%09text%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0A%09%09theBox.value%20%3D%20text%3B%0A%09%09theBox.selectionStart%20%3D%20startPos%3B%0A%09%09theBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0A%09%09var%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0A%09%09theBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Код:

custombutton://%u0418%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%20%20%28L%20-%20%u043E%u0431%u0440%u0430%u043C%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0435%3B%20C%20-%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u043E%u0431%u0440%u0430%u043C%u043B%u0451%u043D%u043D%u043E%u0435%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%29%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABpUlEQVR42p2TP0gbURzHPxebwyEJVBw6aKZAxOUcbYYOpS0IRSgljVBMOLgxZA64SBY30RDp0HuEDraBQodChrQI/UNj3XRRoreYQfo3NF4kSo9ct4dHcsX4pvd77/v9/B7vva8CUKlU3E6nw7DDMAxFMU3TTSQSxGKxocyWZVGv1wkAvmYhBJqmoaoqmqYhhMBxHLrdrvTc8OsghODt6zXq7zZQ1RG6Z39YNPI4jkM6nZa6gB+gWCzy8sUGI73vXPz+SOB8j2crjyiVSh6dPIGqqn2Qm5P3aO0vyzoSHqXRaAwGAHxb0nFOmrKeKG8xNr3MZmmBubtTnNrnxONxf4Bz0uTv8ZFH8OnrLndmZ3j/ymD1+Wey2axnP/C/pyoUCuwc/gQgV/jCw8c5MpnM1QDlZpv780/40bLR8+tEo1F0Xe/T+QJ+PXjKwXELgPFbk9RqNarVap/OcwcT5S05317N8ebDvqz1/DrJZJJ2uz0YcDkLoVCI2zNTV/rSEuC6rly0bXuguNfrARAMBr0Ay7KuFaZIJIICYJqmO2yUw+EwqVRK+QdtIZCYwfQIRQAAAABJRU5ErkJggg%3D%3D%5D%5B%5D%5Bthis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3C2%29%0A%09%7B%0A%09%09var%20open%3D%22%5Bimg%5D%22%3B%0A%09%09var%20close%3D%22%5B/img%5D%22%3B%0A%09%09var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%09%09var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%09var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%09var%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0A%09%09var%20oPosition%20%3D%20theBox.scrollTop%3B%0A%09%09var%20oHeight%20%3D%20theBox.scrollHeight%3B%0A%09%09var%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0A%09%09text%20+%3Dopen+pastetext+close%3B%0A%09%09text%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0A%09%09theBox.value%20%3D%20text%3B%0A%09%09theBox.selectionStart%20%3D%20startPos%3B%0A%09%09theBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0A%09%09var%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0A%09%09theBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Код:

custombutton://%u0413%u0438%u043F%u0435%u0440%u0441%u0441%u044B%u043B%u043A%u0430%20%20%20%28L%20-%20%u043E%u0431%u0440%u0430%u043C%u0438%u0442%u044C%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0435%3B%20C%20-%20%u0432%u0441%u0442%u0430%u0432%u0438%u0442%u044C%20%u043E%u0431%u0440%u0430%u043C%u043B%u0451%u043D%u043D%u043E%u0435%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%29%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAKIAAGZmZgAAAP///8zMzP///////////////yH5BAEAAAQALAAAAAAQABAAAAMxSLrc/jBKCYK16lpAqhBDaH3hEHimpoqBEJhkWJkpq17iXFZnaXK8S0bDmRiPyGQyAQA7%5D%5B%5D%5Bthis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3C2%29%0A%09%7B%0A%09%09var%20open%3D%22%5Burl%5D%22%3B%0A%09%09var%20close%3D%22%5B/url%5D%22%3B%0A%09%09var%20theBox%20%3D%20document.commandDispatcher.focusedElement%3B%0A%09%09var%20startPos%20%3D%20theBox.selectionStart%3B%0A%09%09var%20endPos%20%3D%20theBox.selectionEnd%3B%0A%09%09var%20pastetext%3D%20%28event.button%29%3FreadFromClipboard%20%28%29%3AtheBox.value.substring%28startPos%2C%20endPos%29%3B%0A%09%09var%20oPosition%20%3D%20theBox.scrollTop%3B%0A%09%09var%20oHeight%20%3D%20theBox.scrollHeight%3B%0A%09%09var%20text%3DtheBox.value.substring%280%2CstartPos%29%3B%0A%09%09text%20+%3Dopen+pastetext+close%3B%0A%09%09text%20+%3DtheBox.value.substring%28endPos%2C%20theBox.value.length%29%3B%0A%09%09theBox.value%20%3D%20text%3B%0A%09%09theBox.selectionStart%20%3D%20startPos%3B%0A%09%09theBox.selectionEnd%20%3D%20startPos%20+%20open.length%20+%20pastetext.length%20+%20close.length%3B%0A%09%09var%20nHeight%20%3D%20theBox.scrollHeight%20-%20oHeight%3B%0A%09%09theBox.scrollTop%20%3D%20oPosition%20+%20nHeight%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Также модифицировал менюшку WebDeveloper от Zoolcar9 - по щелчку средней кнопкой теперь открывается/закрывается WebDeveloperToolbar.

Код:

custombutton://Web%20Developer%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH1AsQFRwsrPDCMgAAAAlwSFlzAABOIAAATiABFn2Z3gAAAARnQU1BAACxjwv8YQUAAAL9SURBVHjarVN7SJNRFL/OTefSoSyYmoGBmaQYZisD8ZGaZYam5msuELMs0kqd4h9SGkFKoY0yIkxJU7F8BPkufJSpDcVHmfl+T3Gbzs3m3L7vdCdqJuRfHfh955x7zu/c7557LkL/WaipadkeWBtwudyjsYk54tspgnzs07y9A205HA/rXdk+ftd5Fe+/EqG8hFLsRi0r1kj/i7Hd2A7LyHkjTkrLG8I2858FbB0d3QpL6uXTc2Iy62mRemxGDM1tXUTm40LNzPIauJwKbcJpe7dzKNrPg+y3hU9eVErnF/TiVCoFwWazdKKvhFBX1WuIzjCkcJzsdL/19aOFRYmBPzfxS0raa+kxFxfOVpVzAddShsfFasAyv6QApQZAplCD4HkZVFa3ws+JOXhZUg2NwiGYWgKIisscxTRnDJ3NGthgZbV3fifHRGIYGJ4lD9mfrmYYMXgmrIP8pFSBSNgzCOV1QvAL5Utw/hkMxjrT/Swv+llelby6vo3s/jEC0wsyCAiPn9jYgaYtbuPgmVxa0QT5pbVQWtUO97LKNMGR9ztwTJ8iEs2rCLVGBxCJVlZW0Ro+N6FRAw4uYagxgEqlaahUXWTENER6dBoiCKSjUsoNccx08wgspG9Z8KFZSH5s7YLBURFpZedZTDeinzQ2tb90NyN3ckGmhN6hKQiJSFjE+ecxLLR/sM728o3h9wzOqpdJgPLaz1DXLASZfBVeFddC46duwMswvbgKc5JfoMR25I1HA5hmuXWNRziODuVl9UpTll3LyNikYkWpQjVNHYhCpyIloUG9Q9NILpYidzffzgtBN8f3GDLNzc2t7LT9oWoLPLwTzcOKbWZmcYLU0AqYxubQ1NBCOhy30ZXLVWRNTTPi8YIoJux9stoygQ/O1cVQavvz1yQ6e0VGZOc2Es6e4Q3YTe7oV4CH79U+bMfw04ukl+MFIzsncafQ3L0Dg7E+7Orq6RTIS5f4h916p23yAWtbDpNp4r3rW/gzVFsTZoKxf2Me0Lb1LfkN2BRevObpD7MAAAAASUVORK5CYII%3D%5D%5B%0A%5D%5Bvar%20webdev%20%3D%20document.getElementById%28%22webdeveloper-menu%22%29.getElementsByTagName%28%22menupopup%22%29%5B0%5D%3B%0Athis.appendChild%28webdev.cloneNode%28true%29%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0A%0Athis.onClick%3Dfunction%28event%29%0A%7B%0A%09if%28event.button%3D%3D1%29%0A%09%7B%0A%09%09var%20a%20%3D%20document.getElementById%28%22webdeveloper-toolbar%22%29%3B%0A%09%09a.collapsed%20%3D%20%21a.collapsed%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Yan, а не подскажешь, как сделать так, чтобы попап-меню вылезало не по левой, а по средней кнопке?

Ну и для порядка кнопка "Панель закладок" теперь открывает/закрывает эту панель не только левой, но и средней кнопкой.

Код:

custombutton://%u041F%u0430%u043D%u0435%u043B%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACq0lEQVR4Xm2PzWtcVRiHn/fce2Ymk8ykk9YkpTWkCyvYVBvpImQhhdCYbgRdSYMLd5K0qaj0L2jpF+3GpVChGNSNllYMCn5uulEKJiGEiCQm1TSTTmYmmXvnfp1j6wwdAn3ggXPg/b0fYj4CLJg6+B67UIarQQyJ4TxNRMGff4HnQxiDookIOIoWll72qHHyatwYerGNmmoV4qTxBlC0QDlgAWshqTOWGj28v230xf31bcb8EMpV2CiCNbQyPAMTk5G8e1od3xQ9tCOS06dDn4zvt7bd3cA2TRrGNQb1sa4TstdDPVciPbjvhFdiMPAA09zAthoMI7wFTErGvSTZzLTu677lDKFRHiif7GuubjvUfUt3ZKadJzXC5P8Zy7CYc8zyUvcAx/KQqWG1Qnq6obAKdhMApAe7cZD6yhqRbwjWAta/8Vi7H8+JeZ/DJtsxLW+0H5fBIoQGIsCwGxdIAbFQ+tJh7tPkt1rJjov5AKIKL4SWjzOn1OvOEQNx60YUoJv/LQhmSO7d5vtanXOOZkkhoFIsmZC3K7fNnegXoNh0E5aXFBe/znHtqxzX7xY4+4NjKxETnZqlNKCSCJIErKJc3+Gi/wdb/ANsAI9gftFSLEzR/+YFgndG+LFfux8mRJMKphS4D1Z4ShKzN6/JswWYhoWyJf/KOrVDs2wvz5GKIlag6goAuMbQAo464FBqTL8ZtvNTlOKIttSDgKCeIEpICV+48BnwuTIJPDGJcVzFq+kqhIvw9wKe/t3/ZCnQiwNHewniAFccDgy3keTo9Aw/+wKyMEYTutJwP2vpe+jxaxhzpWb59t2Yg3teTs+MnDkwsLrq8+/l9WjfQ9trNCUAmT8JAAJ91nIvjLhhDTdJ2CpbeM+B7YDnpUu+66/Y/MQK5R6XUyGsAvwHk/0n+0qkvkwAAAAASUVORK5CYII%3D%5D%5B%5D%5Bthis.PTB%3D%20document.getElementById%28%22PersonalToolbar%22%29%3B%0A//this.PTB.collapsed%3D%20true%3B%0A%0Athis.onClick%3Dfunction%28event%29%20%7Bif%28event.button%3C2%29%20this.PTB.collapsed%3D%21this.PTB.collapsed%3B%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

ps: а почему кнопка "apply" по дефолту скрыта?

Ещё одна кнопка, для преобразования простых ссылок 'custombutton://...' в ссылку-картинку:

Код:

custombutton://%u041F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0438%20%27custombutton%3A//...%27%20%u0432%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u0441%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%u043C%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfWBgMQBxbn9GxKAAAAB3RJTUUH1gYDEBMzV1+MKAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADNQTFRF////mZmZMzMzZmZmzMzM/8yZ/5mZ/8xm/8wA///M/8wz/8zMzJmZ/5kA/5lmZmYz/5kzCyXdoQAAAAF0Uk5TAEDm2GYAAAB6SURBVHjaTc5bFsIgDATQCZOIJdZ2/6t1oNHKRwj3kAcaeZAVDACRXdcWAfiEI/rogT5GFCg9E3kqLGDu+1slmVXCiHwBNvMLsA7d/IY5QEO9YNMYNdRCVj/6c24iaQURD1xCB5qZ2uEWPVevryj+ARvXOj+oxBrrCD73jALvj0npfgAAAABJRU5ErkJggg%3D%3D%5D%5Bvar%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0Avar%20cbcodes%20%3D%20doc.%20evaluate%0A%28%0A%20%20%20%20%22//a%5B@href%20and%20starts-with%28@href%2C%27custombutton%3A//%27%29%5D%22%2C%0A%20%20%20%20doc%2C%20null%2C%20XPathResult.%20ORDERED_NODE_SNAPSHOT_TYPE%2C%20null%0A%29%3B%0Avar%20i%2C%20cn%2C%20cnt%2C%20cnf%2C%20nn%2C%20titletext%3B%0Afor%20%28i%20%3D%200%3B%20i%20%3C%20cbcodes.%20snapshotLength%3B%20i++%29%0A%7B%0A%20%20%20%20cn%20%3D%20cbcodes.%20snapshotItem%20%28i%29%3B%0A%20%20%20%20cnt%20%3D%20cn.%20getAttribute%20%28%22href%22%29%3B%0A%20%20%20%20cnf%20%3D%20cnt.%20split%20%28%22%255D%255B%22%29%3B%0A%20%20%20%20if%20%28cnf.%20length%20%21%3D%204%29%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20titletext%20%3D%20unescape%20%28cnf%20%5B0%5D.%20replace%20%28/custombutton%3A%5C/%5C//%2C%20%22%22%29%29%3B%0A%20%20%20%20nn%20%3D%20doc.%20createElement%20%28%22img%22%29%3B%0A%20%20%20%20nn.%20setAttribute%20%28%22src%22%2C%20unescape%20%28cnf%20%5B1%5D%29%20%7C%7C%20%22chrome%3A//custombuttons/skin/button.png%22%29%3B%0A%20%20%20%20nn.%20setAttribute%20%28%22class%22%2C%20%22toolbarimg%22%29%3B%0A%20%20%20%20nn.%20setAttribute%20%28%22title%22%2C%20titletext%29%3B%0A%20%20%20%20nn.%20setAttribute%20%28%22alt%22%2C%20titletext%29%3B%0A%20%20%20%20cn.%20innerHTML%20%3D%20%22%22%3B%0A%20%20%20%20cn.%20appendChild%20%28nn%29%3B%0A%7D%5D%5B

А в старых кнопках был лишний код, вот новые:

Код:

custombutton://%u041F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u0442%u044C%20%u043A%u043E%u0434%u044B%20custombuttons%20%u0432%20%u0441%u0441%u044B%u043B%u043A%u0438%20%28%u0441%u0442%u0440%u043E%u0433%u043E%u0435%20%u043F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u043D%u0438%u0435%29%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfWBgMQBxbn9GxKAAAAB3RJTUUH1gYDEBMzV1+MKAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADNQTFRF////mZmZMzMzZmZmzMzM/8yZ/5mZ/8xm/8wA///M/8wz/8zMzJmZ/5kA/5lmZmYz/5kzCyXdoQAAAAF0Uk5TAEDm2GYAAAB6SURBVHjaTc5bFsIgDATQCZOIJdZ2/6t1oNHKRwj3kAcaeZAVDACRXdcWAfiEI/rogT5GFCg9E3kqLGDu+1slmVXCiHwBNvMLsA7d/IY5QEO9YNMYNdRCVj/6c24iaQURD1xCB5qZ2uEWPVevryj+ARvXOj+oxBrrCD73jALvj0npfgAAAABJRU5ErkJggg%3D%3D%5D%5Bvar%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0Avar%20cbcodes%20%3D%20doc.%20evaluate%0A%28%0A%20%20%20%20%22//text%28%29%5Bstarts-with%28.%2C%27custombutton%3A//%27%29%5D%22%2C%0A%20%20%20%20doc%2C%20null%2C%20XPathResult.%20ORDERED_NODE_SNAPSHOT_TYPE%2C%20null%0A%29%3B%0Avar%20i%2C%20cn%2C%20cnt%2C%20cnf%2C%20nn%2C%20t%2C%20titletext%3B%0Afor%20%28i%20%3D%200%3B%20i%20%3C%20cbcodes.%20snapshotLength%3B%20i++%29%0A%7B%0A%20%20%20%20cn%20%3D%20cbcodes.%20snapshotItem%20%28i%29%3B%0A%20%20%20%20cnt%20%3D%20cn.%20textContent%3B%0A%20%20%20%20cnf%20%3D%20cnt.%20split%20%28%22%255D%255B%22%29%3B%0A%20%20%20%20if%20%28cnf.%20length%20%21%3D%204%29%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20titletext%20%3D%20unescape%20%28cnf%20%5B0%5D.%20replace%20%28/custombutton%3A%5C/%5C//%2C%20%22%22%29%29%3B%0A%20%20%20%20nn%20%3D%20doc.%20createElement%20%28%22a%22%29%3B%0A%20%20%20%20nn.%20setAttribute%20%28%22href%22%2C%20cn.%20textContent%29%3B%0A%20%20%20%20t%20%3D%20doc.%20createElement%20%28%22img%22%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22src%22%2C%20unescape%20%28cnf%20%5B1%5D%29%20%7C%7C%20%22chrome%3A//custombuttons/skin/button.png%22%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22class%22%2C%20%22toolbarimg%22%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22title%22%2C%20titletext%29%3B%0A%20%20%20%20t.%20setAttribute%20%28%22alt%22%2C%20titletext%29%3B%0A%20%20%20%20nn.%20appendChild%20%28t%29%3B%0A%20%20%20%20cn.%20parentNode.%20replaceChild%20%28nn%2C%20cn%29%3B%0A%7D%5D%5B

Код:

custombutton://%u041F%u0440%u0435%u043E%u0431%u0440%u0430%u0437%u043E%u0432%u0430%u0442%u044C%20%u043A%u043E%u0434%u044B%20custombuttons%20%u0432%20%u0441%u0441%u044B%u043B%u043A%u0438%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfWBgMQBxbn9GxKAAAAB3RJTUUH1gYDEBMzV1+MKAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADNQTFRF////mZmZMzMzZmZmzMzM/8yZ/5mZ/8xm/8wA///M/8wz/8zMzJmZ/5kA/5lmZmYz/5kzCyXdoQAAAAF0Uk5TAEDm2GYAAAB6SURBVHjaTc5bFsIgDATQCZOIJdZ2/6t1oNHKRwj3kAcaeZAVDACRXdcWAfiEI/rogT5GFCg9E3kqLGDu+1slmVXCiHwBNvMLsA7d/IY5QEO9YNMYNdRCVj/6c24iaQURD1xCB5qZ2uEWPVevryj+ARvXOj+oxBrrCD73jALvj0npfgAAAABJRU5ErkJggg%3D%3D%5D%5Bvar%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0Avar%20cbcodes%20%3D%20doc.%20evaluate%0A%28%0A%20%20%20%20%22//text%28%29%5Bcontains%28.%2C%27custombutton%3A//%27%29%5D%22%2C%0A%20%20%20%20doc%2C%20null%2C%20XPathResult.%20ORDERED_NODE_SNAPSHOT_TYPE%2C%20null%0A%29%3B%0Avar%20i%2C%20j%2C%20cn%2C%20cnt%2C%20cnf%2C%20nn%2C%20t%2C%20titletext%3B%0Afor%20%28i%20%3D%200%3B%20i%20%3C%20cbcodes.%20snapshotLength%3B%20i++%29%0A%7B%0A%20%20%20%20cn%20%3D%20cbcodes.%20snapshotItem%20%28i%29%3B%0A%20%20%20%20cnt%20%3D%20cn.%20textContent.%20match%20%28/custombutton%3A%5C/%5C/.+/%29%3B%0A%20%20%20%20for%20%28j%20%3D%200%3B%20j%20%3C%20cnt.%20length%3B%20j++%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20cnf%20%3D%20cnt%20%5Bj%5D.%20split%20%28%22%255D%255B%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cnf.%20length%20%21%3D%204%29%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20titletext%20%3D%20unescape%20%28cnf%20%5B0%5D.%20replace%20%28/custombutton%3A%5C/%5C//%2C%20%22%22%29%29%3B%0A%20%20%20%20%20%20%20%20nn%20%3D%20doc.%20createElement%20%28%22a%22%29%3B%0A%20%20%20%20%20%20%20%20nn.%20setAttribute%20%28%22href%22%2C%20cn.%20textContent%29%3B%0A%20%20%20%20%20%20%20%20t%20%3D%20doc.%20createElement%20%28%22img%22%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22src%22%2C%20unescape%20%28cnf%20%5B1%5D%29%20%7C%7C%20%22chrome%3A//custombuttons/skin/button.png%22%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22class%22%2C%20%22toolbarimg%22%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22title%22%2C%20titletext%29%3B%0A%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22alt%22%2C%20titletext%29%3B%0A%20%20%20%20%20%20%20%20nn.%20appendChild%20%28t%29%3B%0A%20%20%20%20%20%20%20%20if%20%28j%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20cn.%20parentNode.%20replaceChild%20%28nn%2C%20cn%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20cn.%20parentNode.%20appendChild%20%28nn%29%3B%0A%20%20%20%20%7D%0A%7D%5D%5B

Решил тоже попробовать это расширение и кнопки описанные здесь выше. Одно маленькое пожелание, надо что-то делать с пояснительным текстом к кнопкам. Эти опусы невозможно прочитать в окне Настройки панелей инструментов (если только не растянуть его на весь экран) из-за налезания текста друг на друга. Если вытащить кнопку на панель, то при включённом отображении "Значки и текст" кнопка занимает много места.

Может быть стоит разделить текст, появляющийся при выборе "Значки и текст", и текст всплывающей подсказки, который может содержать более подробную информацию?

P.S. В рассмотрении участвовали кнопки Dark-Demon и Anton.

...Эти опусы невозможно прочитать в окне Настройки панелей инструментов...

Infant
Ну, не получилось у меня кратко описать назначение. И за иконку мне уже замечание делали. Не художник я.
Если кто может, переделайте и разместите, это несложно.

Что касается раздельных названия/описания - это уже к разработчику.

Вот, твою подправил:

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADA2LzE5LzA21AYRVQAAAX5JREFUeJyVkzGL1FAUhT/HbZYU0yhC6lcsA9nm2k0r+BOmdZoHFltOJ6wL1iJs9W6zAbFI49+w8YBsIFikEsV6isFSi2QymXFnxdMk5J373XNzkwer1eo3/6kQwjLGWAKcAFxevSFrasDZzK4HY3ZagwTAZvYCgKvLV3uwE4CsKQEBImsuAOsK5P1zyJodZKxJd9Fg7DpafxxHR3ZYu0vQGZ8ORZtZ0d0aQOpHKO4E7BJYAvuMRp3chUtHi4cE49nORmZJxBj58L7EzPbODhLs1L3QfpgYcXck4e58berjgOy07jfgZM0FWVNzNiuIMaJ+le5+HLD5tY233XsxjJRSGiDr9fq+EQxIoP2VHUIk3UgqAB7O5/PXP75/o779gn4CuTF99vyvqI8eP+k8EnmeI+llnucfJyGEZdu2mBlmNnS5S2/fXe953D1OYozlYrE4r6rqaOFY0+l0C/kE/XdgZjVwXlXVbQjhnxAzW6aUygGwhUhatm17c/jH3ac/OM+gHyNFEgQAAAAASUVORK5CYII=

И свою нарисовал:

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX////////v7+/f39/MzMy/v7+vr6+ZmZmPj49/f39mZmZPT08/Pz8zMzMfHx8PDw+Fgb3WAAAAEHRSTlMA////////////////////wFCLQwAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADA2LzE5LzA21AYRVQAAAFRJREFUeJxjYC8HgwIGdkEwQGOoCDpBGF2Cn4AMqULBq2IHgQzxQKGPUo1gKfGNco5ghnShH0SXvGIXiCFiGCt4DMSQmbhC6CNE6on4RnQrIAyoMwBNFh56ZTJDyQAAAABJRU5ErkJggg==

А вот и кнопочка "найти ссылки":

custombutton://%u041D%u0430%u0439%u0442%u0438%20%u0441%u0441%u044B%u043B%u043A%u0438%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX////////v7+/f39/MzMy/v7+vr6+ZmZmPj49/f39mZmZPT08/Pz8zMzMfHx8PDw+Fgb3WAAAAEHRSTlMA////////////////////wFCLQwAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADA2LzE5LzA21AYRVQAAAFRJREFUeJxjYC8HgwIGdkEwQGOoCDpBGF2Cn4AMqULBq2IHgQzxQKGPUo1gKfGNco5ghnShH0SXvGIXiCFiGCt4DMSQmbhC6CNE6on4RnQrIAyoMwBNFh56ZTJDyQAAAABJRU5ErkJggg%3D%3D%5D%5Bvar%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0Avar%20cbcodes%20%3D%20doc.%20evaluate%0A%28%0A%20%20%20%20%22//text%28%29%5Bcontains%28.%2C%27%3A//%27%29%5D%22%2C%0A%20%20%20%20doc%2C%20null%2C%20XPathResult.%20ORDERED_NODE_SNAPSHOT_TYPE%2C%20null%0A%29%3B%0Avar%20i%2C%20j%2C%20cn%2C%20cnt%2C%20cnf%2C%20nn%2C%20t%2C%20titletext%3B%0Afor%20%28i%20%3D%200%3B%20i%20%3C%20cbcodes.%20snapshotLength%3B%20i++%29%0A%7B%0A%20%20%20%20cn%20%3D%20cbcodes.%20snapshotItem%20%28i%29%3B%0A%20%20%20%20cnt%20%3D%20cn.%20textContent.%20match%20%28/%5BA-Za-z%5D+%3A%5C/%5C/%5CS+/g%29%3B%0A%20%20%20%20for%20%28j%20%3D%200%3B%20j%20%3C%20cnt.%20length%3B%20j++%29%0A%20%20%20%20%7B%0A%09if%20%28cnt%20%5Bj%5D.%20match%20%28/custombutton%3A%5C/%5C//%29%29%0A%09%7B%0A%20%20%20%20%20%20%20%20%09cnf%20%3D%20cnt%20%5Bj%5D.%20split%20%28%22%255D%255B%22%29%3B%0A%09%20%20%20%20%20%20%20%20if%20%28cnf.%20length%20%21%3D%204%29%0A%20%20%20%20%20%20%20%20%09%20%20%20%20continue%3B%0A%09%20%20%20%20%20%20%20%20titletext%20%3D%20unescape%20%28cnf%20%5B0%5D.%20replace%20%28/custombutton%3A%5C/%5C//%2C%20%22%22%29%29%3B%0A%20%20%20%20%20%20%20%20%09nn%20%3D%20doc.%20createElement%20%28%22a%22%29%3B%0A%09%20%20%20%20%20%20%20%20nn.%20setAttribute%20%28%22href%22%2C%20cn.%20textContent%29%3B%0A%09%20%20%20%20%20%20%20%20t%20%3D%20doc.%20createElement%20%28%22img%22%29%3B%0A%20%20%20%20%20%20%20%20%09t.%20setAttribute%20%28%22src%22%2C%20unescape%20%28cnf%20%5B1%5D%29%20%7C%7C%20%22chrome%3A//custombuttons/skin/button.png%22%29%3B%0A%09%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22class%22%2C%20%22toolbarimg%22%29%3B%0A%20%20%20%20%20%20%20%20%09t.%20setAttribute%20%28%22title%22%2C%20titletext%29%3B%0A%09%20%20%20%20%20%20%20%20t.%20setAttribute%20%28%22alt%22%2C%20titletext%29%3B%0A%20%20%20%20%20%20%20%20%09nn.%20appendChild%20%28t%29%3B%0A%09%20%20%20%20%20%20%20%20if%20%28j%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%09%20%20%20%20cn.%20parentNode.%20replaceChild%20%28nn%2C%20cn%29%3B%0A%09%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%09%20%20%20%20cn.%20parentNode.%20appendChild%20%28nn%29%3B%0A%09%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%09nn%20%3D%20doc.%20createElement%20%28%22a%22%29%3B%0A%09%20%20%20%20%20%20%20%20nn.%20setAttribute%20%28%22href%22%2C%20cnt%20%5Bj%5D%29%3B%0A%09%20%20%20%20%20%20%20%20t%20%3D%20doc.%20createTextNode%20%28%22%20@%20%22%29%3B%0A%20%20%20%20%20%20%20%20%09nn.%20appendChild%20%28t%29%3B%0A/*%09%20%20%20%20%20%20%20%20if%20%28j%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%09%20%20%20%20cn.%20parentNode.%20replaceChild%20%28nn%2C%20cn%29%3B%0A%09%20%20%20%20%20%20%20%20else*/%0A%20%20%20%20%20%20%20%20%09%20%20%20%20cn.%20parentNode.%20appendChild%20%28nn%29%3B%0A%09%7D%0A%20%20%20%20%7D%0A%7D%5D%5B

кастомбутоны показывает как у тебя, плюс находит ссылки вида _http://mozilla.ru/ и тому подобные.

Кстати, что-то твоя новая кнопка не работает...

На основе примера из Canvas Tutorial (http://developer.mozilla.org/en/docs/Ca … _example_2) соорудил аналоговые часы:

Код:

custombutton://%u0410%u043D%u0430%u043B%u043E%u0433%u043E%u0432%u044B%u0435%20%u0447%u0430%u0441%u044B%5D%5B%5D%5B//%20based%20on%20canvas%20tutorial%20example%20code%0A//%20%28http%3A//developer.mozilla.org/en/docs/Canvas_tutorial%3ABasic_animations%23An_animation_example_2%29%5D%5Bif%20%28%21document.%20getElementById%20%28%22canvas-clock%22%29%29%0A%7B%0A%09var%20canvas%20%3D%20document.%20createElementNS%20%28%22http%3A//www.w3.org/1999/xhtml%22%2C%20%22canvas%22%29%3B%0A%09canvas.%20setAttribute%20%28%22id%22%2C%20%22canvas-clock%22%29%3B%0A%09canvas.%20setAttribute%20%28%22width%22%2C%20%2224px%3B%22%29%3B%0A%09canvas.%20setAttribute%20%28%22height%22%2C%20%2224px%3B%22%29%3B%0A%09canvas.%20setAttribute%20%28%22style%22%2C%20%22min-width%3A24px%3Bmin-height%3A24px%3Bheight%3A24px%3Bwidth%3A24px%3Bmax-width%3A24px%3Bmax-height%3A24px%3B%22%29%3B%0A%09var%20button%20%3D%20this%3B%0A%09setTimeout%0A%09%28%0A%09%20%20%20%20function%20%28%29%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20button.%20parentNode.%20insertBefore%20%28canvas%2C%20button%29%3B%0A%09%09canvas.%20addEventListener%0A%09%09%28%0A%09%09%09%22click%22%2C%0A%09%09%09function%20%28event%29%0A%09%09%09%7B%0A%09%09%09%09button.%20hidden%20%3D%20%21button.%20hidden%3B%0A%09%09%09%7D%2C%0A%09%09%09false%0A%09%09%29%3B%0A%09%09button.%20hidden%20%3D%20true%3B%0A%09%20%20%20%20%20%20%20%20var%20ctx%20%3D%20canvas.%20getContext%28%222d%22%29%3B%0A%09%20%20%20%20%20%20%20%20ctx.%20scale%20%2824%20/%20122%2C%2024%20/%20122%29%3B%0A%09%20%20%20%20%20%20%20%20var%20clock%20%3D%20function%20%28%29%0A%09%20%20%20%20%20%20%20%20%7B%0A%09%09%09var%20now%20%3D%20new%20Date%20%28%29%3B%0A%09%09%09var%20canvas%20%3D%20document.%20getElementById%20%28%22canvas-clock%22%29%3B%0A%09%09%09var%20ctx%20%3D%20canvas.%20getContext%28%222d%22%29%3B%0A%09%09%09ctx.%20save%20%28%29%3B%0A%09%09%09ctx.%20clearRect%20%280%2C%200%2C%20150%2C%20150%29%3B%0A%09%09%09ctx.%20translate%20%2861%2C%2061%29%3B%0A%09%09%09ctx.%20scale%20%280.4%2C%200.4%29%3B%0A%09%09%09ctx.%20rotate%20%28-Math.%20PI%20/%202%29%3B%0A%09%09%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%09%09%09ctx.%20fillStyle%20%3D%20%22white%22%3B%0A%09%09%09ctx.%20lineWidth%20%3D%2012%3B%0A%09%09%09ctx.%20lineCap%20%3D%20%22round%22%3B%0A%09%09%09ctx.%20save%20%28%29%3B%0A%09%09%09ctx.%20beginPath%20%28%29%3B%0A%09%09%09for%20%28i%20%3D%200%3B%20i%20%3C%2012%3B%20i++%29%0A%09%09%09%7B%0A%09%09%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%206%29%3B%0A%09%09%09%20%20%20%20ctx.%20moveTo%20%28100%2C%200%29%3B%0A%09%09%09%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%09%09%09%7D%0A%09%09%09ctx.%20stroke%20%28%29%3B%0A%09%09%09ctx.%20restore%20%28%29%3B%0A%09%09%09ctx.%20save%20%28%29%3B%0A%09%09%09ctx.%20lineWidth%20%3D%205%3B%0A%09%09%09ctx.%20beginPath%20%28%29%3B%0A%09%09%09for%20%28i%20%3D%200%3B%20i%20%3C%2060%3B%20i++%29%0A%09%09%09%7B%0A%09%09%09%20%20%20%20if%20%28i%20%25%205%20%21%3D%200%29%0A%09%09%09%20%20%20%20%7B%0A%09%09%09%20%20%20%20%20%20%20%20ctx.%20moveTo%20%28117%2C%200%29%3B%0A%09%09%09%20%20%20%20%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%09%09%09%20%20%20%20%7D%0A%09%09%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%2030%29%3B%0A%09%09%09%7D%0A%09%09%09ctx.%20stroke%20%28%29%3B%0A%09%09%09ctx.%20restore%20%28%29%3B%0A%09%09%09var%20sec%20%3D%20now.%20getSeconds%20%28%29%3B%0A%09%09%09var%20min%20%3D%20now.%20getMinutes%20%28%29%3B%0A%09%09%09var%20hr%20%20%3D%20now.%20getHours%20%28%29%3B%0A%09%09%09canvas.%20setAttribute%20%28%22title%22%2C%20%5Bhr%2C%20min%2C%20sec%5D.%20join%20%28%22%20%3A%20%22%29%29%3B%0A%09%09%09hr%20%3D%20hr%20%3E%3D%2012%3F%20hr%20-%2012%3A%20hr%3B%0A%09%09%09ctx.%20fillStyle%20%3D%20%22black%22%3B%0A%09%09%09ctx.%20save%20%28%29%3B%0A%09%09%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%09%09%09ctx.%20rotate%20%28hr%20*%20%28Math.%20PI%20/%206%29%20+%20%28Math.%20PI%20/%20360%29%20*%20min%20+%20%28Math.%20PI%20/%2021600%29%20*%20sec%29%0A%09%09%09ctx.%20lineWidth%20%3D%2014%3B%0A%09%09%09ctx.%20beginPath%20%28%29%3B%0A%09%09%09ctx.%20moveTo%20%28-20%2C%200%29%3B%0A%09%09%09ctx.%20lineTo%20%2880%2C%200%29%3B%0A%09%09%09ctx.%20stroke%20%28%29%3B%0A%09%09%09ctx.%20restore%20%28%29%3B%0A%09%09%09ctx.%20save%28%29%3B%0A%09%09%09ctx.%20rotate%20%28%28Math.%20PI%20/%2030%29%20*%20min%20+%20%28Math.%20PI%20/%201800%29%20*%20sec%29%0A%09%09%09ctx.%20lineWidth%20%3D%2010%3B%0A%09%09%09ctx.%20beginPath%20%28%29%3B%0A%09%09%09ctx.%20moveTo%20%28-28%2C%200%29%3B%0A%09%09%09ctx.%20lineTo%20%28112%2C%200%29%3B%0A%09%09%09ctx.%20stroke%20%28%29%3B%0A%09%09%09ctx.%20restore%20%28%29%3B%0A%09%09%09ctx.%20save%28%29%3B%0A%09%09%09ctx.%20rotate%20%28sec%20*%20Math.%20PI%20/%2030%29%3B%0A%09%09%09ctx.%20strokeStyle%20%3D%20%22%23D40000%22%3B%0A%09%09%09ctx.%20fillStyle%20%3D%20%22%23D40000%22%3B%0A%09%09%09ctx.%20lineWidth%20%3D%206%3B%0A%09%09%09ctx.%20beginPath%20%28%29%3B%0A%09%09%09ctx.%20moveTo%20%28-30%2C%200%29%3B%0A%09%09%09ctx.%20lineTo%20%2893%2C%200%29%3B%0A%09%09%09ctx.%20stroke%20%28%29%3B%0A%09%09%09ctx.%20fillStyle%20%3D%20%22%23555%22%3B%0A%09%09%09ctx.%20arc%280%2C%200%2C%203%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%09%09%09ctx.%20fill%20%28%29%3B%0A%09%09%09ctx.%20restore%20%28%29%3B%0A%09%09%09ctx.%20beginPath%20%28%29%3B%0A%09%09%09ctx.%20lineWidth%20%3D%2014%3B%0A%09%09%09ctx.%20strokeStyle%20%3D%20%27%23325FA2%27%3B%0A%09%09%09ctx.%20arc%280%2C%200%2C%20142%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%09%09%09ctx.%20stroke%20%28%29%3B%0A%09%09%09ctx.%20restore%20%28%29%3B%0A%09%20%20%20%20%20%20%20%20%7D%0A%09%20%20%20%20%20%20%20%20clock%20%28%29%3B%0A%09%20%20%20%20%20%20%20%20setInterval%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20function%20%28%29%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clock%20%28%29%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%201000%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%20%20%20%20%7D%2C%0A%09%20%20%20%202000%0A%09%29%3B%0A%7D

второй вариант ("заводятся" только после открытия окна настройки панелей инструментов):

Код:

custombutton://%u0410%u043D%u0430%u043B%u043E%u0433%u043E%u0432%u044B%u0435%20%u0447%u0430%u0441%u044B3%5D%5B%5D%5B//%20based%20on%20canvas%20tutorial%20example%20code%0A//%20%28http%3A//developer.mozilla.org/en/docs/Canvas_tutorial%3ABasic_animations%23An_animation_example_2%29%5D%5Bthis.%20clock%20%3D%20function%20%28%29%0A%7B%0A%09var%20now%20%3D%20new%20Date%20%28%29%3B%0A%09var%20canvas%20%3D%20this.%20getElementsByTagNameNS%20%28%22http%3A//www.w3.org/1999/xhtml%22%2C%20%22canvas%22%29%20%5B0%5D%3B%0A%09if%20%28%21canvas%29%0A%09%7B%0A%09%09var%20canvas%20%3D%20document.%20createElementNS%20%28%22http%3A//www.w3.org/1999/xhtml%22%2C%20%22canvas%22%29%3B%0A%09%09canvas.%20setAttribute%20%28%22width%22%2C%20%2224%22%29%3B%0A%09%09canvas.%20setAttribute%20%28%22height%22%2C%20%2224%22%29%3B%0A%09%09canvas.%20setAttribute%20%28%22style%22%2C%20%22min-width%3A24px%3Bmin-height%3A24px%3Bheight%3A24px%3Bwidth%3A24px%3Bmax-width%3A24px%3Bmax-height%3A24px%3B%22%29%3B%0A%09%09this.%20image%20%3D%20%22data%3A%22%3B%0A%09%09this.%20disabled%20%3D%20true%3B%0A%09%09canvas%20%3D%20this.%20appendChild%20%28canvas%29%3B%0A%09%09var%20ctx%20%3D%20canvas.%20getContext%28%222d%22%29%3B%0A%09%20%20%20%20%20%20%20%20ctx.%20scale%20%2824%20/%20122%2C%2024%20/%20122%29%3B%0A%09%7D%0A%09var%20ctx%20%3D%20canvas.%20getContext%28%222d%22%29%3B%0A%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20clearRect%20%280%2C%200%2C%20150%2C%20150%29%3B%0A%20%20%20%20%09ctx.%20translate%20%2861%2C%2061%29%3B%0A%20%20%20%20%09ctx.%20scale%20%280.4%2C%200.4%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28-Math.%20PI%20/%202%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22white%22%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2012%3B%0A%20%20%20%20%09ctx.%20lineCap%20%3D%20%22round%22%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%2012%3B%20i++%29%0A%20%20%20%20%09%7B%0A%20%20%20%20%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%206%29%3B%0A%20%20%20%20%09%20%20%20%20ctx.%20moveTo%20%28100%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%205%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%2060%3B%20i++%29%0A%20%20%20%20%09%7B%0A%20%20%20%20%09%20%20%20%20if%20%28i%20%25%205%20%21%3D%200%29%0A%20%20%20%20%09%20%20%20%20%7B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20moveTo%20%28117%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%7D%0A%20%20%20%20%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09var%20sec%20%3D%20now.%20getSeconds%20%28%29%3B%0A%20%20%20%20%09var%20min%20%3D%20now.%20getMinutes%20%28%29%3B%0A%20%20%20%20%09var%20hr%20%20%3D%20now.%20getHours%20%28%29%3B%0A%20%20%20%20%09this.%20tooltipText%20%3D%20%5Bhr%2C%20min%20%3E%209%3F%20min%3A%20%220%22%20+%20min%2C%20sec%20%3E%209%3F%20sec%3A%20%220%22%20+%20sec%5D.%20join%20%28%22%20%3A%20%22%29%3B%0A%20%20%20%20%09hr%20%3D%20hr%20%3E%3D%2012%3F%20hr%20-%2012%3A%20hr%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20rotate%20%28hr%20*%20%28Math.%20PI%20/%206%29%20+%20%28Math.%20PI%20/%20360%29%20*%20min%20+%20%28Math.%20PI%20/%2021600%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-20%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2880%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28%28Math.%20PI%20/%2030%29%20*%20min%20+%20%28Math.%20PI%20/%201800%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2010%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-28%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%28112%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28sec%20*%20Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%206%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-30%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2893%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23555%22%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%203%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20fill%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%27%23325FA2%27%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%20142%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%09setTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%201000%29%3B%0A%7D%0AsetTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%202000%29%3B

Anton
Предупреждать надо о невидимости кода (или это только у меня). Хорошо кнопка преобразования custombuttons есть...

Infant написал:

Anton
Предупреждать надо о невидимости кода (или это только у меня). Хорошо кнопка преобразования custombuttons есть...

Infant

О чём речь ?

В последних кнопках в поле код я текста не вижу, но он выделяется. В остальных — вижу. Видимо что-то в коде кнопки так воспринимается.
Если скопировать и вставить, а потом удалять по одному символу с начала строки, то начиная с:
3B%0A%20%20%20%20%09%20%20%20%20ctx.%20moveTo%20%28100%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%205%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%2060%3B%20i++%29%0A%20%20%20%20%09%7B%0A%20%20%20%20%09%20%20%20%20if%20%28i%20%25%205%20%21%3D%200%29%0A%20%20%20%20%09%20%20%20%20%7B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20moveTo%20%28117%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%7D%0A%20%20%20%20%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09var%20sec%20%3D%20now.%20getSeconds%20%28%29%3B%0A%20%20%20%20%09var%20min%20%3D%20now.%20getMinutes%20%28%29%3B%0A%20%20%20%20%09var%20hr%20%20%3D%20now.%20getHours%20%28%29%3B%0A%20%20%20%20%09this.%20tooltipText%20%3D%20%5Bhr%2C%20min%20%3E%209%3F%20min%3A%20%220%22%20+%20min%2C%20sec%20%3E%209%3F%20sec%3A%20%220%22%20+%20sec%5D.%20join%20%28%22%20%3A%20%22%29%3B%0A%20%20%20%20%09hr%20%3D%20hr%20%3E%3D%2012%3F%20hr%20-%2012%3A%20hr%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20rotate%20%28hr%20*%20%28Math.%20PI%20/%206%29%20+%20%28Math.%20PI%20/%20360%29%20*%20min%20+%20%28Math.%20PI%20/%2021600%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-20%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2880%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28%28Math.%20PI%20/%2030%29%20*%20min%20+%20%28Math.%20PI%20/%201800%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2010%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-28%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%28112%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28sec%20*%20Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%206%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-30%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2893%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23555%22%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%203%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20fill%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%27%23325FA2%27%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%20142%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%09setTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%201000%29%3B%0A%7D%0AsetTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%202000%29%3B
всё становится видным.

Infant написал:

В последних кнопках в поле код я текста не вижу, но он выделяется. В остальных — вижу. Видимо что-то в коде кнопки так воспринимается.
Если скопировать и вставить, а потом удалять по одному символу с начала строки, то начиная с:
3B%0A%20%20%20%20%09%20%20%20%20ctx.%20moveTo%20%28100%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%205%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%2060%3B%20i++%29%0A%20%20%20%20%09%7B%0A%20%20%20%20%09%20%20%20%20if%20%28i%20%25%205%20%21%3D%200%29%0A%20%20%20%20%09%20%20%20%20%7B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20moveTo%20%28117%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%7D%0A%20%20%20%20%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09var%20sec%20%3D%20now.%20getSeconds%20%28%29%3B%0A%20%20%20%20%09var%20min%20%3D%20now.%20getMinutes%20%28%29%3B%0A%20%20%20%20%09var%20hr%20%20%3D%20now.%20getHours%20%28%29%3B%0A%20%20%20%20%09this.%20tooltipText%20%3D%20%5Bhr%2C%20min%20%3E%209%3F%20min%3A%20%220%22%20+%20min%2C%20sec%20%3E%209%3F%20sec%3A%20%220%22%20+%20sec%5D.%20join%20%28%22%20%3A%20%22%29%3B%0A%20%20%20%20%09hr%20%3D%20hr%20%3E%3D%2012%3F%20hr%20-%2012%3A%20hr%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20rotate%20%28hr%20*%20%28Math.%20PI%20/%206%29%20+%20%28Math.%20PI%20/%20360%29%20*%20min%20+%20%28Math.%20PI%20/%2021600%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-20%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2880%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28%28Math.%20PI%20/%2030%29%20*%20min%20+%20%28Math.%20PI%20/%201800%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2010%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-28%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%28112%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28sec%20*%20Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%206%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-30%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2893%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23555%22%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%203%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20fill%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%27%23325FA2%27%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%20142%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%09setTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%201000%29%3B%0A%7D%0AsetTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%202000%29%3B
всё становится видным.

Непонятно, что имеется в виду... Блоки "Код:" я оформлял как обычно, у меня отображаются нормально. Адресная строка ? Да, бывает, что в textbox'ах большой текст становится невидимым (впрочем, у меня код последних кнопок в адресной строке также виден).

http://people.mozilla.ru/infant/Images/NoCode.gif

Infant
Не, я тут не при чём. Это у тебя со стилями какой-то непорядок (userContent.css, greasemonkey или расширения).

А это:

Если скопировать и вставить, а потом удалять по одному символу с начала строки, то начиная с:...

где ? В локальном html ?

Копирую в поле создания сообщения и тоже не вижу текст. Вставляю в редактор FAR'а — вижу. Самому стало интересно, начал Ctrl+Del удалять символы и ... бац появилось.

Infant написал:

Копирую в поле создания сообщения и тоже не вижу текст. Вставляю в редактор FAR'а — вижу. Самому стало интересно, начал Ctrl+Del удалять символы и ... бац появилось.

Бывает, про textbox'ы я уже говорил (у меня обсуждаемые коды видно и в полях создания сообщений : ) ).

скажите как сделать кнопку которая выводила бы смайл:P в  TextBox а то у мени ничего неполучаеться :whiteflag:

xXx написал:

скажите как сделать кнопку которая выводила бы смайл:P в  TextBox а то у мени ничего неполучаеться :whiteflag:

Код:

custombutton://Smiley%3A%20%3A%29%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADYUExURWJiYv7xQ0ZGRioqKiQaAP/te//gAPeiAP7uZP7lAP/YAPz8Ef/UAP31Kv+zAP7qADcuFf+6APOgAP3yAP/dAP33AP/MAP/VZemdAP3yAf+sAP/eQsaHAP7sEf30Ef/gY//DIP/VVtaeLkM9If7MYv31Jv/jVv/AEf7tKt6jMeCpAOXNJ/GfAP/BAPz5AOfQOf7jGfikAP/dAf/he/33Af7kEf/FKv/aEf/IRv/FPv7lAv7xYv/WCv/jDvixKuSkGfW5Rf7qAuOgDvmqEf/cKuKbAAAAAP///7GsR/gAAABIdFJOU///////////////////////////////////////////////////////////////////////////////////////////////AJzs8mAAAACwSURBVHjaVM9FFsMwDARQBxpmhqbMzMytlfvfqHbSTedpob/SCOU0QFNsiKqd9urNowWlYS5VSNbhEKhhLJ0RkhAKOy0gthiGYVky6eFh5QgWA13nODKf3e0OCK5ZTVXVWrbd998vYsHs+jPfNQWtIWJiT4aN65qyd4EJtSLIEMfP0wqSiDjnFU8o+hkO5un9UaApWjA1RFyFoh+2bdtIHMqyP78UnQjzv/5//30FGACrUSaRymhFqgAAAABJRU5ErkJggg%3D%3D%5D%5Bvar%20smiley%20%3D%20%22%3A%29%22%3B%0Avar%20ie%20%3D%20document.%20commandDispatcher.%20focusedElement%3B%0Avar%20ss%20%3D%20ie.%20selectionStart%3B%0Avar%20se%20%3D%20ie.%20selectionEnd%3B%0Avar%20st%20%3D%20ie.%20scrollTop%3B%0Avar%20sh%20%3D%20ie.%20scrollHeight%3B%0Aie.%20value%20%3D%20ie.%20value.%20substring%20%280%2C%20ss%29%20+%20smiley%20+%20ie.%20value.%20substring%20%28se%29%3B%0Aie.%20selectionStart%20%3D%20ie.%20selectionEnd%20%3D%20ss%20+%20smiley.%20length%3B%0Aie.%20scrollTop%20%3D%20st%20+%20ie.%20scrollHeight%20-%20sh%3B%5D%5B

Спасибо :dumb: :)

Доработал часы. Теперь нормально "заводятся".

Код:

custombutton://%u0410%u043D%u0430%u043B%u043E%u0433%u043E%u0432%u044B%u0435%20%u0447%u0430%u0441%u044B3%5D%5B%5D%5B//%20based%20on%20canvas%20tutorial%20example%20code%0A//%20%28http%3A//developer.mozilla.org/en/docs/Canvas_tutorial%3ABasic_animations%23An_animation_example_2%29%5D%5Bthis.%20clockWidth%20%3D%2024%3B%0Athis.%20clockHeight%20%3D%2024%3B%0Athis.%20htmlNS%20%3D%20%22http%3A//www.w3.org/1999/xhtml%22%3B%0Athis.%20xulNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0Athis.%20clock%20%3D%20function%20%28%29%0A%7B%0A%09var%20now%20%3D%20new%20Date%20%28%29%3B%0A%09var%20canvas%20%3D%20this.%20getElementsByTagNameNS%20%28this.%20htmlNS%2C%20%22canvas%22%29%20%5B0%5D%3B%0A%09if%20%28%21canvas%29%0A%09%7B%0A%09%09var%20canvas%20%3D%20document.%20createElementNS%20%28this.%20htmlNS%2C%20%22canvas%22%29%3B%0A%09%09canvas.%20setAttribute%20%28%22width%22%2C%20this.%20clockWidth%29%3B%0A%09%09canvas.%20setAttribute%20%28%22height%22%2C%20this.%20clockHeight%29%3B%0A%09%09canvas.%20setAttribute%0A%09%09%28%0A%09%09%09%22style%22%2C%0A%09%09%09%22min-width%3A%22%20+%20this.%20clockWidth%20+%0A%09%09%09%22px%3Bwidth%3A%22%20+%20this.%20clockWidth%20+%0A%09%09%09%22px%3Bmax-width%3A%22%20+%20this.%20clockWidth%20+%0A%09%09%09%22px%3Bmin-height%3A%22%20+%20this.%20clockHeight%20+%0A%09%09%09%22px%3Bheight%3A%22%20+%20this.%20clockHeight%20+%0A%09%09%09%22px%3Bmax-height%3A%22%20+%20this.%20clockHeight%0A%09%09%29%3B%0A%09%09this.%20image%20%3D%20%22data%3A%22%3B%0A%09%09this.%20disabled%20%3D%20true%3B%0A%09%09this.%20setAttribute%20%28%22class%22%2C%20%22%22%29%3B%0A%09%09canvas%20%3D%20this.%20appendChild%20%28canvas%29%3B%0A%09%09var%20ctx%20%3D%20canvas.%20getContext%28%222d%22%29%3B%0A%09%20%20%20%20%20%20%20%20ctx.%20scale%20%28this.%20clockWidth%20/%20122%2C%20this.%20clockHeight%20/%20122%29%3B%0A%09%09var%20pn%20%3D%20this.%20parentNode%3B%0A%09%09var%20ns%20%3D%20this.%20nextSibling%3B%0A%09%09var%20button%20%3D%20pn.%20removeChild%20%28this%29%3B%0A%09%09if%20%28ns%29%0A%09%09%09pn.%20insertBefore%20%28button%2C%20ns%29%3B%0A%09%09else%0A%09%09%09pn.%20appendChild%20%28button%29%3B%0A%09%7D%0A%09var%20ctx%20%3D%20canvas.%20getContext%28%222d%22%29%3B%0A%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20clearRect%20%280%2C%200%2C%20150%2C%20150%29%3B%0A%20%20%20%20%09ctx.%20translate%20%2861%2C%2061%29%3B%0A%20%20%20%20%09ctx.%20scale%20%280.4%2C%200.4%29%3B%0A%09ctx.%20fillStyle%20%3D%20%22white%22%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%20142%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20fill%20%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28-Math.%20PI%20/%202%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22white%22%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2012%3B%0A%20%20%20%20%09ctx.%20lineCap%20%3D%20%22round%22%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%2012%3B%20i++%29%0A%20%20%20%20%09%7B%0A%20%20%20%20%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%206%29%3B%0A%20%20%20%20%09%20%20%20%20ctx.%20moveTo%20%28100%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%205%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%2060%3B%20i++%29%0A%20%20%20%20%09%7B%0A%20%20%20%20%09%20%20%20%20if%20%28i%20%25%205%20%21%3D%200%29%0A%20%20%20%20%09%20%20%20%20%7B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20moveTo%20%28117%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%20%20%20%20ctx.%20lineTo%20%28120%2C%200%29%3B%0A%20%20%20%20%09%20%20%20%20%7D%0A%20%20%20%20%09%20%20%20%20ctx.%20rotate%20%28Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09%7D%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09var%20sec%20%3D%20now.%20getSeconds%20%28%29%3B%0A%20%20%20%20%09var%20min%20%3D%20now.%20getMinutes%20%28%29%3B%0A%20%20%20%20%09var%20hr%20%20%3D%20now.%20getHours%20%28%29%3B%0A%20%20%20%20%09this.%20tooltipText%20%3D%20%5Bhr%2C%20min%20%3E%209%3F%20min%3A%20%220%22%20+%20min%2C%20sec%20%3E%209%3F%20sec%3A%20%220%22%20+%20sec%5D.%20join%20%28%22%20%3A%20%22%29%3B%0A%20%20%20%20%09hr%20%3D%20hr%20%3E%3D%2012%3F%20hr%20-%2012%3A%20hr%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20save%20%28%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22black%22%3B%0A%20%20%20%20%09ctx.%20rotate%20%28hr%20*%20%28Math.%20PI%20/%206%29%20+%20%28Math.%20PI%20/%20360%29%20*%20min%20+%20%28Math.%20PI%20/%2021600%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-20%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2880%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28%28Math.%20PI%20/%2030%29%20*%20min%20+%20%28Math.%20PI%20/%201800%29%20*%20sec%29%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2010%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-28%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%28112%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20save%28%29%3B%0A%20%20%20%20%09ctx.%20rotate%20%28sec%20*%20Math.%20PI%20/%2030%29%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23D40000%22%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%206%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20moveTo%20%28-30%2C%200%29%3B%0A%20%20%20%20%09ctx.%20lineTo%20%2893%2C%200%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20fillStyle%20%3D%20%22%23555%22%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%203%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20fill%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%20%20%20%20%09ctx.%20beginPath%20%28%29%3B%0A%20%20%20%20%09ctx.%20lineWidth%20%3D%2014%3B%0A%20%20%20%20%09ctx.%20strokeStyle%20%3D%20%27%23325FA2%27%3B%0A%20%20%20%20%09ctx.%20arc%280%2C%200%2C%20142%2C%200%2C%20Math.%20PI%20*%202%2C%20true%29%3B%0A%20%20%20%20%09ctx.%20stroke%20%28%29%3B%0A%20%20%20%20%09ctx.%20restore%20%28%29%3B%0A%09setTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%201000%29%3B%0A%7D%0AsetTimeout%20%28this.%20clock.%20bind%20%28this%29%2C%202000%29%3B

http://forum.mozilla.ru/uploaded/textbug.png

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

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

Код:

custombutton://Bookmarks%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAACb0lEQVR4nGWSS29NYRSGn73P7jmnpz0uLY00DWnqVqQqISpCWgbiFgMTBsKIhl9ADMzFX/ArDIgBAwYiESJpxSUqLaE9PZfa+1z2931rGex9eorBylrfYD1533d9HuAB2bT7aXn/9PYMIEAIxKqq3sXr97cBk8A4MLmpb9346PZBujI+xWKBUnmF5WrIh88/qsDbtKrAc2AuKOSyc3t2DjG6Y4iDY8P0byzieT4vX85y7Ng+Hj76yuOPJQb2jm+Ym1+anPtUmmyGIdOnsnybX8KP6i1G9h/m9NQBBjb1EQQ5MpkssRUazmf6wSznL+9j4vQuLt04ykIpy/SZjYxNHEe7evER5c2nCqpdeF4Gz/cQD0ShYRSArkKeF19a/Ko4AO7cPJfsiCQANQbnIJNJUlJNACLJu1oXFkNLtZEAnAM1BkQIVBVJAU7BCVhJZrsKsFjjqEbJIZwFMQZ1QoAoahNA7DoA6/4GmNhSWqx3FFiDihIgrCpo2ES2FTAOYpsCwpioVkfUrALEGHBCwBoLrTjxbgVaDqIUUItiwlpIy9O/ACpCoGssRKZjoW5hJU4Ay5U6rWaTZpqqSGKBdgZiDCLwu9UJsmESIED4u8nyTJnCUP5/BWst1GzHQmQgTBX8el9hdHOOd7MrCUA6V/A1/QciUGuCGuhVGO7JMuLF9OQzXJ3q5+6tQ1w5txX81EL7H7SvoAojccjiUpmPCz958uQZr19t5dqRdZzc1k1Prcbts7s5MVxE2zuieBcu3NP1G/roLhRQ1RXnzGwYVZ5+X/g8EwQBWwZHJrpzPXt8P1MMguxhVSWfzxGGEeXSIn8AD3imeeFtcw8AAAAASUVORK5CYII%3D%5D%5B%5D%5Bthis.url2xul%3D%20%27chrome%3A//browser/content/bookmarks/bookmarksManager.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%20toggleSidebar%28%27viewBookmarksSidebar%27%29%3B%20break%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

History. и там и там - обычную историю. в табе открываеть сие смысла мало, но всё же...

Код:

custombutton://History%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADEklEQVR4Xm2TXWwUVRiGn5mdbfenW4Ziba0pWSNLAokaJSrFwCJobEg0I3pDDNoVEmNIFEkAb7hqg14gmKbtjSlrmjSERO2GaAwlBRo1oIH4c7EqVLopNWgpy0qzdGdn5nzObPbCEt/kOZOTfO97zpnvHI17tOqNM6a4ylKOk1aOl1RVB+W4Bc92JpXr5ua+y5T4j5YEpDITlnheVplR88nH20i1x3A9IT9zh0sXZ6j+OltSVTdT/PntHHXp1LV619msFjHGtryy1jzd10X29RRNxQWMP/5kILOWr/pfYMfB50y9qXGsOXU0uyTAN1tao9Hz7p519HY/SEskRMWD7g0dvNi9Gk8gGtLY9XyS/f2vEkpEemIdhy0ALfXmhImS6a3+yvu3PEBYB78WDVACrkBVwYG3MjTEE+zu7Wd0fIqT+04Ex3lIF09ZsY5mc8f6tlqh7dWgEhDM6+Yzp75g3dZtzNuKzkc7aU61m8r1LF1cL51c1ULE0ANDjcX6Nwg56JvHffPeoRN4azZxbrbM9D82K59dE3QnrQetun9FlNGx37l2/Q53PVj06TvwHkfeyZAb/ZSNO/fwl61hCzRUXa6f+40V7cuCgKTuD2gC8zcXmC97zNtwy2e6UCCdTgNweugDhndvI1Itk9CFcLlM1NBABCO4JOVima7tT2CENEq2EAkJe48Nk79wnuMXr5BobafiCRUxiCdCbN65ngufXwYo+AHO5JXvCz1dz6ykMazTZPiENSKty0la2xEBRwl3XWHBUYSqClc08l/+BDAZ/IPcTP5G6e+rc8QMjYRvbm7QWdagYYYJ8OdagB+s+zU6s5cLFC5Nl4CccePsa6XWp4czJwe+GXts4GVisQjxEDWKJRvXcWm5Lw5oVBXcKlYYef8zgAwcLVEXyx8ZzKY2H5fhiRmZKovM2SKHs7/IoSPfyuyiSH5BZPDUVWnr7BXYd4z/U+Lhj6x454e3N700IkMjP8r4+Wvy9cSUfPzJD/LUxsHAeNvHWvoa71G0ra92w1TVSfskgzaLkgIwCeSWbBv4F2vVgQlhKqMWAAAAAElFTkSuQmCC%5D%5B%5D%5Bthis.url2xul%3D%20%27chrome%3A//browser/content/history/history-panel.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%20toggleSidebar%28%27viewHistorySidebar%27%29%3B%20break%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

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

Код:

custombutton://Downloads%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACuklEQVR4XnWSS2hUVxiAv/OaezN3kpkmjVq1JV1FqNiF1D6gtAvbBIPo0oVdlOKuoO2iFlyUtjtxjIK4qMWFaHBREFyoFFoslvqor4yalqjEGtpOm8lMOnPncSe55/TCDEgQP/jgwOF85/xwBMEhwIETO3PZ/iPZbBDYBJ6AEInSk+X5v8LaXP4zmDkGPgACPQ6xRfr+5a/Gt7+xdWQl1aZFiOWBjKc4cXqO/L5dj7DfD0OqDaAxEnBIT6m1QwEvrFak62pZACCXgTUvpkH7Ae0oDVE3kFKgJfjaFkPHw3+hVuNJwIGQMGihGgHCWcDSRfOcD2EbehS1WDAfQtjozg14prO+fR9uTsdgFER0EBJNv98J+sY1liSlGjSaoBWoxKmi45e7MfcKjuKjGHwHoWjRtx6waBwgQ6xdisNIMh9CFEFzCW79DT/fh4UkQksgAgmiFbN6m2bFWJuZo2jlB2dTemANzg3PtcBUIGzC4wX4owzKCIJBTVwXxNay+PxbgyjvKt6qFkIdEOb14+FroyPBy0MZlJ8mRtNoQ72V2IZKHUqJYc0Rl5rECxFxS+PCSzD16Tlly4XHbblqdP2bm8zwSxoDeAp0IoBzYC1EVmAxQA+2egOmv5ilMrlPAJDZuKVvwwendnz8Ye7VdX38U+7cXE6cq3VtwHwZoqkL2Ot7f6Nc2AEUJNJAyjtXnZx4fyK/v3j97n+sXQn9vRB4HXsDUALav3+HvbL7RnJ4DCgASACEAi/1azh5/J2TB76euXitxEAOsmnozXT+XPHyBPFPe36kOj0KzNBF0gVhwKjpxTvHNp0++OXt8xdn6cnAfHmRO2ePuOiHT87Q/HMMKLEMaWDg7cR3IT0E3gAEQxmx7qNLr+ydctnN+RjZ+y0geRo0y+iOY0zoZs+/d++bW4epPqhga5/zDP4HPDMe0LQJb6wAAAAASUVORK5CYII%3D%5D%5B%5D%5Bthis.url2xul%3D%20%27chrome%3A//mozapps/content/downloads/downloads.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%20if%20%28document.getElementById%28%27sidebar-box%27%29.getAttribute%28%27sidebarcommand%27%29%29%20//%20close%20sidebar%0A%09%09%09%09toggleSidebar%28%29%3B%0A%09%09%09else%20%20//%20open%20in%20sidebar%0A%09%09%09%09openWebPanel%28this.tooltipText%2C%20this.url2xul%29%3B%20%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Add-ons. и там и там - менеджер расширений.

Код:

custombutton://Add-ons%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUklEQVR4XqVTv0vDQBR+SS4m9tIOsQiKXR1EXMRVruKiIrgo6OIkmawKVlr8AxwUQbciOHbSQVyK+OMmQUdRRAouFXFxSMFBhJ7JQQ5r7qrQB4F399735ct7XzTGGLQTSHbZv5Peq1bfh37esRLL/psgBF9ulUl0Hisu0JYKNE+7ihV0C05rBzCdWQLRI1EjFFxvn5DfJBZKBERI1F7YI8xtFKj0Ewy9A85ey80EBoaLtyNxxq6tngHSTZjsW+Q5B0nCNjvVBMNr43RkcABmp0aJjRw5AUqIeQS9d7fLDyuRD0Rhf3NdSZDswiKfz+VpOEwUf4sTPFhK8OUDj1TaUfqAg1UKUm7yTx9wcLfbE2v063WwwQHizcjXWCs9811/NHxYPczTys15E0Fl95gEBGojGWDC0+c9zwOwaIoUhqayAKvX2OtlKLSIbG5CWm/7d/4GwUhlMxyCjq8AAAAASUVORK5CYII%3D%5D%5B%5D%5Bthis.url2xul%3D%20%27chrome%3A//mozapps/content/extensions/extensions.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%20if%20%28document.getElementById%28%27sidebar-box%27%29.getAttribute%28%27sidebarcommand%27%29%29%20//%20close%20sidebar%0A%09%09%09%09toggleSidebar%28%29%3B%0A%09%09%09else%20%20//%20open%20in%20sidebar%0A%09%09%09%09openWebPanel%28this.tooltipText%2C%20this.url2xul%29%3B%20%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

View Source. соответственно просмотр исходников в сайдбаре и табе. при всплытии таба перегружает его автоматом.

Код:

custombutton://View%20Source%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABxklEQVR4XqVSS47aUBCs5w9GKOITAs4soxwhF8gtuAYcJIJjcIAsuEWySTRJVtHAxISR+NmYZ9nuuFojC8mbkVJS082jX1V3Pcx8Phf8Bzx+TKdTfP6RwWYFvj5YfFlbxJccSVogZtgSRQlABEQpBtGn91gsFkqg+BCWCFoBPr7zkFwDuJ6PsuTFssoCazMYY2Acg+v1ihpcgVg//Nb8uFlL9LgWkbKKoopcbBrLz/tvcomP8vT3j/y6/y4E79YTjMM7zf3Ba7RaLVUlOHVeGrwZ38HxAhg3x3D89tYDBXzfZ9LxjscjRqMRoiiC53kYDAZwHAd5niMIAuYGQY0sy9But1EUhXrQ6XS0fobWt3AA1Moign6/T1U1LAxDTqbnSZKQnDV7mwS73U7zdrvFfr+nujYT1lpsNhuWJGJv8xXiOJY0TeV0OknVxJpZz8/ns1S+SKXM3xn1K3CCWpmqh8OBNY1S1YqAK3EVTsIeRtNEus4mRq/Xo+vqR7fbrddYrVZ4RpOgGlPffzgccneaSCXuTBL9TkwmEyb9G89ms1f1ClRmE8N1XV2h8oFPWp8RN5d9eqomvhTL5VKNa6xAxheCygY3+AdSq3K+SO25KQAAAABJRU5ErkJggg%3D%3D%5D%5B%5D%5Bthis.onClick%3D%20function%28e%29%0A%7B%0A%09var%20current%3D%20content.document.location.href%3B%0A%09var%20url%3D%20%27view-source%3A%27%20+%20current%3B%0A%09switch%20%28e.button%29%0A%09%7B%0A%09%09case%200%3A%20if%20%28document.getElementById%28%27sidebar-box%27%29.getAttribute%28%27sidebarcommand%27%29%29%20//%20close%20sidebar%0A%09%09%09%09toggleSidebar%28%29%3B%0A%09%09%09else%20%20//%20open%20in%20sidebar%0A%09%09%09%09openWebPanel%28current%2C%20url%29%3B%20%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%20i%3D%20t.length%3B%20%0A%09%09%09while%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%09gBrowser.selectedTab%3D%20gBrowser.addTab%28url%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%3Durl%29%20//%20popup%20loaded%0A%09%09%09%09%7B%0A%09%09%09%09%09gBrowser.selectedTab%3D%20gBrowser.tabContainer.childNodes%5Bi%5D%3B%0A%09%09%09%09%09BrowserReload%28%29%3B%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Error Console. и там и там - консоль ошибок.

Код:

custombutton://Error%20Console%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAChklEQVR4Xn1TTUtbQRQ9L3lqIvnAWFNjQPxauOgPEPEn2J3iRkqzUASLRUSXLl1IQRdCu3VTN9L8ARGJkgrdCLbRmC4kIdqo0aZp8qJJnN4z9BWhtgcOj5m5d+45d+4zRkdHX87Ozs47HA7jXoD/QCml2dTUZB4fH+fm5uZeGQcHB9/6+vqenp2dwe1ywWmacDqdjyYTtVoNxWIR/f39mJ6efmc+aW11xeNx5C0LPo8HJ4eH+CkBhmHgMdTrdbDY6uoqmpubvaZE6oqpoyO8mJpCMBzG2+Vl3Eug4XD8dRFd+v1+lMtlqlGmeAfRFgohurGB+M4OMqenOtGkHaFtgXt3d3fsAUqlEgizoaEBt7e3mJmYgFsOgsEgno+MoLWtDV+TSezv7jKZ1TQvLi7Q0dEBGybl8+ZatYq6XFa2LMS2t+GShloikxXpm0UsOSMZzz2C+rXUlpYWBAIBeL1eWCKvWCiwD/TLPU2fzwePNLqxsVGrIRwCkPTldrsZYF/GL5OYzH2e6zja/qOAcii3p6cHXV1d6O7uJvW6t7dXf+0z+zwcDrMvfD3DzOfzlcHBQf/W1hZl0TP9sgKfzG4e1/Ru72sblUqlagwPD89EIpHXnJFCoVAKhUKdMpmBqjSVZAKrXV9f15PJZFr2fsgA+WRtra2tzUNgCL3C8OTk5JtYLPY9lUqpdDqtMpmM/kqikpFX0Wj0ZGhoKALAL/TgIcbHxxfUb1xdXanz83OVy+VUNptViURCrwm5vCjNfQbCfkZib29vf3NzM3t5eclOa9pP3N7ezrmHqMH6+nri5uamgH+gc2BgYEGsfFhaWvokP8yXlZWVz4uLix/HxsbeS2+mOPV4gF+2zl1OzFwo7QAAAABJRU5ErkJggg%3D%3D%5D%5B%5D%5Bthis.url2xul%3D%20%27chrome%3A//global/content/console.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%20if%20%28document.getElementById%28%27sidebar-box%27%29.getAttribute%28%27sidebarcommand%27%29%29%20//%20close%20sidebar%0A%09%09%09%09toggleSidebar%28%29%3B%0A%09%09%09else%20%20//%20open%20in%20sidebar%0A%09%09%09%09openWebPanel%28this.tooltipText%2C%20this.url2xul%29%3B%20%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

Stylish. и там и там - менеджер стилей. в табе не нажимайте кнопку "ОК", а то браузер закроется ;-)

Код:

custombutton://Downloads%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQPFTcXrGmnbAAAAo9JREFUOMuNkk1sjEEYx38z79hd+1rd3aq2WlrEqjrhIIREiYuPg5BGpDiQCCIO4uSECIKERBBE4uNAhAvRRdKLCAckNDTiQKhU6lDdt/vO7nbfGYftllUJz2Uyz8z85/c8z1/sOXgpszgVV/wjPn3tH5oyrXX+1va23t/SgjWnegr2P+Psucv9F652NgEQiYedZPNB+cWzUmtNNpvF93183yeXy42uWmu01nz42Mfundtq+np7nuJOjoVrWx6GJtQ8VYXAEY7j4HkeAFJKjDElPiEASCQSNNYnAaitrqpW1TPT0YmJ3ED3g0dq2AohhCCZTFY8Koe1FmvBjuxPXLgWmlTXPC/77W0KQClhbKFQEGWCskhZKAgMgTF43hA7D5xgUAsZVdlL3uc3vQAqpLCu6+K67pjOW2sxxlIMDPsPn+bdF4/pDTXmZdftveU7KuRYtNYMDAwgpUQIgZRyFL0YBBw6eZ70s/e0zGymrTURvOz69YkKOQJrLfF4HCnlSAlylODMxevc6upm1ozpbF41j9j4aAWlHC7mbTQaJZ/Po7XG930ynsdgJkNnOs2Nm7dJNTXQvizFru1bsdZWCvT98OWxOy8Ih8NEIhFC4TBBMUe68z5udDz7dnSwoW0O7evXl6j+6JMaEjF55O5zIt9fUetkePHkHp9eP2Hy3JW0LFxNXX0DaxcvxRk37q8WV8M4tKbquf/4CrO/3SEkoXYCNDY2srFjCyAIjCUIzAhBJYPKFy0Z6lixbhfx50NE3BhNizaxYOES+vu/Y0xpGsYETK1LjqlBSWBSrIqjHfOhY3nF4dT6mrHegAqrqiplMsM9DwePHtfdQgg5MsOSvy1CCClLeYQQQuZz+eLvAj8BP0QydNxNldoAAAAASUVORK5CYII%3D%5D%5B%5D%5Bthis.url2xul%3D%20%27chrome%3A//stylish/content/stylish.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%20stylishBrowserOverlay.openSidebar%28%29%3B%20break%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

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

Код:

custombutton://Open%20Location%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAB+ElEQVR4nK2TP2hTURSHv/teXmpTi0iUalHbLq0IdqirolBcHBTqUgWtdBWKAa2bCC7axclZUXAoglsXcbG6dLFoaONkkNBKmpjiS9/fe+9xSFt1iYV6pgOH38c5v3OOEhF2E86u1P8DkNlKzlydfpJauWCs099O4Dq27Dlqbv7lzE0ANj1wR8YK5WKpJHG0LnG0LlHYkCisSxTUJQxqEjTXJGiuyeJSUUbGCmXAFZHtDpxUS9/gQC+NHzXS1EesIdeVQ6wgWLQ2eF6WwWN5Ui19m+ObLQ+U1hqlHBxXWKrmcV0Xq2OMjtBJiE4Cmn4dBLTWAOovD4wxWLvBno4Oaqvr5Aa6mV/8TLURINayvyvDo9JDKrrCyr7fq98GADhODs+LuHz+EGkacer4YUzaGiGNQ0oLy7y+94zRG+MAWSDJDF8qyMmLt1oA18WaCJsGmCSl0/PQyjAxd5uF7x+x2jD7c7bV/CS+unIAdfTspJTfzAAu2viIibFWo43Fak0QRpx4eo4Hd+7ytvqODc8n53lM5acYnRhH9Z6+3vaWxWpWD76CzgSA4UI/nx6XW8UwS2bl/fOhdoBNn3qAbq4x4/fEQ3h84QXTkPgZoPwPAMA3oANL8ev9VYNlGfgAxGqn36iUygJHgL1AE6iISLJjwB8QBYiIJAC/AEheAlhU2OEsAAAAAElFTkSuQmCC%5D%5B%5D%5Bthis.url2xul%3D%20%27chrome%3A//local/content/open_location.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%20openWebPanel%28this.tooltipText%2C%20this.url2xul%29%3B%20break%3B%0A%09%09case%201%3A%20gBrowser.selectedTab%3D%20gBrowser.addTab%28%27about%3Ablank%27%29%3B%20break%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B

чтобы это заработало нужно в папке с установленой мозиллой в папке chrome создать файл local.manifest с таким содержимым:

Код:

content local local/

потом создать там же папку local и внутри нее файл open_location.xul с такими потрохами:

Код:

<?xml version="1.0"?> 
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://browser/locale/openLocation.dtd">
 
<window id="openLocation" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="document.getElementById('url2open').focus()">
    <hbox align="center">
            <textbox id="url2open" 
            flex="1" 
            type="autocomplete" 
            completeselectedindex="true" 
            autocompletesearch="history" 
            enablehistory="true" 
            style="height:1.75em" />
        <button 
            label="open" 
            oncommand="document.location=document.getElementById('url2open').value;" />
    </hbox>
</window>

весьма простенько, но с поставленной задачей справляется на ура.

не подскажите, как реализовать такие же кнопки для, например, Page Info или DOM Inspector'a?

Не знаю почему, но и одна из этих кнопок у мну сайдбар открыть не ухитрилась... Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1a3) Gecko/20060619... Более того Bookmark и History у мну не открылись даже в обычной панели... Ж(
Может дело в MR Tech's Local Install??? А может и нет...

Оформил страничку со своими кнопочками: http://dark-demon.nm.ru/soft/custombuttons/
Zoolcar9 тоже: http://zoolcar9.lhukie.net/mozilla/custombuttons.html

Lain_13 какая у тебя версия FF?

Dark-Demon
Чего-то твоя страничка не открывается.

Оформил страничку со своими кнопочками: http://dark-demon.nm.ru/soft/custombuttons/

Запрашиваемая страница не найдена.

Dark-Demon написал:

Lain_13 какая у тебя версия FF?

см. мой пост внимательно. Ж)
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1a3) Gecko/20060619
1.8.1a3 - вот это как раз и есть 2.0а3, возможно ночная сборка, в оригинале Gecko/20060619 был, кажется, меньше. Если это так, то, возможно, кнопки у тебя правильные.

Они к расширениям к каким либо привязаны или все должны работать отдельно?

з.ы. Есть идея для всех, тут присутствующих. Надо создать плагин со списком возможных кнопок из которого их можно будет установить при условии наличия в системе КастомБаттонсов. Или прямо в баттонсы такую панельку вшить со страничкой. Много не займет, но если ее обновлять, то тем, кто поставит себе расширение, не понадобится лезть в инет за кнопочками... Они сразу там будут! (Хотя, конечно, самые новые версии кнопок будут тут...)
з.з.ы. Странички работают обе, но как же медленно у Золкара9 она грузиццо... Видимо хостинг... А твоя, ДД, на редкость криво в ФФ отображается... Ж) ты ее под что делал... я ее в 1.5 открывать пробовал только-что... кнопки перекошены, ссылки раздирает пополам и переносит (слево одна такая) и это *БЕЗ* МР Техс Переносчика ссылок...
з.з.з.ы. НАМ НУЖЕН ОБЩИЙ ФОРМАТ ОФОРМЛЕНИЯ!!! Не только ведь для себя делаете, не так ли? Для всех! Поэтому нужно придумать какой-то общий формат оформления странички с кнопками (как по мне так наилучший - слева кнопки в столбик, а справа от них комментарии и все это разбито по тематическим группам). И так же срочно встроить этот документ в расширение... или отдельным плагином (для желающих). Было б у мну время сейчас, занялсо бы набросками, а так сорри, что дал инициативу и ничего для этого, пока что, не сделал...
з.з.з.з.ы. Посмотрел код сайта твоего, ДД. ЖЖОШ! А в таблицу засунуть? Текст в один столбец а картинки рядышком в другой. Самое ж очевидное решение. А то они не по вертикали а в разнобой идут Ж(.

Lain_13

з.ы. Есть идея для всех, тут присутствующих. Надо создать плагин со списком возможных кнопок из которого их можно будет установить при условии наличия в системе КастомБаттонсов. Или прямо в баттонсы такую панельку вшить со страничкой. Много не займет, но если ее обновлять, то тем, кто поставит себе расширение, не понадобится лезть в инет за кнопочками... Они сразу там будут! (Хотя, конечно, самые новые версии кнопок будут тут...)

Идея хорошая, но вшивать в расширение - это каждый раз обновлять само расширение. Сделать-то легко отдельное.

см. мой пост внимательно.

версия ядра мне ни о чём не говорит. а оффициальная альфа датируется 20060526, которая у меня и стоит. думаю, дело в твоей ночнушке...

Запрашиваемая страница не найдена.

Сори :) не думал, что вы так быстро среагируете... теперь всё залито.

Они к расширениям к каким либо привязаны или все должны работать отдельно?

Не привязаны. Окромя Stylish Button ес-сно.

Есть идея для всех, тут присутствующих. Надо создать плагин со списком возможных кнопок

нет, нужно просто создать сайт потипу http://userstyles.org/

А твоя, ДД, на редкость криво в ФФ отображается... Ж) ты ее под что делал...

под FF :) А перенос ссылок - это фича такая...

и это *БЕЗ* МР Техс Переносчика ссылок...

не понял фразу :-\

И так же срочно встроить этот документ в расширение...

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

Посмотрел код сайта твоего, ДД. ЖЖОШ! А в таблицу засунуть? Текст в один столбец а картинки рядышком в другой. Самое ж очевидное решение. А то они не по вертикали а в разнобой идут

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

Ой, глянул своё творение, - действительно жуть. Я забыл закачать обновлённую таблицу стилей. Сейчас всё в порядке. :angel:

Dark-Demon написал:

1. нет, нужно просто создать сайт потипу http://userstyles.org/

2.
> и это *БЕЗ* МР Техс Переносчика ссылок...
не понял фразу :-\

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

1. реализация в видео отдельного плагина с обновлением открывающегося в сайдбаре не менее удобна в плане юзабилити. не надо на сайт заходить. смотреть что там поменялось... просто нажал найти обновления и если нету значит нету Ж(. А генерировать плагин можно со страничке на сайте. Никто ее не отменяет, идея хорошая.
2. MR Tech's Link Wrapper - такой страшный плагин для нарезки особо длинных ссылок. Таких длинных, что ни в какие рамки не помещаются и эти рамки растягивают по горизонтали. ИЕ это автоматически делает, а вот для фокса нужен этот плагин. Впрочем иногда он и лажается. Дело в том, что он нарезает вообще все особо длинные матюки на странице, так что если там окажется магнетлинк ДЦ, то потом из него придется удалять 2-3 пробела.
3. не возражаю, созданием сайтов не занимаюсь просто там такой УЖОС был в плане оформления Ж). Теперь действительно все ОК. по поводу таблиц. вы б видели как Опера9 обрабатывает таблицы с незакрытыми внутри тегами... вот ужос... а ИЕ с Фоксом такие фокусы переваривают...

Новая кнопочка. Flip Tabbar. Если таббар у вас расположен вертикально (http://userstyles.org/style/show/603), то сия кнопка по среднему щелчку переключает режим увеличения ширины таббара при наведении.

Код:

custombutton://Flip%20Tabbar%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAABGklEQVR4nKWTO04DMRiEx3ayixZR0aAgRGjoSEHNNkg0FCBBRwFXIBQcgp7TcAEOgKKU2yGhhSwg2IcfQwEFyT6yUUZy5fHn8a+xIIllJBc9sBleTd24MGBWnbqN8OL2XjseWyf7jQSSpQVA7Z8No6fxmHmWMM8SZumEWfrK3sEl/3vrEkhtuL2708PkLYbWn6CzCFaDsrEGIIwxEEJCKmL0sg6lFJzJWwNgrYVzX1jxfcTPCYJgDY+jqD0AAKQM0O36OD/aQMfzEA76JU9pBoPTIfdOrn8BSsHZDE5/wxYapJsPSN4/ED3cAVAwRQzaHKSDkAJppucDrDXYOrxpetm0KjrQqNke1A3RaxugBPgjF1UNrUoolv3OP69LsdagzuDeAAAAAElFTkSuQmCC%5D%5B/*%20you%20need%20to%20install%20this%20stylesheet%3A%20http%3A//userstyles.org/style/show/603%20*/%20%5D%5Bthis.PS%3D%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.pref%3D%20%27custombuttons.fliptabbar.enable%27%3B%0A%0Avar%20tb%3D%20gBrowser.mStrip%3B%0Atb.openwidth%3D%20tb.boxObject.width%3B%0Atb.closewidth%3D%2078%3B%0A%0Athis.onClick%3D%20function%28e%29%0A%7B%0A%09switch%20%28e.button%29%0A%09%7B%0A%09%09case%200%3A%20BrowserOpenTab%28%29%3B%20break%3B%0A%09%09case%201%3A%20this.PS.setBoolPref%28this.pref%2C%20%21getBoolPref%28this.pref%2Ctrue%29%29%3B%20break%3B%0A%09%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B%0A%0Atb.fliptabbar%3D%20function%28s%29%0A%7B%0A%09if%20%28s%3D%3Dthis.tabbarstate%29%20this.width%3D%20%28s%29%3Ftb.openwidth%3Atb.closewidth%3B%0A%7D%3B%0A%0Athis.changeFTB%3D%20function%28%29%0A%7B%0A%09var%20tb%3D%20gBrowser.mStrip%3B%0A%09if%20%28getBoolPref%28this.pref%2Ctrue%29%29%0A%09%7B%0A%09%09tb.omov%3D%20tb.onmouseover%3B%20tb.omou%3D%20tb.onmouseout%0A%09%09tb.onmouseover%3D%20function%20%28%29%20%0A%09%09%7B%0A%09%09%09tb.tabbarstate%3Dtrue%3B%20%0A%09%09%09setTimeout%28%22gBrowser.mStrip.fliptabbar%28true%29%22%2C500%29%3B%0A%09%09%7D%3B%0A%09%09tb.onmouseout%3D%20function%20%28%29%20%0A%09%09%7B%0A%09%09%09tb.tabbarstate%3Dfalse%3B%20%0A%09%09%09setTimeout%28%22gBrowser.mStrip.fliptabbar%28false%29%22%2C250%29%3B%0A%09%09%7D%3B%0A%09%09tb.width%3D%20tb.closewidth%3B%0A%09%09this.image%3D%20%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAABGklEQVR4nKWTO04DMRiEx3ayixZR0aAgRGjoSEHNNkg0FCBBRwFXIBQcgp7TcAEOgKKU2yGhhSwg2IcfQwEFyT6yUUZy5fHn8a+xIIllJBc9sBleTd24MGBWnbqN8OL2XjseWyf7jQSSpQVA7Z8No6fxmHmWMM8SZumEWfrK3sEl/3vrEkhtuL2708PkLYbWn6CzCFaDsrEGIIwxEEJCKmL0sg6lFJzJWwNgrYVzX1jxfcTPCYJgDY+jqD0AAKQM0O36OD/aQMfzEA76JU9pBoPTIfdOrn8BSsHZDE5/wxYapJsPSN4/ED3cAVAwRQzaHKSDkAJppucDrDXYOrxpetm0KjrQqNke1A3RaxugBPgjF1UNrUoolv3OP69LsdagzuDeAAAAAElFTkSuQmCC%27%3B%0A%09%7Delse%7B%0A%09%09tb.onmouseover%3D%20tb.omov%3B%0A%09%09tb.onmouseout%3D%20tb.omou%3B%0A%09%09tb.width%3D%20tb.openwidth%3B%0A%09%09this.image%3D%20%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAB+ElEQVR4nK2TP2hTURSHv/teXmpTi0iUalHbLq0IdqirolBcHBTqUgWtdBWKAa2bCC7axclZUXAoglsXcbG6dLFoaONkkNBKmpjiS9/fe+9xSFt1iYV6pgOH38c5v3OOEhF2E86u1P8DkNlKzlydfpJauWCs099O4Dq27Dlqbv7lzE0ANj1wR8YK5WKpJHG0LnG0LlHYkCisSxTUJQxqEjTXJGiuyeJSUUbGCmXAFZHtDpxUS9/gQC+NHzXS1EesIdeVQ6wgWLQ2eF6WwWN5Ui19m+ObLQ+U1hqlHBxXWKrmcV0Xq2OMjtBJiE4Cmn4dBLTWAOovD4wxWLvBno4Oaqvr5Aa6mV/8TLURINayvyvDo9JDKrrCyr7fq98GADhODs+LuHz+EGkacer4YUzaGiGNQ0oLy7y+94zRG+MAWSDJDF8qyMmLt1oA18WaCJsGmCSl0/PQyjAxd5uF7x+x2jD7c7bV/CS+unIAdfTspJTfzAAu2viIibFWo43Fak0QRpx4eo4Hd+7ytvqODc8n53lM5acYnRhH9Z6+3vaWxWpWD76CzgSA4UI/nx6XW8UwS2bl/fOhdoBNn3qAbq4x4/fEQ3h84QXTkPgZoPwPAMA3oANL8ev9VYNlGfgAxGqn36iUygJHgL1AE6iISLJjwB8QBYiIJAC/AEheAlhU2OEsAAAAAElFTkSuQmCC%27%3B%0A%09%7D%3B%0A%7D%0A%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.changeFTB.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0A%0Athis.changeFTB%28%29%3B

Ребят, а реально замутить кнопку для SessionSaver, т.е., чтобы по нажатию левой кнопки мыши на кнопке SessionSaver выдвигался бы список, аналогичный SessionSaver из пункта меню "Инструменты"?
Кто сделает - от меня вечные плюсы в репутацию. :)
Anton? :)

Добавлено:
Сегодня наткнулся на расширение Session Manager, так что необходимость в кнопке отпала. :)

Ян, Люцифер тут интересную фишку сварганил (http://forums.mozillazine.org/viewtopic.php?p=2402639) не хочешь к своему расширению подцепить?

Люди, состряпайте кнопку Online\Offline для Thunderbird, пожалуйста.

Пытаюсь сделать кнопку с выпадающим списком букмарков. Результат - видны только 3 предопределённых пункта. Посоветуйте, пожалуйста, как добавить недостающее ^_^

kuroneko, там это меню специальным скриптом создаётся. смотри свойство onpopupshowing.
также глянь сюда: http://forums.mozillazine.org/viewtopic.php?p=2418562#2418562

Dark-Demon написал:

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

Угу. В том-то и дело, и вызов этого скрипта "в лоб" не срабатывает.

также глянь сюда: http://forums.mozillazine.org/viewtopic.php?p=2418562#2418562

Читал я эту тему. Устанавливать дополнительное расширение ради одной кнопки не хочется, а посмотреть, как оно реализовано... я не слишком силён в XUL-программировании, и пока не совсем понимаю.

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

kuroneko написал:

...вызов этого скрипта "в лоб" не срабатывает.
...

Я как то делал скрипт для keyconfig, вроде работало.
http://forum.mozilla-russia.org/doku.ph … ps:hotkeys

Anton написал:

kuroneko написал:

...вызов этого скрипта "в лоб" не срабатывает.
...

Я как то делал скрипт для keyconfig, вроде работало.
http://forum.mozilla-russia.org/doku.ph … ps:hotkeys

Угу. До чего-то похожего я уже дошёл.
Вложенные папки показываются пустыми.....

http://custombuttons2.com/forum/

:D:beer:

kuroneko, попробуй внаглую выдрать это меню и вставить в свою кнопку.
Ян, а ведь для таких случаев не помешал бы деструктор ;)

Вот, может кому пригодится. При первом нажатии меняет заголовок активного таба на (Untitled) с соответствующей иконкой, при повторном - возвращает. Чтобы особо любопытные сотрудники не видели, что за табы открыты в фоне ^_^

Код:

custombutton://TRename%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHnSURBVDjLpZLbaxNREMZjk7obSHYtXmtD21QtxiIWJK2+GG+UilQsFaLWS0StiYpBFGkpGGmeauhFo1JFzVMRRCjkHwiCoA95zqOuDwEtirgPIqj5ObsJglC1iwMfw8yZ7zvnzIwLcP0P/mj3dXWdYGpCU9olXOJyakJ+kw+3M6OrbyX0OhIRcupZRws8SWP5m5oyIWllsWRd8Kk8dhYeXKE8dtp6xecexROUY/diBHKF3i5KiVOUUilK52MU9oWZ0pSncqz+ixzJrdEx71zFmM5gmXErg3nvMlZ+xLf0oJR5/iZQKB7ZC9mLGPFoVSARpZI9RzG6k6ymvpQy/4INFfLJ2dZV8HAYknswdm2oCoRW8i2ynsroCWYDy0n7laSU1y/cuOFBuC43H9uK0dnE80iE163L+LJ5BV8HtlGO9doN7VM9zUKr+21s+c42mLwABzbBjiBGLld9gXgz1MDHNh/fL/WTDwUY9yuTvxoq5NUCzBsxKoPbqXQH+BFuojw3ZwtY/n3Qx7tmLx+6WjATfVj1h731G+2xWuta3N8N43FID1UhOzAfP4SRPMP8UD+MHoeRo3AtaqO4ewsZTXlkb6j8afqurr64ramvnEAEHnd46hpdtbk2CKxgrQM01ni2uWtCTuH+CTReO8ZCTKnoAAAAAElFTkSuQmCC%5D%5Bvar%20CurTab%20%3D%20document.getElementById%28%27content%27%29.selectedTab%3B%0Aif%20%28CurTab.hasAttribute%28%22prev_label%22%29%29%20%7B%0A%20CurTab.setAttribute%28%22label%22%2CCurTab.getAttribute%28%22prev_label%22%29%29%3B%0A%20CurTab.removeAttribute%28%22prev_label%22%29%3B%0A%20CurTab.setAttribute%28%22image%22%2CCurTab.getAttribute%28%22prev_image%22%29%29%3B%0A%20CurTab.removeAttribute%28%22prev_image%22%29%3B%0A%7D%20else%20%7B%0A%20CurTab.setAttribute%28%22prev_label%22%2CCurTab.getAttribute%28%22label%22%29%29%3B%0A%20CurTab.setAttribute%28%22label%22%2C%22%28Untitled%29%22%29%3B%0A%20CurTab.setAttribute%28%22prev_image%22%2CCurTab.getAttribute%28%22image%22%29%29%3B%0A/*%20CurTab.setAttribute%28%22image%22%2C%22chrome%3A//browser/skin/Bookmarks-folder.png%22%29%3B%0A*/%0A%20CurTab.setAttribute%28%22image%22%2C%22%22%29%3B%0A%7D%0A%5D%5B/*Initialization%20Code*/

Код:

custombutton://TRename%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHnSURBVDjLpZLbaxNREMZjk7obSHYtXmtD21QtxiIWJK2+GG+UilQsFaLWS0StiYpBFGkpGGmeauhFo1JFzVMRRCjkHwiCoA95zqOuDwEtirgPIqj5ObsJglC1iwMfw8yZ7zvnzIwLcP0P/mj3dXWdYGpCU9olXOJyakJ+kw+3M6OrbyX0OhIRcupZRws8SWP5m5oyIWllsWRd8Kk8dhYeXKE8dtp6xecexROUY/diBHKF3i5KiVOUUilK52MU9oWZ0pSncqz+ixzJrdEx71zFmM5gmXErg3nvMlZ+xLf0oJR5/iZQKB7ZC9mLGPFoVSARpZI9RzG6k6ymvpQy/4INFfLJ2dZV8HAYknswdm2oCoRW8i2ynsroCWYDy0n7laSU1y/cuOFBuC43H9uK0dnE80iE163L+LJ5BV8HtlGO9doN7VM9zUKr+21s+c42mLwABzbBjiBGLld9gXgz1MDHNh/fL/WTDwUY9yuTvxoq5NUCzBsxKoPbqXQH+BFuojw3ZwtY/n3Qx7tmLx+6WjATfVj1h731G+2xWuta3N8N43FID1UhOzAfP4SRPMP8UD+MHoeRo3AtaqO4ewsZTXlkb6j8afqurr64ramvnEAEHnd46hpdtbk2CKxgrQM01ni2uWtCTuH+CTReO8ZCTKnoAAAAAElFTkSuQmCC%5D%5Bvar%20CurTab%20%3D%20document.getElementById%28%27content%27%29.selectedTab%3B%0A%0Aif%20%28CurTab.hasAttribute%28%22prev_label%22%29%29%20%7B%0A%20CurTab.setAttribute%28%22label%22%2CCurTab.getAttribute%28%22prev_label%22%29%29%3B%0A%20CurTab.removeAttribute%28%22prev_label%22%29%3B%0A%20CurTab.setAttribute%28%22image%22%2CCurTab.getAttribute%28%22prev_image%22%29%29%3B%0A%20CurTab.removeAttribute%28%22prev_image%22%29%3B%0A%20this.image%20%3D%20this.truetitle%3B%0A%7D%20else%20%7B%0A%20CurTab.setAttribute%28%22prev_label%22%2CCurTab.getAttribute%28%22label%22%29%29%3B%0A%20CurTab.setAttribute%28%22label%22%2C%22%28Untitled%29%22%29%3B%0A%20CurTab.setAttribute%28%22prev_image%22%2CCurTab.getAttribute%28%22image%22%29%29%3B%0A/*%20CurTab.setAttribute%28%22image%22%2C%22chrome%3A//browser/skin/Bookmarks-folder.png%22%29%3B%0A*/%0A%20CurTab.setAttribute%28%22image%22%2C%22%22%29%3B%0A%20this.image%20%3D%20this.falsetitle%3B%0A%7D%0A%5D%5Bthis.truetitle%20%3D%20this.image%3B%0Athis.falsetitle%20%3D%20%22data%3Aimage/png%3Bbase64%2C%5C%0AiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%5C%0A/9hAAACRElEQVR4XpWSS0hUURzGf+fcedy66owKcp%5C%0A3RwbJEfJRklglGSAsfgSRSgyZkExHiC3pgBbVrUwt%5C%0AbuDVyF0RQ0NqF0QOiLMzS0opepIKINjovTzIXQZ0M%5C%0A+sHHdw6H7+PPnyMGy/krdsG2aJTTp0a4M7nIOJsgN%5C%0AWCjhAJp4/quKi5fyuMGYGMTxOMDJKBCVGbu1wa3dx%5C%0AVoU32jHOmP1b/4zUMSQUYUrFU4irTrXMturtbIe0J%5C%0AGczXdO+nRBQaJIIY2TBBb5OiOWuN+qLWPoac6FWVB%5C%0AvHfbaboVDDyYpf+fOxAxnEnpXM1sbWDkQwrDL1/x/%5C%0AI2DLf562oq44IS0hALWEuGkWeMqEbl+tjqWUAqS9Q%5C%0AjkHaOiITm/KYMzCQVhBStiKYzbyKLH9NcCBl5PmFg%5C%0AshGkuATrG8SrO7qUjXeJbV2AXYAMciq6sxtQc6SkH%5C%0AJjHNeaQMkuVdAMbALGR3U5LnhEl3wg4I43Pl05nWs%5C%0AAeYAyZwu3/Q2Kgwze9WATM46nMJHCJgahRjgVy2Ps%5C%0A15b4uRJgwX8Bb4yOzsGPPz35ieHovf4T0YdgoDjpT%5C%0A2HM4BAkBGQxSnlhJwH3YDn4HxeGBgYJS6umF6e98B%5C%0An6w3fiIOOmmpwV+kUwkgnS6u+DrkVrQg8AX4Gvei0%5C%0Al+U7FtY8Zl4EKYtaYtkd+Jsy+eiBF1M+FnwdUpDaH%5C%0AZQglWkTQEK1DKxyOpZgVBoEl7fJFx2jwLR7KG1IJm%5C%0AKiEICCoRlgBDxPCjWoQnEsznGH01xW2BhAyT/RwxQ%5C%0AfwCvBroM3KF3TQAAAABJRU5ErkJggg%3D%3D%22%3B

:D

m435tr0d написал:

:D

Не идеально. Если переключиться на другой таб, иконка кнопки не поменяется.

я понимаю :/

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

Кнопка "Быстро процитировать":

Код:

custombutton://%u0411%u044B%u0441%u0442%u0440%u043E%20%u043F%u0440%u043E%u0446%u0438%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%7C%20%u0432%u044B%u0434%u0435%u043B%u0438%u0442%u044C%20%u0436%u0438%u0440%u043D%u044B%u043C%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACfElEQVQ4jc2SXUiTYRTHd5NYkIEfVEgXhbtQRCiNEQ1iZmhR70owQ2TsKlvdlKVBZFRY1ruZX2u6EG3BTGtapqn0MZN07SP3adqWH6lUrpZzbs5M9N/eZ7iLCKm7DhyeA8/z/50/5zks1n8R7WptTiDl/5g56zZEryEAVccr+bzrHn54uv4qmbeMJgCIIADFw6dy5sJt2gK3OQ4zA8nwjgjhG8+HdzgX3tE8+J018E0WYaURowkAoghAWtco909VofwmhdISClViPjyDezDrOATZLT6qyw6Tul6WiblPVwiI0YQA18vvEAefNVGY0kUTByuAmQFOoE6Fb6Iw6GC6mThgNCFA4WU65KCCpuB6uxHSUj6pZWVZ6FHXwz0zjZ+Li9COfEND9xtcEkt0O7icbQRw/PQF4uCLNio0A7dpM2Y/ZMM5cQ0DY3q09k9CZXMhUW6CqLMXT3SK7z06ZToBHBWeJA6Yrk59DDmlEj7Ghm/AMK2GxGrEQbkeKbdNSFPa0GbXQONQLduGe5sIICMzN/gL5q2YtR+BZ2g/mTxteIe0+0ZwKl8HxAYk15iRQb/Ec6seDwzvYfs4/pUAdu/j/3EPtrcMIq7GgviSPiRWGhFf3IOiF3Z4/T7Mzc/D7RxbIICEZG5eEoen+D3PND1D8+hjJFUbEXOuD5HCBsg6NXCMWGCxtGKovzHogAlmLZnNCn1NIKSq2rp22ylUaYtBidsQcawWEYK72JtfgRP0+aWO7tJG1mohLChgXy0XOVvUouXsyjqspWiwcmsRdkC8RJ2lrWLxxcxVAQlZWWECQQ5vFzdVGb5p5xRrffoCK5LnCo9NecRJF1BsNjv2F9wYBxnBxXjGAAAAAElFTkSuQmCC%5D%5B%5D%5Bthis.onclickFunction%3Dfunction%28event%29%7B%0Aswitch%20%28event.button%29%7B%0A%20%20case%200%3A%20loadURI%28%22javascript%3A%7Bta%20%3D%20%09%09%20%09window.document.getElementsByTagName%28%27textarea%27%29%3B%20%09ta%5Bta.length-1%5D.value%20+%3D%20%27%5Bquote%5D%27+document.getSelection%28%29+%27%5B/quote%5D%5Cn%27%3B%20ta%5Bta.length-1%5D.focus%28%29%3B%7D%22%29%3B%20break%3B%0A%20%20case%201%3A%20loadURI%28%22javascript%3A%7Bta%20%3D%20%09%09%20%09window.document.getElementsByTagName%28%27textarea%27%29%3B%20%09ta%5Bta.length-1%5D.value%20+%3D%20%27%5Bb%5D%27+document.getSelection%28%29+%27%5B/b%5D%5Cn%27%3B%20ta%5Bta.length-1%5D.focus%28%29%3B%7D%22%29%3B%20break%3B%0A%7D%0A%7D%0Athis.setAttribute%28%27onclick%27%2C%27this.onclickFunction%28event%29%3B%27%29%3B

Работает на форумах.
Принцип работы - выделите текст на странице, нажмите левую кнопку мыши, выделенный текст вставится в форму ответа с символами цитирования, среднюю кнопку - с символами выделения жирным. Нагло спёрта с оперы, модифицирована.

Что случилось с Yan ом? Кто-нибудь знает? Его уже два месяца не видно. Может в армию забрали?:(

petrovich
[offtopic]
Я жив-здоров, и полон сил. :)
Просто отдыхал от компьютера по полной программе....
Перепробовал почти все способы. Понравилось. :)
[/offtopic]


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

Yan
Надо бы организовать складирование кнопок в отдельный файл, например в ini.
Так не хочется захламлять prefs.js...

Dimanish
Будет, правда с форматом файла я пока не определился.


nn-zh написал:

Dark-Demon

Switch Proxy очень и очень полезен при работе в разных местах.

можно заменить с помощью более лёгого custombuttons c соответствующей кнопкой.

Можно поподробнее? У меня 4 набора прокси-серверов и пара автоконфигурационных файлов.
Как custombuttons настроить на это дело так, чтобы в результате оно занимало места меньше,
чем switchproxy в статусной строке? Ну и имя конфигурации было говорящим откуда и куда
нужно использовать это прокси.

( url )

Вот "Enhanced Proxy" кнопка:

Код:

custombutton://Enhanced%20Proxy%20Button%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUA/wCIiIgAAADd3d3///8AAICAAAD/AAAAAP8pkhnQAAAAAXRSTlMAQObYZgAAAF1JREFUeF4tyUERg0AQRNEJDjprAAYFQztYCglYWAlwzi2y053kn17Vj4AK9djJmo3jPP94exqv7zR6prFXvy8D+AG59DGExiJpoKC0gFQ9pmxUzwhNbqsBJ2iq+QNw+RI4rlZUrAAAAABJRU5ErkJggg%3D%3D%5D%5B/*%0AEnhanced%20Proxy%20Button%20by%20Yan%0A%0AEdit%20proxy%20settings%20in%20the%20Initialization%20Code.%0A%0A*/%5D%5Bvar%20Proxies%3D%5B%5D%3B%0Avar%20AutoCfgProxyFiles%3D%5B%5D%3B%0A//------Proxies--------%0AProxies.push%28%5B%27localhost%20%28example%29%27%2C%27127.0.0.1%27%2C%278080%27%5D%29%3B%0AProxies.push%28%5B%27Proxomitron%20%28example%29%27%2C%27127.0.0.1%27%2C%279090%27%5D%29%3B%0AAutoCfgProxyFiles.push%28%5B%27autoconf%20file1%20%28example%29%27%2C%27http%3A//localhost/conf.pac%27%5D%29%3B%0AAutoCfgProxyFiles.push%28%5B%27file2%20%28example%29%27%2C%27http%3A//example.com//file.pac%27%5D%29%3B%0A//------/Proxies-------%0A%0Athis.pref%3D%27network.proxy.type%27%3B%0Athis.setProxy%3Dfunction%28prtype%2Cprvalue%2Cport%29%7B%0A%20switch%28prtype%29%7B%0A%20%20case%20%27http%27%3A%09%7Bthis.PS.setIntPref%28this.pref%2C1%29%3B%0A%09%09%20this.PS.setCharPref%28%27network.proxy.http%27%2Cprvalue%29%3B%0A%09%09%20this.PS.setIntPref%28%27network.proxy.http_port%27%2Cport%29%3B%0A%20%20%09%09%7D%3Bbreak%3B%0A%20%20case%20%27file%27%3A%09%7Bthis.PS.setIntPref%28this.pref%2C2%29%3B%0A%09%09%20this.PS.setCharPref%28%27network.proxy.autoconfig_url%27%2Cprvalue%29%3B%0A%20%20%09%09%7D%3Bbreak%3B%0A%20%20case%20null%3A%09%7Bthis.PS.setIntPref%28this.pref%2C0%29%3B%0A%20%20%09%09%7D%3Bbreak%3B%0A%20%7D%0A%7D%0A%0A%20var%20nMItem%3Dfunction%28label%2Cp1%2Cp2%2Cp3%2Cobj%29%7B%0A%20%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20%20m.f%3Dobj.setProxy.bind%28obj%29%3B%0A%20%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%27+%28p1%3F%28%27%22%27+p1+%27%22%27%29%3A%28%27null%27%29%29+%27%2C%27+%28p2%3F%28%27%22%27+p2+%27%22%27%29%3A%28%27null%27%29%29+%27%2C%27+%28p3%3F%28%27%22%27+p3+%27%22%27%29%3A%28%27null%27%29%29+%27%29%27%29%3B%0A%20%20%20var%20pr%3Dnull%3B%20%0A%20%20%20if%20%28p1%26%26p2%29%20pr%3Dp1+%27%3A%27+p2+%28p3%3F%28%27%3A%27+p3%29%3A%28%27%27%29%29%3B%0A%20%20%20if%20%28pr%29%20m.setAttribute%28%27pr%27%2Cpr%29%3B%0A%20%20%20m.setAttribute%28%27type%27%2C%27radio%27%29%3B%0A%20%20%20m.setAttribute%28%27name%27%2C%27radio%27%29%3B%0A%20%20%20return%20m%3B%0A%20%7D%0A%20var%20mP%3Ddocument.createElement%28%27menupopup%27%29%3B%0A%20%20for%20%28var%20i%3D0%3Bi%3CProxies.length%3Bi++%29%7B%0A%20%20%20mP.appendChild%28nMItem%28Proxies%5Bi%5D%20%5B0%5D%2C%27http%27%2CProxies%5Bi%5D%20%5B1%5D%2CProxies%5Bi%5D%20%5B2%5D%2Cthis%29%29%3B%0A%20%20%7D%0A%20%20if%20%28AutoCfgProxyFiles.length%3E0%29%7B%0A%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%20for%20%28var%20i%3D0%3Bi%3CAutoCfgProxyFiles.length%3Bi++%29%7B%0A%20%20%20%20mP.appendChild%28nMItem%28AutoCfgProxyFiles%5Bi%5D%20%5B0%5D%2C%27file%27%2CAutoCfgProxyFiles%5Bi%5D%20%5B1%5D%2Cnull%2Cthis%29%29%3B%0A%20%20%20%7D%0A%20%20%7D%0A%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20mP.appendChild%28nMItem%28%27No%20proxy%27%2Cnull%2Cnull%2Cnull%2Cthis%29%29%3B%0A%20%20mP.f%3Dfunction%28%29%7B%0A%20%20%20var%20PS%3Dthis.parentNode.PS%3B%0A%20%20%20var%20pref%3D%27network.proxy.type%27%3B%0A%20%20%20var%20pr%3Dnull%3B%0A%20%20%20switch%28PS.getIntPref%28this.parentNode.pref%29%29%7B%0A%09case%201%3A%20pr%3D%27http%3A%27+PS.getCharPref%28%27network.proxy.http%27%29+%27%3A%27%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+PS.getIntPref%28%27network.proxy.http_port%27%29%3Bbreak%3B%0A%09case%202%3A%20pr%3D%27file%3A%27+PS.getCharPref%28%27network.proxy.autoconfig_url%27%29%3Bbreak%3B%0A%20%20%20%7D%0A%20%20%20if%20%28%21pr%29%20this.lastChild.setAttribute%28%27checked%27%2Ctrue%29%3B%0A%20%20%20for%20%28var%20i%3D0%3Bi%3Cthis.childNodes.length%3Bi++%29%7B%0A%20%20%20%20if%20%28this.childNodes%5Bi%5D.getAttribute%28%27pr%27%29%3D%3Dpr%29%7B%0A%20%20%20%20%20this.childNodes%5Bi%5D.setAttribute%28%27checked%27%2Ctrue%29%3B%0A%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%7D%0A%20%20%7D%0A%20%20mP.setAttribute%28%27onpopupshowing%27%2C%27this.f%28%29%3B%27%29%3B%0A%20%20this.type%3D%22menu%22%3B%0A%20%20this.orient%3D%22vertical%22%3B%0A%20%20this.appendChild%28mP%29%3B%0A%20%20this.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0A%0A%0A/*images*/%0Athis.offImage%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUA/wAAAACIiIjd3d2AgID///9WXziYAAAAAXRSTlMAQObYZgAAAFRJREFUeF4tydERgCAMBNFABUQr8KjAXAcODTD034s5cb/ezJohs6wuMpow3X8MTeH5prBnXTHHEIAN+LHRGSQFBLJcgGfTindml1lO3qcAJRTP2gv/MBEl7nzAMAAAAABJRU5ErkJggg%3D%3D%27%3B%0Athis.onImage%3Dthis.image%3B%0A%0Athis.setState%3Dfunction%28%29%7B%0A%20var%20state%3Dthis.PS.getIntPref%28this.pref%29%3B%0A%20if%20%28state%3D%3D0%29%7B%0A%20%20this.image%3Dthis.offImage%3B%0A%20%7Delse%7B%0A%20%20this.image%3Dthis.onImage%3B%0A%20%7D%0A%7D%0A%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B

HTTP-прокси и URL'ы настройки прокси задаются вручную в коде инициализации.

Ян, не вижу смысла изобретать велосипед. http://www.xulplanet.com/references/elemref/ref_toolbarpalette.html

надо просто создать XUL-файл с кнопками и оверлеить им стандартную "BrowserToolbarPalette". более того этот механизм позволяет подвергнуть редактированию и неCustomButtons кнопки. к томуже кнопки будут появляться сразу и не будет проблем с новыми окнами.

Dark-Demon
Ну, во-первых, велосипед уже изобретен, как-никак. :) Но это оффтоп.

Второе, и самое важное. Код:

Код:

var element=document.getElementById('BrowserToolbarPalette');
alert(element);

Получаем null. Это значит, что <toolbarpalette id="BrowserToolbarPalette"> удаляется из документа после создания панелей инструментов. Т.е. после загрузки браузера его уже никак не достать.

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

К счастью, Anton нашёл отличное решение, как из скрипта добраться-таки до <toolbarpalette>, и добавить туда нужные кнопки. Оно и будет использовано в след. версии.
Подробности могу в PM написать, а то они довольно объёмны, и не так "просты" :)

А поддержка второй версии браузера планируется? А то я давно уже сижу на ней и без CB уж очень не уютно.

Просьба о создании кнопки.

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

Чтобы было более наглядно: если кто юзает (юзал) плагин для Осла под названием Avant Browser, там как раз такая фича реализована.

Philip
Планируется
Пит Бэнкман
Reload:

Код:

custombutton://Reload%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANbY1E9YMgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAwZJREFUeNpdkktoXHUUxn//+5g7D5N5GidMk7QxtWpL09aAOC4MmkWplNKC4oMaFETBlTs3UulCKlZMLS5URMVNRSi1KApNShdCHk1LMp3QJg2ZppOkmSE2d2aSm5l7596/i6Q15qwOB74H33cEW6dntA34BOgGtm9c7yC933CtM1zpztEz2gv00d+VEFvAvcFGve/FI82Rlo4Qiqbi86mslR1ujZmMXClilas/64bvuGN70N8VE5vAncEGbeyND3ZQNKtULIGi+9AMA39AJ9Wk8lijx+/n8hx4LsY3p6agvyupbdLv6znWjG4IDFeQaPIRTwaoOoL7q5LF+x6rNcErva0oinwI0japd09mKlz8ISeRLggxqPv96X3pOC8cbMLTNRZMycQ8PJFUHhKsb9I7alXq5LL5e4o9N07pxjtcTh92Jr5svzowe+7Hr2ZojgoiQYkQHup/+A0HUu70+a1hv8xdKle9LNffPw+4tL/Xhuo/2NkVYWZyBU2BsAKF3FaC1emPog3zUbPgCmriLuCs+/O1Ib3MwIVZdeCCVP7XmPRKAEJ/+fpyOG5Etr6DVXGwyrWTDDx7CgiROhYPpXbE9IZY0FwKKox/mAHqWjhuRD7+7EmqDrieJKgLhoZLnP9+OsvtMz9t5FSi7fgRIyWTZjn1LnE5DLwFuBrAkgULpgRP8ngCios2SFmm9fVDtLz6F4g3UQKH1uzwzm0d0ejdzMzXgA442nqGAk0VrNUlN+95dD4f46m9DenstVJ67o6FY3skkga79oW59Os8FPovAx4gNYB4SBALwO0imCsKc0t1pAvbdj/Crv0h3LpLwK8wfbPG0mzhO6ZO5zeCXk92ZMjk8xO30NaqtCYEfl3gOBKz4lL4x0bXFYqLkr//yE8wffY0UAVcABE8Oibrtp21CzdO+Jr2nOzY++jup/eHaWkPIQQUFqpkri4zOVoYtMc/fZuFi0Vg5UHVgpdG+pj64iz5X5YBm2e+PUBo+2HUwB6E2ki9Moi9nGXotT+BGmAB9oO6/wVl0kFzmdAMvwAAAABJRU5ErkJggg%3D%3D%5D%5Bif%20%28event.shiftKey%29%20BrowserReloadSkipCache%28%29%3B%20else%20BrowserReload%28%29%3B%5D%5Bthis.ReloadAll%3Dfunction%28%29%7B%0A%20%20gBrowser.reloadAllTabs%28gBrowser.mContextTab%29%3B%20%20%0A%7D%0A%0A%20var%20nMItem%3Dfunction%28label%2Cimg%2Cobj%29%7B%0A%20%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20%20m.f%3Dobj.ReloadAll.bind%28obj%29%3B%0A%20%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%29%27%29%3B%0A%20%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20%20return%20m%3B%0A%20%7D%0A%0A%20var%20mP%3Ddocument.createElement%28%27menupopup%27%29%3B%0A%20mP.appendChild%28nMItem%28%27Reload%20All%20Tabs%27%2Cthis.image%2Cthis%29%29%3B%0A%0A%20this.appendChild%28mP%29%3B%0A%20this.type%3D%22menu-button%22%3B%0A%0A

Stop:

Код:

custombutton://Stop%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gkPDzESY3gWcgAAAqFJREFUeNplkz1sE0kYhp9dZzfBXq8HYpQUBxjOinQUVhBQRKIB3XFSjkgIAlQUAV1/6VPS5yip0FFCwU8kBxSJSG7QFXBgCayDIEwgQPjd7Np79s7uDIWDiXOfNBppPj2v3u9nDDbEpdzAqOtkFp1MWmx8x4BGM/RW/ebPf/itB4DekPoO57dtXTw2dULYfQriBJK4c8cxkWExd/WO//D9p/ELjegeoLoCXfj8KWF/eQuvlkFKiNaPlDA8TLTrR+auLfSIpLrw76eFHXxg6e8aq6GJSMWk0Mh2zNPWFtZWPpA32hQPHej3l99NjsioUomSFdN1MovHzk0K21tl6d4Ttl/8i+L1BapBmjCMqMbbKM5X2H7lBs+erGDUakycOOzuFdkykDGdTFrYtobXy0jTJl0oYAlB6WaZ2q4xSrfmsYQgXSggtzjIF3VSzYCsk3aBnAl0GiUlxWxM9fg40vOwhGD/5ctYQiA9j0fjRynITyil0bo7BKsjkMQQxVhofur7QnV6umeK1elpRoKXmIBSCrTq5r47iCQybFGTgtLsbI9AaXaWf7M7acsYlSi00t0FMDHWHUjJUtOmdHO+a/v+1FS3nNHyAi/tPEmyyUGjGXqR7oOhIaymT1ivd2r+7Sgj98s8Gv8F6XmE9TpmsIa9ewfazRE0Qh/A+NMd2P9DfuvdiTO/uvbzpzx7/Ao54FCIP5NC04pi6lYeM/Ao7Bmkf1+JuRsV/9bKx7NX/pMPUrfb8bsRGVX8+pvJ4qGD/YO6Re7zW3SiSJIEnSiybZ/B3cOb4X+AtW9/wZxx7LHRocHyxMkjbioMQOtOs7RCK4V2c5thD2gaG5ptzjj22F6RLa8vSc93Cxqhf/uj3wMDyqA3TCAD5ACL/4cE1r7BAF8BBX1jYyT/fJkAAAAASUVORK5CYII%3D%5D%5BBrowserStop%28%29%3B%5D%5Bthis.StopAll%3Dfunction%28%29%7B%0A%20try%7B%0A%20%20for%20%28var%20i%3D0%3Bi%3CgBrowser.browsers.length%3Bi++%29%7B%0A%20%20%20%20gBrowser.browsers%5Bi%5D.stop%28%29%3B%0A%20%20%7D%0A%20%7Dcatch%28ex%29%20%7B%7D%0A%7D%0A%20var%20nMItem%3Dfunction%28label%2Cimg%2Cobj%29%7B%0A%20%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20%20m.f%3Dobj.StopAll.bind%28obj%29%3B%0A%20%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%29%27%29%3B%0A%20%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20%20return%20m%3B%0A%20%7D%0A%0A%20var%20mP%3Ddocument.createElement%28%27menupopup%27%29%3B%0A%20mP.appendChild%28nMItem%28%27Stop%20All%20Tabs%27%2Cthis.image%2Cthis%29%29%3B%0A%0A%20this.appendChild%28mP%29%3B%0A%20this.type%3D%22menu-button%22%3B

Так?

Update: в пред. раз забыл картинку в base64 отконвертировать. Исправил.

Yan Спасибо! Это то, что нужно! Давно хотел наличие этой фичи в ФФ.

Лови "+" :)

А поддержка второй версии браузера планируется? А то я давно уже сижу на ней и без CB уж очень не уютно.

Планируется

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

Philip
Вот тут LouCypher выложил подправленную версию, которая работает в последних сборках FF2.

Yan написал:

Philip
Вот тут LouCypher выложил подправленную версию, которая работает в последних сборках FF2.

Скачал, попробовал, но... в общем после долгих опытов, выяснил:

Создано: Sat Sep 16 2006 19:15:20 GMT+0400
User Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.8.1b2) Gecko/20060913 BonEcho/2.0b2
ID сборки: 2006091303

Используемые расширения: [39]
- Adblock Plus 0.7.1.2
- All-in-One Gestures 0.17.4
- All-in-One Sidebar 0.7 RC 4
- autoHideStatusbar 0.3.9.3
- BBCodeXtra 0.2.5.5
- CoLT 2.1.1
- Custom Buttons 0.0.1.2
- CuteMenus - Crystal SVG 1.2
- DOM Inspector 1.8.1b2
- Download Statusbar 0.9.4.1
- Drag de Go 0.2.5
- Extended Link Properties 1.2.3
- External Application Buttons mod 0.7.3.4
- Fission 0.8.6
- FlashGot 0.5.96.060910
- Forecastfox l10n 0.7.2006091401
- Gmail Manager 0.5.1
- IE Tab 1.1.0.6
- ImgLikeOpera 0.6.12
- keyconfig 20060828
- Launchy 4.2.0
- MenuManipulator 20060418.1.1
- MinimizeToTray 0.0.1.2006030906+
- MR Tech Local Install 5.2
- NoScript 1.1.4.3
- Pearl Crescent Page Saver Basic 1.2
- Proxy FlightGhost 1.2.08082006
- QuickNote 0.6.0.2
- RSS Ticker 1.8.5
- Save Image in Folder 0.9.3
- Save Link in Folder 1.1.2
- ScrapBook 1.2.0.4
- ScrapBook CopyPageInfo 1.3.3
- SuperScroll 1.5.2
- Tab Mix Plus 0.3.0.60915
- Talkback 2.0b2
- Text Link 1.3.2006032801
- UI Tweaker (Formerly Toolbar Cleanup) 1.7.0
- Unsorted menu 0.0.9

Подсветил те расширения, присутствие которых "убивает" работоспособность Custom Buttons. :(

Philip
Принцип работы расширения в следующих версиях будет в корне отличаться от нынешнего. Надеюсь, в лучшую сторону, и проблем с совместимостью не появится. А пока, увы, надо подождать..

Yan
Ладно :) сроков не узнал, но ждать не перестану. Расширение из ряда Must Have.

Установил сегодня это расширение и наслаждался его функционалом, а именно кнопками BBcode. Хотелось бы выразить огромный респект создателю! :)
Но случился у меня BSOD, вызванный Outpost FireWall в момент открытия ссылки в новом табе. У меня установлено расширение TabMix Plus и включен в нем менеджер сессий, соответственно при запуске FF я восстановил сессию. Но при этом кнопки с панели исчезли, нет их и в настройках. FF 1.5.0.7 Как лечить? Переустановить расширение или только кнопки?

ЗЫ: Кнопки были у меня помещены на панель меню. Сейчас восстановил кнопки, пока вроде работает.

GASon
Переустановить кнопки.
Когда Firefox вылетает, кнопки, установленные за последний сеанс, не сохраняются.

Т.е. после загрузки браузера его уже никак не достать.

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

Когда Firefox вылетает, кнопки, установленные за последний сеанс, не сохраняются.

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

Dark-Demon написал:

...просто правим оверлеящий файл...

Эх, если бы... Но не так просто на самом деле:

1. Местонахождение оверлея должно быть известно до первого запуска расширения. Т. е., оверлей должен находиться в каталоге расширения. А иначе придётся править chrome.manifest, extensions.ini и/или ещё что-нибудь.
2. Не факт, что в каталог установленного расширения имеются права на запись.
3. Динамические оверлеи через loadOverlay(...) бесполезны, в связи с отсутствием на момент их применения toolbarpalette.

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

К слову, своё решение я идеальным не считаю, с оверлеями было бы проще. Возможно, имеет смысл подумать о feature request на bugzill'у.

Расширение однозначно супер! У меня на работе юзеры FF уже заценили.
Вопрос, не планируется ли это расширение прикрутить на Thunderbird?

Yan написал:

Philip
Планируется
Пит Бэнкман
Reload:

Код:

custombutton://Reload%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANbY1E9YMgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAwZJREFUeNpdkktoXHUUxn//+5g7D5N5GidMk7QxtWpL09aAOC4MmkWplNKC4oMaFETBlTs3UulCKlZMLS5URMVNRSi1KApNShdCHk1LMp3QJg2ZppOkmSE2d2aSm5l7596/i6Q15qwOB74H33cEW6dntA34BOgGtm9c7yC933CtM1zpztEz2gv00d+VEFvAvcFGve/FI82Rlo4Qiqbi86mslR1ujZmMXClilas/64bvuGN70N8VE5vAncEGbeyND3ZQNKtULIGi+9AMA39AJ9Wk8lijx+/n8hx4LsY3p6agvyupbdLv6znWjG4IDFeQaPIRTwaoOoL7q5LF+x6rNcErva0oinwI0japd09mKlz8ISeRLggxqPv96X3pOC8cbMLTNRZMycQ8PJFUHhKsb9I7alXq5LL5e4o9N07pxjtcTh92Jr5svzowe+7Hr2ZojgoiQYkQHup/+A0HUu70+a1hv8xdKle9LNffPw+4tL/Xhuo/2NkVYWZyBU2BsAKF3FaC1emPog3zUbPgCmriLuCs+/O1Ib3MwIVZdeCCVP7XmPRKAEJ/+fpyOG5Etr6DVXGwyrWTDDx7CgiROhYPpXbE9IZY0FwKKox/mAHqWjhuRD7+7EmqDrieJKgLhoZLnP9+OsvtMz9t5FSi7fgRIyWTZjn1LnE5DLwFuBrAkgULpgRP8ngCios2SFmm9fVDtLz6F4g3UQKH1uzwzm0d0ejdzMzXgA442nqGAk0VrNUlN+95dD4f46m9DenstVJ67o6FY3skkga79oW59Os8FPovAx4gNYB4SBALwO0imCsKc0t1pAvbdj/Crv0h3LpLwK8wfbPG0mzhO6ZO5zeCXk92ZMjk8xO30NaqtCYEfl3gOBKz4lL4x0bXFYqLkr//yE8wffY0UAVcABE8Oibrtp21CzdO+Jr2nOzY++jup/eHaWkPIQQUFqpkri4zOVoYtMc/fZuFi0Vg5UHVgpdG+pj64iz5X5YBm2e+PUBo+2HUwB6E2ki9Moi9nGXotT+BGmAB9oO6/wVl0kFzmdAMvwAAAABJRU5ErkJggg%3D%3D%5D%5Bif%20%28event.shiftKey%29%20BrowserReloadSkipCache%28%29%3B%20else%20BrowserReload%28%29%3B%5D%5Bthis.ReloadAll%3Dfunction%28%29%7B%0A%20%20gBrowser.reloadAllTabs%28gBrowser.mContextTab%29%3B%20%20%0A%7D%0A%0A%20var%20nMItem%3Dfunction%28label%2Cimg%2Cobj%29%7B%0A%20%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20%20m.f%3Dobj.ReloadAll.bind%28obj%29%3B%0A%20%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%29%27%29%3B%0A%20%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20%20return%20m%3B%0A%20%7D%0A%0A%20var%20mP%3Ddocument.createElement%28%27menupopup%27%29%3B%0A%20mP.appendChild%28nMItem%28%27Reload%20All%20Tabs%27%2Cthis.image%2Cthis%29%29%3B%0A%0A%20this.appendChild%28mP%29%3B%0A%20this.type%3D%22menu-button%22%3B%0A%0A

Stop:

Код:

custombutton://Stop%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gkPDzESY3gWcgAAAqFJREFUeNplkz1sE0kYhp9dZzfBXq8HYpQUBxjOinQUVhBQRKIB3XFSjkgIAlQUAV1/6VPS5yip0FFCwU8kBxSJSG7QFXBgCayDIEwgQPjd7Np79s7uDIWDiXOfNBppPj2v3u9nDDbEpdzAqOtkFp1MWmx8x4BGM/RW/ebPf/itB4DekPoO57dtXTw2dULYfQriBJK4c8cxkWExd/WO//D9p/ELjegeoLoCXfj8KWF/eQuvlkFKiNaPlDA8TLTrR+auLfSIpLrw76eFHXxg6e8aq6GJSMWk0Mh2zNPWFtZWPpA32hQPHej3l99NjsioUomSFdN1MovHzk0K21tl6d4Ttl/8i+L1BapBmjCMqMbbKM5X2H7lBs+erGDUakycOOzuFdkykDGdTFrYtobXy0jTJl0oYAlB6WaZ2q4xSrfmsYQgXSggtzjIF3VSzYCsk3aBnAl0GiUlxWxM9fg40vOwhGD/5ctYQiA9j0fjRynITyil0bo7BKsjkMQQxVhofur7QnV6umeK1elpRoKXmIBSCrTq5r47iCQybFGTgtLsbI9AaXaWf7M7acsYlSi00t0FMDHWHUjJUtOmdHO+a/v+1FS3nNHyAi/tPEmyyUGjGXqR7oOhIaymT1ivd2r+7Sgj98s8Gv8F6XmE9TpmsIa9ewfazRE0Qh/A+NMd2P9DfuvdiTO/uvbzpzx7/Ao54FCIP5NC04pi6lYeM/Ao7Bmkf1+JuRsV/9bKx7NX/pMPUrfb8bsRGVX8+pvJ4qGD/YO6Re7zW3SiSJIEnSiybZ/B3cOb4X+AtW9/wZxx7LHRocHyxMkjbioMQOtOs7RCK4V2c5thD2gaG5ptzjj22F6RLa8vSc93Cxqhf/uj3wMDyqA3TCAD5ACL/4cE1r7BAF8BBX1jYyT/fJkAAAAASUVORK5CYII%3D%5D%5BBrowserStop%28%29%3B%5D%5Bthis.StopAll%3Dfunction%28%29%7B%0A%20try%7B%0A%20%20for%20%28var%20i%3D0%3Bi%3CgBrowser.browsers.length%3Bi++%29%7B%0A%20%20%20%20gBrowser.browsers%5Bi%5D.stop%28%29%3B%0A%20%20%7D%0A%20%7Dcatch%28ex%29%20%7B%7D%0A%7D%0A%20var%20nMItem%3Dfunction%28label%2Cimg%2Cobj%29%7B%0A%20%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20%20m.f%3Dobj.StopAll.bind%28obj%29%3B%0A%20%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%29%27%29%3B%0A%20%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20%20return%20m%3B%0A%20%7D%0A%0A%20var%20mP%3Ddocument.createElement%28%27menupopup%27%29%3B%0A%20mP.appendChild%28nMItem%28%27Stop%20All%20Tabs%27%2Cthis.image%2Cthis%29%29%3B%0A%0A%20this.appendChild%28mP%29%3B%0A%20this.type%3D%22menu-button%22%3B

Так?

Update: в пред. раз забыл картинку в base64 отконвертировать. Исправил.

Возникла одна проблема: со всплывающими подсказками. Если вывести всплывающую подсказку для любой другой кнопки панели инструментов (к примеру, "Открывает новую вкладку"), а потом посмотреть ее для кнопки "Stop All Tabs", то она будет такой же (т.е. "Открывает новую вкладку"). И только после повторного обращения к кнопке "Stop All Tabs" ее всплывающая подсказка становится адекватной содержанию кнопки.

Аналогочно и с кнопкой "Reload All Tabs".

Вопрос.
Код кнопки – понятно.
Установил кнопки, которые сами реализуют функционал BBCode (из сайта - Домашняя страница)
Поле “код”, уже заполнено.
А что необходимо вводить в другое поле, или добавлять некий дополнительный файл, чтобы эта кнопка, функционировала?
(При нажатии, к примеру, открывала Promt, находящийся на диске?)
Спасибо.

Вопрос, не планируется ли это расширение прикрутить на Thunderbird?

Custom Buttons работает в Thunderbird.

Custom Buttons работает в Thunderbird.

Отлично! Может тогда кто-нибудь кнопочки наваяет "получить всё" и "удалить всё помеченное как спам"? Заранее признателен. :)

GASon
Картинки искать лень, прикрути сам какие-нибудь.
1. "получить всё":

Код:

goDoCommand('cmd_getNewMessages')

2. "удалить всё помеченное как спам":

Код:

goDoCommand('cmd_deleteJunk');

Anton, во первых, путь вегда можно определить: %путькпапке профиля%/extensions/custombuttons@xsms.org/что-тотам
во вторых, права на запись точно есть иначе бы расширение было бы попросу не поставить.
в третьих, я не предлагаю использовать динамические оверлеи.
ну и в четвёртых, у тебя с Яном одна шизофрения? :)

Пит Бэнкман

Возникла одна проблема: со всплывающими подсказками...

Не знаю, воспроизвести не получается. Возможно, что-то с чем-то конфликтует..
Levabati

А что необходимо вводить в другое поле, или добавлять некий дополнительный файл, чтобы эта кнопка, функционировала?
(При нажатии, к примеру, открывала Promt, находящийся на диске?)
Спасибо.

Не очень понял, какой функционал нужен для кнопки?

GASon
Картинки искать лень, прикрути сам какие-нибудь.

Зачет! Большое человеческое спасибо! Всё работает. :) За исключением того, что почту надо было забирать со всёх ящиков и так же удалять...

ЗЫ: Видимо я криво сделал постановку задачи...сорри. :(

Dark-Demon
Все эти способы (и аналогичные) давно обдуманы, обмусолены, и протестированы самыми разными способами. НЕ ВЫХОДИТ.
(а если и выходит, то через страшные извращения)

Я так понимаю, ты предлагаешь:
1. Использовать статический оверлей, расположенный в %путькпапке профиля%/extensions/custombuttons@xsms.org/buttons.xul, что то же самое, что и chrome://custombuttons/content/ ?
2. Записывать в него новые кнопки при создании оных ?
3. Чтоб этот оверлей обрабатывался стандартным способом, и добавлял кнопки после следующего запуска?

Внимание, вопрос:
ты не видишь в этом способе никаких недостатков? :)

ну и в четвёртых, у тебя с Яном одна шизофрения? :)

Ага, свою справку могу тебе предъявить. :)

Yan
Просто, не могу понять, что необходимо сделать, чтобы кнопка, уже установленная на панели
инструментов, при нажатии на нее, "включала" некую программу?
(При нажатии, к примеру, открывала Promt, находящийся на диске?)
Спасибо.

Levabati
Вот тут кнопка для запуска внешних приложений:
http://forum.mozilla-russia.org/viewtopic.php?pid=109330#p109330

Или попроще, только для одного приложения, например "Блокнота":

Код:

custombutton://Launch%20Notepad%5D%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhCwAQAPcAAFVVVWRkZKmpqa+wr7SztLa2tr28vL2+vcLDw8TDxMfHx8nJysrKys7Ozc/P0NHR0dLR0tTU1NbW1tfX19va2tvb29zc3d7e3eDh4eLi4uTj4+Xm5ebm5ufn5+jo6Orq6uzr7O7u7e/v7vDv7/Hw8PPz8vT09PX19fn4+fn6+vr6+/z8/P/+/v///v/+//7//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yH5BAEAAP8ALAAAAAALABAAAAhxAP8RGEiQIAACMBIqVHhwocOGASJKDACjYUIXMF4wRNjCIYsUECdGHGGxIwwUJUBssPhixQkRHjJUCCkSwkEVJkJ0wEAhQgMFB0l80HBhwgMGCQ4c5CAyIoGDFiQ4WIDAQIEBAqBKpWoVK4CvYMN+DQgAOw%3D%3D%5D%5Bvar%20path%3D%27C%3A%5C%5Cwindows%5C%5Cnotepad.exe%27%3B%0A%0Avar%20arguments%3D%5B%27%27%5D%3B%0Avar%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0Avar%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20.getService%28Components.interfaces.nsIProcess%29%3B%0A%20file.initWithPath%28path%29%3B%20%0A%20process.init%28file%29%3B%0A%20process.run%28false%2Carguments%2Carguments.length%29%3B%5D%5B

Yan
Не получается.
Все вроде делаю, как здесь описано.
По кнопке, правой кнопкой мышки.
Редактировать.
Код, вставляю в поле “код”.
Инициализация, ничего не меняю.
Не работает.
В чем, проблема?

(Для установки кнопки нужно выделить код из пред. сообщения и вставить его в адресную строку)
Т.е. в поле код кнопки должно получиться:

Код:

var path='C:\\windows\\notepad.exe';

var arguments=[''];
var file = Components.classes['@mozilla.org/file/local;1']
    .createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);
 file.initWithPath(path); 
 process.init(file);
 process.run(false,arguments,arguments.length);

Соответственно, путь к notepad.exe может быть другой.

Yan
Предлагаю другой вариант:
По клику средней(левой, если приложение не выбрано) открывается проводник в кот. пользователь указывает путь к программе.

ты не видишь в этом способе никаких недостатков?

нет :sick:

Dark-Demon

нет :sick:

Недостаток номер 1:
При установке новой версии расширения файлик с кнопками потрется.. Нехорошо получится, правда? :)

Dark-Demon написал:

...
...права на запись точно есть иначе бы расширение было бы попросу не поставить.
...

Логично. Во время установки расширения права есть. Потом может не быть.

...
у тебя с Яном одна шизофрения?...

На этом форуме у меня нет раздвоения личности. idee fix по поводу статических оверлеев была, я даже бредил чего-то на xml Yan'у в PM. Но логика победила, и я поправился... В очередной раз : )

Yan!
Спасибо, с "Notepad", получилось.
А вот здесь:

Вот тут кнопка для запуска внешних приложений:
http://forum.mozilla-russia.org/viewtop … 30#p109330

ничего не выходит.
Видимо писали код, для определенной машины.
Только для нее он и подходит?
Я так понимаю, соответствующий код, может написать, только специалист?
Или спец.программа для этого, есть?

При установке новой версии расширения файлик с кнопками потрется.. Нехорошо получится, правда?

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

Код:

content profile ../
overlay    чттототам chrome://profile/content/custombutton.xul

Логично. Во время установки расширения права есть. Потом может не быть.

думаю, стоит проверить...

в общем на днях помучаю лису оверлеями и отпишусь...

Levabati

ничего не выходит.
Видимо писали код, для определенной машины.

Контекстное меню на кнопке -> редактировать -> код инициализации
Там можно (и нужно) поменять пути к программам на нужные.

Добавлено Срд 20 Сен 2006 13:10:01 :
Dark-Demon

хранить копию в корне профиля.

Ну да, но при переустановке расширения пользователь запустит Лису, а там нет ни одной кнопки! Копия из профиля сработает только при следующем запуске. Вот такие пироги.

а если есть возможность (сам ещё не пробовал) то оттуда и оверлеить. что-то вроде

На сколько я знаю, нет такой возможности.

Добавлено Срд 20 Сен 2006 13:12:27 :

в общем на днях помучаю лису оверлеями и отпишусь...

Да не мучайся. :) Сейчас будет немного побольше времени, и я доделаю новую версию с новым принципом через xbl. Всё должно быть тип-топ. :)

На сколько я знаю, нет такой возможности.

есть :) http://dark-demon.nm.ru/etc/files/cb2-tp1.rar
с xpi пока не возился, в общем содержимое архива следует распаковать в папку профиля. после перезагрузки должна появиться кнопка imageSH. Правда она ещё не доделана - я не знаю как отлавливать изменение соответствующей настройки....

я доделаю новую версию с новым принципом через xbl.

одно другому не мешает...

Dark-Demon написал:

На сколько я знаю, нет такой возможности.

есть :) http://dark-demon.nm.ru/etc/files/cb2-tp1.rar
...

Здорово : ) :beer:

Dark-Demon
Хех, класс!
Я рад, что был не прав.

Yan, ну так что, берёшь на вооружение? :rock:

Dark-Demon
Обязательно. А вообще, протестирую оба варианта в поисках плюсов и минусов, и может быть даже буду использовать их одновременно. :)

не работают кнопки. в чем может быть проблема?

Крыска
Firefox 1.5?
Есть сообщения в JS-консоли?

Люди, напишите пожалуйста кнопку Multi-Scrapbook, аналогичную кнопке, входящей в Scrapbook.

Dimanish

Кнопка Multi-ScrapBook:

Код:

custombutton://Multi-ScrapBook%5D%5Bchrome%3A//scrapbook/skin/main_16.png%5D%5B%5D%5B%20var%20nMItem%3Dfunction%28label%2Cp%2Cobj%29%7B%0A%20%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20%20if%20%28p%29%7B%20m.setAttribute%28%27path%27%2Cp%29%3B%0A%20%20%20%7Delse%7B%0A%20%20%20%20%20m.setAttribute%28%27isDefault%27%2Ctrue%29%0A%20%20%20%7D%0A%20%20%20m.setAttribute%28%27type%27%2C%27radio%27%29%3B%0A%20%20%20m.setAttribute%28%27name%27%2C%27radio%27%29%3B%0A%20%20%20return%20m%3B%0A%20%7D%0A%0Athis.%20orient%20%3D%20%22vertical%22%3B%0Athis.type%3D%27menu%27%3B%0Avar%20popup%3Ddocument.createElement%28%27menupopup%27%29%3B%0Apopup.setAttribute%28%27oncommand%27%2C%27this.parentNode.changeScrapbookDirectory%28event%29%27%29%3B%0Apopup.f%3Dfunction%28%29%7B%0A%09while%20%28this.childNodes.length%3E0%29%20this.removeChild%28this.childNodes%5B0%5D%29%3B%0A%0A%09var%20file%3DsbCommonUtils.DIR.get%28%22ProfD%22%2C%20Components.interfaces.nsIFile%29.clone%28%29%3B%0A%09file.append%28%22ScrapBook%22%29%3B%0A%09file.append%28%22multibook.txt%22%29%3B%0A%0A%09var%20ret%20%3D%20%5B%5D%3B%0A%09var%20lines%20%3D%20sbCommonUtils.convertToUnicode%28sbCommonUtils.readFile%28file%29%2C%20%0A%09%09%09%09%09%09%09%09%22UTF-8%22%29.split%28%22%5Cn%22%29%3B%0A%09for%20%28%20var%20i%20%3D%200%3B%20i%20%3C%20lines.length%3B%20i++%20%29%0A%09%7B%0A%09%09var%20item%20%3D%20lines%5Bi%5D.replace%28/%5Cr%7C%5Cn/g%2C%20%22%22%29.split%28%22%5Ct%22%29%3B%0A%09%09if%20%28%20item.length%20%3D%3D%202%20%29%20ret.push%28item%29%3B%0A%09%7D%0A%0A%09var%20i%3D0%3B%0A%09while%20%28i%3Cret.length%29%7B%0A%09%09this.appendChild%28nMItem%28ret%5Bi%5D%20%5B0%5D%2Cret%5Bi%5D%20%5B1%5D%2Cthis%29%29%3B%0A%09%09i++%3B%0A%09%7D%0A%09this.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%09this.appendChild%28nMItem%28%27Profile%20Folder%27%2Cnull%2Cthis%29%29%3B%0A%09/*----*/%0A%09var%20PS%3Dthis.parentNode.PS%3B%0A%09if%20%28PS.getBoolPref%28%27scrapbook.data.default%27%29%29%7B%0A%09%09this.getElementsByAttribute%28%27isDefault%27%2C%27true%27%29%5B0%5D%0A%09%09%09.setAttribute%28%27checked%27%2Ctrue%29%3B%0A%09%7Delse%7B%0A%09%09var%20path%3DPS.getCharPref%28%27scrapbook.data.path%27%29%3B%0A%09%09for%20%28var%20i%3D0%3Bi%3Cthis.childNodes.length%3Bi++%29%7B%0A%09%09%09if%20%28this.childNodes%5Bi%5D.nodeType%3D%3D1%29%7B%0A%09%09%09%20%20%20%20if%20%28this.childNodes%5Bi%5D.getAttribute%28%27path%27%29%3D%3Dpath%29%7B%0A%09%09%09%09this.childNodes%5Bi%5D.setAttribute%28%27checked%27%2Ctrue%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%20%20%20%20%7Delse%7B%0A%09%09%09%20%20%20%20%20%20%20%20this.childNodes%5Bi%5D.removeAttribute%28%27checked%27%29%3B%0A%09%09%09%20%20%20%20%7D%0A%09%09%09%7D%0A%09%09%7D%09%0A%09%7D%0A%7D%0Apopup.setAttribute%28%27onpopupshowing%27%2C%27this.f%28%29%3B%27%29%3B%0Athis.%20appendChild%20%28popup%29%3B%0A%0Athis.%20changeScrapbookDirectory%20%3D%20function%20%28event%29%7B%0A%09if%20%28event.%20target.%20getAttribute%20%28%22isDefault%22%29%3D%3D%27true%27%29%7B%0A%09%09this.PS.setBoolPref%28%27scrapbook.data.default%27%2Ctrue%29%3B%0A%09%7Delse%7B%0A%09%09var%20path%3Devent.target.getAttribute%28%22path%22%29%3B%0A%09%09var%20title%3Devent.target.getAttribute%28%22label%22%29%3B%0A%09%09this.PS.setBoolPref%28%27scrapbook.data.default%27%2Cfalse%29%3B%0A%09%09this.PS.setCharPref%28%27scrapbook.data.path%27%2Cpath%29%3B%0A%09%09this.PS.setCharPref%28%27scrapbook.data.title%27%2Ctitle%29%3B%0A%09%7D%0A%09try%20%7B%0A%09%09var%20winEnum%20%3D%20sbCommonUtils.WINDOW.getEnumerator%28%22navigator%3Abrowser%22%29%3B%0A%09%09while%20%28%20winEnum.hasMoreElements%28%29%20%29%7B%0A%09%09%09var%20win%20%3D%20winEnum.getNext%28%29%0A%09%09%09%09.QueryInterface%28Components.interfaces.nsIDOMWindow%29%3B%0A%09%09%09try%20%7B%0A%09%09%09%09win.sbBrowserOverlay.refresh%28%29%3B%0A%09%09%09%09win.sbBrowserOverlay.onLocationChange%28%29%3B%0A%09%09%09%09win.document.getElementById%28%22sidebar%22%29.contentWindow%0A%09%09%09%09%09.sbMainService.refresh%28%29%3B%0A%09%09%09%7D%20catch%28ex%29%20%7B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%20catch%28ex%29%20%7B%0A%7D%0A%7D%0A%0Athis.PS%3Dcustombuttons.ps%3B

Тестировалась для ScrapBook 1.2.0.5

P.S. С днём рождения!

Yan
Что-то не работает. Появляется кнопка с дропмаркером, щёлкнув на который открывается пустой список:
http://forum.mozilla-russia.org/uploaded/Multi_Scrapbook_1.png
P.S. Спасибо :)
P.S.S. Кнопка очень нужна товарищу Крыска.

Yan
ааа. наверное у тебя как всегда не включены подписи :)
My FF 2.0 [20060918] Rus
как только пересел на 2,0, так кнопки и не работали. переустановили расширение, но не помогло. удалял, ставил кнопки....

Кнопка нужна очень-очень :blush::blush::blush:

Крыска
http://forum.mozilla-russia.org/viewtopic.php?pid=131940#p131940

Dimanish

Что-то не работает. Появляется кнопка с дропмаркером, щёлкнув на который открывается пустой список:

Ага, оказывается, у меня Scrapbook старой версии стоял, и имена функций не совпадали.
Исправил. Устанавливать из предыдущего сообщения.

Yan, я тут продолжаю развивать мысль...
http://dark-demon.jino-net.ru/~files/cb2-tp2.rar
переделал всё на xbl, доделал кнопку imageSH.
но меня смущает некоторая неопрятность с обсервом. чувствую, что если написать

Код:

<implementation implements="nsIPrefBranch">

, то можно его добавить более эстетично :)
никто не работал с имплементсами?

Dark-Demon
Что-то я не очень понимаю твою мысль.
Зачем реализацию кнопки запихивать в xbl?

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

я думаю окно редактирования кнопки можно сделать так:
поле id (cb2- в начале добавляется автоматом)
поле label - подпись у кнопки (по дефолту равна id)
поле image - дефолтовая картинка
поле css - тут задаётся стиль отображения, иконки и тп (привязка xbl осуществляется автоматом)
поле xbl - тут собственно код кнопки (без обрамляющих <binding> и <bindings>)
в табах смысла не вижу, а вот сплиттер между двумя последними полями не помешает...

Dark-Demon
Гм, не знаю-не знаю. Получится, что чтобы написать кнопку, нужно знать JS+DOM+CSS+XBL. Не великоват наборчик получается? :)

IMHO, надо наоборот идти по пути упрощения написания кнопки. В общем, пока я к таким радикальным преобразованиям не готов. Надо всё хорошенько обдумать.

Yan, достаточно снабдить хорошими примерами и любой интересующийся разберётся. я с xbl освоился разбирая нехитрый пример.

не работает... отключение указанных расширений и установка 1,2 mod не помогла :(

Крыска, юзай мою модификацию :) "код" пихай в <handler event="click" button="0">, а "инициализация" в <constructor>

Dark-Demon
хм... че-то не совсем ясно. а в каком файле чего менять?

и новые кнопки создаются в одном и том же файле или под каждую кнопку новый файл?

Крыска, в одном файле. custombuttons2.xbl
а чтобы добавить несколько кнопок, нужно править ещё и custombuttons2.xul с custombuttons2.css, действуя по аналогии (идентификаторы главное поменять, а остальное не важно)

а вообще, какие кнопки-то интересуют?

Можно ли создать кнопку, которая бы удаляла текущую страницу из закладок?
(И если можно, то может ли она еще и историю удалений писать куда-нибудь...)

Dark-Demon
bbcode и кнопка мульти-скрэпбука (код выше)

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

например  ББ-код "Цитата". правая кнопка выделить цитату, а левая - вставить как цитату :)

Если всё таки можно, накропайте кнопочку для TB "Получить почту из всех ящиков". :)

GASon

Если всё таки можно, накропайте кнопочку для TB "Получить почту из всех ящиков". smile

А ведь же есть такая в mr.tech local install!!!

custombuttons 0.0.2 alpha
Внимание! Это тестовая версия, со всеми вытекающими отсюда последствиями.

Совместимость: FF 1.5.0.* - 2.0

Функциональных изменений никаких, но изменился принцип работы расширения и формат хранения кнопок. Теперь они хранятся в каталоге custombuttons профиля. При установке расширение удалит все кнопки из prefs.js и сохранит их в новом формате. Так что если Вы планируете в будущем вернуться на старую версию, сделайте backup файла prefs.js.

Скачать custombuttons 0.0.2 alpha
(Ниже есть более новая версия)

При тестировании просьба особое внимание обратить на совместимость с другими расширениями.
________________________________________________________

Если в Firefox2 не работает кнопка с выпадающем меню, нужно в коде её инициализации поместить this.type='menu'. Из-за этого в частности не работала кнопка "Multi-ScrapBook".

Опаньки.... :sick:
Кнопки заработали!!! Вот только пропали ВСЕ элементы фокса которые стояли... т.е. кнопки вперед, назад, стоп, строка адреса....

фигасе компромисик :lol::lol::lol:

Добавлено Птн 29 Сен 2006 01:14:51 :
Оххх... нашлись.. оказывается произошел резет всех элементов... они оказались на панелях где по умолчанию и стояли, а не там куда я их в одну строчку сгрупировал.

но самое интересное, что теперь у меня 2е!!! строки поиска!

Добавлено Птн 29 Сен 2006 01:20:26 :
Правда поисковики не могут быть разными :)
http://img237.imageshack.us/img237/879/untitled11yr7.th.jpg

Добавлено Птн 29 Сен 2006 01:21:20 :
Скриншот 173,4 Кб (предупреждаю)

Добавлено Птн 29 Сен 2006 01:23:36 :
Кнопка Мульти-бука пока что-то не работает :(

вставил код из сообщения 133681 и добавил код инициализации (появилась стрелочка)...

trolll написал:

А ведь же есть такая в mr.tech local install!!!

Точно есть.

И ещё на один шажок ближе к идеалу: http://dark-demon.jino-net.ru/~files/cb2-tp3.rar
добавил бб-кнопки (при этом заюзал ООП в плане наследования ;)), а также Multiscrapbook, правда не уверен работает ли он...

Yan, ща посмотрим, что ты там замутил... :)

Крыска
Мда.. Такого хулиганства я не ожидал...
Попробовал воспроизвести - не получается.
AIOS у меня никак не хочет заводиться, ни 0.6.4, ни 0.7 RC4, даже на чистом профиле.

Кнопка Мульти-бука пока что-то не работает :(
вставил код из сообщения 133681 и добавил код инициализации (появилась стрелочка)...

Странно. У меня работает. Scrapbook 1.2.0.4, кнопка из 133681 (неизмененная, я её уже там отредактировал).
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060928 BonEcho/2.0
В JS-консоле что-нибудь есть?

Dark-Demon

Yan, ща посмотрим, что ты там замутил... :)

Одну явную ошибку я уже нашел - не определяется event в oncommand-коде.
Попозже перевыложу исправленную версию.

Продолжу аггитировать за xul+css+xbl...
1. иконки в base64 занимают прилично места, так что нет смысла пихать их прямо в код.
лучше в цсс, где им и место. хотя, ещё лучше - отдельными файлами, тогда они и прокешируются нормально, а не будут каждый раз из строки декодироваться.
2. возможность в простой и наглядной форме организовывать не только кнопки, но и поля ввода, добавлять меню и прочие xul-елементы. в тех ужасах, что сейчас реализуют это с помощью DOM - сам чёрт ногу сломит. на xbl же достаточно просто вставить соответствующие теги.

Dark-Demon
Принципиально я не против.
Но к перечисленному ранее у меня еще вопросы появились, например:
- можно ли будет быстро отредактировать кнопку без перезагрузки браузера?

В общем, пока у меня большие сомнения. Впрочем, я опять буду рад, если я ошибаюсь. :)

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

Это безусловный плюс. Правда, я не думаю, что xbl для большинства так уж и прозрачен.
Но можно пойти по другому пути. Сделать wizard, по аналогии с Customizable toolbar buttons, только расширенный, с выпадающими меню, и т.п. А кнопку формировать через DOM.

Добавлено Птн 29 Сен 2006 15:56:03 :
Забыл сказать. Кнопка Multi-book в твоей сборке почему-то не работает, хотя код вроде верный (this.type='menu' я добавлял).

Добавлено Птн 29 Сен 2006 15:59:14 :
P.S. Если есть возможность, подтвердите кто-нибудь, или опровергните баг, который я отписал на xpoint:
http://xpoint.ru/forums/programming/XUL/thread/38351.xhtml
Это важно для работы расширения.

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

думаю да, ведь в xul хранится только указание, что кнопка наличиствует, а xbl подключается через css. потом попробую сделать...

Dark-Demon написал:

Продолжу аггитировать за xul+css+xbl...

имхо, на каждую кнопку по xbl - слишком расточительно.

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

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

Yan написал:

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

Можно.
js для cb

Код:

var b = document. getElementById ("go-button");
//b. style. MozBinding = "url(chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton)";
b. style. MozBinding = "url(chrome://custombuttons/content/bind1.xml#bind1)"; // или document. addBinding (b, "chrome://custombuttons/content/bind1.xml#bind1"); // жаль, removeBinding не работает

+ xbl

Код:

<?xml version="1.0" encoding="UTF-8"?>

<bindings id="binds1"
          xmlns="http://www.mozilla.org/xbl"
          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
          xmlns:xbl="http://www.mozilla.org/xbl"
          xmlns:html="http://www.w3.org/1999/xhtml">

    <binding id="bind1" extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton">
        <handlers>
            <handler event="click">
                alert ("bind1");
            </handler>
        </handlers>    
    </binding>

</bindings>

правда, после привязки bind1 не получилось отредактировать его из внешнего редактора.

Yan
вроде консоль по поводу кнопок или расширения молчит.

Продолжаю радовать всех своими глюками...

на этот раз под раздачу влетела версия Dark-Demon:)

обнаружил там свою желанную кнопку мульти-бука... ставлю.... а она сразу пропадает.... и нет её. стер и поставил заново... понажимал пару раз на кнопку (кстати не естественно приподнятой) результат нулевой.

в настройках кнопок новые кнопки "дрожат"...

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

на время теста отключался оригинальный кастомбуттонс

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

Anton

правда, после привязки bind1 не получилось отредактировать его из внешнего редактора.

Не очень понял. Т.е. привязать bind1, потом его изменить, и потом попробовать опять привязать?
Крыска
Только что поставил последнюю версию Scrapbook'а, последнюю сборку custombuttons, и кнопку отсюда. Работает.. Так что помогай, говори, что еще поставить, чтоб она перестала работать. Сам я не справляюсь. :)

Добавлено Сбт 30 Сен 2006 01:08:46 :
Крыска

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

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

Dark-Demon

Крыска написал:

обнаружил там свою желанную кнопку мульти-бука... ставлю.... а она сразу пропадает.... и нет её. стер и поставил заново... понажимал пару раз на кнопку (кстати не естественно приподнятой) результат нулевой.

Подтверждаю.
Это из-за того, что для всех custom-кнопок указывается
-moz-binding: url('chrome://cb2-profile/content/custombuttons2.xbl#allbuttons');
А нужно для каждого типа кнопки (обычная, menu, menu-button) указывать свой MozBinding, а то для кнопок с меню не отрабатывают дефолтные binding'и #menu (или #menu-button) из chrome://global/content/bindings/toolbarbutton.xml

По-моему так, я в xbl не силён. Но в последней своей сборке я так сделал, и вроде всё прошло успешно.

Добавлено Сбт 30 Сен 2006 01:12:27 :
Крыска
Забыл спросить про кнопку Scrapbook'а.
Выпадающее меню вообще не появляется, или в нём есть только "Profile Folder"?

Yan
чистый профиль не спас. на нем поставил плагин для установки "несертифицированных" расширений, Ббкод и кастом последний, скрап последний... результат нулевой.

при нажатиии на кнопку она выделяется, но ничего не происходит. даже меню не появляется....

есть у меня подозрения, что я что-то не то делаю....:blush:

Добавлено Сбт 30 Сен 2006 01:24:36 :
кстати на новом профиле сгенерировал альбомы внутри профиля.... явно глюк не в этом.

Добавлено Сбт 30 Сен 2006 01:33:37 :
может виноват тот факт, что у меня релиз ФФ не бета и не РК1, а между ними.

Крыска
Какие-нибудь другие кнопки с выпадающим меню работают? Эти, например?

Yan написал:

Anton

правда, после привязки bind1 не получилось отредактировать его из внешнего редактора.

Не очень понял. Т.е. привязать bind1, потом его изменить, и потом попробовать опять привязать?
...

Да.

Yan
не работают и они :( где ж ручки то кривые у меня... не ясно :(

Интересно, у кого-нибудь кроме меня эта последняя alpha работает?
Сдаётся мне, что ручки-то кривые у меня, только вот никак не пойму, где именно...

Yan, а ты не можешь в .htaccess прописать

Код:

AddType application/x-xpinstall .xpi

?

INFOMAN
Не могу. На newmail.ru вообще мало что можно.

Сборку поставил, добавил кнопку, после перезапуска кнопка исчезла.
Посмотрел в профиль, почему-то папка custombuttons имеет права 644 (т.е. без права выполнения), а надо 755 или 700.
:::: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.1) Gecko/20060918 Firefox/2.0

Добавлено Пнд 02 Окт 2006 02:24:35 :
Поменял вручную права на 700, вроде работает

INFOMAN
Чёрт! Ну конечно! Copy-past'нул, а подумать головой забыл!
Огромное спасибо!

Это из-за того, что для всех custom-кнопок указывается
-moz-binding: url('chrome://cb2-profile/content/custombuttons2.xbl#allbuttons');

сорри, забыл убрать extends для #allbuttons - теперь он совершенно не нужен :) а биндинг этот не трож - он жизнено необходим :)

Не могу. На newmail.ru вообще мало что можно.

переезжай на jino-net.ru :)

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

Код:

<toolbaritem id="cb2-images" class="custombutton" style="-moz-binding: url('chrome://cb2-profile/content/custombuttons2.xbl#cb2-imagesh');" />

,а после редактирования xbl-файла создать его временную копию с другим именем и выполнить такого плана код:

Код:

button.style.cssText= "-moz-binding: url('chrome://cb2-profile/content/cb2-temp-234.xbl#cb2-imagesh'); ";

Dark-Demon, на jino-net тоже AddType запрещён

Добавлено Пнд 02 Окт 2006 14:24:50 :
Я там php-скрипт юзал, чтобы правильный Content-Type выдавать

по ходу дела xbl-ки надо править через вот эту функцию:
http://www.xulplanet.com/references/objref/XULDocument.html#method_loadBindingDocument

ща буду ковырять... ;)

custombuttons 0.0.2 alpha
Внимание! Это тестовая версия, со всеми вытекающими отсюда последствиями.

Совместимость: FF 1.5.0.* - 2.0

Скачать custombuttons 0.0.2 alpha

New:
- исправил права доступа на папку custombuttons в профиле
_____________________________________________________________________

custombuttons 0.0.1.3 alpha

Совместимость: FF 1.5.0.* - 2.0

Скачать custombuttons 0.0.1.3 alpha

New:
- по сравнению с версией 0.0.1.2 добавил только совместимость с Firefox2, а именно пару хаков, чтобы исправно работали кнопки, использующие метод bind.

Yan
Зачем две версии?

Dimanish
Потому что с 0.0.2 возникли некоторые трудности. Видимо, придётся существенно доработать.

Поэтому пока я сделал 0.0.1.3, чтоб можно было нормально пользоваться расширением в Firefox2.

в общем через ту функцию сделать ничего не получится :( xbl-ки править на лету нельзя и это диагноз :sick: остаётся только вариант с временными файлами...

Dark-Demon написал:

в общем через ту функцию сделать ничего не получится :( xbl-ки править на лету нельзя и это диагноз...

Интересно, можно сделать ссылку на якорь (#) в data:// ?

Anton, что ты имеешь ввиду?

Если можно сделать ссылку на якорь, можно было бы "подшивать" образ *.xbl-файла по data:// протоколу.

ой какой изврат... зачем?

Dark-Demon написал:

ой какой изврат... зачем?

Ладно-ладно, не буду спорить. : ) Конечно, временные файлы гораздо естественней и, скорее всего, единственный приемлимый вариант.

Anton, в общем, как и обещал сделал кнопку к своему расширению реализующую выпадающее меню.

в xul надо добавить такой код:

Код:

<toolbaritem id="cb2-useragent" class="chromeclass-toolbar-additional" style="-moz-binding: url('chrome://cb2-profile/content/custombuttons2.xbl#cb2-useragent');" />

а в xbl такой:

Код:

<binding id="cb2-useragent" extends="chrome://custombuttons2/content/custombuttons2.xbl#allbuttons">
    <content context="">
        <xul:menulist>
            <xul:menupopup>
                <xul:menuitem label="default UA" value="" />
                <xul:menuitem label="FF 2.0b2 UA" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2" />
                <xul:menuitem label="IE 6.0sp2 UA" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" />
                <xul:menuitem label="Op 9.00 UA" value="Opera/9.00 (Windows NT 5.1; U; ru)" />
            </xul:menupopup>
        </xul:menulist>
    </content>
    <implementation>
        <field name="prefservice">Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch)</field>
        <field name="prefname"> 'general.useragent.override' </field>
        <property name="pref"> 
            <getter>    return navigator.userAgent;    </getter>
            <setter>
                <![CDATA[
                    if (val=='') this.prefservice.clearUserPref(this.prefname);
                    else this.prefservice.setCharPref(this.prefname,val);
                    return val;
                ]]>
            </setter>
        </property>
    </implementation>
    <handlers>
        <handler event="command">    this.pref= this.boxObject.firstChild.value;    </handler>
    </handlers>
</binding>

css в данном случае не используется. есть мысль вообще от него отказаться...

К сожалению, в прошлый раз никто не ответил. Спрашиваю еще раз.

Можно ли создать кнопку, которая бы удаляла текущую страницу из закладок?
(И если можно, то может ли она еще и историю удалений писать куда-нибудь...)

pongo, можно, разрешаю.

Dark-Demon, здорово! Но дело в том, что я не разбираюсь в программировании расширенией. Может быть, кто-нибудь напишет?

pongo
Слишком уж никому не нужная кроме вас кнопка.

pongo

Код:

custombutton://%u0423%u0434%u0430%u043B%u0438%u0442%u044C_%u0412%u0421%u0415_%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438_%u043D%u0430_%u0442%u0435%u043A%u0443%u0449%u0438%u0439_%u0430%u0434%u0440%u0435%u0441%5D%5B%5D%5Btry%0A%7B%0A%20%20%20%20var%20rdfs%20%3D%20Components.%20classes%20%5B%22@mozilla.org/rdf/rdf-service%3B1%22%5D.%20getService%20%28Components.%20interfaces.%20nsIRDFService%29%3B%0A%20%20%20%20var%20bmds%20%20%3D%20rdfs.%20GetDataSource%20%28%22rdf%3Abookmarks%22%29%3B%0A%20%20%20%20var%20urlr%20%3D%20rdfs.%20GetResource%20%28%22http%3A//home.netscape.com/NC-rdf%23URL%22%29%3B%0A%20%20%20%20var%20urlv%20%3D%20rdfs.%20GetLiteral%20%28getBrowser%20%28%29.%20currentURI.%20spec%29%3B%0A%20%20%20%20var%20tbms%20%3D%20bmds.%20GetSources%20%28urlr%2C%20urlv%2C%20true%29%3B%0A%20%20%20%20var%20tbm%2C%20alo%2C%20res%2C%20tar%2C%20ali%2C%20src%3B%0A%20%20%20%20while%20%28tbms.%20hasMoreElements%20%28%29%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20tbm%20%3D%20tbms.%20getNext%20%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28tbm%20instanceof%20Components.%20interfaces.%20nsIRDFResource%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20alo%20%3D%20bmds.%20ArcLabelsOut%20%28tbm%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20%28alo.%20hasMoreElements%20%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20res%20%3D%20alo.%20getNext%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28res%20instanceof%20Components.%20interfaces.%20nsIRDFResource%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tar%20%3D%20bmds.%20GetTarget%20%28tbm%2C%20res%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28tar%20instanceof%20Components.%20interfaces.%20nsIRDFResource%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bmds.%20Unassert%20%28tbm%2C%20res%2C%20tar%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20ali%20%3D%20bmds.%20ArcLabelsIn%20%28tbm%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20%28ali.%20hasMoreElements%20%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20res%20%3D%20ali.%20getNext%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28res%20instanceof%20Components.%20interfaces.%20nsIRDFResource%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20src%20%3D%20bmds.%20GetSource%20%28res%2C%20tbm%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28res%20instanceof%20Components.%20interfaces.%20nsIRDFResource%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bmds.%20Unassert%20%28src%2C%20res%2C%20tbm%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20var%20rds%20%3D%20bmds.%20QueryInterface%20%28Components.%20interfaces.%20nsIRDFRemoteDataSource%29%3B%0A%20%20%20%20setTimeout%20%28function%20%28%29%20%7Brds.%20Flush%20%28%29%7D%2C%20100%29%3B%0A%7D%0Acatch%20%28e%29%0A%7B%0A%20%20%20%20alert%20%28e%29%3B%0A%7D%5D%5B

Удаляет все закладки на текущий адрес. Историю удалений не ведёт.

Dark-Demon написал:

Anton, в общем, как и обещал сделал кнопку к своему расширению реализующую выпадающее меню.

Ну, во-первых, если перечитаешь старые PM, то заметишь, что я говорил о контекстном меню.
А во-вторых - почему доступна только с клавиатуры ?

Anton, спасибо, но мне кажется, что код слижком сложный. Есть же BookmarksCommand.deleteBookmark или http://home.netscape.com/NS-rdf#command?cmd=deletebookmark. Вот только я не знаю что с ними делать

pongo написал:

Anton, спасибо, но мне кажется, что код слижком сложный. Есть же BookmarksCommand.deleteBookmark или http://home.netscape.com/NS-rdf#command?cmd=deletebookmark. Вот только я не знаю что с ними делать

Я начинал разработку кнопки с DoCommand, но не разобрался с аргументами cmd=deletebookmark, так что я тоже не знаю, что с ним делать. И BookmarksCommand/BookmarkRemoveTransaction тоже копал, но, имхо, с ними проще не будет, так как перед их вызовом надо формировать массив аргументов node/parentNode/nodeProperties - но, коль скоро они найдены, зачем их помещать их в массив и вызывать функцию ? Лишняя работа, проще сделать вызов Unassert.

Anton, понятно. Но можете написать код, который бы удалял только текущую страницу из закладок?

pongo написал:

...только текущую страницу из закладок?

Вот именно это кнопка и делает.

Anton, ой. Извините. Я прочитал «адрес» как «сеанс».
Всё работает, огромное спасибо

новый билд: http://dark-demon.jino-net.ru/~files/cb2-tp4.rar
совсем отказался от css. картинки теперь переключаются через deck.
[b]Anton[/и] специально для тебя сделал кнопку с контекстным меню :)

Dark-Demon написал:

...
[b]Anton[/и] специально для тебя сделал кнопку с контекстным меню :)

Опять эти <toolbaritem>... Чтобы нужная кнопка появилась в диалоге нужно вручную править xul и/или extens'ы в xbl. Очень юзабельно.
Не убедительно, понимаешь. Смотри, как эти две кнопки можно сделать без xbl:
Кнопка с выпадающим меню:

Код:

<script type="application/x-javascript" src="chrome://global/content/nsUserSettings.js"/>
<script type="application/x-javascript">
    <![CDATA[
        function showAlert (v)
        {
            var sa = Components. classes ["@mozilla.org/alerts-service;1"]. getService (Components.interfaces.nsIAlertsService);
            sa. showAlertNotification (null, "User Agent:", v, false, "", null);
        }
    ]]>
</script>
<toolbaritem id="cb2-useragent">
    <menulist oncommand="nsPreferences.setUnicharPref('general.useragent.override',this.value);showAlert(this.value);">
        <menupopup>
            <menuitem label="default UA" value="" />
            <menuseparator />
            <menuitem label="FF 2.0b2 UA" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2" />
            <menuitem label="IE 6.0sp2 UA" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" />
            <menuitem label="Op 9.00 UA" value="Opera/9.00 (Windows NT 5.1; U; ru)" />
        </menupopup>
    </menulist>
</toolbaritem>

2. Кнопка с контекстным меню

Код:

<toolbarbutton id="cb2-about" context="cb2-about-context" oncommand="openAboutDialog();">
    <label value="[about]" />
    <menupopup id="cb2-about-context" onclick="event.stopPropagation()">
        <menuitem label="config" oncommand="loadURI('about:config');" />
        <menuitem label="mozilla" oncommand="loadURI('about:mozilla');" />
        <menuitem label="plugins" oncommand="loadURI('about:plugins');" />
        <menuitem label="license" oncommand="loadURI('about:license');" />
        <menuitem label="neterror" oncommand="loadURI('about:neterror');" />
        <menuitem label="blank" oncommand="loadURI('about:blank');" />
        <menuitem label="buildconfig" oncommand="loadURI('about:buildconfig');" />
        <menuitem label="feeds" oncommand="loadURI('about:feeds');" />
        <menuitem label="credits" oncommand="loadURI('bout:credits');" />
        <menu label="cache">
            <menupopup>
                <menuitem label="memory" oncommand="loadURI('about:cache?device=memory')" />
                <menuitem label="disk" oncommand="loadURI('about:cache?device=disk')"/>
            </menupopup>
        </menu>
    </menupopup>
</toolbarbutton>

Кратко и без всяких namespaces, handlers, getters/setters.

Опять эти <toolbaritem>... Чтобы нужная кнопка появилась в диалоге нужно вручную править xul и/или extens'ы в xbl. Очень юзабельно.

ничего подобного. xul генерится автоматом и пользователю его править не надо. только xbl.

Не убедительно, понимаешь. Смотри, как эти две кнопки можно сделать без xbl:

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

Кратко и без всяких namespaces, handlers, getters/setters.

ну давай меряться пиписьками... реализуй тогда cb2-imagesh на xul.
если очень хочется сделать через xul - никто не мешает вставить этот xul в xbl. а вот с обратным у тебя будут проблемы...

Dark-Demon написал:

...
ничего подобного. xul генерится автоматом и пользователю его править не надо. только xbl.
...

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

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

(кстати, и с выпадающим тоже). Вот как частный случай: а если пользователю не нужен тег [ code] из твоего расширения ? Вот либо придётся ставить ненужную кнопку, либо все преимущества насмарку. Это ведь смотря как организовать.

...

Кратко и без всяких namespaces, handlers, getters/setters.

ну давай меряться пиписьками... реализуй тогда cb2-imagesh на xul.
если очень хочется сделать через xul - никто не мешает вставить этот xul в xbl. а вот с обратным у тебя будут проблемы...

Ну давай. Вот твоя:
xul:

Код:

<toolbaritem id="cb2-imagesh" class="custombutton" style="-moz-binding: url('chrome://cb2-profile/content/custombuttons2.xbl#cb2-imagesh')" />

+xbl:

Код:

<binding xbl:id="cb2-imagesh" id="cb2-imagesh" extends="chrome://custombuttons2/content/custombuttons2.xbl#allbuttons">
    <content context="" tooltiptext="image show/hide" >
        <xul:deck xbl:inherits="selectedIndex=image" >
            <xul:toolbarbutton label="show all images" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACp0lEQVR42mL4//8/g3zm6f8AAcQAYvz4uuc/QACBeSAOQAAx/P75/X/ukY//AQIILHXhz///lZe//wfJAgQQWOBui9D/P78t/6ftffcfIIAYYKbA9AIEEIjDWnPtx3+YIEAAMXz7/P7/75+v/mcADQQJAAQQ0HTt/y9nqv73W/caLAAQQDAzWC8CbWq89et//fWf/5HNBAgguIJzIKdc+v6/7Py3/8Wnv/wvPPkZrAgggMAKfv+c8P/f+8r//x+mAZ03/X/g5nf/sw68BysACCCIH78p///zSeb/n4ci/39d4P+/4+f//0d//QcrAAggFH8gY5A4CAMEEFxB0+1f/xtu/vxfc+X7f5CDYYoAAgiuoP7Gz//VV378r7j4HdkkVoAAgisA6Sy/8O1/ydmvYB+c+g02hRUggBgaw6T+g4Iegq//B/Fzj376fwLiSFaAAAIr+HI17f//l4X//9+JAyvIPPjh/3GoAoAAAit4MEns/71Gof+f1hmCFaQCownqTVaAAAIr+PNb4f+fFxL//9wUACsAScIUAAQQA8y/IA7IsSAvgvAFKD4PxdjCCIQBAgjDgAvQSK0DRmrtNWDQXAUFzTewxjNAn5/8/R/FIIAAwjAAZFsdMEFVAcMUFPkgzaAEUAoKvlOfkYMQ7AWAAAJrBvmLEC4Aasw/DsTHPiG7ghUggOAG/PkFTCG/p/3//6P///+PLf//vwamrsc5///+WQc2IHLX+//Zhz/+zz4EjwKwAQABBDfg90/d/w+mSvx/DEztPy+G//9/K/r//6vBwBhoBhvgv/HN//T97/9n7Hv//xiSAQABhDDgl8b/B33C/++3C/6/38T//34d7//7Vdz//0Kjzm/dq/9pe979T939Fp6UQQYABBDRYSAZdghrkgcIMAD5xMj+kGsEXgAAAABJRU5ErkJggg==" />
            <xul:toolbarbutton label="hide all images" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC" />
            <xul:toolbarbutton label="hide external" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACdklEQVR42mL4//8/g3zm6f8AAcQAYvz69es/QACBeSAOQAAx/Pnz5//Z20/+AwQQWOrHv///n7x89R8kCxBAYIEuXdb/f//+/X/w8oP/AAHEADMFphcggEAc1pdv3vyHCQIEEMPPnz//gwy8dPcpWAAggMCmnzp16v+Rqw/BAgABBDOD9RfQpncf3v1/9RahHSQHEEBwBd+BCh4DnXLv6Yv/Nx89/3/l/jOwIoAAAisAGXv9+vX/MOedvvn4//Frj8AKAAII7keQBAj//v37//M///8/+/0frAAggFD8gYxB4iAMEEBwBR8+vvv/5v1bYJC8/v/733+4IoAAgit4/e7t/+evX/9/9OIVskmsAAEEV/D01ev/D56//H/78Yv/1x48+//uD9gUVoAAYlizZg04pGAYxD8PjIbXUAUAAQRWMMmA9f+VK1f+dwK9CeKfuP7o/0uoAoAAAivo02f9f+7cuf9tOhAFh4DR9BziTVaAAAIrgIUBCIP4IEloOLACBBADzL8gDsixIC+C4uUnFP+AYmxhBMIAAYRhwE9wpL79/wYYLKCIfQEMmofPIUHz6e///2///EcxCCCAMAwA2fYCmKCeATWC0uFDYNDdf/by/50nL/5fBQbf5ftP/7//CzeEFSCAwJpB/iKErwJTz6V7T/9fBCZMJFewAgQQ3ABQAE0BBjcoyCcAQxUUsj16rP///fsHNuAcMG7OAFPZqRuP/79CMgAggOAGgCIRpBEUX6BkCYqWDh1WeMiD4u4oMBeAcsILJAMAAgjFgF6gjSDNII2gOG3RRhhw+MrD/wcvPfi//+J9eFIGGQAQQESHAa4kDxBgAMjdAQviliYiAAAAAElFTkSuQmCC" />
        </xul:deck>
    </content>
    <implementation>
        <constructor>
            <![CDATA[
                /*this.observer= {observe: Function.prototype.bind.apply(this.observe,[this]) };*/ //работает только до загрузки браузера %-/
                this.observer=
                {
                    el:this,
                    observe: function() {this.el.observe();},
                };
                this.prefservice.addObserver(this.prefname,this.observer,false);
                this.observe();
            ]]>
        </constructor>
        <destructor>
            <![CDATA[
                this.prefservice.removeObserver(this.prefname,this.observer);
            ]]>
        </destructor>
        <method name="observe">
            <body>
                <![CDATA[
                    this.setAttribute('image', this.pref-1);
                ]]>
            </body>
        </method>
        <field name="prefservice"> Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch) </field>
        <field name="prefname"> 'permissions.default.image' </field>
        <property name="image" onget="return this.getAttribute('image')" onset="this.setAttribute('image',val);return val" />
        <property name="pref" onget="return this.prefservice.getIntPref(this.prefname)" onset="this.prefservice.setIntPref(this.prefname,val); return val" />
    </implementation>
    <handlers>
        <handler event="click" button="0" modifiers="any"><![CDATA[        this.pref= 1;        ]]></handler>
        <handler event="click" button="1" modifiers="any"><![CDATA[        this.pref= 3;        ]]></handler>
        <handler event="click" button="2" modifiers="any"><![CDATA[        this.pref= 2;        ]]></handler>
    </handlers>
</binding>

а вот моя:

Код:

<script type="application/x-javascript" src="chrome://global/content/nsUserSettings.js"/>
<script type="application/x-javascript">
    <![CDATA[
        function setDeckImage ()
        {
            document. getElementById ("cb22-imageshdeck"). selectedIndex = nsPreferences. getIntPref ('permissions.default.image', 0);
        }
        var ps = nsPreferences. mPrefService;
        var ps2 = ps. QueryInterface (Components. interfaces. nsIPrefBranch2);
        var imageshObserver =
        {
            observe: function (s, t, d)
            {
                setDeckImage ();
            }
        };
        ps2. addObserver ('permissions.default.image', imageshObserver, false);
        setTimeout (setDeckImage, 0);
    ]]>
</script>
<toolbarbutton id="cb22-imagesh">
    <deck id="cb22-imageshdeck" onclick="nsPreferences.setIntPref('permissions.default.image',event.button)">
        <toolbarbutton label="show all images" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACp0lEQVR42mL4//8/g3zm6f8AAcQAYvz4uuc/QACBeSAOQAAx/P75/X/ukY//AQIILHXhz///lZe//wfJAgQQWOBui9D/P78t/6ftffcfIIAYYKbA9AIEEIjDWnPtx3+YIEAAMXz7/P7/75+v/mcADQQJAAQQ0HTt/y9nqv73W/caLAAQQDAzWC8CbWq89et//fWf/5HNBAgguIJzIKdc+v6/7Py3/8Wnv/wvPPkZrAgggMAKfv+c8P/f+8r//x+mAZ03/X/g5nf/sw68BysACCCIH78p///zSeb/n4ci/39d4P+/4+f//0d//QcrAAggFH8gY5A4CAMEEFxB0+1f/xtu/vxfc+X7f5CDYYoAAgiuoP7Gz//VV378r7j4HdkkVoAAgisA6Sy/8O1/ydmvYB+c+g02hRUggBgaw6T+g4Iegq//B/Fzj376fwLiSFaAAAIr+HI17f//l4X//9+JAyvIPPjh/3GoAoAAAit4MEns/71Gof+f1hmCFaQCownqTVaAAAIr+PNb4f+fFxL//9wUACsAScIUAAQQA8y/IA7IsSAvgvAFKD4PxdjCCIQBAgjDgAvQSK0DRmrtNWDQXAUFzTewxjNAn5/8/R/FIIAAwjAAZFsdMEFVAcMUFPkgzaAEUAoKvlOfkYMQ7AWAAAJrBvmLEC4Aasw/DsTHPiG7ghUggOAG/PkFTCG/p/3//6P///+PLf//vwamrsc5///+WQc2IHLX+//Zhz/+zz4EjwKwAQABBDfg90/d/w+mSvx/DEztPy+G//9/K/r//6vBwBhoBhvgv/HN//T97/9n7Hv//xiSAQABhDDgl8b/B33C/++3C/6/38T//34d7//7Vdz//0Kjzm/dq/9pe979T939Fp6UQQYABBDRYSAZdghrkgcIMAD5xMj+kGsEXgAAAABJRU5ErkJggg==" />
        <toolbarbutton label="hide all images" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC" />
        <toolbarbutton label="hide external" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACdklEQVR42mL4//8/g3zm6f8AAcQAYvz69es/QACBeSAOQAAx/Pnz5//Z20/+AwQQWOrHv///n7x89R8kCxBAYIEuXdb/f//+/X/w8oP/AAHEADMFphcggEAc1pdv3vyHCQIEEMPPnz//gwy8dPcpWAAggMCmnzp16v+Rqw/BAgABBDOD9RfQpncf3v1/9RahHSQHEEBwBd+BCh4DnXLv6Yv/Nx89/3/l/jOwIoAAAisAGXv9+vX/MOedvvn4//Frj8AKAAII7keQBAj//v37//M///8/+/0frAAggFD8gYxB4iAMEEBwBR8+vvv/5v1bYJC8/v/733+4IoAAgit4/e7t/+evX/9/9OIVskmsAAEEV/D01ev/D56//H/78Yv/1x48+//uD9gUVoAAYlizZg04pGAYxD8PjIbXUAUAAQRWMMmA9f+VK1f+dwK9CeKfuP7o/0uoAoAAAivo02f9f+7cuf9tOhAFh4DR9BziTVaAAAIrgIUBCIP4IEloOLACBBADzL8gDsixIC+C4uUnFP+AYmxhBMIAAYRhwE9wpL79/wYYLKCIfQEMmofPIUHz6e///2///EcxCCCAMAwA2fYCmKCeATWC0uFDYNDdf/by/50nL/5fBQbf5ftP/7//CzeEFSCAwJpB/iKErwJTz6V7T/9fBCZMJFewAgQQ3ABQAE0BBjcoyCcAQxUUsj16rP///fsHNuAcMG7OAFPZqRuP/79CMgAggOAGgCIRpBEUX6BkCYqWDh1WeMiD4u4oMBeAcsILJAMAAgjFgF6gjSDNII2gOG3RRhhw+MrD/wcvPfi//+J9eFIGGQAQQESHAa4kDxBgAMjdAQviliYiAAAAAElFTkSuQmCC" />
    </deck>
</toolbarbutton>

ой... и правда короче : ) Зато выглядит аккуратнее и работает, в отличие от первой.

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

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

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

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

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

а вот моя:

уже вижу, что она работает неправильно :) сам догадаешься? впрочем, лови критику:
1. ты создаёшь глобальные переменные, да ещё и с такими короткими именами, а это всегда черевато.
2. setTimeout (setDeckImage, 0); - это по твоему "выглядит аккуратнее?"
3. если настройка является не числом, а строкой, то тебе придётся делать честную проверку на нажатую клавишу.
4. при создании другой кнопки на базе этой придётся искать все вхождения 'permissions.default.image'. у тебя в этом примитивном случае их уже 3, а с более-менее сложной кнопкой, да с таким стилем программирования - туши свет бросай гранату...

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

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

кстати, это было бы весьма неплохо! но дорого... пока...

Yan, может ты выскажешься по этому поводу?

Я бы прежде всего предложил не превращать эту ветку в холивар "xbl vs xul", и перенести обсуждение в форум Разработка. Всё-таки здесь лучше обсуждать уже готовые релизы расширения, и кнопки к нему. Короче, создаю тему "Разработка Сustom Buttons", и предлагаю продолжить там.

И снова приходится редактировать - баг вернулся.
Делается ли что-то для прекращения конфликта с флешгот?

Я уже спрашивал здесь, спрошу теперь и в этой теме. :)
Можно ли сделать кнопку для Custom Buttons, при нажатии на которую открывается окно, в которое надо ввести фразу. На текущей странице перебираются все ссылки, и название которых содержит эту фразу, будут открываться в новых табах.
Например, захожу на форуме на страницу Последние сообщения и открываю все ссылки Новые сообщения.

stoneflash
Ссылки надо автоматически открыть в новых табах, или только добавить к ним аттрибут target="_blank"?
Если первое, то:

Код:

custombutton://%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u044B%u0445%20%u0442%u0430%u0431%u0430%u0445%20%u0432%u0441%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u0441%20%u0444%u0440%u0430%u0437%u043E%u0439%5D%5B%5D%5Bvar%20caseSensitive%3Dtrue%3B%0Avar%20s%3Dprompt%28%27%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u044B%u0445%20%u0442%u0430%u0431%u0430%u0445%20%u0432%u0441%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u0441%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0441%20%u0444%u0440%u0430%u0437%u043E%u0439%3A%27%29%0Aif%20%28%21caseSensitive%29%20s%3Ds.toLowerCase%28%29%3B%0Avar%20doc%3Dcontent.document%3B%0Avar%20ar%3Ddoc.getElementsByTagName%28%27a%27%29%3B%0Avar%20hrefs%3D%7B%7D%3B%0Afor%20%28var%20i%3D0%3Bi%3Car.length%3Bi++%29%7B%0A%20%20var%20text%3Dar%5Bi%5D.innerHTML%3B%0A%20%20if%20%28%21caseSensitive%29%20text%3Dtext.toLowerCase%28%29%3B%0A%20%20if%20%28%20%20%28text%09.replace%28/%26nbsp%3B/g%2C%27%20%27%29%0A%20%20%09%09.replace%28/%26amp%3B/g%2C%27%26%27%29%0A%20%20%09%09.replace%28/%26quot%3B/g%2C%27%22%27%29%0A%20%20%09%09.indexOf%28s%29%21%3D-1%0A%09%29%0A%09%26%26%28ar%5Bi%5D.href%29%0A%09%29%0A%20%20%7B%0A%09hrefs%5Bar%5Bi%5D.href%5D%3D1%3B%0A%20%20%7D%0A%7D%0Afor%20%28var%20h%20in%20hrefs%29%7B%0A%20%20%20%20gBrowser.addTab%28h%29%3B%0A%7D%5D%5B

По умолчанию поиск регистрозависим.
Настраивается указанием var caseSensitive=false; в коде.

Yan
Огромное спасибо! Именно то, что надо!

Yan
А нельзя ещё сделать так, чтобы открывались только непосещённые ссылки? Желательно чтоб это было опционально, галочкой. Заранее спасибо.

stoneflash

Код:

custombutton://%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u044B%u0445%20%u0442%u0430%u0431%u0430%u0445%20%u0432%u0441%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u0441%20%u0444%u0440%u0430%u0437%u043E%u0439%5D%5B%5D%5Bvar%20caseSensitive%3Dtrue%3B%0Avar%20promptService%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/prompt-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIPromptService%29%3B%0Avar%20onlyUnVisited%20%3D%20%7B%7D%3B%0Avar%20s%3D%7B%7D%3B%0ApromptService.prompt%28window%2C%27%27%2C%0A%20%20%22%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u044B%u0445%20%u0442%u0430%u0431%u0430%u0445%20%u0432%u0441%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u0441%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0441%20%u0444%u0440%u0430%u0437%u043E%u0439%3A%22%2Cs%2C%0A%20%20%22%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u043D%u0435%u043F%u043E%u0441%u0435%u0449%u0451%u043D%u043D%u044B%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%22%2C%0A%20%20onlyUnVisited%29%3B%0AonlyUnVisited%3DonlyUnVisited.value%3B%0As%3Ds.value%3B%0Aif%20%28s%29%7B%0A%09if%20%28%21caseSensitive%29%20s%3Ds.toLowerCase%28%29%3B%0A%09var%20doc%3Dcontent.document%3B%0A%09var%20ar%3Ddoc.getElementsByTagName%28%27a%27%29%3B%0A%09var%20hrefs%3D%7B%7D%3B%0A%09var%20z%3D0%3B%0A%09var%20his%3DComponents.classes%5B%22@mozilla.org/browser/global-history%3B2%22%5D%0A%09%09.getService%28Components.interfaces.nsIGlobalHistory2%29%3B%0A%09var%20IO%3DComponents.%20classes%5B%22@mozilla.org/network/io-service%3B1%22%5D.%0A%09%09getService%28Components.interfaces.nsIIOService%29%3B%0A%09for%20%28var%20i%3D0%3Bi%3Car.length%3Bi++%29%7B%0A%09%20%20var%20text%3Dar%5Bi%5D.innerHTML%3B%0A%09%20%20if%20%28%21caseSensitive%29%20text%3Dtext.toLowerCase%28%29%3B%0A%09%20%20if%20%28%20%20%28text%09.replace%28/%26nbsp%3B/g%2C%27%20%27%29%0A%09%20%20%09%09.replace%28/%26amp%3B/g%2C%27%26%27%29%0A%09%20%20%09%09.replace%28/%26quot%3B/g%2C%27%22%27%29%0A%09%20%20%09%09.indexOf%28s%29%21%3D-1%0A%09%09%29%0A%09%09%26%26%28ar%5Bi%5D.href%29%0A%09%09%26%26%28%28%21onlyUnVisited%29%7C%7C%28%21his.isVisited%28%20IO.newURI%28ar%5Bi%5D.href%2Cnull%2Cnull%29%20%29%29%29%0A%09%09%29%0A%09%20%20%7B%0A%09%09hrefs%5Bar%5Bi%5D.href%5D%3D1%3B%0A%09%09z++%3B%0A%09%20%20%7D%0A%09%7D%0A%09//alert%28z%29%3B%0A%09for%20%28var%20h%20in%20hrefs%29%7B%0A%09%20%20%20%20gBrowser.addTab%28h%29%3B%0A%09%7D%0A%7D%5D%5B/*Initialization%20Code*/

Исправил код 8.11.06 в 20:39

Yan
хм, не пашет. после нажатия ничего не происходит.

stoneflash
Точняк. Забыл, что я в 0.0.2 кое-что изменил. Отредактировал предыдущее сообщение.

Yan
Спасибо. работает, вроде. :)

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

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

AK-74
Нужна кнопка "Захватить" или "Захватить как...", которая вызывает настройки сохранения?

Добавлено Втр 14 Ноя 2006 21:40:22 :
Собственно, вот 2 кнопки:
Захватить:

Код:

custombutton://Capture%20with%20Scrapbook%5D%5Bchrome%3A//scrapbook/skin/capture_entire_as.png%5D%5BsbBrowserOverlay.execCapture%28false%2Cfalse%2Cfalse%2C%27%27%29%3B%5D%5B

Захватить как...:

Код:

custombutton://Capture%20web-page%20as...%5D%5Bchrome%3A//scrapbook/skin/capture_entire_as.png%5D%5BsbBrowserOverlay.execCapture%28false%2Cfalse%2Ctrue%2C%27%27%29%3B%5D%5B

А можно сделать кнопочку, считающую, сколько раз на странице встречается та или иная фраза?

Yan

Захватить как...:

у меня не работает почему-то.

AndreyD
Расширение Scrapbook какой версии? :)

Modex Версия 1.2.0.6

Scrapbook 1.2.0.8. — всё работает :)
Спасибо!

Обновил до 1.2.0.8, все равно не работает, может я делаю что-то не так?
Разобрался. Я, идиот, пихал этот код в поле "код" создания новой кнопки.

Как выглядит код при создании кнопки для вставки текста в позицию курсора в форме (для смайла например?)

Примерно так:

Код:

var open="[b]";
var close="[/b]";
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
var text=theBox.value.substring(0,startPos);
text +=open+theBox.value.substring(startPos, endPos)+close;
text +=theBox.value.substring(endPos, theBox.value.length);
theBox.value = text;
theBox.selectionStart = startPos;
theBox.selectionEnd = endPos + open.length + close.length;
var nHeight = theBox.scrollHeight - oHeight;
theBox.scrollTop = oPosition + nHeight;

Yan, я так понимаю, этот код вставляет b перед выделенным текстом и /b после него. А просто вставка тескста? Извините, но в программировании не силен.

AndreyD
Сделай так же, но перед текстом ничего не вставляй, а после - то, что тебе надо. Или наоборот. По пути наименьшего сопротивления. :)

AndreyD
Следующий код вставляет смайлик на позиции курсора, если есть выделение текста, то заменяет его смайликом.

Код:

var t=":)";
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
theBox.value=theBox.value.substring(0,startPos)
    +t
    +theBox.value.substring(endPos, theBox.value.length);
theBox.selectionStart=theBox.selectionEnd=startPos+ t.length;
var nHeight = theBox.scrollHeight - oHeight;
theBox.scrollTop = oPosition + nHeight;

stoneflash
Не хочется ипользовать избыточный код.

Добавлено Вск 18 Фев 2007 13:29:47 :
Yan, спасибо. Расширение отличное. Еще бы домашнюю страницу побогаче сделать, с готовыми кнопками и заготовками кодов, чтобы простому юзеру проще было. Надеюсь, сабж будет развиваться.

А можно сделать кнопку, которая прячет-показывает другие панели, как панель закладок? Если да, расскажите, как.

http://forum.mozilla-russia.org/viewtopic.php?pid=147506#p147506

Dark-Demon, такая кнопка у меня есть. Что нужно поменять, чтобы пряталась другая панель? Я пробовал вместо "Personal toolbar" вставить имя настраиваемой панели со смайлами (smiles), но так не работает.

AndreyD, возьми dom inspector и посмотри какой идентификатор у этой панели.

Dark-Demon, вы меня пугаете!:)

Ну а как ты хотел? мне отсюда не видно что там у тебя за панелька... могу предложить поставить расширение Inspect Context, тогда на панельке можно щёлкнуть ПКМ, выбрать inspect, после чего откроется дом инспектор. потом нужно перейти вверх по дереву до элемента toolbar И посмотреть его id во 2 колонке.

Я разобрался с ID панелей с помощью поиска Total Comander в папке профиля по имени панели. Настриваемые панели имеют вид "__customToolbar_имя"

Афигенное расширение!!!! Все действия, которые часто приходится делать в браузере и раньше выполнялись набором кликов-нажатий, теперь выполняются единственным нажатием на нужную кнопку. Еще сделал панели для BB code и 3D смайлов, которые прячутся-вызываются кнопками на меню баре.
Всегда любил всякие макросы. Теперь они есть и в Firefox. Жаль, не очень знаком с жабаскрипт, делал все по  примерам из ветки.

угу, а вот когда поставишь keyconfig - совсем о тулбарах и кнопочках забудешь ;)

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

http://forum.mozilla-russia.org/viewtop … 68#p100868
Ещё полезно было бы всю тему прочитать.

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

itomonster
Есть куча (я нашёл через гугль три) сайтов с готовыми кнопками. Чем не примеры для желающего разобраться?

в текущей вкладке

Код:

loadURI('http://ya.ru')

в новой вкладке

Код:

getBrowser().addTab('http://ya.ru')

Infant
Пожалуйста, не надо мне читать мораль. Когда у меня получается, я нахожу информацию сам. В конце концов, я просто попросил привести пример, черт возьми. Извините, если флейм.
Anton
Спасибо большое.

itomonster

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

Извини, но стоит ли для этого делать кнопку. Не проще ли использовать закладки.

AndreyD
Мне проще с кнопками, поскольку разрешение экрана 800х600 -- дорог каждый мм экрана, а кнопки меньше :) Плюс еще я использую расширение del.icio.us, а оно для меня неудобно в том случае, если по одной и той же закладке надо заходить каждый день несколько раз.

Собственно, для меня Custom Buttons тем и ценно, что все сайты нужные я могу на кнопки повесить :)

Простите, если ужЕ обсуждалось: я не нашёл :-(
Как вставить готовую кнопку (custombutton://...) в Thunderbird?

Как вставить готовую кнопку (custombutton://...) в Thunderbird?

Вообще-то я custombuttons в Thunderbird не пользуюсь, возможно, изобретаю велосипед. Сделай новую кнопку с кодом

Код:

var bc = prompt ("код кнопки: ");
if (bc) custombuttons.installWebButton(bc);

Потом с помощью этой кнопки инсталлируй готовые.

2Anton: Спасибо, работает! :-) (только я не кнопку добавил, а пункт меню).

Значится так. Долго не мог понять, почему custombuttons и кнопки BBcode с домашней страницы расширения у меня напрочь не работали. Причем совсем.
Стал проверять расширения, заподозрив конфликт. Поотключал все блокираторы рекламы, скриптов, флешек и проч. Не помогло. После долгой возни снес (удалил) NoScript. Кнопки заработали! Просто отключение NoScript не помогало, попытки прописать в нем разрешение для custombutton:// результата не давало. (Возможно, неправильно прописывал. Но тогда почему общее разрешение на все скрипты и вообще отключение расширения не сработали?)

369
Наверное надо было ещё и file: разрешить :)

369
У меня не воспроизводится.
Какая версия custombuttons, noscript?
На чистом профиле та же проблема?
"Не работали кнопки" - это значит при нажатии на ссылку "custombuttons://..." кнопка не устанавливалась? Или после установки кнопка не вставляла в текстовое поле "[ b][ /b]"?
Не работали только кнопки bb-кода, или вообще все?
Modex
А при чем тут "file:"?

Yan
Ну мало ли какие файлы могли "подключаться" с жесткого? :) хотя толком я вряд ли объясню

...ничего не понимаю... Снес NoScript в другой сборке - кнопки по прежнему не работают...
Версии custombuttons - та, что на домашней странице сейчас, noscript - обновлено.
Видно, в чем-то другом проблема...
Кнопки BBcode, взятые с домашней страницы, установились нормально, вытащил их на панель и они там стоят как красивые картинки: при нажатии на них ничего не происходит.
User Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.8.1) Gecko/20061010 Firefox/2.0   ID сборки: 2006101023 - не работает и без NoScript, и с ним не работало.
А в других сборках - все работает на ура!
User Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1) Gecko/20061106 lolifox/0.3.0  ID сборки: 2006110620 - с NoScript не работало, после удаления NoScript - работает вот как видите...
User Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2   ID сборки: 2007021917 без NoScript - работает...

при нажатии на них ничего не происходит.

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

Код:

var theBox = document.commandDispatcher.focusedElement;

Добавлено Срд 28 Фев 2007 22:30:12 :
хм..
1. После редактирования кода кнопки работают, после настройки панелей перестают. Это бб-коды. Это с одной стороны.
2. С другой стороны, они могут начать работать без редактирования - не поймал до сих пор как.
3. Старые кнопки, например, 'convert custombuttons://...' работают независимо. После их использования запускаются бб-коды.
4. Бб-коды установлены давно, вытащил на панель сегодня парочку.
5. no script имеется, последние несколько дней.

не пойму только, что тут к чему.



после перезапуска бб-коды "завелись".

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

чтобы небыло поля с названием самой кнопки

1. Правой кнопкой по панели инструментов, "Настроить...", в списке "Показывать" выбрать "Только значки"
или
2. Правой кнопкой по добавленной кнопке, "Редактировать...", в появившемся диалоге очистить поле "Имя"

Спасибо, но это не совсем то. Хотелось бы запихнуть кнопку на панель с главным меню. При этом чтобы панель главного меню не расширялась, а текст у кнопок с тулбара оставался виден. Если сделать так как ты предлагаешь:
1 - пропадают наименования у всех кнопок на тулбаре
2 - Само пустое "поле" с именем кнопки не исчезает, а панель с главным меню расширяется

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

чтобы панель главного меню не расширялась

можно прописать в секцию "Инициализация" одной из этих кнопок строку

Код:

this. parentNode. setAttribute ("mode", "icons");

я так понимаю нужно всего-лишь поменять ориентацию охватывающего бокса - это можно сделать через userCrome.css

To Anton:
При добавлении в код инициализации "this. parentNode. setAttribute ("mode", "icons");" слетают подписи кнопок на тулбаре :(

to Dark-Demon:
а можно подробнее, пожалуйста...

Добавлено Втр 06 Мар 2007 21:43:37 :
Спасибо Anton! Заработало: кнопку надо было сначало перетащить на панель меню :)

И всё таки хотелось бы подробностей от Dark-Demon :)

не, мне лень ковыряться %-)

to Dark-Demon:
Бывает :)

А кто нибудь может сделать кнопки:
- для выбора кодировки страницы;
- загрузки(именно загрузки, а не отображения) картинок, аудио, видео и скриптов для конкретной страницы;
как это сделано в Maxthon-е?

На вопрос зачем всё это, отвечу так: перехожу с макстона на лису и хочется сохранить макстоновскую функциональность.

для выбора кодировки страницы

где-то была в этой теме

загрузки(именно загрузки, а не отображения) картинок, аудио, видео и скриптов для конкретной страницы

и как оно там это в Maxthone'е реализовано ?

К сожелению не знаю как выложить свой скриншот этой кнопки. Поэтому попытаюсь объяснить на словах:
- кнопка с ниспадающим меню, типа кнопок Reload и Stop, выложеных в этой теме;
- в самом меню следующие пункты:
    - загружать изображения;
    - загружать видео;
    - загружать аудио;
    - разрешить скрипты;
    - разрешить аплеты Java;
    (есть ещё "разрешить ActivX", но думаю, что для лисы это не актуально :) )
- напротив каждого элемента в меню ставиться/снимается галочка(checkbox).
В самом Maxthone задаётся действие кнопки по умолчанию, т.е. что отключать/подключать при нажатии на кнопку(не выбор из меню), у меня стоит отключение/подключение загрузки изображений. При включении/отключении кнопка меняет своё состояние(нажата/отжата).

Кнопка для выбора кодировки (выкладываю снова, т. к., в старой у меня почему-то перестали работать кириллические имена функций и переменных):

Код:

custombutton://%u0412%u044B%u0431%u043E%u0440%20%u043A%u043E%u0434%u0438%u0440%u043E%u0432%u043A%u0438%5D%5B%5D%5B%5D%5Bvar%20menu%20%3D%0A%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%20%20%20oncommand%3D%22this.parentNode.changeEncoding%28event%29%22%3E%0A%09%3Cmenuitem%20charset%3D%22KOI8-R%22%20label%3D%22%u041A%u0438%u0440%u0438%u043B%u043B%u0438%u0446%u0430%20%28KOI8-R%29%22/%3E%0A%09%3Cmenuitem%20charset%3D%22IBM866%22%20label%3D%22%u041A%u0438%u0440%u0438%u043B%u043B%u0438%u0446%u0430/%u0420%u043E%u0441%u0441%u0438%u044F%20%28CP-866%29%22/%3E%0A%09%3Cmenuitem%20charset%3D%22windows-1251%22%20label%3D%22%u041A%u0438%u0440%u0438%u043B%u043B%u0438%u0446%u0430%20%28Windows-1251%29%22/%3E%0A%09%3Cmenuitem%20charset%3D%22UTF-8%22%20label%3D%22Unicode%20%28UTF-8%29%22/%3E%0A%3C/menupopup%3E%3B%0Amenu%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28menu.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Athis.%20orient%20%3D%20%22horizontal%22%3B%0Athis.%20type%20%3D%20%22menu-button%22%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20changeEncoding%20%3D%20function%20%28event%29%0A%7B%0A%09var%20encoding%20%3D%20event.%20target.%20getAttribute%20%28%22charset%22%29%3B%0A%09SetForcedCharset%20%28encoding%29%3B%0A%09SetDefaultCharacterSet%20%28encoding%29%3B%0A%7D

Что касается второй кнопки, я думаю для custombuttons-кнопки это будет сложно, особенно, если выяснится, что при выборе, например, "загружать изображения" нужно будет загрузить изображения для текущей/всех страниц. Поэтому, лучше поискать расширения - ILO, NoScript, например.

В общем, это конечно в принципе реализуемо, но потребует немалых затрат времени. Лучше поискать готовые решения.

Спасибо за кнопку со сменой кодировки, в сообщениях выше я её так ине нашёл :)

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

Есть такое расширение ImageShack Toolbar.
Можно ли сделать кнопки для всего что там есть? Или хотя бы для элементов основного меню?
А то очень уж убого выглядит он. И неудобно :(


UPD:

Поиграл с DOM инспектором... Понял, что расширение это великая вещь... Еще бы понять, как делать radio buttons (я правильно называю, дырочки
http://img64.imageshack.us/img64/9823/untitled3xl2.gif
эти?) отмеченными...

ЗЫ
Вот кнопка Upload для тулбара...

Код:

custombutton://Upload%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAACXBIWXMAAAsSAAALEgHS3X78AAABa0lEQVR4nJWSLWjDQBiGP3kyVMUGagKDEjExO1OojKiIjRmcW8QIsaFqYqKmI6aiUBMZqImNKpGBmZiJyKr1y2reiWuTaynddvBwfzz3fncc8b7Fif0lzNgzQ0g6jtsz6DdZSMJ4M4SQBG6//yh/9eLL5yOm29GxAl3mFtcQkuAszU6cbkdwlqaq4BhGzC0ci5AGivdngpAEMzLglw6m2xHGmyHuMxPW2sBgJroD6CSq9goh6Qx7bnTi5R7p4iXlxxMGM9ElunMbK73sNCCA46tkhYfBTMBIBERImGeTK/Iu6u6sE0iCiAliTjCkeg99X8mN7O/NeUeUeUoOCXZsApyjKWOAq17m2lfybgU0AdAEiNIHiFAl25EBPq6X6zswp1py5fVyLeEntnrRkOAnNprKA2oJ1FLJO10uXaQB4dAsgMq7iZJXWtnFRCXXb0Dhggv3rIc2LxMLh2ahyXkvcz65yZmsf83/4FiEH0rWltfnBPlKAAAAAElFTkSuQmCC%5D%5BImageShack_upload%28event%29%3B%20event.preventBubble%28%29%3B%5D%5B/*Initialization%20Code*/

Можно ли отменить действие прописанное в секции "CODE", при выполнении действия по нажатию на пункт в ниспадающем меню кнопки?
И как? У меня кнопка по умолчанию(при нажатии) выполняет определённое действие, а ниспадающее меню используется, соответственно, для других функций.

to Yan:
В кнопке "External Applications" не появляется ни стрелочка ни сам список добавленных программ (не разворачивается меню), это можно как-нибудь исправить? Или это я накосячил? Хотя кроме путей ничего не менял, да и в варианте взятом, непосредственно, с форума - тоже самое:(

alexmac, опиши по шагам чего ты хочешь...

У меня есть кнопка с ниспадающим меню, по нажатию на саму кнопку должно происходить 1-ое действие, при нажатии на 1-ый пункт в ниспад. меню 2-ое действие, при нажатии на 2-ой пункт в ниспад. меню 3-е действие и т.д. Но возникает проблемма: при нажатии на любой пункт в нисп. меню (1-ый или 2-ой) происходит нужное действие (2-ое или 3-е) + 1-ое.

а, понял, тебе нужно вставить event.stopPropagation(), чтобы событие не всплывало дальше.

а куда именно?

Код:

/*Initialization Code*/
this.SaveSelToMaf=function(){
  MafGUI.addSelectedTabsToArchive(Maf);
}

this.SaveAllToMaf=function(){
  MafGUI.addAllTabsToArchive(Maf);
}

 var nMItem=function(label,img,obj){
   var m=document.createElement('menuitem');
   m.setAttribute('label',label);
   m.f=obj.SaveSelToMaf.bind(obj);
   m.setAttribute('oncommand','this.f()');
   m.setAttribute('image',img);
   m.setAttribute('class','menuitem-iconic');
   return m;
 }

 var nMItem2=function(label,img,obj){
   var m=document.createElement('menuitem');
   m.setAttribute('label',label);
   m.f=obj.SaveAllToMaf.bind(obj);
   m.setAttribute('oncommand','this.f()');
   m.setAttribute('image',img);
   m.setAttribute('class','menuitem-iconic');
   return m;
 }


 var mP=document.createElement('menupopup');
 mP.appendChild(nMItem('Save selection to MAF',this.image,this));
 mP.appendChild(nMItem2('Save all to MAF',this.image,this));

 this.appendChild(mP);
 this.type="menu-button";

Замечания по реализации приветствуются :)

Был бы очень благодарен,если бы кто-нибудь написал кнопочку для удаления с диска просматриваемой страницы по протоколу file://. Заранее спасибо.

а куда именно?

у меня не выполняется первое действие при выполнении второго. я, правда, заменил MafGUI.xxx alert'ами, может, это особенность maf ?

stoneflash

Код:

custombutton://%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u0444%u0430%u0439%u043B%5D%5B%5D%5Btry%0A%7B%0A%09var%20file%20%3D%20Components.%20classes%20%5B%22@mozilla.org/file/local%3B1%22%5D.%20createInstance%20%28Components.%20interfaces.%20nsILocalFile%29%3B%0A%09var%20fn%20%3D%20getBrowser%20%28%29.%20contentDocument.%20location.%20href.%20replace%20%28/file%3A%28%5C/%29%7B2%2C3%7D/%2C%20%22%22%29%3B%0A%09fn%20%3D%20fn.%20replace%20%28/%2520/g%2C%20%22%20%22%29%3B%0A%09fn%20%3D%20fn.%20replace%20%28/%5C//g%2C%20%22%5C%5C%22%29%3B%20//%20for%20windows%0A%09file.%20initWithPath%20%28fn%29%3B%0A%09file.%20remove%20%28false%29%3B%0A%09file.%20initWithPath%20%28fn.%20replace%20%28/%5C.%28htm%7Chtml%29%24/%2C%20%22%22%29%20+%20%22_files%22%29%3B%0A%09file.%20remove%20%28true%29%3B%0A%7D%20catch%20%28e%29%20%7Balert%28e%29%3B%7D%5D%5B

может, это особенность maf?
Хотел бы я знать...
Я не силён в данной области программирования, поэтому сорри за глупый вопрос а что такое alert'ы?

Anton
Спасибо, правда возникли маленькие проблемки.
При удалении файл выдаёт предупреждение:

[Exception... "Component returned failure code: 0x80520012 (NS_ERROR_FILE_NOT_FOUND) [nsILocalFile. remove]" nsresult: "0x80520012 (NS_ERROR_FILE_NOT_FOUND)" location: "JS frame :: chrome://browser/content/browser.xul:: oncommand :: line 10" data: no]

Но файл удаляется.

Если файл с русскими буквами в названии, то выдаёт примерно такое же сообщение, но файл не удаляется. Хотя стоило, в принципе, ожидать. Никак не фофиксить? например взять кусок кода из Human URL ?

alexmac, вроде должно работать так...

Код:

var mP=document.createElement('menupopup');
mP.onclick="event.stopPropagation()"

Не помогло :(

а так?

Код:

mP.setAttribute('onclick',"event.stopPropagation()");

также попробуй вместо onclick поставить oncommand

Спасибо, Dark-Demon!!! Поставил в этот код oncommand и всё заработало :)

stoneflash

При удалении файл выдаёт предупреждение...Но файл удаляется.

Вероятно, файл не имеет сопутствующей директории с картинками, css и т. п. Определённо, я забыл убрать отладочный alert из кода кнопки.

В общем, надо открыть код кнопки и удалить символы

Код:

alert(e);

Подскажите, пожалуйста, код кнопки, аналогичной кнопки "Перейти(перейти по введённому адресу)". Хочу "прикрутить" к ней ниспадающее меню, с дополнительными функциями.
Также интересует, как по нажатию кнопки получить текущий URL.

а какие функции ты хочешь прикрутить? :)~

Хочется иметь такую же кнопку как в maxthone с функциями перевода на различные языки используя веб-сервисы типа промт и т.д. Ну и ещё чего-нибудь, про запас :) что-то , где необходимо передавать ссылку на загруженную страницу. Знаю, что для перевода существует несколько "приятных" расширений, но хочется именно так :)
Да! И ещё вопрос: а в чём отличия между Custom Buttons и Custom Items? Понятно, что второе-это развитие первого... а можно подробней, но без углубления в "формулы" :)

alexmac, второе использует XBL и все его прелести (конструктор, деструктор, евенты, наследование итп), а первое - только яваскрипт: есть только конструктор и обработчик клика, который во многих случаях без надобности. часть кнопок custombuttons совместимо с customitems, но не все. если установлены оба расширения, то конфликтов быть не должно.

Dark-Demon, спасибо за ответ. Может по поводу кнопки что-нибудь подскажите?
В файлах browser.js и minit.js(от TMP) нашёл функции handleURLBarCommand и TMP_goButtonClick соответственно. В goButtonClick есть вызов handleURLBarCommand, но как это прикрутить к нужной мне кнопке я не знаю :(

alexmac
https://addons.mozilla.org/en-US/firefox/addon/3361

To Nem
Спасибо, но про это расширение мне известно. Хочется сделать именно так как я сказал выше, в посте 408.

alexmac
Кнопка там есть - в statusbar-е. Перевод через разные сервисы.
А Maxthon стоит далеко не у всех, поэтому не совсем понятно, что именно нужно.
А так еще посмотрите http://www.concisefreeware.com/foxlingo.php
Удачи.

Спасибо за участие :) FoxLingo у меня уже есть. Функциональность в виде сервисов перевода была взята для примера :)
Нужен аналог кнопки "Перейти", реализованной через Custom Buttons и кнопка, которая бы получала текущий URL.

alexmac
Пардон, я забыл что нахожусь в теме "Custom Buttons" :-)

Вот простой пример такой кнопки, переводящей через Google с de на en
custombutton://GoogleTrans%20de%7Cen%5D … B%0A%5D%5B

Чуть позже доделаю и выложу вариант, где будет с выпадающим списком.

Спасибо.
Правильно ли я понял, что :content.document.location.href -получение текущего URL, а loadURI(...) - функция перехода по какому-либо URL? И будет ли loadURI(...)+Custom Buttons  работать как кнопка "Перейти"?

Вот с меню.
custombutton://Open%20URL%20with%20serv … P%29%3B%0A

Да, "content.document.location.href" - текущий URL, а "loadURI()" - переход по адресу.

И будет ли loadURI(...)+Custom Buttons  работать как кнопка "Перейти"?

Не понял вопроса. А как работает функция "Перейти"?

:) Вопрос вот в чём :
  content.document.location.href = текущий URL- это только набранный или уже с загруженой страницы? или и тот и другой?

Добавлено Птн 30 Мар 2007 15:55:16 :
Проверил, -это URL уже загруженой страницы :( а как получить "и тот и другой" ?

alexmac
Понял. Именно тот текст, который находится в строке URL:

Код:

document.getElementById("urlbar").value

To Nеm:Спасибо, помогло! А, вообще, это что за язык, javs script?

alexmac
Да, JavaScript.
Удачи.

Кто-нибудь может подсказать, как при помощи Custom Buttons сделать так, что бы при наведении курсора мыши кнопка меняла свой цвет (менялась картинка)?

вот так:

Код:

this. mouseover = function (event)
{
    this. oldimage = this. image;
    this. image = "file:///H:/greenicon.png";
}
this. mouseout = function (event)
{
    this. image = this. oldimage;
}
this. setAttribute ("onmouseover", "this.mouseover()");
this. setAttribute ("onmouseout", "this.mouseout()");

например, в разделе "Инициализация".

Народ, подскажите, как функцию из TMP "Закрыть вкладки справа" реализовать в кнопку??

To Anton:
             Спасибо!
To Jarov:

Код:

custombutton://%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0441%u043F%u0440%u0430%u0432%u0430%5D%5B%5D%5B/*CODE*/%0AgBrowser.closeRightTabs%28gBrowser.mCurrentTab%29%3B%5D%5B/*Initialization%20Code*/

код взял отсюда _http://tmp.garyr.net/forum/rss.php?p=15016 (может тебе пригодится)

А у когонить открывается сайт custombuttons.phpbbnow.com?
Просто суда по кешу гугли там очень много всего полезного, но к сожалению гугль не все успел прокешировать



UPD:
Нашел на мой взляд довольно интересную кнопку. Создает html список установленных кнопок.

Код:

custombutton://Export%20Custom%20Buttons%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACq0lEQVR4Xm2PzWtcVRiHn/fce2Ymk8ykk9YkpTWkCyvYVBvpImQhhdCYbgRdSYMLd5K0qaj0L2jpF+3GpVChGNSNllYMCn5uulEKJiGEiCQm1TSTTmYmmXvnfp1j6wwdAn3ggXPg/b0fYj4CLJg6+B67UIarQQyJ4TxNRMGff4HnQxiDookIOIoWll72qHHyatwYerGNmmoV4qTxBlC0QDlgAWshqTOWGj28v230xf31bcb8EMpV2CiCNbQyPAMTk5G8e1od3xQ9tCOS06dDn4zvt7bd3cA2TRrGNQb1sa4TstdDPVciPbjvhFdiMPAA09zAthoMI7wFTErGvSTZzLTu677lDKFRHiif7GuubjvUfUt3ZKadJzXC5P8Zy7CYc8zyUvcAx/KQqWG1Qnq6obAKdhMApAe7cZD6yhqRbwjWAta/8Vi7H8+JeZ/DJtsxLW+0H5fBIoQGIsCwGxdIAbFQ+tJh7tPkt1rJjov5AKIKL4SWjzOn1OvOEQNx60YUoJv/LQhmSO7d5vtanXOOZkkhoFIsmZC3K7fNnegXoNh0E5aXFBe/znHtqxzX7xY4+4NjKxETnZqlNKCSCJIErKJc3+Gi/wdb/ANsAI9gftFSLEzR/+YFgndG+LFfux8mRJMKphS4D1Z4ShKzN6/JswWYhoWyJf/KOrVDs2wvz5GKIlag6goAuMbQAo464FBqTL8ZtvNTlOKIttSDgKCeIEpICV+48BnwuTIJPDGJcVzFq+kqhIvw9wKe/t3/ZCnQiwNHewniAFccDgy3keTo9Aw/+wKyMEYTutJwP2vpe+jxaxhzpWb59t2Yg3teTs+MnDkwsLrq8+/l9WjfQ9trNCUAmT8JAAJ91nIvjLhhDTdJ2CpbeM+B7YDnpUu+66/Y/MQK5R6XUyGsAvwHk/0n+0qkvkwAAAAASUVORK5CYII%3D%5D%5Bvar%20rv%20%3D%20new%20Object%28%29%3B%0Avar%20cbPrefs%20%3D%20gPrefService.getChildList%28%22custombuttons.button%22%2C%20rv%29%3B%0AcbPrefs.sort%28%29%3B%0A%0Avar%20btnSource%2C%20btnValue%2C%20btnLabel%2C%20btnImage%2C%20btnURL%3B%0Avar%20btnLink%20%3D%20%22%22%3B%0A%0Afor%28var%20i%20%3D%200%3B%20i%20%3C%20cbPrefs.length%3B%20i++%29%20%7B%0A%20%20btnValue%20%3D%20gPrefService.getCharPref%28cbPrefs%5Bi%5D%29%3B%0A%20%20btnSource%20%3D%20%5B%5D%3B%0A%20%20btnSource%20%3D%20btnValue.split%28/%5C%5D%5C%5B/%29%3B%0A%20%20btnLabel%20%3D%20btnSource%5B0%5D%3B%0A%20%20btnImage%20%3D%20%28btnSource%5B1%5D%20%3D%3D%20%22%22%20%7C%7C%20btnSource%5B1%5D%20%3D%3D%20%22data%3A%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%22chrome%3A//custombuttons/skin/button.png%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20btnSource%5B1%5D%3B%0A%20%20btnURL%20%3D%20%22custombutton%3A//%22%20+%20escape%28btnValue%29%3B%0A%0A%20%20btnLink%20+%3D%20%22%3Cli%20style%3D%27list-style-image%3A%20url%28%22%20+%20btnImage%20+%20%22%29%27%3E%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3Ca%20href%3D%27%22%20+%20btnURL%20+%20%22%27%3E%22%20+%20btnLabel%20+%20%22%3C/a%3E%3C/li%3E%5Cn%22%3B%0A%7D%0A%0A%0Avar%20htmlData%20%3D%20%22%3C%21DOCTYPE%20html%20PUBLIC%20%5C%22-//W3C//DTD%20XHTML%201.0%20Strict//EN%5C%22%5Cn%5C%0A%20%20%20%20%5C%22http%3A//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd%5C%22%3E%5Cn%5C%0A%3Chtml%20xmlns%3D%5C%22http%3A//www.w3.org/1999/xhtml%5C%22%3E%5Cn%5C%0A%3Chead%3E%5Cn%5C%0A%3Ctitle%3EMy%20Custom%20Buttons%3C/title%3E%5Cn%5C%0A%3Cstyle%20type%3D%5C%22text/css%5C%22%3E%5Cn%5C%0A/*%3C%21%5BCDATA%5B*/%5Cn%5C%0Aul%20%7B%20-moz-column-count%3A%203%3B%20-moz-column-gap%3A%201em%3B%20%7D%5Cn%5C%0Aa%20%7B%20text-decoration%3A%20none%3B%20%7D%5Cn%5C%0Aa%3Ahover%20%7B%20text-decoration%3A%20underline%3B%20%7D%5Cn%5C%0A/*%5D%5D%3E*/%5Cn%5C%0A%3C/style%3E%3C/head%3E%5Cn%5C%0A%3Cbody%3E%5Cn%5C%0A%3Ch1%3EClick%20the%20links%20to%20install%20the%20buttons%3C/h1%3E%5C%0A%3Cul%3E%5Cn%22%3B%0A%0Avar%20htmlSource%20%3D%20htmlData%20+%20btnLink%20+%20%22%3C/ul%3E%5Cn%3C/body%3E%5Cn%3C/html%3E%22%3B%0A%0Avar%20nsIFilePicker%20%3D%20Components.interfaces.nsIFilePicker%3B%0Avar%20fp%20%3D%20Components.classes%5B%22@mozilla.org/filepicker%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20.createInstance%28nsIFilePicker%29%3B%0Afp.init%28window%2C%20%22%22%2C%20fp.modeSave%29%3B%0Afp.defaultString%20%3D%20%22my_custombuttons.html%22%3B%0Afp.appendFilters%28fp.filterHTML%29%3B%0Afp.appendFilters%28fp.filterAll%29%3B%0Aif%28fp.show%28%29%20%3D%3D%20fp.returnCancel%29%20return%3B%0A%0Avar%20stream%20%3D%20Components.classes%5B%27@mozilla.org/network/file-output-stream%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIFileOutputStream%29%3B%0A%0Astream.init%28fp.file%2C%200x20%7C0x02%7C0x08%2C%200666%2C%200%29%3B%0Astream.write%28htmlSource%2C%20htmlSource.length%29%3B%0Astream.close%28%29%3B%0A%0A%0A%0A%5D%5B

Одна проблема у меня при попытке вставить в код строчку:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n\
Кнопка перестает работать, а без выставления кодировки криво отображает русские буквы.

И еще одна кнопка, которая должна оправлять тебя в низ страницы:


Код:

custombutton://Go%20to%20bottom%20of%20the%20page%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAABAQEKAAAACwAAAAkAAAAGAAAAAAAAAPoAAAD3AAAA9f////YAAAAAAAAAAAAAAAAB////AAAAAAArKysGC/X1EvQOMCsEDRVfAwAGQgEBARsAAAAA////5f79/cv79uiUDPLQ1fULC+7V1dX6AAAAAAH///8AVlZWBg3s7BnS/Shf/f0CgSlCRwA9QDIAKSQbAPr8AADS1eIAxb/QAODKugADA/5/LgPYofMUFOeqqqr6BAAAAABCCgoapQU3YwMG/3x1h3QAIBcUAPDpAADv4/8A/Pn7ABsLGABbW0oA4z8yAKaVk4HaATcFWwrnnQAAAOADK/LyErr7Nzzm5+CTdI56AB8TFADx6QAA9/QAAPz5/QD6+P4A+/f7APfw+wAMDgoAHScsAM/Fvz72FjrG/sCi6AQWKioX6LDgWypIRwAKCggAhoCoAPr39AD/Af8A//z/AP///gD///8A////AAYHCABHVkkAHC0+AOjj1lsWOCrUBBUbGxrz9tc6WEIyAOzm9gBNQSEAZV03AAAAAAAAAAAAAAAAAAAAAAAAAAAAm6PJAOXm8wAtLioAu9nJOhUbGxoCCxMTGPz6+RUvKBsAGRoWAMfa8QDU2egAAAAAAAAAAAAAAAAAAAAAANTZ6AC6x+kAExEQABwbGQD8+vkVCxMTGAIIEBALAAAAAP4AAAD/AQAARUs9AH+RwQDy8vcAAAAAAAAAAADy8vcAfoi7ADk1MQD///8A/Pz/AAAAAAAIEBALAgQICPkICArv0NnkAAIEAAAIDAgAP0k9AHmJugAAAAAAAAAAAHmEugAuNjcABQkHAAACAADh4OQACAgK7wQICPkEBQkJ6x4iLdvBvM82KWYcAPb4AQAbHRcA4uIdAI6WwQAAAAAAABAXABgaEwD7+f4AAQUCANbW1QAXGiPjBQkJ6wIB/PzfcGc+z9m5uQDd5+wACQwAAP8FAQA1Oi0A4wAMAN/6CgAwNSsAAAIBAAQLAgDq7ewA6NjHAHdvSMcB/PzfA4aMjOwWDgQK9f8RFqOXoiAkNTAAFBILAPv+AQAXGRcAGRgUAAEC/wAABgMA5ujsALemnABYV1DBUUIjqgoTE8EEAAAAAPn//79yYTcVBQEBB5dxgDghREgANzsvACEgHAD6BAEA3dbeAM/GzwDkzcIAXlxWyG1gNqv2+/u/BgAAAAH///8AAAAAAAAAABb9/f1L2d3tUpOexinW0s4Z8/LuCgAAAAANDhL2Ki4y521iOtcnIxOuAwMDtQAAAOoAAAAAAf///wAAAAAAAAAAAAAAAAAAAAAz/f39NAMDAykAAAAeAAAAAAAAAOL9/f3XAwMDzAAAAM0AAAAAAAAAAAAAAAAbzVfefBtHvQAAAABJRU5ErkJggg%3D%3D%5D%5Bcontent.scrollTo%280%2Cwindow.innerHeight*2%29%3B%0A%0A%5D%5B

У меня она отправлает роно на одно нажатие Page Down и больше не работает.

UPD2:

Грубо, но заставил ее работать:

Код:

custombutton://Go%20to%20bottom%20of%20the%20page%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAABAQEKAAAACwAAAAkAAAAGAAAAAAAAAPoAAAD3AAAA9f////YAAAAAAAAAAAAAAAAB////AAAAAAArKysGC/X1EvQOMCsEDRVfAwAGQgEBARsAAAAA////5f79/cv79uiUDPLQ1fULC+7V1dX6AAAAAAH///8AVlZWBg3s7BnS/Shf/f0CgSlCRwA9QDIAKSQbAPr8AADS1eIAxb/QAODKugADA/5/LgPYofMUFOeqqqr6BAAAAABCCgoapQU3YwMG/3x1h3QAIBcUAPDpAADv4/8A/Pn7ABsLGABbW0oA4z8yAKaVk4HaATcFWwrnnQAAAOADK/LyErr7Nzzm5+CTdI56AB8TFADx6QAA9/QAAPz5/QD6+P4A+/f7APfw+wAMDgoAHScsAM/Fvz72FjrG/sCi6AQWKioX6LDgWypIRwAKCggAhoCoAPr39AD/Af8A//z/AP///gD///8A////AAYHCABHVkkAHC0+AOjj1lsWOCrUBBUbGxrz9tc6WEIyAOzm9gBNQSEAZV03AAAAAAAAAAAAAAAAAAAAAAAAAAAAm6PJAOXm8wAtLioAu9nJOhUbGxoCCxMTGPz6+RUvKBsAGRoWAMfa8QDU2egAAAAAAAAAAAAAAAAAAAAAANTZ6AC6x+kAExEQABwbGQD8+vkVCxMTGAIIEBALAAAAAP4AAAD/AQAARUs9AH+RwQDy8vcAAAAAAAAAAADy8vcAfoi7ADk1MQD///8A/Pz/AAAAAAAIEBALAgQICPkICArv0NnkAAIEAAAIDAgAP0k9AHmJugAAAAAAAAAAAHmEugAuNjcABQkHAAACAADh4OQACAgK7wQICPkEBQkJ6x4iLdvBvM82KWYcAPb4AQAbHRcA4uIdAI6WwQAAAAAAABAXABgaEwD7+f4AAQUCANbW1QAXGiPjBQkJ6wIB/PzfcGc+z9m5uQDd5+wACQwAAP8FAQA1Oi0A4wAMAN/6CgAwNSsAAAIBAAQLAgDq7ewA6NjHAHdvSMcB/PzfA4aMjOwWDgQK9f8RFqOXoiAkNTAAFBILAPv+AQAXGRcAGRgUAAEC/wAABgMA5ujsALemnABYV1DBUUIjqgoTE8EEAAAAAPn//79yYTcVBQEBB5dxgDghREgANzsvACEgHAD6BAEA3dbeAM/GzwDkzcIAXlxWyG1gNqv2+/u/BgAAAAH///8AAAAAAAAAABb9/f1L2d3tUpOexinW0s4Z8/LuCgAAAAANDhL2Ki4y521iOtcnIxOuAwMDtQAAAOoAAAAAAf///wAAAAAAAAAAAAAAAAAAAAAz/f39NAMDAykAAAAeAAAAAAAAAOL9/f3XAwMDzAAAAM0AAAAAAAAAAAAAAAAbzVfefBtHvQAAAABJRU5ErkJggg%3D%3D%5D%5Bcontent.scrollTo%280%2Cwindow.innerHeight*1000000%29%3B%0A%0A%5D%5B

Одна проблема у меня при попытке вставить в код строчку:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n\
Кнопка перестает работать, а без выставления кодировки криво отображает русские букв

Может быть, нужно заэкранировать (\") кавычки ?

Подскажите, что я не так делаю.
Я установил расширение, добавил кнопку с названием "Добавить закладку" в Code написал: addBookmarkAs(document.getElementById(’content’), false); Вынес кнопку на панель. Жму ничего не происходит.
Мне, собственно, это расширение понравилось возможностью создать интересующие меня три кнопки: Добавить закладку, Сохранить страницу как... и Вызвать Оутлук. И на первой же команде - неудача. Подскажите плз. что не так. Код взял на указанной выше странице _http://forum.mozilla-russia.org/doku.php?id=general:tips:hotkeys

FireFox 2.0.0.3 + Windows XP SP2 (и все последующие)

Заренее спасибо.

добавил кнопку с названием "Добавить закладку" в Code написал: addBookmarkAs(document.getElementById(’content’), false); Вынес кнопку на панель. Жму ничего не происходит.

коды в wiki не рассчитаны на copy-paste : )

Замени вот эти:

Код:

addBookmarkAs(document.getElementById(’content’), false);
                                      ^       ^

символы символами одинарной (') или двойной (") кавычек.

p.s. wiki-страничку поправил, copy-paste сейчас должен работать корректно.

Спасибо Anton. Сработало.

Еще один коротенький вопросик. Где взять коды? MenuManipulator, на который тут ссылались не становится на FF 2.0 - говорит не та версия.

Меня сейчас интересует код вызова меню кодировки страницы (KOI8-R, Windows-1251 и т. д.). (Save as... вроде нашел).

vadi61
MenuManipulator ставится, если исправить версию или отключить проверку на совместимость (как - искать на форуме, обсуждалось множество раз).

Где взять коды?

Dom Inspector, сырцы firefox, расширений

код вызова меню кодировки страницы (KOI8-R, Windows-1251 и т. д.)

Кнопка выбора кодировок есть где-то в этой теме.

OK, поищем

А кто-нибудь может создать несколько кнопок следующего характера (все действия выполняются применительно к текущей вкладке по нажатию на соответствующую кнопку):
- загрузка/перезагрузка вкладки со включ/отключ java;
- загрузка/перезагрузка вкладки со включ/отключ java script;
- загрузка/перезагрузка вкладки со включ/отключ flash;
Видел кнопки для java и java script, но они не перезагружают вкладку :(

Не подскажите сайтики, где можно достать различные кнопки? (кроме официального сайта и сайта дарк-демона)

Mr. JeCk
В этой теме должны быть ссылки.

хе-хе... набрёл сейчас на https://addons.mozilla.org/ru/firefox/addon/5066 которое ничем от custombuttons не отличается кроме нескольких незначительных настроек. Ян, естественно, в соавторах не указан...

а я ужо было испугался, что зря делал customitems, ведь уже есть custombuttons в квадрате... :)

Ян, естественно, в соавторах не указан...

На странице не указан, в install.rdf:

Код:

em:developer="Custom Buttons Forum Development Group members are:
        Yan: Original Creator,
...
        em:contributor="Dark-Demon,

гм... а мне за что такая честь? :) я для custombuttons только кнопки делал...

ps: проверил несколько ссылок - битые. в том числе и тот форум с кнопками..

Добавлено Птн 13 Июл 2007 19:48:03 :
похоже живых источников на данный момент только четыре:
эта ветка
http://forums.mozillazine.org/viewtopic.php?t=428688
http://minidata.googlepages.com/BackupCustomButtonsForMiniData.html
http://dark-demon.nm.ru/soft/custombuttons/

а мне за что такая честь?

не скромничай, решение с оверлеями ты нашёл

"идеи не подлежат потенции" :) всё-равно реализовывал мою идею и обеспечивал обратную совместимость Ян..

Очень нужна кнопочка для бекапа Custom Buttons, нашел вот такую:

Код:

custombutton://Backup%20Custom%20Buttons%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAAkVJREFUeJx90UtPE2EUxvF/59KWaaENhYIGSIgRTWPKxrgRooms0L0LvwNfg09h3LBz50Kj0YQYF2q6wcQbRcFekF5oOyntzLzvO/O6Mikk5ezO4vnlOTkxRmZ1dfXh9vb2TjqdNnv9ftQ6rmOYFjPz86SSSbtcLte2trY2gyD49T9jXAA2CoVC1g/E5OnBj0zhaj6zciWf8bqdzISTcorF4srS0tL6aMYaXbLZ7MKfWp3v717xZDFFzpHQOKL+4Q0vmw8wsznS6fTCWCCZTE43mk2sZIJk5SdUv0G/ywQ22jQZekMcx8mPBQzDSIeBT5Rf5AVzFGcz6JjJ177A6w8wlCKRSEyNBQBLKcVEPM5RZ8h+p4ppmphGgripMU0T27ZTY4EoilBKUa9XWZ6zWVtbR0Xw8VOJWivAtuNore1LgaEvmTJbPL6XI576Al6V+Wt7PHPvMpAWWutzlc+9UUpJFIZE1jTdZhvOyiB6uKwQxhykEIRheP7mCw1CtEIwyfO9HDeXc2gdY7/So+u2iKFRSumxgBAiCMMQopBq7YRq6y+WYUFgECExDAMhhH8ZMFBS0e6ecGt9gY37m0jl83b3NYclgZQSIcRgLOC6rqtERHwmIH2nwufhU9riN80bRzgHj2jXBgyHw95YIAiCTqgVlpfj7EAzd91hIZ4l1blNeSDxvAG+7zcua1Cz4xZC2Jy8dzAOZ9EajitNXPeUSEd4nlcZC5RKpR0p5WIsFssopcIw1GgdEUUaw8Dyfb/ZaDR2RzP/ACJMLvfI0dt2AAAAAElFTkSuQmCC%5D%5B%0A//%20Sun%20Jan%2028%202007%204%3A09%3A01%20PM%20GMT-0800%20%28Pacific%20Standard%20Time%29%20cblover%20http%3A//minidata.googlepages.com/%0A%0A//%20This%20button%20was%20given%20birth%20by%20deepakjoshi04%2C%20Custom%20Buttons%20Forum%20since%2014%20Aug%202006%0A//%20http%3A//custombuttons.phpbbnow.com/viewtopic.php%3Ft%3D199%26postdays%3D0%26postorder%3Dasc%26start%3D0%0A%0A//%20The%20purpose%20of%20this%20button%20is%20to%20create%20a%20backup%20HTML%20file%20of%20the%20Customs%20Buttons.%0A%0A//%20Creates%20an%20HTML%20file%20with%20no%20errors%20or%20warnings%20from%20Firefox%20Extension%20Html%20Validator%200.7.9.5%0A//%20as%20long%20as%20one%20uses%20no%20special%20characters%2C%20such%20as%20%26%20or%20%27%2C%20in%20the%20button%20name%2C%20uses%20an%20image%2C%0A//%20and%20does%20not%20use%20an%20imagelike%20the%20image%20for%20Yan%27s%20Clock%20button%3B%20even%20in%20these%20cases%20one%20only%0A//%20gets%20warnings%2C%20not%20errors.%0A%0A//%20See%20https%3A//addons.mozilla.org/firefox/249/%20or%20http%3A//users.skynet.be/mgueury/mozilla/%0A//%20and%20read%20the%20entire%20thread%20at%20http%3A//custombuttons.phpbbnow.com/viewtopic.php%3Ft%3D199%0A%0A//%20The%20file%20created%20will%20have%20a%20unique%20name.%0A%0A//%20This%20button%20and%20the%20Open%20File...%20button%20--%20BrowserOpenFileWindow%28%29%3B%20--%20will%20enable%20one%20to%20load%20the%0A//%20HTML%20file%20into%20Firefox%20for%20a%20printed%20output.%0A%0A%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%20Get%20the%20Date%20%26%20Time%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%0A%0A%0A/*%20Constants%20%20%20%20*/%20var%20c%3D%22%3A%22%3Bb%3D%22%20%22%3B%0A/*%20Date%20%20%20%20%20%20%20%20%20*/%20var%20t%3Dnew%20Date%28%29%3B%0A/*%20Year%20%20%20%20%20%20%20%20%20*/%20var%20y%3D1900+t.getYear%28%29%3B%0A/*%20Minutes%20%20%20%20%20%20*/%20var%20min%3Dt.getMinutes%28%29%3B%20if%20%28min%3C10%29%7Bmin%3D%220%22+min%7D%3B%0A/*%20Seconds%20%20%20%20%20%20*/%20var%20s%3Dt.getSeconds%28%29%3B%20if%20%28s%3C10%29%7Bs%3D%220%22+s%7D%3B%0A/*%20Time%2012%20Hour%20*/%20var%20h%3Dt.getHours%28%29%3B%20var%20ap%3D%22AM%22%3B%20if%20%28h%3E%3D12%29%20ap%3D%22PM%22%3B%20if%20%28h%3E12%29%20h%3Dh-12%3B%20if%20%28h%3D%3D0%29%20h%3D12%3B%20h%3Dh+c+min+c+s+b+ap%3B%0A/*%20Day%20of%20Week%20%20*/%20var%20dw%3Dt.getDay%28%29%3Bswitch%28dw%29%7Bcase%200%3A%20dw%3D%22Sun%22%3Bbreak%3Bcase%201%3A%20dw%3D%22Mon%22%3Bbreak%3Bcase%202%3A%20dw%3D%22Tue%22%3Bbreak%3Bcase%203%3A%20dw%3D%22Wed%22%3Bbreak%3Bcase%204%3A%20dw%3D%22Thu%22%3Bbreak%3Bcase%205%3A%20dw%3D%22Fri%22%3Bbreak%3Bdefault%3A%20dw%3D%22Sat%22%3B%7D%0A/*%20Month%20%20%20%20%20%20%20%20*/%20var%20m%3Dt.getMonth%28%29%3Bswitch%28m%29%7Bcase%200%3A%20m%3D%22Jan%22%3Bbreak%3Bcase%201%3A%20m%3D%22Feb%22%3Bbreak%3Bcase%202%3A%20m%3D%22Mar%22%3Bbreak%3Bcase%203%3A%20m%3D%22Apr%22%3Bbreak%3Bcase%204%3A%20m%3D%22May%22%3Bbreak%3Bcase%205%3A%20m%3D%22Jun%22%3Bbreak%3Bcase%206%3A%20m%3D%22Jul%22%3Bbreak%3Bcase%207%3A%20m%3D%22Aug%22%3Bbreak%3Bcase%208%3A%20m%3D%22Sep%22%3Bbreak%3Bcase%209%3A%20m%3D%22Oct%22%3Bbreak%3Bcase%2010%3A%20m%3D%22Nov%22%3Bbreak%3Bdefault%3A%20m%3D%22Dec%22%3B%7D%0A/*%20Day%20of%20Month%20*/%20var%20d%3Dt.getDate%28%29%3B%0A/*%20Time%20Zone%20%20%20%20*/%20var%20tz%3DString%28t%29.substring%2825%29%3B%0A/*%20Output%20%20%20%20%20%20%20*/%20var%20p%3Ddw+b+m+b+d+b+y+b+h+b+tz%3B%0A%0A%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%20End%20of%20Get%20the%20Date%20%26%20Time%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%0A%0A%0Avar%20dataURL%3D%22%5Cn%3C%21DOCTYPE%20html%20PUBLIC%20%27-//W3C//DTD%20XHTML%201.0%20Transitional//EN%27%22%3B%0A%0AdataURL%3DdataURL+%22%27http%3A//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%27%3E%5Cn%3Chtml%20xmlns%3D%27http%3A//www.w3.org/1999/xhtml%27%3E%22%3B%0A%0AdataURL%3DdataURL+%22%5Cn%3Chead%3E%3Clink%20rel%3D%27shortcut%20icon%27%20href%3D%27favicon.ico%27%20/%3E%22%3B%0A//D6D6D6%20gray%20background%0AdataURL%3DdataURL+%22%3Ctitle%3EMy%20Custom%20Buttons%3C/title%3E%3C/head%3E%5Cn%3Cbody%20style%3D%27background-color%3A%20%23E1E5C4%27%3E%5Cn%3Ccenter%3E%3Ch2%3EMy%20Custom%20Buttons%3C/h2%3E%3Cstrong%3E%22+p+%22%3C/strong%3E%3C/center%3E%5Cn%3Col%3E%5Cn%22%3B%0A%0Avar%20NumOfButtons%3B%0Avar%20buttons%3DgetButtons%28%29%3B%0A%0AdataURL+%3Dbuttons.sort%28%29+%22%5Cn%5Cn%3C/ol%3E%5Cn%3Ccenter%3E%3Ch1%3E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%3C/h1%3E%3C/center%3E%3C/body%3E%5Cn%3C/html%3E%5Cn%22%3B%0AdataURL%3DdataURL.replace%28/%3E%2C%3C/g%2C%27%3E%3C%27%29%3B%0A%0AwriteFile%28dataURL%29%3B%0A%0A%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%0A%0Afunction%20getButtons%28%29%0A%20%20%7B%0A%20%20var%20buttons%3Dnew%20Array%3B%0A%20%20var%20i%3D0%3B%0A%20%20for%20%28var%20j%3D0%3Bj%3Ccustombuttons.gToolbox.palette.childNodes.length%3Bj++%29%0A%20%20%20%20%7B%0A%20%20%20%20var%20but%3Dcustombuttons.gToolbox.palette.childNodes%5Bj%5D%3B%0A%20%20%20%20if%20%28but.getAttribute%28%27id%27%29.indexOf%28%27custombuttons-button%27%29%21%3D-1%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20var%20num%3Dcustombuttons.getNumber%28but.getAttribute%28%27id%27%29%29%3B%0A%20%20%20%20%20%20var%20but_code%3DgetHyperlink%28num%29%3B%0A%20%20%20%20%20%20if%28but_code.length%3E2%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20buttons%5Bi++%5D%3D%22%3Cli%3E%22+but_code+%22%3C/li%3E%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20NumOfButtons%3Di%3B%0A%20%20%20%20return%20buttons%3B%0A%20%20%7D%0A%0A%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%0A%0Afunction%20getHyperlink%28num%29%0A%20%20%7B%0A%20%20var%20values%20%3D%20custombuttons.getButtonParameters2%28num%29%3B%0A%20%20var%20altext%20%3D%20values.name%3B%0A%20%20var%20uri%3D%27custombutton%3A//%27+escape%28values.name+%27%5D%27+%27%5B%27+values.image+%27%5D%27+%27%5B%27+values.code+%27%5D%27+%27%5B%27+values.initCode%29%3B%0A%20%20var%20link%20%3D%20%22%5Cn%5Cn%3Ca%20href%3D%27%22%20+%20uri%20+%20%22%27%3E%5Cn%3Cimg%20alt%3D%27%22%20+%20altext%20+%20%22%27%20src%3D%5C%22%22%20+%20unescape%28values.image%29%20+%0A%20%20%20%20%22%5C%22%20border%3D%270%27%20height%3D%2716%27%20/%3E%5Cn%22%20+%20unescape%28values.name%29%20+%20%22%3C/a%3E%22%3B%0A%20%20return%20link%3B%0A%20%20%7D%0A%0A%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%0A%0Afunction%20writeFile%28str%29%0A%20%20%7B%0A%20%20var%20nsIFilePicker%20%3D%20Components.interfaces.nsIFilePicker%3B%0A%20%20var%20fp%20%3D%20Components.classes%5B%22@mozilla.org/filepicker%3B1%22%5D.createInstance%28nsIFilePicker%29%3B%0A%20%20fp.init%28window%2C%20%22Save%20CB%20backup%20as%20%22%2C%20nsIFilePicker.modeSave%29%3B%0A%20%20/*%20The%20file%20name%20will%20be%20unique%20given%20MS%27%20time-stamp%20and%20will%20also%20have%20the%20number%20of%20buttons%20indicated%20*/%0A%20%20fp.defaultString%20%3D%20%22BackupCustomButtons%20%22+new%20Date%28%29.getTime%28%29+%22%20%28%22+NumOfButtons+%22%29.html%22%3B%0A%20%20fp.appendFilters%28fp.filterHTML%29%3B%0A%20%20fp.appendFilters%28fp.filterAll%29%3B%0A%20%20//%20other%20filters%0A%20%20var%20res%3Dfp.show%28%29%3B%0A%20%20if%20%28res%20%3D%3D%20nsIFilePicker.returnOK%20%7C%7C%20res%3D%3DnsIFilePicker.returnReplace%29%0A%20%20%20%20%7B%0A%20%20%20%20var%20outputStream%20%3D%20Components.classes%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.%0A%20%20%20%20%20%20createInstance%28Components.interfaces.nsIFileOutputStream%29%3B%0A%20%20%20%20outputStream.init%28%20fp.file%2C%200x04%20%7C%200x08%2C777%2C%200%20%29%3B%0A%20%20%20%20var%20result%20%3D%20outputStream.write%28%20str%2C%20str.length%20%29%3B%0A%20%20%20%20outputStream.close%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%5D%5B

но она коверкает кириллицу в названиях кнопок. :(

Philip
сойдёт:

Код:

custombutton://Backup%20Custom%20Buttons%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAAkVJREFUeJx90UtPE2EUxvF/59KWaaENhYIGSIgRTWPKxrgRooms0L0LvwNfg09h3LBz50Kj0YQYF2q6wcQbRcFekF5oOyntzLzvO/O6Mikk5ezO4vnlOTkxRmZ1dfXh9vb2TjqdNnv9ftQ6rmOYFjPz86SSSbtcLte2trY2gyD49T9jXAA2CoVC1g/E5OnBj0zhaj6zciWf8bqdzISTcorF4srS0tL6aMYaXbLZ7MKfWp3v717xZDFFzpHQOKL+4Q0vmw8wsznS6fTCWCCZTE43mk2sZIJk5SdUv0G/ywQ22jQZekMcx8mPBQzDSIeBT5Rf5AVzFGcz6JjJ177A6w8wlCKRSEyNBQBLKcVEPM5RZ8h+p4ppmphGgripMU0T27ZTY4EoilBKUa9XWZ6zWVtbR0Xw8VOJWivAtuNore1LgaEvmTJbPL6XI576Al6V+Wt7PHPvMpAWWutzlc+9UUpJFIZE1jTdZhvOyiB6uKwQxhykEIRheP7mCw1CtEIwyfO9HDeXc2gdY7/So+u2iKFRSumxgBAiCMMQopBq7YRq6y+WYUFgECExDAMhhH8ZMFBS0e6ecGt9gY37m0jl83b3NYclgZQSIcRgLOC6rqtERHwmIH2nwufhU9riN80bRzgHj2jXBgyHw95YIAiCTqgVlpfj7EAzd91hIZ4l1blNeSDxvAG+7zcua1Cz4xZC2Jy8dzAOZ9EajitNXPeUSEd4nlcZC5RKpR0p5WIsFssopcIw1GgdEUUaw8Dyfb/ZaDR2RzP/ACJMLvfI0dt2AAAAAElFTkSuQmCC%5D%5B%0A//%20Sun%20Jan%2028%202007%204%3A09%3A01%20PM%20GMT-0800%20%28Pacific%20Standard%20Time%29%20cblover%20http%3A//minidata.googlepages.com/%0A%0A//%20This%20button%20was%20given%20birth%20by%20deepakjoshi04%2C%20Custom%20Buttons%20Forum%20since%2014%20Aug%202006%0A//%20http%3A//custombuttons.phpbbnow.com/viewtopic.php%3Ft%3D199%26postdays%3D0%26postorder%3Dasc%26start%3D0%0A%0A//%20The%20purpose%20of%20this%20button%20is%20to%20create%20a%20backup%20HTML%20file%20of%20the%20Customs%20Buttons.%0A%0A//%20Creates%20an%20HTML%20file%20with%20no%20errors%20or%20warnings%20from%20Firefox%20Extension%20Html%20Validator%200.7.9.5%0A//%20as%20long%20as%20one%20uses%20no%20special%20characters%2C%20such%20as%20%26%20or%20%27%2C%20in%20the%20button%20name%2C%20uses%20an%20image%2C%0A//%20and%20does%20not%20use%20an%20imagelike%20the%20image%20for%20Yan%27s%20Clock%20button%3B%20even%20in%20these%20cases%20one%20only%0A//%20gets%20warnings%2C%20not%20errors.%0A%0A//%20See%20https%3A//addons.mozilla.org/firefox/249/%20or%20http%3A//users.skynet.be/mgueury/mozilla/%0A//%20and%20read%20the%20entire%20thread%20at%20http%3A//custombuttons.phpbbnow.com/viewtopic.php%3Ft%3D199%0A%0A//%20The%20file%20created%20will%20have%20a%20unique%20name.%0A%0A//%20This%20button%20and%20the%20Open%20File...%20button%20--%20BrowserOpenFileWindow%28%29%3B%20--%20will%20enable%20one%20to%20load%20the%0A//%20HTML%20file%20into%20Firefox%20for%20a%20printed%20output.%0A%0A%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%20Get%20the%20Date%20%26%20Time%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%0A%0A%0A/*%20Constants%20%20%20%20*/%20var%20c%3D%22%3A%22%3Bb%3D%22%20%22%3B%0A/*%20Date%20%20%20%20%20%20%20%20%20*/%20var%20t%3Dnew%20Date%28%29%3B%0A/*%20Year%20%20%20%20%20%20%20%20%20*/%20var%20y%3D1900+t.getYear%28%29%3B%0A/*%20Minutes%20%20%20%20%20%20*/%20var%20min%3Dt.getMinutes%28%29%3B%20if%20%28min%3C10%29%7Bmin%3D%220%22+min%7D%3B%0A/*%20Seconds%20%20%20%20%20%20*/%20var%20s%3Dt.getSeconds%28%29%3B%20if%20%28s%3C10%29%7Bs%3D%220%22+s%7D%3B%0A/*%20Time%2012%20Hour%20*/%20var%20h%3Dt.getHours%28%29%3B%20var%20ap%3D%22AM%22%3B%20if%20%28h%3E%3D12%29%20ap%3D%22PM%22%3B%20if%20%28h%3E12%29%20h%3Dh-12%3B%20if%20%28h%3D%3D0%29%20h%3D12%3B%20h%3Dh+c+min+c+s+b+ap%3B%0A/*%20Day%20of%20Week%20%20*/%20var%20dw%3Dt.getDay%28%29%3Bswitch%28dw%29%7Bcase%200%3A%20dw%3D%22Sun%22%3Bbreak%3Bcase%201%3A%20dw%3D%22Mon%22%3Bbreak%3Bcase%202%3A%20dw%3D%22Tue%22%3Bbreak%3Bcase%203%3A%20dw%3D%22Wed%22%3Bbreak%3Bcase%204%3A%20dw%3D%22Thu%22%3Bbreak%3Bcase%205%3A%20dw%3D%22Fri%22%3Bbreak%3Bdefault%3A%20dw%3D%22Sat%22%3B%7D%0A/*%20Month%20%20%20%20%20%20%20%20*/%20var%20m%3Dt.getMonth%28%29%3Bswitch%28m%29%7Bcase%200%3A%20m%3D%22Jan%22%3Bbreak%3Bcase%201%3A%20m%3D%22Feb%22%3Bbreak%3Bcase%202%3A%20m%3D%22Mar%22%3Bbreak%3Bcase%203%3A%20m%3D%22Apr%22%3Bbreak%3Bcase%204%3A%20m%3D%22May%22%3Bbreak%3Bcase%205%3A%20m%3D%22Jun%22%3Bbreak%3Bcase%206%3A%20m%3D%22Jul%22%3Bbreak%3Bcase%207%3A%20m%3D%22Aug%22%3Bbreak%3Bcase%208%3A%20m%3D%22Sep%22%3Bbreak%3Bcase%209%3A%20m%3D%22Oct%22%3Bbreak%3Bcase%2010%3A%20m%3D%22Nov%22%3Bbreak%3Bdefault%3A%20m%3D%22Dec%22%3B%7D%0A/*%20Day%20of%20Month%20*/%20var%20d%3Dt.getDate%28%29%3B%0A/*%20Time%20Zone%20%20%20%20*/%20var%20tz%3DString%28t%29.substring%2825%29%3B%0A/*%20Output%20%20%20%20%20%20%20*/%20var%20p%3Ddw+b+m+b+d+b+y+b+h+b+tz%3B%0A%0A%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%20End%20of%20Get%20the%20Date%20%26%20Time%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%0A%0A%0Avar%20dataURL%3D%22%5Cn%3C%21DOCTYPE%20html%20PUBLIC%20%27-//W3C//DTD%20XHTML%201.0%20Transitional//EN%27%22%3B%0A%0AdataURL%3DdataURL+%22%27http%3A//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%27%3E%5Cn%3Chtml%20xmlns%3D%27http%3A//www.w3.org/1999/xhtml%27%3E%22%3B%0A%0AdataURL%3DdataURL+%22%5Cn%3Chead%3E%3Clink%20rel%3D%27shortcut%20icon%27%20href%3D%27favicon.ico%27%20/%3E%5Cn%3Cmeta%20http-equiv%3D%5C%22content-type%5C%22%20content%3D%5C%22text/html%3B%20charset%3DUTF-8%5C%22%20/%3E%22%3B%0A//D6D6D6%20gray%20background%0AdataURL%3DdataURL+%22%3Ctitle%3EMy%20Custom%20Buttons%3C/title%3E%3C/head%3E%5Cn%3Cbody%20style%3D%27background-color%3A%20%23E1E5C4%27%3E%5Cn%3Ccenter%3E%3Ch2%3EMy%20Custom%20Buttons%3C/h2%3E%3Cstrong%3E%22+p+%22%3C/strong%3E%3C/center%3E%5Cn%3Col%3E%5Cn%22%3B%0A%0Avar%20NumOfButtons%3B%0Avar%20buttons%3DgetButtons%28%29%3B%0A%0AdataURL+%3Dbuttons.sort%28%29+%22%5Cn%5Cn%3C/ol%3E%5Cn%3Ccenter%3E%3Ch1%3E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%7E%3C/h1%3E%3C/center%3E%3C/body%3E%5Cn%3C/html%3E%5Cn%22%3B%0AdataURL%3DdataURL.replace%28/%3E%2C%3C/g%2C%27%3E%3C%27%29%3B%0A%0AwriteFile%28dataURL%29%3B%0A%0A%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%0A%0Afunction%20getButtons%28%29%0A%20%20%7B%0A%20%20var%20buttons%3Dnew%20Array%3B%0A%20%20var%20i%3D0%3B%0A%20%20for%20%28var%20j%3D0%3Bj%3Ccustombuttons.gToolbox.palette.childNodes.length%3Bj++%29%0A%20%20%20%20%7B%0A%20%20%20%20var%20but%3Dcustombuttons.gToolbox.palette.childNodes%5Bj%5D%3B%0A%20%20%20%20if%20%28but.getAttribute%28%27id%27%29.indexOf%28%27custombuttons-button%27%29%21%3D-1%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20var%20num%3Dcustombuttons.getNumber%28but.getAttribute%28%27id%27%29%29%3B%0A%20%20%20%20%20%20var%20but_code%3DgetHyperlink%28num%29%3B%0A%20%20%20%20%20%20if%28but_code.length%3E2%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20buttons%5Bi++%5D%3D%22%3Cli%3E%22+but_code+%22%3C/li%3E%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20NumOfButtons%3Di%3B%0A%20%20%20%20return%20buttons%3B%0A%20%20%7D%0A%0A%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%0A%0Afunction%20getHyperlink%28num%29%0A%20%20%7B%0A%20%20var%20values%20%3D%20custombuttons.getButtonParameters2%28num%29%3B%0A%20%20var%20altext%20%3D%20values.name%3B%0A%20%20var%20uri%3D%27custombutton%3A//%27+escape%28values.name+%27%5D%27+%27%5B%27+values.image+%27%5D%27+%27%5B%27+values.code+%27%5D%27+%27%5B%27+values.initCode%29%3B%0A%20%20var%20link%20%3D%20%22%5Cn%5Cn%3Ca%20href%3D%27%22%20+%20uri%20+%20%22%27%3E%5Cn%3Cimg%20alt%3D%27%22%20+%20altext%20+%20%22%27%20src%3D%5C%22%22%20+%20unescape%28values.image%29%20+%0A%20%20%20%20%22%5C%22%20border%3D%270%27%20height%3D%2716%27%20/%3E%5Cn%22%20+%20unescape%28values.name%29%20+%20%22%3C/a%3E%22%3B%0A%20%20return%20link%3B%0A%20%20%7D%0A%0A%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%0A%0Afunction%20writeFile%28str%29%0A%20%20%7B%0A%20%20var%20nsIFilePicker%20%3D%20Components.interfaces.nsIFilePicker%3B%0A%20%20var%20fp%20%3D%20Components.classes%5B%22@mozilla.org/filepicker%3B1%22%5D.createInstance%28nsIFilePicker%29%3B%0A%20%20fp.init%28window%2C%20%22Save%20CB%20backup%20as%20%22%2C%20nsIFilePicker.modeSave%29%3B%0A%20%20/*%20The%20file%20name%20will%20be%20unique%20given%20MS%27%20time-stamp%20and%20will%20also%20have%20the%20number%20of%20buttons%20indicated%20*/%0A%20%20fp.defaultString%20%3D%20%22BackupCustomButtons%20%22+new%20Date%28%29.getTime%28%29+%22%20%28%22+NumOfButtons+%22%29.html%22%3B%0A%20%20fp.appendFilters%28fp.filterHTML%29%3B%0A%20%20fp.appendFilters%28fp.filterAll%29%3B%0A%20%20//%20other%20filters%0A%20%20var%20res%3Dfp.show%28%29%3B%0A%20%20if%20%28res%20%3D%3D%20nsIFilePicker.returnOK%20%7C%7C%20res%3D%3DnsIFilePicker.returnReplace%29%0A%20%20%20%20%7B%0A%20%20%20%20var%20outputStream%20%3D%20Components.classes%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.%0A%20%20%20%20%20%20createInstance%28Components.interfaces.nsIFileOutputStream%29%3B%0Avar%20suc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Components.%20interfaces.%20nsIScriptableUnicodeConverter%29%3B%0Asuc.charset%3D%22UTF-8%22%3B%0Astr%20%3D%20suc.%20ConvertFromUnicode%20%28str%29%3B%0A%20%20%20%20outputStream.init%28%20fp.file%2C%200x04%20%7C%200x08%2C777%2C%200%20%29%3B%0A%20%20%20%20var%20result%20%3D%20outputStream.write%28%20str%2C%20str.length%20%29%3B%0A%20%20%20%20outputStream.close%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%5D%5B

?

Anton
Большое, нечеловеческое, спасибо. :)

хе-хе... набрёл сейчас на https://addons.mozilla.org/ru/firefox/addon/5066 которое ничем от custombuttons не отличается кроме нескольких незначительных настроек. Ян, естественно, в соавторах не указан...

Меня-то указали, а вот Anton'а по каким-то причинам убрали, хотя в install.rdf из версии, на которой они базировались, было:

Код:

    <em:creator>Yan</em:creator>
    <em:developer>Anton</em:developer>
    <em:developer>Dark-Demon</em:developer>
    ...

Anton написал:

коды в wiki не рассчитаны на copy-paste : )

Замени вот эти:

Код:

addBookmarkAs(document.getElementById(’content’), false);
                                      ^       ^

символы символами одинарной (') или двойной (") кавычек.

p.s. wiki-страничку поправил, copy-paste сейчас должен работать корректно.

А можно сделать, что бы окно добавления закладки не появлялось, а она скажем автоматом добавлялась в "Unsorted"?

Xaber

Код:

custombutton://%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0443%5D%5B%5D%5Bvar%20docshell%20%3D%20getBrowser%20%28%29.%20webNavigation%3B%0Avar%20doc%20%3D%20docshell.%20document%3B%0Avar%20url%20%3D%20getBrowser%20%28%29.%20currentURI.%20spec%3B%0Avar%20title%2C%20charset%20%3D%20null%3B%0Avar%20description%3B%0Atry%0A%7B%0A%09title%20%3D%20doc.%20title%20%7C%7C%20url%3B%0A%09charset%20%3D%20doc.%20characterSet%3B%0A%09description%20%3D%20BookmarksUtils.%20getDescriptionFromDocument%20%28doc%29%3B%0A%7D%0Acatch%20%28e%29%0A%7B%0A%20%20%20%20title%20%3D%20url%3B%0A%7D%0Avar%20bmroot%20%3D%20RDF.%20GetResource%20%28%22NC%3ABookmarksRoot%22%29%3B%0Avar%20res%20%3D%20BMDS.%20createBookmark%20%28title%2C%20url%2C%20%22%22%2C%20description%2C%20charset%2C%20null%29%3B%0Avar%20sel%20%3D%20BookmarksUtils.%20getSelectionFromResource%20%28res%29%3B%0Avar%20target%20%3D%20BookmarksUtils.%20getTargetFromFolder%20%28bmroot%29%3B%0ABookmarksUtils.%20insertAndCheckSelection%20%28%22newbookmark%22%2C%20sel%2C%20target%29%3B%0Avar%20rds%20%3D%20BMDS.%20QueryInterface%20%28Components.%20interfaces.%20nsIRDFRemoteDataSource%29%3B%0Ards.%20Flush%20%28%29%3B%5D%5Bthis.%20mouseover%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20oldimage%20%3D%20this.%20image%3B%0A%09this.%20image%20%3D%20%22file%3A///H%3A/redicon.png%22%3B%0A%7D%0Athis.%20mouseout%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20image%20%3D%20this.%20oldimage%3B%0A%7D%0Athis.%20setAttribute%20%28%22onmouseover%22%2C%20%22this.%20mouseover%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22onmouseout%22%2C%20%22this.%20mouseout%28%29%22%29%3B

Подскажите, пожалуйста, как задействовать сабж для тулбаров в окнах чтения, составления письма в Tb?

А как создать новую тему?

Anton написал:

Xaber

Код:

custombutton://%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0443%5D%5B%5D%5Bvar%20docshell%20%3D%20getBrowser%20%28%29.%20webNavigation%3B%0Avar%20doc%20%3D%20docshell.%20document%3B%0Avar%20url%20%3D%20getBrowser%20%28%29.%20currentURI.%20spec%3B%0Avar%20title%2C%20charset%20%3D%20null%3B%0Avar%20description%3B%0Atry%0A%7B%0A%09title%20%3D%20doc.%20title%20%7C%7C%20url%3B%0A%09charset%20%3D%20doc.%20characterSet%3B%0A%09description%20%3D%20BookmarksUtils.%20getDescriptionFromDocument%20%28doc%29%3B%0A%7D%0Acatch%20%28e%29%0A%7B%0A%20%20%20%20title%20%3D%20url%3B%0A%7D%0Avar%20bmroot%20%3D%20RDF.%20GetResource%20%28%22NC%3ABookmarksRoot%22%29%3B%0Avar%20res%20%3D%20BMDS.%20createBookmark%20%28title%2C%20url%2C%20%22%22%2C%20description%2C%20charset%2C%20null%29%3B%0Avar%20sel%20%3D%20BookmarksUtils.%20getSelectionFromResource%20%28res%29%3B%0Avar%20target%20%3D%20BookmarksUtils.%20getTargetFromFolder%20%28bmroot%29%3B%0ABookmarksUtils.%20insertAndCheckSelection%20%28%22newbookmark%22%2C%20sel%2C%20target%29%3B%0Avar%20rds%20%3D%20BMDS.%20QueryInterface%20%28Components.%20interfaces.%20nsIRDFRemoteDataSource%29%3B%0Ards.%20Flush%20%28%29%3B%5D%5Bthis.%20mouseover%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20oldimage%20%3D%20this.%20image%3B%0A%09this.%20image%20%3D%20%22file%3A///H%3A/redicon.png%22%3B%0A%7D%0Athis.%20mouseout%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20image%20%3D%20this.%20oldimage%3B%0A%7D%0Athis.%20setAttribute%20%28%22onmouseover%22%2C%20%22this.%20mouseover%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22onmouseout%22%2C%20%22this.%20mouseout%28%29%22%29%3B

Делал копипастом, не пашет :( Тут ничего менять не надо?

Xaber написал:

...не пашет :( Тут ничего менять не надо?

Нет, не надо - у меня работает.
Разве что, попробуй в секции "Код" кнопки в начало первой строки поставить

Код:

try{

, а в конце последней -

Код:

}catch(e){alert(e);}

- что там выдаст алерт ?

Мб я вас не правильно понял?

Код:

custombutton://%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0443%5D%5B%5D%5Bvar%20docshell%20%3D%20getBrowser%20%28%29.%20webNavigation%3B%0Avar%20doc%20%3D%20docshell.%20document%3B%0Avar%20url%20%3D%20getBrowser%20%28%29.%20currentURI.%20spec%3B%0Avar%20title%2C%20charset%20%3D%20null%3B%0Avar%20description%3B%0Atry%0A%7B%0A%09title%20%3D%20doc.%20title%20%7C%7C%20url%3B%0A%09charset%20%3D%20doc.%20characterSet%3B%0A%09description%20%3D%20BookmarksUtils.%20getDescriptionFromDocument%20%28doc%29%3B%0A%7D%0Acatch%20%28e%29%0A%7B%0A%20%20%20%20title%20%3D%20url%3B%0A%7D%0Avar%20bmroot%20%3D%20RDF.%20GetResource%20%28%22NC%3ABookmarksRoot%22%29%3B%0Avar%20res%20%3D%20BMDS.%20createBookmark%20%28title%2C%20url%2C%20%22%22%2C%20description%2C%20charset%2C%20null%29%3B%0Avar%20sel%20%3D%20BookmarksUtils.%20getSelectionFromResource%20%28res%29%3B%0Avar%20target%20%3D%20BookmarksUtils.%20getTargetFromFolder%20%28bmroot%29%3B%0ABookmarksUtils.%20insertAndCheckSelection%20%28%22newbookmark%22%2C%20sel%2C%20target%29%3B%0Avar%20rds%20%3D%20BMDS.%20QueryInterface%20%28Components.%20interfaces.%20nsIRDFRemoteDataSource%29%3B%0Ards.%20Flush%20%28%29%3B%5D%5Bthis.%20mouseover%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20oldimage%20%3D%20this.%20image%3B%0A%09this.%20image%20%3D%20%22file%3A///H%3A/redicon.png%22%3B%0A%7D%0Athis.%20mouseout%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20image%20%3D%20this.%20oldimage%3B%0A%7D%0Athis.%20setAttribute%20%28%22onmouseover%22%2C%20%22this.%20mouseover%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22onmouseout%22%2C%20%22this.%20mouseout%28%29%22%29%3B

Я тоже писал в Код.
Теперь у меня в "Коде" получилось:

Код:

try{
custombutton://%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0443%5D%5B%5D%5Bvar%20docshell%20%3D%20getBrowser%20%28%29.%20webNavigation%3B%0Avar%20doc%20%3D%20docshell.%20document%3B%0Avar%20url%20%3D%20getBrowser%20%28%29.%20currentURI.%20spec%3B%0Avar%20title%2C%20charset%20%3D%20null%3B%0Avar%20description%3B%0Atry%0A%7B%0A%09title%20%3D%20doc.%20title%20%7C%7C%20url%3B%0A%09charset%20%3D%20doc.%20characterSet%3B%0A%09description%20%3D%20BookmarksUtils.%20getDescriptionFromDocument%20%28doc%29%3B%0A%7D%0Acatch%20%28e%29%0A%7B%0A%20%20%20%20title%20%3D%20url%3B%0A%7D%0Avar%20bmroot%20%3D%20RDF.%20GetResource%20%28%22NC%3ABookmarksRoot%22%29%3B%0Avar%20res%20%3D%20BMDS.%20createBookmark%20%28title%2C%20url%2C%20%22%22%2C%20description%2C%20charset%2C%20null%29%3B%0Avar%20sel%20%3D%20BookmarksUtils.%20getSelectionFromResource%20%28res%29%3B%0Avar%20target%20%3D%20BookmarksUtils.%20getTargetFromFolder%20%28bmroot%29%3B%0ABookmarksUtils.%20insertAndCheckSelection%20%28%22newbookmark%22%2C%20sel%2C%20target%29%3B%0Avar%20rds%20%3D%20BMDS.%20QueryInterface%20%28Components.%20interfaces.%20nsIRDFRemoteDataSource%29%3B%0Ards.%20Flush%20%28%29%3B%5D%5Bthis.%20mouseover%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20oldimage%20%3D%20this.%20image%3B%0A%09this.%20image%20%3D%20%22file%3A///H%3A/redicon.png%22%3B%0A%7D%0Athis.%20mouseout%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20image%20%3D%20this.%20oldimage%3B%0A%7D%0Athis.%20setAttribute%20%28%22onmouseover%22%2C%20%22this.%20mouseover%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22onmouseout%22%2C%20%22this.%20mouseout%28%29%22%29%3B
}catch(e){alert(e);}

Алерта нету...

Xaber написал:

Мб я вас не правильно понял?...

Да, похоже что неправильно.

...

Код:

custombutton://%u0414%u043E%u043...

Я тоже писал в Код.
...

Строки такого вида надо помещать не в секцию "Код" кнопок, а в адресную строку браузера.

Спасибо, заработало, но:
1.Закладка добавляется не в папку, а в корень (в общем то меня это устраивает).
2.После первого нажатия иконка (звёздочка) на кнопе исчезла и кнопку теперь почти невидно :(
3.Ну а в общем - супер, спасибо :)))

Xaber написал:

Спасибо, заработало, но:
1.Закладка добавляется не в папку, а в корень (в общем то меня это устраивает).

Xaber написал:

А можно сделать, что бы окно добавления закладки не появлялось, а она скажем автоматом добавлялась в "Unsorted"?

А я так понял, что "Unsorted" и есть корень. Так что, не ко мне претензия.

2.После первого нажатия иконка (звёздочка) на кнопе исчезла и кнопку теперь почти невидно :(

Надо убрать код в секции "Инициализация".

привет, может кто знает, почему этот код не робит:

Код:

var path='c:\\windows\\notepad.exe';
var arguments=['c:\\aa.txt'];

var file = Components.classes['@mozilla.org/file/local;1']
.createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
.getService(Components.interfaces.nsIProcess);
file.initWithPath(path);
process.init(file);
process.run(false,arguments,arguments.length);

Вставляю его в code и по нажатию на кнопку ни чего не происходит, однако в initalization он срабатывает :(

globik написал:

...почему этот код не робит:...

Переименование arguments в что-нибудь другое решит проблему.

благодарю )

Однако я нашел еще более изощренное решение :

Код:

function yo()
{
var path='c:\\windows\\notepad.exe';
var arguments=['c:\\aa.txt'];

var file = Components.classes['@mozilla.org/file/local;1']
.createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
.getService(Components.interfaces.nsIProcess);
file.initWithPath(path);
process.init(file);
process.run(false,arguments,arguments.length);
}

yo();

:)

arguments - некорректно, потому что это зарезервированное слово.

Обновил код кнопки "Fit to width":

Код:

custombutton://Fit%20to%20Page%20Width%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAFVBMVEX///8AzP8AAAAAzP8Amf8AAMwAAACWs84cAAAAB3RSTlMAd3f/////1grLHQAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADA1LzI4LzA2GvIWfQAAAEpJREFUeJxjYMAErKGhgRCGi0uIAJjhbBxiCGO4AIUUgIzQ0AAmhiQgw9gkQI0hTRXECEpDiChAGExgXUAGxEAXlwCIFUDtWOwGAHj3ENTzyS3QAAAAAElFTkSuQmCC%5D%5B%5D%5Bvar%20is_active%3D0%3B%0Avar%20rule%3D0%3B%0Athis.checked%3Dfalse%3B%0Athis.tooltipText%3D%22Fit%20to%20Page%20Width%3A%20Off%22%0A%0Athis.onclick%20%3D%20function%28event%29%20%7B%0A%0A%20if%20%28event.button%20%3D%3D%200%29%20%7B%0A%0A%20%20if%20%28is_active%20%3D%3D%200%29%20%7B%0A%20%20%20%20var%20s%3Dcontent.document.styleSheets%5B0%5D%3B%0A%20%20%20%20rule%3Ds.insertRule%28%27div%2Ctable%2Ctbody%2Ctr%2Ctd%2Cp%2Col%2Cul%2Ch1%2Ch2%2Ch3%2Chr%20%7Bmax-width%3A99%25%21important%3B%7D%27%2C1%29%3B%0A%0A%20%20%20%20var%20i%3Dcontent.document.images%3B%0A%20%20%20%20for%20%28var%20j%3D0%3B%20j%3Ci.length%3B%20j++%29%20%7B%0A%20%20%20%20%20%20var%20k%3Dcontent.window.innerWidth/i%5Bj%5D.width*.95%3B%0A%20%20%20%20%20%20if%20%28k%3C1%29%20%7Bi%5Bj%5D.width*%3Dk%3B%20i%5Bj%5D.height*%3Dk%3B%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20is_active%3D1%3B%0A%0A%20%20%20%20this.checked%3Dtrue%3B%0A%20%20%20%20this.tooltipText%3D%22Fit%20to%20Page%20Width%3A%20On%22%0A%20%20%7D%20else%20%7B%0A%20%20%20%20var%20s%3Dcontent.document.styleSheets%5B0%5D%3B%0A%20%20%20%20if%20%28rule%20%21%3D%200%20%29%20%7Bs.deleteRule%28rule%29%3B%20rule%3D0%3B%7D%0A%0A%20%20%20%20var%20i%3Dcontent.document.images%3B%0A%20%20%20%20for%20%28var%20j%3D0%3B%20j%3Ci.length%3B%20j++%29%20%7B%0A%20%20%20%20%20%20var%20k%3D%20content.window.innerWidth/i%5Bj%5D.width/.95%3B%0A%20%20%20%20%20%20if%20%28k%3C1%29%20%7Bi%5Bj%5D.width*%3Dk%3B%20i%5Bj%5D.height*%3Dk%3B%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20is_active%3D0%3B%0A%0A%20%20%20%20this.checked%3Dfalse%3B%0A%20%20%20%20this.tooltipText%3D%22Fit%20to%20Page%20Width%3A%20Off%22%0A%20%20%7D%0A%0A%20%7D%0A%7D%0A%0Athis.setAttribute%28%22onleftclick%22%2C%20%22this.onclick%28%29%22%29%3B%0A

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

Подправил код - теперь и правда ужимает страницу (забыл про <pre>).

Код:

custombutton://Fit%20to%20Page%20Width%5D%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAFVBMVEX///8AzP8AAAAAzP8Amf8AAMwAAACWs84cAAAAB3RSTlMAd3f/////1grLHQAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADA1LzI4LzA2GvIWfQAAAEpJREFUeJxjYMAErKGhgRCGi0uIAJjhbBxiCGO4AIUUgIzQ0AAmhiQgw9gkQI0hTRXECEpDiChAGExgXUAGxEAXlwCIFUDtWOwGAHj3ENTzyS3QAAAAAElFTkSuQmCC%5D%5B%5D%5Bvar%20is_active%3D0%3B%0Avar%20rule1%3D0%3B%0Avar%20rule2%3D0%3B%0Athis.checked%3Dfalse%3B%0Athis.tooltipText%3D%22Fit%20to%20Page%20Width%3A%20Off%22%0A%0Athis.onclick%20%3D%20function%28event%29%20%7B%0A%0A%20if%20%28event.button%20%3D%3D%200%29%20%7B%0A%0A%20%20if%20%28is_active%20%3D%3D%200%29%20%7B%0A%20%20%20%20var%20s%3Dcontent.document.styleSheets%5B0%5D%3B%0A%20%20%20%20rule1%3Ds.insertRule%28%27div%2Ctable%2Ctbody%2Ctr%2Ctd%2Cp%2Col%2Cul%2Cdl%2Ch1%2Ch2%2Ch3%2Chr%20%7Bmax-width%3A99%25%21important%3B%7D%27%2C1%29%3B%0A%20%20%20%20rule2%3Ds.insertRule%28%27pre%20%7Bmax-width%3A99%25%21important%3B%20white-space%3Anormal%21important%3B%7D%27%2C1%29%3B%0A%0A%20%20%20%20var%20i%3Dcontent.document.images%3B%0A%20%20%20%20for%20%28var%20j%3D0%3B%20j%3Ci.length%3B%20j++%29%20%7B%0A%20%20%20%20%20%20var%20k%3Dcontent.window.innerWidth/i%5Bj%5D.width*.99%3B%0A%20%20%20%20%20%20if%20%28k%3C1%29%20%7Bi%5Bj%5D.width*%3Dk%3B%20i%5Bj%5D.height*%3Dk%3B%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20is_active%3D1%3B%0A%0A%20%20%20%20this.checked%3Dtrue%3B%0A%20%20%20%20this.tooltipText%3D%22Fit%20to%20Page%20Width%3A%20On%22%0A%20%20%7D%20else%20%7B%0A%20%20%20%20var%20s%3Dcontent.document.styleSheets%5B0%5D%3B%0A%20%20%20%20if%20%28rule2%20%21%3D%200%20%29%20%7Bs.deleteRule%28rule2%29%3B%20rule2%3D0%3B%7D%0A%20%20%20%20if%20%28rule1%20%21%3D%200%20%29%20%7Bs.deleteRule%28rule1%29%3B%20rule1%3D0%3B%7D%0A%0A%20%20%20%20var%20i%3Dcontent.document.images%3B%0A%20%20%20%20for%20%28var%20j%3D0%3B%20j%3Ci.length%3B%20j++%29%20%7B%0A%20%20%20%20%20%20var%20k%3D%20content.window.innerWidth/i%5Bj%5D.width/.99%3B%0A%20%20%20%20%20%20if%20%28k%3C1%29%20%7Bi%5Bj%5D.width*%3Dk%3B%20i%5Bj%5D.height*%3Dk%3B%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20is_active%3D0%3B%0A%0A%20%20%20%20this.checked%3Dfalse%3B%0A%20%20%20%20this.tooltipText%3D%22Fit%20to%20Page%20Width%3A%20Off%22%0A%20%20%7D%0A%0A%20%7D%0A%7D%0A%0Athis.setAttribute%28%22onleftclick%22%2C%20%22this.onclick%28%29%22%29%3B%0A

Одно плохо - пока не умеет сохранять настройки для каждой вкладки.

Два вопроса:
1) Взял c этой темы несколько BB кнопок, но они не следят за буфером обмена. Как это поправить?
2) Mожет кто-нибудь дать код на BB кнопку, чтобы c её помощью можно было менять цвет текста?

1. http://dark-demon.nm.ru/soft/custombuttons/

Dark-Demon
Спacибо, твои же кнопки и брал, только не знал что надо средней кнопкой жать:)
Можно cделaть тaк: нaжимaешь левой кнопкой, еcли еcть выделенный текcт, то он обрaбaтывaетcя тегaми, a  еcли выделенного текcтa нет, то вcтaвляетcя cодержимое буферa c тегaми?

Второй вопроc чacтично решен, оcтaлоcь узнaть кaк cделaть выпaдaющее меню у кнопки??

custombuttons 0.0.2 beta
Совместимость: FF2/3b (проверял на 2.0.0.11/3b2), TB2 (2.0.0.9).
http://forum.mozilla-russia.org/uploade … -0.0.2.xpi

Может кто-ниудь написать кнопку что бы при нажатии на неё вставлялся следующий текст:
[url = текст из буфера обмена]текст из буфера обмена[/url] ?

obana-obana
Написали уже давно. Поищи по ссылке Dark-Demon'а из сообщения #464.

Anton
По той ссылки нет такого, да и все что я находил  выдавали :  [url = текст из буфера обмена]пусто[/url]. Мне же нужно что бы ссылка из буфера вставлялась сразу и в поле для ссылки, и в поле для названия.

у меня емнип по мидлклику вставляет [ url ]текст из буфера обмена[ /url ]

Dark-Demon
Мне же нужно что бы ссылка из буфера вставлялась сразу и в поле для ссылки, и в поле для названия.
[url = текст из буфера обмена]текст из буфера обмена[/url]

зачем?

Dark-Demon
Ступил, уже не надо, спасибо.

Сори , помогите я так и непонял как сделать просто , чтоб по кнопке открывался адрес url из буфера обмена ?
И ещё нужна кнопочка , которой можно переключать значения "показывать все рисунки" , "не показывать рисунки вобще" и "показывать кэшированные рисунки" :rolleyes:

чтоб по кнопке открывался адрес url из буфера обмена ?

Paste and Go Button

переключать значения "показывать все рисунки" , "не показывать рисунки вобще" и "показывать кэшированные рисунки"

ImagesLikeOpera

чтоб по кнопке открывался адрес url из буфера обмена

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%09%3Cname%3Egoto%3C/name%3E%0A%09%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%09%3Cmode%3E0%3C/mode%3E%0A%09%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.%2520onClick%2520%253D%2520function%2520%2528ev%2529%250A%257B%250A%2509if%2520%2528ev%2520%2526%2526%2520ev.%2520button%2520%253D%253D%25202%2529%2520return%253B%250A%2509openUILinkIn%2520%2528readFromClipboard%2520%2528%2529%252C%2520whereToOpenLink%2520%2528ev%252C%2520false%252C%2520false%2529%2529%253B%250A%257D%253B%250A%250Athis.%2520setAttribute%2520%2528%2522onclick%2522%252C%2520%2522this.%2520onClick%2520%2528event%2529%253B%2522%2529%253B%5D%5D%3E%3C/initcode%3E%0A%09%3Ccode%3E%3C%21%5BCDATA%5Bthis.%2520onClick%2520%2528%2529%253B%5D%5D%3E%3C/code%3E%0A%09%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%3C/custombutton%3E

переключать значения "показывать все рисунки" , "не показывать рисунки вобще" и "показывать кэшированные рисунки"

можно, конечно, и кнопку сделать, но лучше ilo.

спасибо Anton и Al_H .
Но ещё ... что такое ilo ?

musTANK
Расширение ImgLikeOpera.

Сэнкс за разьяснения .

Ещё очень бы хотелось кнопку для заливания картинок на _http://radikal.ru

з.ы. /оффтоп/ если невозможно сделать такой батон , то подскажите может есть какаоето расширение типа ImageBot (работает с imageshack) , но чтоб он с радикалом дружил . Типа выбераеш на страничке картинку , правой кнопкой и "Upload Image" .

Проблема с расширением. При изменении кода в кнопке не могу нажать OK (окно не закрывается), то есть ничего не могу изменить. Кто знает как бороться ?

vurdalak
Нужны подробности.
Новые версии в настоящий момент не размещаются на официальном сайте расширения. Ищите на addons.mozilla.org или custombuttons.mozdev.org. Или на custombuttons2.com, но там другая ветка расширения.

Мне ктонибудь поможет ? :whiteflag:

Доброго времени суток. Значит, обновил недавно (вчера что ли) до 0.0.2.5 и сегодня заметил глюк, точнее trueглюк[/b]. Вот именно так, как написано: вместо всех открывающих тегов пишется true. В свойства кнопок лазил, но там всё как положено:

Код:

var open="[b]";
var close="[/b]";
var theBox =

Никто не сталкивался с такой проблемой? Как исправить можно? Я, конечно, ещё попробую downgrade версии...
Обидно такого инструмента лишаться.:|

Вот ещё обновился, проблема также и осталась.

А чем CustomButtons 2 и 1 отличаются?

Robert Ingil

Вот ещё обновился, проблема также и осталась.

Подтверждаю, в 0.0.2.5 такая ошибка была. В 0.0.2.6 не наблюдаю.

TLemur
CB² поддерживает несколько дополнительных возможностей.

Подскажите код запуска внешнего приложения , например открыть текущую страницу в IE ?

Мужики,а че надо писать в этой штуке,если я хочу вывести на панель кнопку из настроек "Автоматическая загрузка изображений"???я так то впринципе почитал,что вы тут пишите,но ровным счетом ничего не понял :(
Что мне нужно написать в "КОД" и в "ИНИЦИАЛИЗАЦИЯ"??
помогите пожалуйста :)

vurdalak
Код запуска внешнего приложения в теме был. Открыть текущую страницу в IE:

Код:

var file = Components. classes ["@mozilla.org/file/local;1"].
           createInstance (Components. interfaces. nsILocalFile);
var process = Components. classes ["@mozilla.org/process/util;1"].
    getService (Components. interfaces. nsIProcess);
file. initWithPath ("H:\\Program Files\\Internet Explorer\\iexplore.exe"); 
process. init (file);
process. run (false, [getBrowser (). contentDocument. location. href], 1);

ПысКо
Я думаю, в секцию "Код":

Код:

var pdi = nsPreferences. getIntPref ("permissions.default.image");
nsPreferences. setIntPref ("permissions.default.image", 3 - pdi);

Anton
На «голом» профиле объект nsPreferences отсутствует:

Код:

alert(typeof nsPreferences);

Так что надо

Код:

var prefs = Components.classes["@mozilla.org/preferences-service;1"]
    .getService(Components.interfaces.nsIPrefBranch);

и

Код:

prefs.getIntPref(name);
prefs.setIntPref(name, value);

:)

Anton
Спасибо пребольшое

Можно ли реализовать с помощью кнопки вот такое расширение ?
http://chrispederick.com/work/user-agent-switcher/

Можно ли реализовать с помощью кнопки вот такое расширение ?
http://chrispederick.com/work/user-agent-switcher/

Как-то так:

Код:

var ps = Components. classes ["@mozilla.org/preferences-service;1"]. getService (Components. interfaces. nsIPrefService). getBranch ("general.");
ps. setCharPref ("appname.override", "");
ps. setCharPref ("appversion.override", "");
ps. setCharPref ("platform.override", "");
ps. setCharPref ("useragent.vendor", "");
ps. setCharPref ("useragent.vendorSub", "");

А смысл ?

Подскажите код кнопки  для того чтоб открыть ссылку http://mail.ru в боковой панеле (sidebar)

openWebPanel ("Заголовок", "Адрес")

Еще вопрос .Как сделать кнопку чтоб при на ведении на нее она подсвечивалась и изменялась подсветка если клик зажать на ней .Пример кнопки из панели расширения FoxLingo.
Заранее Спасибо:)

А кто знает код кнопки "домашняя страница" и когд "bookmarks manager"

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

Попробовал смастерить свою кнопку для открывания УРЛ, вроде работает, но открывает страницу только в активной вкладке, подскажите что изменить в коде что бы открывалась страница в новой вкладке при нажатии на кнопку?

Код:

if (event.ctrlKey)
gBrowser.selectedTab = gBrowser.addTab('http://www.mail.ru/');
else
gBrowser.loadURI('http://www.mail.ru/');

Bruce
Не понятно, что требуется. Опишите подробней.

alabanco

"домашняя страница"

в раздел "Инициализация":

Код:

this. onclick = function (event)
{
    if (event. button != 2)
        BrowserHomeClick(event);
}

"bookmarks manager"

в раздел "Код":

Код:

toggleSidebar('viewBookmarksSidebar');

Dizeloid
Я не помню, чтобы обработка onclick раньше выполнялась в разделе "Код"; будем считать, что эта возможность сломана в текущих сборках, я постараюсь исправить ситуацию в следующей версии. Пока что, в качестве замены предлагаю поместить в раздел "Инициализация":

Код:

this. onclick = function (event)
{
    if (event. button == 2)
        return;
    if (event. ctrlKey)
        gBrowser. addTab ('http://www.mail.ru/');
    else
        gBrowser. loadURI ('http://www.mail.ru/');
}

Anton
Кнопка на панели инструментов выглядит просто значком .Как добавить немного анимации кнопке?
1).При наведении курсора на кнопку чтоб кнопка подсвечивалась (выделялась)
2).При нажатии на кнопку чтоб вид кнопки (подсветка) менялась на значение соответсвующее данному состоянию
Пример  на панели расширения FoxLingo .К сожалению других примеров не могу привести.

1).При наведении курсора на кнопку чтоб кнопка подсвечивалась (выделялась)

Так она и выделяется, как и все прочие кнопки. Если нужно что-то особенное, можно в раздел "Инициализация" добавить что-нибудь вроде

Код:

this. onmouseover = function (event)
{
    this. style. setProperty ("opacity", "1", null);
}
this. onmouseout = function (event)
{
    this. style. setProperty ("opacity", "0.5", null);
}

2).При нажатии на кнопку чтоб вид кнопки (подсветка) менялась на значение соответсвующее данному состоянию

Аналогично, только в onmousedown, onmouseup.

Dizeloid
Я не помню, чтобы обработка onclick раньше выполнялась в разделе "Код"; будем считать, что эта возможность сломана в текущих сборках, я постараюсь исправить ситуацию в следующей версии. Пока что, в качестве замены предлагаю поместить в раздел "Инициализация":
Код:

this. onclick = function (event)
{
    if (event. button == 2)
        return;
    if (event. ctrlKey)
        gBrowser. addTab ('http://www.mail.ru/');
    else
        gBrowser. loadURI ('http://www.mail.ru/');
}

К сожалению ничего не изменилось. Сайт как открывался в активной вкладке так и продолжает это делать. А хочется что бы в новой. :(

Dizeloid
Если просто щёлкнуть мышкой - то открывается в активной. Если при этом удерживать Ctrl - откроется в новой вкладке.

Dizeloid
В теме был  такой вопрос на 15 старнице 366 сообщение

Код:

getBrowser().addTab('http://mail.ru')

Bruce, спасибо большое! Всё работает :rock:

Вопрос к пользователям расширения. Какое поведение пользовательского интерфейса более предпочтительно при клонировании/добавлении/удалении custom-кнопок в одном из окон приложения:
1. Соответствующие изменения происходят также во всех открытых окнах
2. Соответствующие изменения происходят только во вновь открываемых окнах ('стандартное' поведение UI браузера)

Anton
1.
Частенько приходилось перегружать браузер, дабы изменения коснулись всех окон.

Подтверждаю, в 0.0.2.5 такая ошибка была. В 0.0.2.6 не наблюдаю.

Ну, не знаю. Я со своей стороны всё на «косячность» проверил... В итоге сделал downgrade до 0.0.1.3 — всё заработало. А недавно сделал обновление (хотя и боялся) до 0.0.2.6. Пару раз перезагрузил Firefox, кнопки удалил, а затем заново поставил, а то они в двух экземплярах у меня вылезли  (по-умолчанию что ли теперь в составе есть). И теперь всё работает как часы. (Пробовал до этого манипуляции без downgrad'а — не помогало).
Спасибо за расширение.

проблема с кнопкой "External Applications" та что 2006 года, она у меня не работает, не выпадает дроп даун меню.
вот initialization code:

Код:

var apps=new Array;
//------menu items--------
apps.push(['Notepad','c:/windows/notepad.exe']);
apps.push('separator');
apps.push(['IE','c:/Program files/Internet Explorer/IEXPLORE.EXE']);
//------/menu items-------

var nMItem=function(label,path,args,obj){
  var m=document.createElement('menuitem');
  m.setAttribute('label',label);
  m.f=obj.startProcess.bind(obj);
  m.setAttribute('oncommand','this.f("'+path+'","'+args+'")');
  return m;
}
this.startProcess=function(path,args){
var file = Components.classes['@mozilla.org/file/local;1']
    .createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);
 file.initWithPath(path.replace(/\//g,'\\\\')); 
// file.launch();
 process.init(file);
 process.run(false,[args],1); 
}

this.orient="vertical";
var mP=document.createElement('menupopup');
for (var i=0;i<apps.length;i++){
 if (apps[i] =='separator'){
  mP.appendChild(document.createElement('menuseparator'));
 }else{
  if (!apps[i] [2]) apps[i] [2]='';
  mP.appendChild(nMItem(apps[i] [0],apps[i] [1],apps[i] [2],this));
 }
}
this.appendChild(mP);

может у кого есть более новая версия? или кто знает как заставить работать ту что есть?

pshenk
надо добавить строку

Код:

this. type = "menu";

Anton
ага работает. но как теперь избавиться от черной стрелочки вниз (которая мол показывает что здесь попапменю)?

pshenk
Если не устраивает перемещение стрелочки вправо (this. orient="horizontal" или type="menu-button" (немного отличающиеся по виду варианты)), тогда не знаю подходящего способа.

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

... как ... избавиться от черной стрелочки вниз (которая мол показывает что здесь попапменю)?

Сообразил только сегодня. Надо убрать this.type=.... и установить атрибут popup

Код:

this.setAttribute("popup","mypopupid");

Мне на AMO и mozdev три человека пожаловались, что у них на 0.0.2.7/0.0.2.8 "сломались" кнопки, которые сами строят своё контекстное меню. Мне такие не попадались, может кто-нибудь показать подобную ?

С домашней страницы расширения не добавляются кнопки для BBcode, хотя BBcode установлено.
Custom Buttons 0029, BBcode 0522.

Сообразил только сегодня. Надо убрать this.type=.... и установить атрибут popup

не работает. не появляется всплывающие меню.
вот кнопка:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EFavorite%20Applications%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACvUlEQVR4nO2Uz2tcVRTHP+ecN3ltM2kwEESiGbSx6EawIkK7aUAQoSi4cu0/4EYYCykONLSMdOF/4dKN4F5adKEL3bTVbNog2TlpJ5nM3PfuPS7e/LImcWxc9guXe9/l3e/n3nPOvfBM/yJxdwA2N29+FmNsA3pCz2RmzY2Nq7cAcHfcnVbregwh+EkVQvBW63oc+WZTZFU13vz4K3a7/afa+tLZ0/z89adMR2EaQBkTj/f6XHznDcyEzHTYJuPj9M13P/5jLjvkP8qYcAQRwdRBFBcBqUACOFV4cSf5cHyIDgUkdzI1VBU1Q9QwVdQE1clJ3J00jHVKswIE1CbmajpuFaQC9UPk0f6A/X5B76Bg7yDMegIBmZjK2NQQUwYx8sefA7q9QHInxURMjprNHiLRCiIiqBqmRpmcTm/AICQcOJXXiMmJMRFjpNQ0O8AdokOIEIn0iirpqkqeG+AT8zJSyqHeRwP6ZSISqdWEGkaWKbXMqgpSwZNTxkQpcbyhNEsVZaacref8+tMvR2/pGC0tnjkeYKZ8e+ujpzI/StOAVBSFrqysnsiwKAqAccbHADNr3rjR/t9e09GHHHXFR7rZ3vT8VM7c3NwTrcbvv21xtblxTA0NASJi7S/bW6q69NrrawtqKmZGjJH/0heh8Ht3t7oxps7nzeaau5fWarVweHt5efmTK1fef+7x3q5kWcbc6Rr1+QUw54XnVwixz7mXX2W/3+WVYT+ar59ZgKx6Hi9dvJTv7OykCxfe+n798uVtBUjJ322sri6mlCiKkhACMTidTof5vM7D7Qf0ugfcu3+XXveA+8P+4fYD5vM6nd0OMVRrU0o0Go3FlPw9GCZZRT5YX1/P8jxn7dz5E+YYXnqxYXdu//Ah8EUGMBgEu3at9UikupXAMHEuUzXwRDL/VhxC9XrLyMNMFeAvxD6eG31AG3sAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20login%20%3D%20%22Administrator%22%3B%20%20%20%20%20%20%20%20%20%20//%20Here%20put%20your%20login%20name%21%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%20%20//%20So%20you%20can%20use%20%22Show%20Desktop%22%20command%21%0A%0A/*%0AIf%20you%20deleted%20%22Show%20Desktop%22%20from%20your%20Quick%20Launch%20toolbar%2C%20just%20enter%20this%20URI%0Ain%20your%20Firefox%20and%20save%20the%20file%20as%20%22Show%20Desktop.scf%22.%20Then%20you%20can%20put%20it%20in%20you%20Quick%20Launch%21%21%0AShowDesktop%3D%22data%3Aapplication/x-unknown-content-type%3Bbase64%2CW1NoZWxsXQ0KQ29tbWFuZD0yDQpJY29uRmlsZT1leHBsb3Jlci5leGUsMw0KW1Rhc2tiYXJdDQpDb21tYW5kPVRvZ2dsZURlc2t0b3ANCg%3D%3D%22%3B%0A*/%0A%0Avar%20apps%20%3D%20new%20Array%3B%0ADefault%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%27%3B%0AShowDesk%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAioFc/4lLHf9dPCL/Sj8u/zZMRv86Ukv/O1RN/0VhWf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZbEv+tSQT/p0wR/8F4MP/BeDD/wXgw/8F4MP9FOCj/OUc+/ztTTf8+Vk//RmNb/1p+dP8AAAAAAAAAAAAAAAC2WxL/tlsS/7/WzP++8vv/t/D7/7fw+/+37vv/wXgw/8F4MP/BeDD/wXgw/1M3H/8+Qjf/TGpi/wAAAAAAAAAAtlsS/8fQvf/F8/z/xfP8/8x6O//Mejv/zHo7/7fu+/+37vv/t+77//DOpv+1UAH/tVAB/ztUTf8AAAAAAAAAANiBJ//L0bz/yvX7/8r1+//3ozD//+PH///lzP/Mejv/zHo7/8x6O//Q9vz/8M6m/8xnAf87VE3/AAAAAAAAAADYgSf/z9K9/9D2/P/Q9vz/96Mw///lzP//5cz//+XM///lzP/Mejv/0Pb8/9D2/P/MZwH/PldQ/wAAAAAAAAAA2IEn/9Tt7P/U9vz/1Pb8//ejMP//8+f/AQ4U/wEOFP/Zhzf/2Yc3/9mHN//U9vz/zGcB/zZMRv8AAAAAAAAAANiBJ//c+P3/3Pj9/9z4/f/3ozD///Pn///y5f9hhJL//+TJ//XDkP/Zhzf/2Yc3/8xnAf8pOTX/Ql1V/2eShv/YgSf/4fn9/+H5/f/h+f3/96Mw///8+f//8uX///Pn/9mHN///5Mn//+XM//zRpv/Zhzf/ETG5/y9CPf9UeG7/2IEn/+Xi0P/o+v7/6Pr+//ejMP////////r1///y5f//7dz/2Yc3/9mHN///5cz/H1zV/y6G8v8RMbn/bJiL/9iBJ//YgSf/7Pv+/+z7/v/3ozD/+7JB//uyQf//+vX///Ll/8x6O//s+/7/2Yc3/9mHN/8eJJb/AAAAAAAAAADYgSf//+26/9iBJ//0/P7/9Pz+//T8/v/w2L//+7JB//uyQf/Mejv/9Pz+//T8/v/Zhzf/O1RN/wAAAAAAAAAA2IEn/++mRv/vpkb/2IEn//DOpv/w2L///P7///z+///8/v///P7///z+///vpkb/2Yc3/ztUTf8AAAAAAAAAAAAAAACOn4b/oLac/6ilhf/vpkb/76ZG/++mRv/vpkb/8tKf//LRo//vpkb//L12/9mHN/9Sc2n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+mRv/vpkb/76ZG/++mRv/vpkb/AAAAAAAAAAAAAAAA//9zQQD/c0EAB3NBAANzQQADc0EAA3NBAANzQQADc0EAAHNBAABzQQAAc0EAA3NBAANzQQADc0GAA3NB/wdzQQ%3D%3D%27%3B%0AIExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%3D%27%3B%0AWExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%3D%3D%27%3B%0ACtrlPanel%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAEG0lEQVR42mJkTDzG8P/ffwYpEU6Gzz/+8H//9Y+dh4s1+cOn3+zMbMwWf/8wWAAVMOi/nLtX8uet4L+MrAz/GBgYmIHY/ft3BoAAYgHSOYyMjCIfv/2x+Pnnv8WfH/+YPnz4zMsAVMbC+p9BQYCV4dNfNoYvf9j4vn37wvCXkZ3hF9BADyFhBtVv3xgAAoiF4e/fif+//Wb6+ukvAzvrPwYtUVYGSyM+Bl15HgYTLSkGRUkOhty5txkOXP//F+TSv/9+MrCxsjBICggw/H73jgEggFgYvn37HGXEx+9lJMpgqCrEoCTJw8DBycoAAh++vGP4y8TO8O8/IwMj0FaGf38Y2ISUGZgktBlYGR4x/P//nwEggFj+//jBkO2py2BlIAnW9Auo7uMvBoYfP38zvD2aycBr1MPAxsLO8PsvM8PPb58ZhByDGb4x8TAwPL0HNJiJASCAmFhYWRkevvoG1vz9NwPDN5Dm/wwMX57sZPjLrcnAwCfLwMXJzPDr19//X8XNGX5JWzP8/flVjOnLq5lC7G+XAwQQCwsLE8PHL7/BBvwG2v7zL9AVQAO+3V/E8E86juEvkP3/90+GbyzCzJ90wsRUuDhmGqgKO6v/4ufl/HiCASCAWJgYGRlefQBay/Cf4fsfRoZfjEDNTw4x/P5wiYHVyInh/hsGhhc//jEEhwU4OFmo3/vOxMN98Yo8w+p/ir8EX0uvBggAQQC+/wQBAAAA8fkCAPf25ADuzJEABC2AAPnkrgD/FUcA6ujpAMTU2gBKOz4ADgkHBcfU4wXNzbvV8efcyCAD8ZMlFRvSAgBBAL7/BAYFAwDz9vgA+AcnAP8IHAD0vkgAAAUPAPkplQCyqrAAEQDYAKTmJQDhz8HdGv3XbBUE9L8QAQT5BgIBAAP+/QACiAUc8n/+Mvz8DYw6pVyGf68OAWML6CUuBQYG23yGHwxfGMwefmK4/fj2dQbu5zsYhIFpjJmNAehZcLgBBBALIxMTw2dgIH79AQo8YGjrLWb4/fEWw+8/DAyaAowMh9/zMnAy/2L4w8TP+uLjK4a33xkZ+Pn/M8gKAh3K+I8BIIBY/gDN+gNMYT+AGn4AI+M3IzfDT35DsOninAwM8m9+Mxy5+Yrhz5+/zIzAhPPr1x+Gly+/MHz78p/h5x8hBoAAYvnz9x/DT6BrmNiAOoCGfAUmiRcf/jLcuPmU4eS5+wy3rt1g+Pfuyk8VtkefeNk+gxMPCAC9z/CekZkBIIBY/v/5wvL8LQfDtGW3GO49eMXwCpjCvjy7+Ov/99cf2P5/mKvO/eseA/v7E0wsbPc5OHmByfcfAzIACCAW9t9v3t6/+vzP0wub//D+f3pGkPnZaQHmP2t4eTjvMTKzfmZj4wAmbXagRiag7f+BNIp+BoAAAwDAMqTgcw5bNAAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSNotepad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAoJJREFUOE+lk/tL01EUwO0fy1ely6IUMoi0AoM0Sy1TMDMitZyvfLDNdM5HPle6RNt0mlvz0ebmYzoVN5vO4cQ5yxQFAz/NbxTo9Kcu3Hu4h3s/fM6BcwYI+q91CBBXdGDtjaG88LUQywoK/9yLJEKseaulRnzX/5Sg41tIiKsWaauX0mdxolUr6Btz0NpWh9Ls4ZNugHbbDpklMvKkTQEQAVD4YQmN+yeGzX00qzvUu9aodKwhc25TurhLtnWbuNb10wF5ygUqnD4UTg8Sxwa5Nhc5026eTnpIG18lYWSdBO3B6QCF2krutI838z7ypzdJNS+RZHJz3/idWyNeLvd7iFEfkKYwnFxCl95Mnm2FdPMGj81bxA25uKZfJla3wZXPm4R0exC93yGtdysAIvRAPWSm1rlEvP4H8UM+ogZcRPS5idKsc6HHQ7BymUj5Kum6A15KWo5YCIAeg5ku7xTXtV5itD7CuhcIVzm41LlChNLO2Xoboko7qV1bpFQNHLEQAB/9JUzsWUkaXOVih4tz7dOENU8gejeLqMFGsMyCqGCSpFoHyU32QIBKb8G6byR/fJmLTQ5C60Y5LzchqrYQKflKcNEXIrMNJBaP8ah1jVdVzf/KEAxUOgsLv6ZodM5xtWGe0LIBQkq0RBSPEF48TIjYRLTYRkqd3W+wyL2c0qOADp2ZyT0jet8Md1Quf8OMxCqnSO63kzVuJ2d2huhMKS8KyykqrQ5sYrfBb8AExt1hVOtzlLkHkXtHaVxxIJuZJ7trnhsJz0+fhXqNlc5lO3LTN3I7p3hQMcjNrBZuP6wkOb2EfLH0xM/CJB8eGc+kJGbIeJJTISge1zxpCv/mfgPvVs+ANDa5fgAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSWordpad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAD5ElEQVR42gBBAL7/Af///wDgz3tx+e7eSe7mDMcTHwhq3d3+lhQQ9Tfb4fDGGxEsa+z105z+AkJFDP3M9PEQRo8qKSyz1d3qAFlVRwACiBFkwPKlJz9+e7WVT1hYgOHZGy4GKcHHDM8/mzIoi55kePEzhEGQcRUDi0gSA9OHVQwfGdUYWCXkTa89en+mOsGTASCAWBiAgJFdgkHbyJ5B21Cb4em9lwwS0h4MHz6zMkiIGDJ8+yPM8O9vAQMXDx8D458Yhv5FhxgOv/s9lf/fvyag1q0AAQQxgPMDg7y9IcP7n38ZBLSkGX4xMDFw8P1mePmHgeEX4zOGv6wMDFyMnxhefWdiWPNZkeH9dwmzIL73y4Ba+QECCGzAH6A33v98z/Dz2y8GZkYGBlZGJgZuFi4GFqBBXKxCDMwsPxnOPvrJMO8gK8Ozj2IMfI/3Mbzn+wjU6ccAEEBgA5gYmRlYmTkZ2Ni5GH78+crw+98vhtc/3gK1/2cQ5eZheHLjP8OWQ78YTj1jY+D/eZNB8dcdBk4uoRcgvQABBDbg59/vQL9+ZWD/z8XAAbSZnYmf4c/fnwzsLL8ZDt78yrBk+x8Gpk//GEwYfzJ8//aUQYCf9a20lKgPSC9AAIENYGPmYmADavzx+ycDw78/DD8ZWRiEONkYdlz8x9C7hZXh0Yd/DOrCnAzm0swMHz69ZbA3MXomLCJ8G6QXIIDABvz+/4vhF9DZTEysDH+B4fGb8TvD8Qd/GCbv/M3w4O1vBj0ZDgYPPUEGA4VvDNc+izAY6GkyCAoKgLQyAAQQE4j4C7L132+g5n8M3Bw8DKz/BBiWbPzEcPflLwYjOW4GGxURBluNvwyWSowMjEzMDMxMTAwsoNAGAoAAArsAFIAg20Hh8OfXV4Yv11kZOF/+YHDTlmLQV+Zg0JT9yCAm8Jfhww9ggIOCFuhKIAIDgAACG/D3/1+giZwMLOwcDO8ufWfYsOk5g5ieGIO2Fj+Drsx/BmHebwzffv1i+Pz7L8N/uMMhLgAIIKgBvxk+/3rPwPqXjeEt628GeRceBlmVPwzS/M8YuNnYGf4BY4edGRg+fz8B2f8YkAFAAIENYGbkYmBl4WX48fMzg7DiPwZpNV4GblYOYIz8Yvj+5zvDX6bvDHzs3Ay87OLgNPMf6g4QAAggsAH/WX4w/GcVZBDgE2FgBdrw48d3hj9ffjNw/AI68xcnw9vX7xgefnjG8PPzD2A6YWXg4+F+x8bKCjYAIIDABiiKcq97e/lN2KfHr7/9+AAMxK/fGH7++Al0wC+wk7m4OBl4eLgZ+Hi52a0tjG5xc3NEMUNjASDAAGRtWmcAXa/AAAAAAElFTkSuQmCC%27%3B%0ATimenDate%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqBJREFUOE+Fk2tIk1EAho9F2J8uFF0gol92g6j+WEFGTGrQBYYynGnrYllOwbIx2aJWUEiJoZiFIYSaoJFdSEFrXcwaUZFz4Vrq5mWX+lz25UQpop62SaOLowPn1+F5znvOeU8cIGKN7FcbIosJc3cK24cvQozPF9/erxDXM5PjokxYMNk8+HI9xe5cmkbrqQtcJK9DwdKGvUw55UNdawkhE1xMWNW2nKLegzR+rqM52MQxu5mVjcXEnStHnJrNsfKrEcmkgk1VPlbfSCacwuRI4aSzkNwOWHCtH1EqEEbB4kOpmEymf+OLomHmmxzMuHCGNXcWktSyhM2tXpbU/0CUeBFnQ4Kjgpm7M2ILpu9rR+R3Ma9Ex5zLK5hWqSIsFqfVCIMg/vAsFqnzSU9PR9hbS/l7Omr34yrdDucToWg9WWdXhWIrEAcsTM3IIyF7G2tTDBOCkeeVcD0NKhSgX8ZY8Q6C5XuQm0oYtbfyfegt2Zf2InYdQSgbiVdUosi6wDplDoWFhQh32x1s927x7FEb7a5hbN4RXIExPIHPBIY/IffZOFF1l+kba5inqGdD+iMSd5xDo9FM3MHN1qdYB0Z5EoLtLi+DVguyvZ2gz4Xs6kAe6KTmtoct+5+TpH3A2q1G1Gp1BI48Y1jQ0j3O6/4A3X2DSD1vkD3d+Ls7kboe43c85M07H2k5FSiVSnQ6XRSOCpq7RpAkiaDdyteAB39/D/6BHiRHC0FZYrCvl/x8I2azOdrAP5p494Ubr8/HR3sbX9/eJzj8gUG3E1mWsTo/UXC8InLjv2L/Xv1IE8PHkIYCkRRhyO+XsFieUVZ2hbTduWRmZk4KR6scFjidbqqrGygoMJKaqonsqNfrY4L/fCatVotKpcJgMPwX+v0IPwEurq5/p1hhrwAAAABJRU5ErkJggg%3D%3D%27%3B%0AAddRemove%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAs9JREFUOE+Vk91L02EUx+2q/yII6iJIxRoRRlHdiRBGF0KglFIkpRWKdKEpJlqEkQRR1txsbqY1dM40Naf5sqm/+ba20sxyc75szqHzNTf36fdb2Bh104EvPJznnA/PeXn2COZJov7DZEcP7IkIlwBPhTUemfxUmYPUDoNOVPsomKygrR9g8quHYBCMRiMGgwHRonYVJQGMY+M8GQrwsG8Hee8Wyg4fqhYP6oZ5uno9uN3g9QZJTk4mMTExEiCRJMj73nFyCt9ReE9PWVk7iso+6moERs0TbK24cTkdZGbeiEiWckNP+fLZxo/ZJUyjMywvuHC5PNhnXUw45miyzlPYaueWbpq0q7f/Deju/BAq47YJigQ/d3q3udYZIKlhk5TnNp41O3hrmKe8vIX8fPnfJTyo6+d+ywy53ZDaCte6RDUHKK224HYusuGDqUkYFpvbLPrz8hr/QEIlZNZYOP/Gh8YCLwY2UHVPUakR8LqWpECWl8EiQJMeXqlAoQiQnl4UgoQAjTod+q8b1FvWWddexv80np6qGnzr4PeLEavwzeBD+LhDpQL0Iqi0pIPs7Ozf85QAbrcX/bdV3k2nMKg5xnu1kaER+D4FP2xOKlRtmIUlBLFHg8I2avUQ8fHxYYDD6cFgX+X63AUO6/Yh1/ZjHoBBUWOmOeobTDinV1hb38K3toVa00VsbGwYYHcsMDC7wtmeOPYqo8iRK+hoAWUVtOlgtD3ApljKrl25kodMJgsDRkasfFpc5qB2P/vrDpFe8ZJqcWJKJbzVQoe4wdJGStbTYyUu7kS4B69f12C1fcG3A599DuyrP5F/9FJQYuRN7ab4B2BiAjyeoJhs49Spc8TExISnIDWyuLgYVbWGu3kFpKSkcvrMWY7KjpOQcImMjPvk5Dzm4sWbHDlykujo6Mg92P1ZaWlpJCUlhZ4madcvnXNzc8nKyorwS/e/AIz06Svr2XfUAAAAAElFTkSuQmCC%27%3B%0ACmdPrompt%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAQ1JREFUOE9j/P//PwNFAGQAJZiB17Xrv17m9v+G2bv/G2TtwonN8vf+N83b+9+8YN9/6+wN/yU8W4H2Al0vXHbzv3jPh//iXW9xYrHOt/+jN//677/29//4zT/+T+tb/N8yZuH/4uLi/wwupQv+G0YV/DeOLcOLLePL/lsAMYh2jMv5rxXQAjHAwSsOFIokYxHNQIgBtp7xYM0eHh4gP4EBiI1sKMSzqJYIa0ANsHKNBkvCNMIMgokhyyEbgtUAXF5BNhSmBm4AzAv4XIDNFRgG4AsD5DDC6QJSYwLuAkfvRJKjEGSZqGYQJBqN/ev/K5iG/le2iCIaq1hE/Je3K4EYAIpiEINcTFFOBFkOAK4+5J3cVDxkAAAAAElFTkSuQmCC%27%3B%0AComputers%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZRJREFUOE+NUz1Lw1AUtT/Hn9BVcDDgYDe7iTiFTsFJXCRjcAod5FmhkA6FdCikW7oE4lCIg5AMhdehwxscInTI4HC898XU2tqPwOF93XPeffee1AAcbfueX7K1w08den1Vry05LFBBdFJodBO43RTBMIbox3CHCcRE6vHk1EbzzCJKyVuSecFE5ynQweJVISyAhA7iL8BfAK7CHgG6TWQFnBkgPkpSQODRozXvGxfO7gzEpMBdVgYLurGCM4fev77xdwhQBuFYwnwHLAq2p79gsvlGuE+2C3Ad/H6CRkQ3TX4ITCLw2qD9ZlvuFnDbJDDIYYyhhSrw2hgdIGB3Yy1QHwB1IjDMqNBtNVvl+7e2seqt1ZM4HlLRohx+n2rSimGcBxvkDR9UAs5jgmAk4dGtPOfWrRvoXyNVm5xusSig5oqEUmqdpzOwH8osVt37x4najWRlJud5DjmTiCPOIkTj0j1QgOyslIKcKqSZJF+k8Hoh1cHTQnsz4CysWwF/ENPPlOhRdFhAHF5EFqnatT6uvp/n35Q1zXl/mKThAAAAAElFTkSuQmCC%27%3B%0AMagnifier%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqxJREFUOE+Vkt1L01EYx48vFQRFdwVdVFQ3URFBd0HQjf9AhXWnBGLRMtdUiLLCt8RGbxZoQvaiglhRai03Z9Za5dbUueb2U/emNXx3upkv26ffFrndlRdfznkOz/dznuecJwkQmwsdpK7bIEJLEZEkksUyEbEmOVlEksJiYTFZLIbDYtP6tSKSkiI2igWxR/jF1lS3qFYdSxJRwJZzWnYrdexS6dmp1MfWv/tovCNXx4FCA3sLP3Hospbs6/VsO14kWxExQKXBD0sOAn4rgdE+ZmUFZS3O2CEowZyDcECS4wHmAwNRI+l59+MAdccoBGz4nF2MDJrxeyyM+yyYDB08b3iJtllLt6GT0JiN5ZlB2bhMeu7dOKBM5ycy3kv/dyOSowunzYjmTQfvPlh5YRumsX+KZwYfD6pbcNs/xio4kXM7DijV/iQy3ceA04zXbUHfYaTzq0QoMI7GPUGtbYI3E3PUmMZQ36yVjUFO5dxKALT9gKlehpxf8di/0KjrQTf8g0bzEA02FxqXG63HR1ckzLXqNiSrgQxVQgulOhkwaWHQYaTP9J6mD/08+SbxyGhHM+Dgs9uJZdiFNTRFTXs3LU31nFYltFCmjwJMDNoNOLr11L/tkW/2USdDDJ4hHB4XIyNeRiO/uNfUTuvzx2TlqeMt1PTOysEIhIdZCHnRtJl42jXJx/kg5tlpXLOT8jfPsSBnqfKLCAftZBfciQOOKppJO9/K0TOv6dFUYGytovi2jrfyeIzH3hwWZV26+pjtBzPIqbSyPy0/YQ7UatSymisz4dU+zCVZnEzPpKL8LorcEi4WlJN5OjeWk6iVSYxu8NaB/jDSDQXKs/djibHzf+hPgiSPZfMRrMU5KM/X/Ld5pYKWKiXSrXwuKh6uyrwCiJaruHBl1eYo4DduhgDBD20V8AAAAABJRU5ErkJggg%3D%3D%27%3B%0AOnScrKeyb%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJVJREFUOE9j/P//PwNFAGQAJRismSHz/H9SMLKFDAxtb/6Tg0tLS4HmgLwPNCD62H+SsELPhf8YBvz9+/f/zDNf///79w+FBlkDEgfJb7gPsQirAaS4AqcLGs78///r19//6DTIBTBx2rkAZDLIZpA/Qf4FARANshnkAmQvUj8MQCaSiuHRCEoMIA45GJyQKMkHg8MAACArvHlXxbSqAAAAAElFTkSuQmCC%27%3B%0AWinTskMngr%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJ5JREFUOE+VU9EOgCAIxPXQY7/sp/lnxpFMTEpkYzST4+AwEVFir+yUc5YYMb6LvG5ILqUsvbK1Qr0YDqKGu58AYNDacSP+xwGqzMX40+IaAImabCN/xwCGqgaMogwEAHLOHmKwkvI1g0MWQQ+jEcO1Uv5K58k6sNhZIl02F8Dr3as+DVIZyBY2rT0w+1YMg/0BmuSTGV76HHcHiWSxG7luAcTplZKTAAAAAElFTkSuQmCC%27%3B%0ASystProps%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAiRJREFUOE99kj9o21AQxl82jx67Crpo9FZDlxoyWNDBKhki8BCMBmMyBOGhuF2MmyFoKsKD0VRQh4A8GORNWQLyUFAGgzy4KEOGN3Tw0MGFDl/vnSu5TkgFH/p397vv7t0RAPHc9en7B/4pf2kckizeidSuHh3EK8BjjdYDKPnSgzv34axMGDcaxGWE2mRD4fscTo7mGQ40ixBeJwinKYIvSQmo0rPo5wQyS0gJSBYUfJMiWuasWG753b3bwFtk5CBDZexDXNUghgJG12NICXCXW7IMhOQw/g1E5MJ/70J9d6YS+gw7wGWFXJDsBqy2tetF2VeBo3swxP9BOu3AW20wWAPWZ7I9ocCPLjkQEBekJwCy6izBCQwiwGAFdO6A+jDjASrrnNytQLctGE1j78BfkNVxCKdPU1d3krUAzNu/gH4Kcd6BONOh2QZqzR4ax+b+ODxqozEHA9yXNRoaWKp/NTBxEkO8jVBpuqjbDvQTD2brH4CagzYFy7nOMJpTS/2ErYr2AOI4hHgVQGsFqJ8GXL0cYjnIb3R0MwlvnKF3nqBDUpWqb0K8IIDeitFo07fXFnrd3uEx5g8bJLc58rXkpRoNI3IQ8yIZZ8kukWBF5WIby2Pc/txCSUpJoIw30b2KCJBSNbdMLCo/AeT3OeSDhLpHc7XCIbUSw58k3OvjxAOAenEuHEoIEHyNubp6Lio/l1yuckFTEBWsjkctyf8qFzl/ABIpmnDaTkSAAAAAAElFTkSuQmCC%27%3B%0ACalculator%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAmhJREFUOE91k99PklEYx18vyrXVRbeuu278T7zK1kWtrVbO8qLwoiybM12aLEdz5mqaqUPE3JJUwAQhfwBq4i/wxwSFyECSgZZaJpaSnw5stlq+Z3v3PO+z8/2e7/d5zkkDpIM15VvjaPoRaXPrpxTf/SXF99OkldiGdOp0hnT8xDHpZEa65O1blK5kZab9ASUJkl/PgF8ECO7Bkoifkvk+hEX0/4De2S1GgjDqjye3pTCpww+SDvM8YYEaEYgyTZCrj0Ncrlwmu2SJ86WLnFHGOVsaoK3XdziBxe4nHIFO1zbZynUu1MGl55DXDPltUNAu4otNjIMppf8rsNp9+IXErsk4ReooNTZQdSd4oA1RrvmAShej0fadoemonIIFZgS5/SM0277yrCtEi2019e9cFfXpeUbcXszjXw4nMA94GJ8XzVoAs3uTFmsAy1wCozNAo2OHmO4aa9qiVE22iY4peCtUNOu9uNZBWTuKeU5Y6dhg9mYm1sIs3CkHMlOwjkF/ABRl/SgeTmAUii4qXmL0QJ3pPZpZmPJtyxMYHQlMwoLOEUHnDKOzbxHahYaeEAZnnPo3EQYnYvIEBtse3eIUtcGPTTTvVoUFVesala1Bbj8ao6h2ieGZz/IEr6y7WEUP8pVDXC8epm8Zcu5o6F2E9qFltLYYAxNr8gRa0w76GehwRDG6olRrvQgHKJvm0JhWKW+O4HDJjDF5lZv031IWnrZ5UA9CRYOHnHt91BgS3K1eILfMi2NyRV6BWty8fvGSCp+4KajyU9W5R16JhRvFr/8BHTrGZPFcbj0Fqnco7utlAX+Dk/lvcXcJCTRwbTMAAAAASUVORK5CYII%3D%27%3B%0ANetConnect%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAtxJREFUOE91k2tI01EYh8/SDxVaGpQVVAYV+CEQchRppandEMEP2WXa1Uq7MUShIk2taGWIdr86M0vn0ka1NishHTMj3RKMxtBIa00zoxxUhPH0/09mSnXghXP58Zzf+573KADhG87v3+j80Sxs/QOi5cNYERroFCF+iSL450SxKyJYMSwcOZEBclS6zZR0H+D2p7NoezTkOpJJagxj2vVjBBZ+5NKLz5JsSDsyvIsiZyl77Mu46Mqh/ruZewO1FHcdZb11PlPLNYh8N4qCZHKrn/wF8QLCayLY/HwBxzu2UtpzhcuufCo+NrHB+ppJ2gYUp7MRBQL/LBUWi2UURKj0bgJOGVj+aDZbJMheezTqtvVkt38gygT+F1skiwKRI1DsCyJibfZoQNgJB2MO2gmtnEnE/eksNc9iibmZ+QaYd+0ra27ZyHxgQK2rZsq+MOYlZYxyIeYcsiEy7IzJfcC48ykElYUwvlTJjOI+7tp60bX2Y+gc5NZLD1ctXagOXUKr1Q67EMo8CbCuHrGrFZHpkHLdjygULC5OJ++2g6qWT5idA7R+AWsf1L37xdHz+j+AvLpeRLwekWRCqBoQ22sQBwQxmiwvoOSRi6o2D/cdHkpM7ym4001S6n70+iGIkAHTUk0oosoRcdWIVbWMSw/GLzkFZcoNih52U946QL6uE31LH82ub+zIPDJcB+8zypAZqfWExOqYvOIyczdmERB1gwmRpShVRoqMbvL1XewuuInWbONZzyB36p4POfB1lQxZuLWM8J3NxO18TKJUk8gtTSiTDShX7iE2fjXR0dFoNBqqrG+50uDGZJLSHtmWMkQWhK/aRnjcJhbFJJKwNo1N6dlUGF/wtL0fa6eHe85BTta0k5CQ8Hdv+4B11lfUtn3B+AZ0dg+VNimk/3DG2EHeGZ3XUVpa2v8BZZZezjV6SD98wWvdF/KtarXa63RUDf7102SxL+9/nct7vwFQw5ZrKBhJFQAAAABJRU5ErkJggg%3D%3D%27%3B%0APowOptions%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAetJREFUOE+lk99rklEYx9e/0VU3QfdB/0JMyEaoF17JZNlg8cqsi8naClSaiBk2jOY71BbOC3/UunBBGkHEgkZu5KiGroiRWxJa6rrp03sOOHS+FNGBL5zDc57PeZ7vwzkGDP3XEoBexdQIR3X0Tu9ZN7m2W+Pzq2eUc3HUxA6j9qtaTv9D3fMAoLWdo7G/xutHyyRv3OH+1GPsdh+BQEAXIgFLiTjpdEaW3infhY9uWr6TPDkxROSUmUvjQSZdk/qARTVK6FYQj8cjAV+rT+GTn4b/NPkzx4nZgsQSL5jzRw/V54HT6SQyP4/b7ZaA2n6dTusbb9deknnwnMzDLyjKLAaDgYmJywMQ2YKAdFWv12m3D3izWSGd3SSb29U8mNLkIJFIkUplJURRFNlSn4kCsre3R6fTplR6Ty5XIhwWKrCxUWVrq0E+v8PY2Aw226g+oNlsaoFflMtVVlbe4fUWKRYrVCo/WV//QaHQYnX1Ow7H9UGAKEl4cWjYXFxzP43PG+d2KEkoVCKqftBUZXo6Kdvua6HrrghYrVZMJjMXRi7KsbqUa8zMbsv9orqkVRDDYrHoA3rHpC5EZNJy2MTw8Ljc37vp4pzxCmaz+e8AARPJQmKUC76zWEbOYzSa9D3408fRi+l68C+Q35MrucWVT9wHAAAAAElFTkSuQmCC%27%3B%0AMSPaint%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZZJREFUOE+NkjFowkAUhnVzdMxYoYubdhM6uTWbgQ7tJodDkQwiTuIimUJwEHEKHYRkKMShoFtcCnYoOGY8x4zt1m5/711MjEZbDw6O4973vvfe5QHkaG21G/xcfclzecTz8nDJIgBt3qjCuysi6JTAWkxcRffpbZh+5j55sNAZ7EoR9m11D/jIwerVkiACsJZzADnI0O9N0NYtqPfd6FEKQMHWLABr2OcBk7kPzQwSwKfLEgMC+FM7U96BAQEexxxqx5NZ/FFhX0JTkeV5D/uS5ADSTXLcANpgA2MsNIW+NyrDWoUIXQuo5CSAdjomY1A3F5HmDtCdcYS6hvBaAHoWqE9nAcbrGvWXMpRmAYEbTYB6QiMmCDX4X4D97oDNGPiyhoVQ91ZrcFPF91ycXR/d4R8GpEYW6lQTHS9hLUCBCISuINxupMHx58r+th3AGRbRf27L7KRPEzrOnpmCNHA30sB4UqQBBiXZPAq+CEAQ6oFm1iOA0D9Ve1xKpgRpsTRAvfDfuPx9VPup7CdLiMmx8jn1+N0vr+ulS/dQUwwAAAAASUVORK5CYII%3D%27%3B%0A%0A%0Avar%20directoryService%20%3D%20Components.classes%5B%27@mozilla.org/file/directory_service%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%3B%0Avar%20profileFolder%20%3D%20directoryService.get%28%27ProfD%27%2C%20Components.interfaces.nsIFile%29%3B%0Avar%20profilePath%20%3D%20profileFolder.QueryInterface%28Components.interfaces.nsILocalFile%29.path%3B%0A%20%20%20%20profilePath%20%3D%20profilePath.replace%28/%5C%5C/g%2C%27/%27%29%3B%0A%0A%0A//%20------%20Menu%20Items%20------%0Aapps.push%28%5B%27Show%20Desktop%27%2C%20%20%20%20%20%20%20%20ShowDesk%2C%20%20%27C%3A/Documents%20and%20Settings/%27+login+%27/Application%20Data/Microsoft/Internet%20Explorer/Quick%20Launch/Show%20Desktop.scf%27%5D%29%3B%0Aapps.push%28%5B%27Open%20My%20Computer%27%2C%20%20%20%20Computers%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27%3A%3A%7B20D04FE0-3AEA-1069-A2D8-08002B30309D%7D%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Open%20Drive%20C%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27C%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20D%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27D%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Profile%20Folder%27%2C%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20profilePath%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Internet%20Explorer%27%2C%20%20%20IExplorer%2C%20%27C%3A/Program%20Files/Internet%20Explorer/IEXPLORE.EXE%27%5D%29%3B%0Aapps.push%28%5B%27Notepad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSNotepad%2C%20%27C%3A/WINDOWS/notepad.exe%27%5D%29%3B%0Aapps.push%28%5B%27WordPad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSWordpad%2C%20%27C%3A/Program%20Files/Windows%20NT/Accessories/wordpad.exe%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Control%20Panel%27%2C%20%20%20%20%20%20%20CtrlPanel%2C%20%27C%3A/WINDOWS/system32/control.exe%27%5D%29%3B%0Aapps.push%28%5B%27Add/Remove%20Programs%27%2C%20AddRemove%2C%20%27C%3A/WINDOWS/system32/control.exe%27%2C%20%27C%3A/WINDOWS/system32/Appwiz.cpl%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Magnifier%27%2C%20%20%20%20%20%20%20%20%20%20%20Magnifier%2C%20%27C%3A/WINDOWS/system32/magnify.exe%27%5D%29%3B%0Aapps.push%28%5B%27On-Screen%20Keyboard%27%2C%20%20OnScrKeyb%2C%20%27C%3A/WINDOWS/system32/osk.exe%27%5D%29%3B%0Aapps.push%28%5B%27Task%20Manager%27%2C%20%20%20%20%20%20%20%20WinTskMngr%2C%27C%3A/WINDOWS/system32/taskmgr.exe%27%5D%29%3B%0Aapps.push%28%5B%27Calculator%27%2C%20%20%20%20%20%20%20%20%20%20Calculator%2C%27C%3A/WINDOWS/system32/calc.exe%27%5D%29%3B%0Aapps.push%28%5B%27Paint%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MSPaint%2C%20%20%20%27C%3A/WINDOWS/system32/mspaint.exe%27%5D%29%0Aapps.push%28%5B%27Command%20Prompt%27%2C%20%20%20%20%20%20CmdPrompt%2C%20%27C%3A/WINDOWS/system32/cmd.exe%27%5D%29%3B%0A//%20------------------------%0A%0A%0Avar%20nMItem%20%3D%20function%28label%2Cimg%2Cpath%2Cargs%2Cobj%29%20%7B%0A%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%20%3D%20obj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%29%27%29%3B%0A%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20if%20%28%21img%29%20img%20%3D%20Default%3B%0A%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20m.tooltipText%20%3D%20label%3B%0A%20%20return%20m%3B%0A%7D%0A%0Athis.startProcess%20%3D%20function%28path%2Cargs%29%20%7B%0A%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20var%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProcess%29%3B%0A%20%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%0A%20%20args%20%3D%20args.replace%28/%5C//g%2C%27%5C%5C%27%29%3B%0A%20%20if%20%28args%3D%3D%27%27%29%20%7B%20file.launch%28%29%3B%20return%3B%20%7D%20%0A%20%20process.init%28file%29%3B%0A%20%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%20%3D%20document.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3B%20i%3Capps.length%3B%20i++%29%20%7B%0A%20%20if%20%28apps%5Bi%5D%20%3D%3D%20%27separator%27%29%20%7B%0A%20%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%20%28%21apps%5Bi%5D%20%5B3%5D%29%20apps%5Bi%5D%20%5B3%5D%3D%27%27%3B%0A%20%20%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2C%20apps%5Bi%5D%20%5B1%5D%2C%20apps%5Bi%5D%20%5B2%5D%2C%20apps%5Bi%5D%20%5B3%5D%2C%20this%29%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.orient%20%3D%20%22vertical%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%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%3C/custombutton%3E

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

AndreyD

С домашней страницы расширения не добавляются кнопки для BBcode, хотя BBcode установлено.
Custom Buttons 0029, BBcode 0522.

Установил с AMO BBCode 0.5.2.2, Custom Buttons 0.0.2.9 с mozdev. Кнопки устанавливаются.
Как раз в версиях до 0.0.2.9 была ошибка связанная с определением валидности кнопки, в 0.0.2.9 исправлено.

pshenk

не работает. не появляется всплывающие меню.

Объясняю. Надо убрать строку this. type = ... - это уберёт стрелочку, и установить атрибут popup. То есть, оконцовка кода должна выглядеть примерно так:

Код:

this.appendChild(mP);
//this.type = "menu";
this. setAttribute ("popup", mP. id = "cbFavoriteApplications-" + this. id);

спасибо, заработало :)
я просто не знал что надо поле ID заполнять таким образом.

Можно без +this.id, это так, для пущего избежания коллизий с клонами этой же кнопки.
Можно последовательно, сначала установить id для менюшки, потом установить значение атрибута popup.

Anton написал:

AndreyD

С домашней страницы расширения не добавляются кнопки для BBcode, хотя BBcode установлено.
Custom Buttons 0029, BBcode 0522.

Установил с AMO BBCode 0.5.2.2, Custom Buttons 0.0.2.9 с mozdev. Кнопки устанавливаются.
Как раз в версиях до 0.0.2.9 была ошибка связанная с определением валидности кнопки, в 0.0.2.9 исправлено.

Не все кнопки доступны, в частности нет активно используемой кнопки "сделать из выбранного текста ссылку"

Вот так это у меня выглядит:
http://i43.photobucket.com/albums/e373/perforator2568/_2.jpg

А вот мои расширения:

http://i43.photobucket.com/albums/e373/perforator2568/_3.jpg

В общем я поковырялся немного следующим образом:

Посмотрел исходный код домашней страницы.
Кнопка "Сделать из выбранного текста ссылку" имеет код

Код:

custombutton://%u0421%u0434%u0435%u043B%u0430%u0442%u044C%20%u0438%u0437%20%u0432%u044B%u0431%u0440%u0430%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0441%u0441%u044B%u043B%u043A%u0443%5D%5Bchrome%3A//bbcode/skin/menuicons/url.gif%5D%5Bbbcode.bbcode%28%27urlclip%27%2C%20%27bbcode%27%29%3B

Я с помощью этого кода сделал кнопку, которая нормально работает, но не имеет иконки. Дело в том, что кнопка берет иконку из скина BBcode url.gif, а BBcode 0.5.2.2 иконки в формате PNG. Заменил url.gif на url.png и кнопка обрела иконку.

AndreyD
Изменить что-нибудь на xsms.nm.ru может только Yan

Дано: Thunderbird 2.0.0.12, Custom Buttons 0.0.2.9
Код кнопки в окне составления сообщений:

Код:

var mp = document.createElement("menupopup");
var mi = document.createElement("menuitem");
mi.setAttribute("label", "test");
mp.appendChild(mi);
this.appendChild(mp);
this.type = "menu-button";

Наблюдаю растягивание иконки в высоту. И все :/

В Firefox все работает:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EMenu-button%20test%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20mp%20%3D%20document.createElement%28%22menupopup%22%29%3B%0Avar%20mi%20%3D%20document.createElement%28%22menuitem%22%29%3B%0Ami.setAttribute%28%22label%22%2C%20%22test%22%29%3B%0Amp.appendChild%28mi%29%3B%0Athis.appendChild%28mp%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Balert%28event.target.nodeName%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%3C/custombutton%3E

Судя по DOM Inspector'у, не применяется XBL на toolbarbutton[type="menu-button"] :|

Infocatcher

Наблюдаю растягивание иконки в высоту.

Есть такое дело.

Судя по DOM Inspector'у, не применяется XBL на toolbarbutton[type="menu-button"]

Здесь вот не знаю - может тема или расширение какое-нибудь; у меня DOM Inspector xbl показывает.

Я посмотрел несколько стандартных кнопок Thunderbird'а - у них стоит type="menu", не "menu-button". Вот этот тип (#menu-vertical) нет расширяющего биндинга. Исправлю.

Anton

Я посмотрел несколько стандартных кнопок Thunderbird'а - у них стоит type="menu", не "menu-button".

Эмм...

Код:

<toolbarbutton oncommand="goDoCommand('cmd_saveDefault')"
               class="toolbarbutton-1" type="menu-button" id="button-save" label="Сохранить"
               tooltiptext="Сохранить это сообщение" command="cmd_saveDefault">
  <menupopup>
    <menuitem label="Файл..." accesskey="Ф" command="cmd_saveAsFile"/>
    <menuseparator/>
    <menuitem label="Черновик" accesskey="Ч" command="cmd_saveAsDraft"/>
    <menuitem label="Шаблон" accesskey="Ш" command="cmd_saveAsTemplate"/>
  </menupopup>
</toolbarbutton>

Здесь вот не знаю - может тема или расширение какое-нибудь; у меня DOM Inspector xbl показывает.

Не совсем точно выразился... Смотрю в DOM Inspector'е: атрибут type есть, CSS для toolbarbutton[type="menu-button"] есть. Эффекта нет. А вот на Computed Style глянуть забыл, а то понял бы, что

Код:

toolbarbutton[id^="custombuttons-button"] {
    -moz-binding: url(chrome://custombuttons/content/toolbarbutton.xml#toolbarbutton)
}

Infocatcher

Эмм...

До исходников птицы далеко ) Я из DOM Inspectora смотрел - type="menu". Может и врёт, конечно.

атрибут type есть, CSS для toolbarbutton[type="menu-button"] есть.

http://pastebin.mozilla-russia.org/91122
Для menu-type в CB есть расширяющий binding. Для menu - есть, но не расширяющий.
Для type="menu" binding CB виден только в computed style, для type="menu-button" - в выпадающем списке.

Всё равно разбираться надо, если стандартным кнопкам TB ставишь (через инспектор) type="menu-button" - их не растягивает. С другой стороны, стрелка оказывается в этом случае дальше от кнопки, чем обычно.

Anton

Я из DOM Inspectora смотрел - type="menu". Может и врёт, конечно.

Именно из него и смотрел...

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

Гм, хорошо, как создать «обычную» кнопку-меню? И на какой версии Thunderbird все это проверялось (есть у меня смутные подозрения...)?

Гм, хорошо, как создать «обычную» кнопку-меню?

Ну очевидно же - type="menu";

И на какой версии Thunderbird все это проверялось (есть у меня смутные подозрения...)?

2.0.0.12, инспектор 1.8.1.2

Плюс ещё из кнопки

Код:

var bt = document. getElementById ("button-tag");
alert (bt. getAttribute ("type"));
alert (bt. type);

Anton

Ну очевидно же - type="menu";

Ну, type="menu" и type="menu-button" – разные вещи. Например, «Получить новые сообщения» – и кнопка, и список (что я и хотел получить).

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

В этом и дело.
Для menu-button слева – кнопка, справа – список. А у menu – только список. Потому-то первая и шире.

P.S. Версии совпали.

Добавлено Thu Apr 10 00:29:21 2008 :
Кстати, из-за того, что атрибут orient="vertical" не работает в Firefox 2.0, есть смысл привязать к
toolbarbutton[type="menu"]
chrome://global/content/bindings/toolbarbutton.xml#menu-vertical
(причем в Firefox 1.5 данный binding отсутствует)
Тогда «треугольничек» будет справа, а не снизу.

Добавлено Thu Apr 10 00:34:06 2008 :
Причем я еще менял класс "menu-iconic-icon" на "blah-blah-blah-menu-iconic-icon". Насколько я помню, в одной из альф fx 3.0 в дефолтной теме было ограничение в 16px на размеры иконки, что жутко корявило картинки большего размера.

атрибут orient="vertical" не работает в Firefox 2.0,

Почему у меня работает ?
2.0.0.12/13

Почему у меня работает ?

http://pastebin.mozilla-russia.org/91123
Кнопка:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EMenu-button%20test%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20mp%20%3D%20document.createElement%28%22menupopup%22%29%3B%0Avar%20mi%20%3D%20document.createElement%28%22menuitem%22%29%3B%0Ami.setAttribute%28%22label%22%2C%20%22test%22%29%3B%0Amp.appendChild%28mi%29%3B%0Athis.appendChild%28mp%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B//%20alert%28event.target.nodeName%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.setAttribute%28%22orient%22%2C%20%22vertical%22%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%3C/custombutton%3E

После клика по кнопке:
fx 1.5.0.12: http://i019.radikal.ru/0804/d6/aa360f2d86fc.png
fx 2.0.0.13: http://i017.radikal.ru/0804/46/fb49bff3036e.png

Добавлено Thu Apr 10 14:33:55 2008 :
А без
this.setAttribute("orient", "vertical");
вид у кнопок будет одинаковый.

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

Код:

this. type = "menu";
this. orient = "horizontal"; // this. setAttribute ("orient", "horizontal");

Ошибка связана с отсутствием четырёх строчек в chrome.manifest. В 0.0.3 добавлю недостающие.
Для временного обхода ошибки могу предложить записать в userChrome.css содержимое chrome://custombuttons/content/overlay.css

Код:

toolbarbutton[id^='custombuttons-button'] {
  -moz-binding: url("toolbarbutton.xml#toolbarbutton");
}

toolbarbutton[id^='custombuttons-button'][type="menu"] {
  -moz-binding: url("toolbarbutton.xml#menu");
}

toolbarbutton[id^='custombuttons-button'][type="menu-button"] {
  -moz-binding: url("toolbarbutton.xml#menu-button");
}

или дополнительный код в init-секцию (только для menu-button)

Код:

if (!this. getAttribute ("cbMenuButtonBindingFix"))
{
    this. setAttribute ("cbMenuButtonBindingFix", "true");
    document. addBinding (this, "chrome://custombuttons/content/toolbarbutton.xml#menu-button");
}

может быть, это наоборот в 1.5 что-то не поддерживается, или просто разное поведение по умолчанию ?

Это смотря как посмотреть...
Реакцию на orient="vertical" я уже показал (см. скриншоты). И в 1.5 нет chrome://global/content/bindings/toolbarbutton.xml#menu-vertical.
Насколько я помню (давно это было), способ изменения положения «треугольничков» (через binding на #menu-vertical) я подсмотрел в Tab Mix Plus... Про orient="vertical" – тоже где-то подсмотрел. :)
В общем, хорошо, что компактная по высоте менюшка получилась с помощью уже имеющихся средств :)

Infocatcher

Это смотря как посмотреть...

Заинтриговал ты меня этим orient'ом. Объясни на словах, пожалуйста, что значит, что этот атрибуте "не работает" ?

Заинтриговал ты меня этим orient'ом. Объясни на словах, пожалуйста, что значит, что этот атрибуте "не работает" ?

(Ну вот, опять все дело в словах)
Не работает == не дает никакого эффекта.

Код:

this.type = "menu";
this.orient = "vertical";

На что Firefox 1.5 выдает стрелочку справа, без «this.orient = "vertical";» – стрелочку снизу. Firefox 2.0 на «this.orient = "vertical";» не реагирует никак (стрелочка всегда снизу).

Firefox 1.5 выдает стрелочку слева

Очепятка ?

Firefox 2.0 на «this.orient = "vertical";» не реагирует никак

Реагирует же на orient="horizontal" ?

Очепятка ?

Да. Исправил.

Реагирует же на orient="horizontal" ?

Реагирует. Это я уже понял, спасибо за помощь.
В общем, имеет место изменение реакции на orient="vertical", на этом предлагаю данную тему закрыть. =)

Ок. Просто, сейчас не в силах объять всё в комплексе, из-за этого опасения, что я что-то упустил, вплоть до "а не CB ли "ломает" orient ?".
Найдёшь другую ошибку - пиши )



Ещё одни часы, как у Яна, но на canvas'е:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EDigital%20clock%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bfunction%20CanvasPixelPrinter%20%28canvas%29%0A%7B%0A%09this.%20init%20%28canvas%29%3B%0A%7D%0ACanvasPixelPrinter.%20prototype%20%3D%0A%7B%0A%09canvas%3A%20null%2C%0A%09font%3A%20null%2C%0A%09%0A%09_context%3A%20null%2C%0A%09get%20context%20%28%29%0A%09%7B%0A%09%09if%20%28%21this.%20_context%29%0A%09%09%7B%0A%09%09%09if%20%28this.%20canvas%29%0A%09%09%09%09this.%20_context%20%3D%20this.%20canvas.%20getContext%20%28%222d%22%29%3B%0A%09%09%09else%0A%09%09%09%09throw%20%28%22SimpleCanvas%20error%3A%20no%20canvas%22%29%3B%0A%09%09%7D%0A%09%09return%20this.%20_context%3B%0A%09%7D%2C%0A%09%0A%09init%3A%20function%20%28canvas%2C%20font%29%0A%09%7B%0A%09%09if%20%28typeof%20%28canvas%29%20%3D%3D%20%22string%22%29%0A%09%09%09this.%20canvas%20%3D%20document.%20getElementById%20%28canvas%29%3B%0A%09%09else%0A%09%09%09this.%20canvas%20%3D%20canvas%3B%0A%09%7D%2C%0A%09%0A%09putch%3A%20function%20%28ch%29%0A%09%7B%0A%09%09if%20%28this.%20font%20%26%26%20this.%20font%20%5Bch%5D%29%0A%09%09%7B%0A%09%09%09var%20chr%20%3D%20this.%20font%20%5Bch%5D%3B%0A%09%09%09var%20chw%20%3D%20chr%20%5B0%5D%3B%0A%09%09%09var%20chh%20%3D%20chr%20%5B1%5D%3B%0A%09%09%09var%20i%2C%20j%2C%20k%3B%0A%09%09%09var%20line%2C%20cbit%3B%0A%09%09%09this.%20context.%20save%20%28%29%3B%0A%09%09%09for%20%28i%20%3D%200%3B%20i%20%3C%20chh%3B%20i++%29%0A%09%09%09%7B%0A%09%09%09%09this.%20context.%20save%20%28%29%3B%0A%09%09%09%09this.%20context.%20translate%20%28chw%2C%200%29%3B%0A%09%09%09%09line%20%3D%20chr%20%5Bi%20+%202%5D%3B%0A%09%09%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20chw%3B%20j++%29%0A%09%09%09%09%7B%0A%09%09%09%09%09this.%20context.%20translate%20%28-1%2C%200%29%3B%0A%09%09%09%09%09cbit%20%3D%20line%20%26%201%3B%0A%09%09%09%09%09line%20%3E%3E%3D%201%3B%0A%09%09%09%09%09if%20%28cbit%29%0A%09%09%09%09%09%09this.%20context.%20fillRect%20%280%2C%200%2C%201%2C%201%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09this.%20context.%20restore%20%28%29%3B%0A%09%09%09%09this.%20context.%20translate%20%280%2C%201%29%3B%0A%09%09%09%7D%0A%09%09%09this.%20context.%20restore%20%28%29%3B%0A%09%09%09this.%20context.%20translate%20%28chw%20+%201%2C%200%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09%0A%09print%3A%20function%20%28str%29%0A%09%7B%0A%09%09this.%20context.%20save%20%28%29%3B%0A%09%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%20str.%20length%3B%20i++%29%0A%09%09%09this.%20putch%20%28str.%20charAt%20%28i%29%29%3B%0A%09%09this.%20context.%20restore%20%28%29%3B%0A%09%7D%0A%7D%3B%0A%0Afunction%20DigitalClock%20%28canvas%2C%20showSeconds%29%0A%7B%0A%09this.%20showSeconds%20%3D%20showSeconds%3B%0A%09this.%20init%20%28canvas%29%3B%0A%7D%0ADigitalClock.%20prototype%20%3D%0A%7B%0A%09displayColor%3A%20%22black%22%2C%0A%09displayBackground%3A%20%22white%22%2C%0A%09canvasBackground%3A%20%22white%22%2C%0A%09displayBorderColor%3A%20%22black%22%2C%0A%09width%3A%2033%2C%0A%09height%3A%2016%2C%0A%09%0A%09_showSeconds%3A%20false%2C%0A%09set%20showSeconds%20%28val%29%0A%09%7B%0A%09%09this.%20_showSeconds%20%3D%20val%3B%0A%09%09if%20%28val%29%0A%09%09%09this.%20width%20%3D%2049%3B%0A%09%09else%0A%09%09%09this.%20widht%20%3D%2033%3B%0A%09%7D%2C%0A%09%0A%09get%20showSeconds%20%28%29%0A%09%7B%0A%09%09return%20this.%20_showSeconds%3B%0A%09%7D%2C%0A%09%0A%09font%3A%0A%09%7B%0A%09%09%220%22%3A%20%5B5%2C%208%2C%200x0E%2C%200x11%2C%200x11%2C%200x11%2C%200x11%2C%200x11%2C%200x11%2C%200x0E%5D%2C%0A%09%09%221%22%3A%20%5B5%2C%209%2C%200x02%2C%200x06%2C%200x0A%2C%200x12%2C%200x02%2C%200x02%2C%200x02%2C%200x02%5D%2C%0A%09%09%222%22%3A%20%5B5%2C%209%2C%200x0E%2C%200x11%2C%200x01%2C%200x02%2C%200x04%2C%200x08%2C%200x10%2C%200x1F%5D%2C%0A%09%09%223%22%3A%20%5B5%2C%209%2C%200x0E%2C%200x11%2C%200x01%2C%200x06%2C%200x01%2C%200x01%2C%200x11%2C%200x0E%5D%2C%0A%09%09%224%22%3A%20%5B5%2C%209%2C%200x02%2C%200x06%2C%200x0A%2C%200x12%2C%200x1F%2C%200x02%2C%200x02%2C%200x02%5D%2C%0A%09%09%225%22%3A%20%5B5%2C%209%2C%200x1F%2C%200x10%2C%200x10%2C%200x1E%2C%200x01%2C%200x01%2C%200x11%2C%200x0E%5D%2C%0A%09%09%226%22%3A%20%5B5%2C%209%2C%200x0E%2C%200x11%2C%200x10%2C%200x1E%2C%200x11%2C%200x11%2C%200x11%2C%200x0E%5D%2C%0A%09%09%227%22%3A%20%5B5%2C%209%2C%200x1F%2C%200x01%2C%200x01%2C%200x02%2C%200x04%2C%200x04%2C%200x04%2C%200x04%5D%2C%0A%09%09%228%22%3A%20%5B5%2C%209%2C%200x0E%2C%200x11%2C%200x11%2C%200x0E%2C%200x11%2C%200x11%2C%200x11%2C%200x0E%5D%2C%0A%09%09%229%22%3A%20%5B5%2C%209%2C%200x0E%2C%200x11%2C%200x11%2C%200x11%2C%200x0F%2C%200x01%2C%200x11%2C%200x0E%5D%2C%0A%09%09%22%3A%22%3A%20%5B3%2C%209%2C%200x00%2C%200x02%2C%200x02%2C%200x00%2C%200x00%2C%200x02%2C%200x02%2C%200x00%5D%0A%09%7D%2C%0A%09%0A%09init%3A%20function%20%28canvas%29%0A%09%7B%0A%09%09this.%20__super.%20prototype.%20init.%20apply%20%28this%2C%20%5Bcanvas%5D%29%3B%0A%09%09this.%20context.%20translate%20%2820%2C%2020%29%3B%0A%09%7D%2C%0A%09%0A%09fixmod%3A%20function%20%28str%2C%20len%29%0A%09%7B%0A%09%09while%20%28%28str.%20length%20%25%20len%29%20%21%3D%200%29%0A%09%09%09str%20%3D%20%220%22%20+%20str%3B%0A%09%09return%20str%3B%0A%09%7D%2C%0A%09%0A%09drawBorder%3A%20function%20%28%29%0A%09%7B%0A%09%09this.%20context.%20save%20%28%29%3B%0A%09%09this.%20context.%20fillStyle%20%3D%20this.%20displayBorderColor%3B%0A%09%09this.%20context.%20fillRect%20%280%2C%201%2C%201%2C%20this.%20height%20-%202%29%3B%0A%09%09this.%20context.%20fillRect%20%281%2C%200%2C%20this.%20width%20-%202%2C%201%29%3B%0A%09%09this.%20context.%20fillRect%20%28this.%20width%20-%201%2C%201%2C%201%2C%20this.%20height%20-%202%29%3B%0A%09%09this.%20context.%20fillRect%20%281%2C%20this.%20height%20-%201%2C%20this.%20width%20-%202%2C%201%29%3B%0A%09%09this.%20context.%20restore%20%28%29%3B%0A%09%7D%2C%0A%09%0A%09getTimeString%3A%20function%20%28%29%0A%09%7B%0A%09%09var%20date%20%3D%20new%20Date%20%28%29%3B%0A%09%09var%20h%20%3D%20this.%20fixmod%20%28date.%20getHours%20%28%29.%20toString%20%28%29%2C%202%29%3B%0A%09%09var%20m%20%3D%20this.%20fixmod%20%28date.%20getMinutes%20%28%29.%20toString%20%28%29%2C%202%29%3B%0A%09%09var%20res%20%3D%20h%20+%20%22%3A%22%20+%20m%3B%0A%09%09if%20%28this.%20showSeconds%29%0A%09%09%7B%0A%09%09%09var%20s%20%3D%20this.%20fixmod%20%28date.%20getSeconds%20%28%29.%20toString%20%28%29%2C%202%29%3B%0A%09%09%09res%20+%3D%20%22%3A%22%20+%20s%3B%0A%09%09%7D%0A%09%09return%20res%3B%0A%09%7D%2C%0A%09%0A%09tick%3A%20function%20%28%29%0A%09%7B%0A%09%09this.%20context.%20save%20%28%29%3B%0A%09%09this.%20context.%20scale%20%281%2C%201%29%3B%0A%09%09this.%20context.%20fillStyle%20%3D%20this.%20canvasBackground%3B%0A%09%09this.%20context.%20fillRect%20%280%2C%200%2C%20this.%20width%2C%20this.%20height%29%3B%0A%09%09this.%20context.%20fillStyle%20%3D%20this.%20displayBackground%3B%0A%09%09this.%20context.%20fillRect%20%281%2C%201%2C%20this.%20width%20-%202%2C%20this.%20height%20-%201%29%3B%0A%09%09this.%20drawBorder%20%28%29%3B%0A%09%09this.%20context.%20fillStyle%20%3D%20this.%20displayColor%3B%0A%09%09this.%20context.%20translate%20%283%2C%204%29%3B%0A%09%09var%20date%20%3D%20new%20Date%20%28%29%3B%0A%09%09var%20h%20%3D%20this.%20fixmod%20%28date.%20getHours%20%28%29.%20toString%20%28%29%2C%202%29%3B%0A%09%09var%20m%20%3D%20this.%20fixmod%20%28date.%20getMinutes%20%28%29.%20toString%20%28%29%2C%202%29%3B%0A%09%09var%20s%20%3D%20this.%20fixmod%20%28date.%20getSeconds%20%28%29.%20toString%20%28%29%2C%202%29%3B%0A%09%09this.%20print%20%28this.%20getTimeString%20%28%29%29%3B%0A%09%09this.%20context.%20restore%20%28%29%3B%0A%09%7D%2C%0A%09%0A%09QueryInterface%3A%20function%20%28iid%29%0A%09%7B%0A%09%09if%20%28iid.%20equals%20%28Components.%20interfaces.%20nsISupports%29%20%7C%7C%0A%09%09%09iid.%20equals%20%28Components.%20interfaces.%20nsITimerCallback%29%29%0A%09%09%09return%20this%3B%0A%09%09return%20Components.%20results.%20NS_ERROR_NO_INTERFACE%3B%0A%09%7D%2C%0A%09%0A%09notify%3A%20function%20%28oTimer%29%0A%09%7B%0A%09%09this.%20tick%20%28%29%3B%0A%09%7D%2C%0A%09%0A%09oTimer%3A%20null%2C%0A%09start%3A%20function%20%28%29%0A%09%7B%0A%09%09if%20%28this.%20oTimer%29%0A%09%09%09this.%20stopTimer%20%28%29%3B%0A%09%09this.%20oTimer%20%3D%20Components.%20classes%20%5B%22@mozilla.org/timer%3B1%22%5D.%0A%09%09%09%09%09%20%20%20createInstance%20%28Components.%20interfaces.%20nsITimer%29%3B%0A%09%09this.%20oTimer.%20initWithCallback%20%28this%2C%201000%2C%201%29%3B%09%09%09%0A%09%7D%0A%7D%3B%0ADigitalClock.%20prototype.%20__proto__%20%3D%20CanvasPixelPrinter.%20prototype%3B%0ADigitalClock.%20prototype.%20__super%20%3D%20CanvasPixelPrinter%3B%0Athis.%20htmlNS%20%3D%20%22http%3A//www.w3.org/1999/xhtml%22%3B%0Athis.%20xulNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0Avar%20canvas%20%3D%20this.%20getElementsByTagNameNS%20%28this.%20htmlNS%2C%20%22canvas%22%29%20%5B0%5D%3B%0Aif%20%28%21canvas%29%0A%7B%0A%09var%20canvas%20%3D%20document.%20createElementNS%20%28this.%20htmlNS%2C%20%22canvas%22%29%3B%0A%09this.%20clock%20%3D%20new%20DigitalClock%20%28canvas%2C%20false%29%3B%0A%09canvas.%20setAttribute%20%28%22width%22%2C%20this.%20clock.%20width%29%3B%0A%09canvas.%20setAttribute%20%28%22height%22%2C%20this.%20clock.%20height%29%3B%0A%09canvas.%20setAttribute%0A%09%28%0A%09%09%22style%22%2C%0A%09%09%22min-width%3A%22%20+%20this.%20clock.%20width%20+%0A%09%09%22px%3Bwidth%3A%22%20+%20this.%20clock.%20width%20+%0A%09%09%22px%3Bmax-width%3A%22%20+%20this.%20clock.%20width%20+%0A%09%09%22px%3Bmin-height%3A%22%20+%20this.%20clock.%20height%20+%0A%09%09%22px%3Bheight%3A%22%20+%20this.%20clock.%20height%20+%0A%09%09%22px%3Bmax-height%3A%22%20+%20this.%20clock.%20height%0A%09%29%3B%0A%09this.%20image%20%3D%20%22data%3A%22%3B%0A%09this.%20disabled%20%3D%20true%3B%0A%09this.%20setAttribute%20%28%22class%22%2C%20%22%22%29%3B%0A%09canvas%20%3D%20this.%20appendChild%20%28canvas%29%3B%0A%09var%20pn%20%3D%20this.%20parentNode%3B%0A%09var%20ns%20%3D%20this.%20nextSibling%3B%0A%09var%20button%20%3D%20pn.%20removeChild%20%28this%29%3B%0A%09if%20%28ns%29%0A%09%09pn.%20insertBefore%20%28button%2C%20ns%29%3B%0A%09else%0A%09%09pn.%20appendChild%20%28button%29%3B%0A%7D%0Athis.%20clock.%20start%20%28%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/***********************************%0A%20*%20Digital%20Clock%20custom%20button%20%20%20%20%20*%0A%20*%20on%20the%20canvas%20element%20base%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%20%20%20%20%20%20%20%20%20%20*%0A%20*%20Author%3A%20Anton%20Glazatov%20%28c%29%202008%20*%0A%20***********************************/%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%3C/custombutton%3E

[...] из-за этого опасения, что я что-то упустил, вплоть до "а не CB ли "ломает" orient ?".

Нет, Firefox 2.0 действительно перестал реагировать на orient="vertical" (это я еще давно заметил). Примером служит Launchy (content/main.xul):

Код:

<toolbarbutton id="launchy-toolbar-browser" type="menu" orient="vertical" class="launchy-toolbar toolbarbutton-1 chromeclass-toolbar-additional" label="&launchy.label;" tooltiptext="&launchy.label;">
    <menupopup onpopupshowing="launchyContext.doContext(this);">
    </menupopup>
</toolbarbutton>

(в fx 1.5 сейчас не проверить, но, насколько я помню, треугольничек менюшки был справа, а не снизу, как в 2.0.)

Найдёшь другую ошибку - пиши )

Обязательно! =)

Нашел довольно странную фичу.
Если в поле «Инициализация» написать что-нибудь вроде

Код:

this.image = this.parentNode.getAttribute("iconsize") == "large"
    ? "file:///J:/somePath/24.png"
    : "file:///J:/somePath/16.png";

, а поле «Картинка» оставить пустым, то при открытии редактора в этом поле появится текущая картинка.
Я так понимаю, что берется button.image – независимо от того, что было сделано в кнопке.
Т.е. если перед сохранением не очистить поле «Картинка», сохранится совершенно ненужная информация... :usch:

Демонстрация:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bfile%3A///J%3A/Soft_distrib/Browsers/Firefox/FF_extensions/_ext_temp/Close_All_Tabs/close_all_tabs-1.1-fx/chrome/skin/closeall24.png%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.image%20%3D%20this.parentNode.getAttribute%28%22iconsize%22%29%20%3D%3D%20%22large%22%0A%09%3F%20%22file%3A///J%3A/Soft_distrib/Browsers/Firefox/FF_extensions/_ext_temp/Close_All_Tabs/close_all_tabs-1.1-fx/chrome/skin/closeall24.png%22%0A%09%3A%20%22file%3A///J%3A/Soft_distrib/Browsers/Firefox/FF_extensions/_ext_temp/Close_All_Tabs/close_all_tabs-1.1-fx/chrome/skin/closeall16.png%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20tabs%20%3D%20gBrowser.mTabContainer.childNodes%3B%0Afor%20%28var%20i%20%3D%20tabs.length%20-%201%3B%20i%20%3E%3D%200%3B%20i--%29%0A%09gBrowser.removeTab%28tabs%5Bi%5D%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%3C/custombutton%3E

P.S. Самое простое, ИМХО, решение, при создании кнопки:

Код:

button.image = img;
button.setAttribute("cbb-image", img);

А при открытии редактора считывать button.getAttribute("cbb-image")
Впрочем, плодить лишних сущностей нехорошо...

Кнопка для закрытия вкладок:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFCSURBVHjarFE7TsNAEH27ygFwFAkJUcMBDKlD4c5pE8miIyegymGS1hJ1fIoEDkCPkFa2+PgCy8xmbCzvJgLBk55n/PZ5NH4LawFiRJzZCbUWsWiHGNtb55vJd9AAImKCSzxgj0QYyxmkxp0z4Mb5uY8UT8QJCaf0ekY8l8rv97ii55MbsMYjPqkzxFfii9RnzDVUu0EIw171QQtoWMyPDHnrVR8f9H0b6gW1+2CXxEQCjjrBx6IvXbCT73DxH7fDwaJzA0NZ/f3IL3o+RbR9Fw1WSv1cH7Cy225b4Xo8BhurqvJWUGpkQ37NAjeN0DWEEPIPjDEoNhukJHCFMc5Q13VwSMivWUynU6xXK1eNDCnL0mMzpO9XfGssNLhbLFzaRVF4W6Rp6lIN+W1o7TzPPS3LsuAvKjJb/BEHN/kNvgQYAML08vlxNjfkAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.onclick%20%3D%20function%28e%29%20%7B%0A%09var%20br%20%3D%20getBrowser%28%29%3B%0A%09var%20cTab%20%3D%20br.mCurrentTab%3B%0A%09switch%28e.button%29%20%7B%0A%09%09case%200%3A%0A%09%09%09var%20tabs%20%3D%20br.mTabContainer.childNodes%3B%0A%09%09%09var%20left%20%3D%20false%3B%0A%09%09%09for%28var%20i%20%3D%20tabs.length%20-%201%3B%20i%20%3E%3D%200%3B%20--i%29%20%7B%0A%09%09%09%09if%28left%29%0A%09%09%09%09%09br.removeTab%28tabs%5Bi%5D%29%3B%0A%09%09%09%09if%28tabs%5Bi%5D%20%3D%3D%20cTab%29%0A%09%09%09%09%09left%20%3D%20true%3B%0A%09%09%09%7D%0A%09%09break%3B%0A%09%09case%201%3A%0A%09%09%09br.removeAllTabsBut%28br.mCurrentTab%29%3B%0A%09%09break%3B%0A%09%09case%202%3A%0A%09%09%09if%28e.shiftKey%20%7C%7C%20e.ctrlKey%20%7C%7C%20e.altKey%20%7C%7C%20e.metaKey%29%0A%09%09%09%09break%3B%0A%09%09%09e.preventDefault%28%29%3B%0A%09%09%09var%20tabs%20%3D%20br.mTabContainer.childNodes%3B%0A%09%09%09for%28var%20i%20%3D%20tabs.length%20-%201%3B%20i%20%3E%3D%200%3B%20--i%29%20%7B%0A%09%09%09%09if%28tabs%5Bi%5D%20%3D%3D%20cTab%29%0A%09%09%09%09%09break%3B%0A%09%09%09%09br.removeTab%28tabs%5Bi%5D%29%3B%0A%09%09%09%7D%0A%09%7D%0A%7D%0A//%20Hide%20context%20menu%20in%20Linux%3A%0Athis.onmousedown%20%3D%20function%28e%29%20%7B%0A%09if%28e.button%20%3D%3D%202%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%29%20%7B%0A%09%09var%20cm%20%3D%20document.getElementById%28this.getAttribute%28%22context%22%29%29%3B%0A%09%09cm.collapsed%20%3D%20true%3B%0A%09%09var%20func%20%3D%20function%28%29%20%7B%0A%09%09%09cm.removeEventListener%28%22popupshowing%22%2C%20func%2C%20false%29%3B%0A%09%09%09setTimeout%28function%28%29%20%7B%20cm.hidePopup%28%29%3B%20cm.collapsed%20%3D%20false%3B%20%7D%2C%200%29%3B%0A%09%09%7D%3B%0A%09%09cm.addEventListener%28%22popupshowing%22%2C%20func%2C%20false%29%3B%0A%09%7D%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

ЛКМ: закрыть все вкладки слева от текущей
СКМ: закрыть другие вкладки
ПКМ: закрыть все вкладки справа от текущей

Контекстное меню доступно по (Ctrl, Shift, Alt или Meta)+ПКМ.



Танцы с бубном вокруг this.onmousedown – заради Linux'а, показывающего контекстное меню сразу после нажатия правой кнопки мыши (по идее, должно работать :D).

Заодно вопрос: нельзя ли не показывать контекстное меню с помощью менее извращенных методов?

[upd]
Забыл сконвертировать картинку в base64... – исправил.
В Linux'е работает :)

Нашел довольно странную фичу.

Что касается label, то изменения уже давно в cvs, а насчёт image не знаю, подумаю.

Заодно вопрос: нельзя ли не показывать контекстное меню с помощью менее извращенных методов?

Обычно очищается атрибут context, а обработчик onclick показывает контекстное меню, когда надо.

Пример:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EScroll%20page%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAIEAAKPdO4i/JsH5XAAAACH5BAEAAAMALAAAAAAQABAAAQItnD8RyBgAVnNAiDjNsxa3zXXSV13jBHpZepJippUqKrcHGM53+a41HNOtbIMCADs%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bfunction%20Scroller%20%28oDocument%29%0A%7B%0A%09this.%20oDocument%20%3D%20oDocument%3B%0A%09this.%20oDocument.%20defaultView.%20addEventListener%20%28%22keydown%22%2C%20this%2C%20false%29%3B%0A%7D%0AScroller.%20prototype%20%3D%0A%7B%0A%09oDocument%3A%20null%2C%0A%09oTimer%3A%20null%2C%0A%09%0A%09_nSpeed%3A%201%2C%0A%09_nDelay%3A%20150%2C%0A%09%0A%09get%20_window%20%28%29%0A%09%7B%0A%09%09return%20this.%20oDocument.%20defaultView%3B%0A%09%7D%2C%0A%09%0A%09revertScroll%3A%20function%20%28%29%0A%09%7B%0A%09%09if%20%28this.%20_nSpeed%20%3E%200%29%0A%09%09%09this.%20_nSpeed%20%3D%20-this.%20_nSpeed%3B%0A%09%7D%2C%0A%09%0A%09setSpeed%3A%20function%20%28nSpeed%29%0A%09%7B%0A%09%09this.%20_nSpeed%20%3D%20nSpeed%3B%0A%09%7D%2C%0A%09%0A%09setDelay%3A%20function%20%28nDelay%29%0A%09%7B%0A%09%09this.%20stopScroll%20%28%29%3B%0A%09%09this.%20_nDelay%20%3D%20nDelay%3B%0A%09%7D%2C%0A%09%0A%09scroll%3A%20function%20%28%29%0A%09%7B%0A%09%09var%20win%20%3D%20this.%20_window%3B%0A%09%09if%20%28%28%28this.%20_nSpeed%20%3C%200%29%20%26%26%20%28win.%20pageYOffset%20%3E%200%29%29%20%7C%7C%0A%09%09%09%28%28this.%20_nSpeed%20%3E%200%29%20%26%26%20%28win.%20pageYOffset%20%3C%20%28this.%20oDocument.%20height%20-%20win.%20innerHeight%29%29%29%29%0A%09%09%09this.%20_window.%20scrollBy%20%280%2C%20this.%20_nSpeed%29%3B%0A%09%09else%0A%09%09%09this.%20stopScroll%20%28%29%3B%0A%09%7D%2C%0A%09%0A%09stopScroll%3A%20function%20%28%29%0A%09%7B%0A%09%09if%20%28this.%20oTimer%29%0A%09%09%7B%0A%09%09%09this.%20oTimer.%20cancel%20%28%29%3B%0A%09%09%09this.%20oTimer%20%3D%20null%3B%0A%09%09%7D%0A%09%7D%2C%0A%09%0A%09startScroll%3A%20function%20%28%29%0A%09%7B%0A%09%09if%20%28this.%20oTimer%29%0A%09%09%09this.%20stopTimer%20%28%29%3B%0A%09%09this.%20oTimer%20%3D%20Components.%20classes%20%5B%22@mozilla.org/timer%3B1%22%5D.%0A%09%09%09%09%09%20%20%20createInstance%20%28Components.%20interfaces.%20nsITimer%29%3B%0A%09%09this.%20oTimer.%20initWithCallback%20%28this%2C%20this.%20_nDelay%2C%201%29%3B%09%09%09%0A%09%7D%2C%0A%09%0A%09QueryInterface%3A%20function%20%28iid%29%0A%09%7B%0A%09%09if%20%28iid.%20equals%20%28Components.%20interfaces.%20nsISupports%29%20%7C%7C%0A%09%09%09iid.%20equals%20%28Components.%20interfaces.%20nsITimerCallback%29%29%0A%09%09%09return%20this%3B%0A%09%09return%20Components.%20results.%20NS_ERROR_NO_INTERFACE%3B%0A%09%7D%2C%0A%09%0A%09notify%3A%20function%20%28oTimer%29%0A%09%7B%0A%09%09this.%20scroll%20%28%29%3B%0A%09%7D%2C%0A%09%0A%09handleEvent%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20stopScroll%20%28%29%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20doScroll%20%3D%20function%20%28oEvent%29%0A%7B%0A%09var%20scroller%20%3D%20this.%20getScroller%20%28%29%3B%0A%09if%20%28oEvent.%20button%20%3D%3D%201%29%0A%09%7B%0A%09%09scroller.%20stopScroll%20%28%29%3B%0A%09%09return%3B%0A%09%7D%0A%09if%20%28oEvent.%20button%20%3D%3D%202%29%0A%09%09scroller.%20revertScroll%20%28%29%3B%0A%09scroller.%20startScroll%20%28%29%3B%0A%7D%3B%0A%0Athis.%20scrollPage%20%3D%20function%20%28evt%29%0A%7B%0A%09var%20scroller%20%3D%20this.%20getScroller%20%28%29%3B%0A%09scroller.%20setSpeed%20%281%29%3B%0A%09scroller.%20setDelay%20%28150%29%3B%0A%09if%20%28evt.%20button%20%3D%3D%202%20%26%26%20evt.%20shiftKey%29%0A%09%09this.%20showPopup%20%28this%29%3B%0A%09else%0A%09%09this.%20doScroll%20%28evt%29%3B%0A%7D%3B%0Athis.%20scrollPageFast%20%3D%20function%20%28evt%29%0A%7B%0A%09var%20scroller%20%3D%20this.%20getScroller%20%28%29%3B%0A%09scroller.%20setSpeed%20%2810%29%3B%0A%09scroller.%20setDelay%20%2850%29%3B%0A%09this.%20doScroll%20%28evt%29%3B%0A%7D%3B%0Athis.%20getScroller%20%3D%20function%20%28%29%0A%7B%0A%09var%20ct%20%3D%20getBrowser%20%28%29.%20selectedTab%3B%0A%09if%20%28%21ct.%20cbScrollButton%29%0A%09%09ct.%20cbScrollButton%20%3D%20new%20Scroller%20%28getBrowser%20%28%29.%20contentDocument%29%3B%0A%09return%20ct.%20cbScrollButton%3B%0A%7D%3B%0A%0Athis.%20showPopup%20%3D%20function%20%28node%29%0A%7B%0A%09var%20popup%20%3D%20document.%20getElementById%20%28%22custombuttons-contextpopup%22%29%3B%0A%09var%20x%20%3D%20node.%20boxObject.%20x%3B%0A%09var%20y%20%3D%20node.%20boxObject.%20y%20+%20node.%20boxObject.%20height%3B%0A%09document.%20popupNode%20%3D%20node%3B%0A%09popup.%20showPopup%20%28node%2C%20x%2C%20y%2C%20%22popup%22%2C%20null%2C%20null%29%3B%0A%7D%0Athis.%20setAttribute%20%28%22onclick%22%2C%20%22this.scrollPage%28event%29%3B%22%29%3B%0Athis.%20setAttribute%20%28%22ondblclick%22%2C%22this.scrollPageFast%28event%29%22%29%3B%0Athis.%20setAttribute%20%28%22context%22%2C%20%22%22%29%3B%0Athis.%20tooltipText%20%3D%20%27Down/Menu/Up%20%7E%20Fast%20Down//Fast%20Up%27%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/**%0A%20*%20@author%20Anton%20Glazatov%20%28c%29%2003.2008%0A%20*%20Scroll%20page%20button%20based%20on%20existing%20button%20idea%0A%20*%20new%20implementation%0A%20*%0A%20*%20Left%20click%20-%20scroll%20slow%20down%0A%20*%20Middle%20click%20-%20stop%20scroll%0A%20*%20Right%20click%20-%20scroll%20slow%20up%0A%20*%20Left%20double%20click%20-%20scroll%20fast%20down%0A%20*%20Right%20double%20click%20-%20scroll%20fast%20up%0A%20*%20Shift%20+%20Right%20click%20-%20Custom%20Buttons%20context%20menu%0A%20*/%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%5BLeft%20click%20-%20scroll%20slow%20down%0A%0AMiddle%20click%20-%20stop%20scroll%0A%0ARight%20click%20-%20scroll%20slow%20up%0A%0ALeft%20double%20click%20-%20scroll%20fast%20down%0A%0ARight%20double%20click%20-%20scroll%20fast%20up%0A%0AShift%20+%20Right%20click%20-%20Custom%20Buttons%20context%20menu%5D%5D%3E%3C/help%3E%0A%3C/custombutton%3E

Забыл сконвертировать картинку в base64... – исправил.

Себе ?

Обычно очищается атрибут context, а обработчик onclick показывает контекстное меню, когда надо.

Ага, ясно. А варианты с сохранением способа показа контекстного меню есть? (Т.е. сразу по нажатию / после отпускания кнопки.)

Себе ?

Ммм? Не понял...

Закрытие вкладок №2:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFCSURBVHjarFE7TsNAEH27ygFwFAkJUcMBDKlD4c5pE8miIyegymGS1hJ1fIoEDkCPkFa2+PgCy8xmbCzvJgLBk55n/PZ5NH4LawFiRJzZCbUWsWiHGNtb55vJd9AAImKCSzxgj0QYyxmkxp0z4Mb5uY8UT8QJCaf0ekY8l8rv97ii55MbsMYjPqkzxFfii9RnzDVUu0EIw171QQtoWMyPDHnrVR8f9H0b6gW1+2CXxEQCjjrBx6IvXbCT73DxH7fDwaJzA0NZ/f3IL3o+RbR9Fw1WSv1cH7Cy225b4Xo8BhurqvJWUGpkQ37NAjeN0DWEEPIPjDEoNhukJHCFMc5Q13VwSMivWUynU6xXK1eNDCnL0mMzpO9XfGssNLhbLFzaRVF4W6Rp6lIN+W1o7TzPPS3LsuAvKjJb/BEHN/kNvgQYAML08vlxNjfkAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.setAttribute%28%22context%22%2C%20%22%22%29%3B%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%09var%20br%20%3D%20getBrowser%28%29%3B%0A%09var%20cTab%20%3D%20br.mCurrentTab%3B%0A%09switch%28e.button%29%20%7B%0A%09%09case%200%3A%0A%09%09%09var%20tabs%20%3D%20br.mTabContainer.childNodes%3B%0A%09%09%09var%20left%20%3D%20false%3B%0A%09%09%09for%28var%20i%20%3D%20tabs.length%20-%201%3B%20i%20%3E%3D%200%3B%20--i%29%20%7B%0A%09%09%09%09if%28left%29%0A%09%09%09%09%09br.removeTab%28tabs%5Bi%5D%29%3B%0A%09%09%09%09if%28tabs%5Bi%5D%20%3D%3D%20cTab%29%0A%09%09%09%09%09left%20%3D%20true%3B%0A%09%09%09%7D%0A%09%09break%3B%0A%09%09case%201%3A%0A%09%09%09br.removeAllTabsBut%28br.mCurrentTab%29%3B%0A%09%09break%3B%0A%09%09case%202%3A%0A%09%09%09if%28e.shiftKey%20%7C%7C%20e.ctrlKey%20%7C%7C%20e.altKey%20%7C%7C%20e.metaKey%29%0A%09%09%09%09this.showPopup%28e%29%3B%0A%09%09%09var%20tabs%20%3D%20br.mTabContainer.childNodes%3B%0A%09%09%09for%28var%20i%20%3D%20tabs.length%20-%201%3B%20i%20%3E%3D%200%3B%20--i%29%20%7B%0A%09%09%09%09if%28tabs%5Bi%5D%20%3D%3D%20cTab%29%0A%09%09%09%09%09break%3B%0A%09%09%09%09br.removeTab%28tabs%5Bi%5D%29%3B%0A%09%09%09%7D%0A%09%7D%0A%7D%3B%0Athis.showPopup%20%3D%20function%28e%29%20%7B%0A%09var%20popup%20%3D%20document.getElementById%28%22custombuttons-contextpopup%22%29%3B%0A%09var%20x%20%3D%20e.clientX%2C%20y%20%3D%20e.clientY%3B%0A%09var%20node%20%3D%20e.target%3B%0A%09document.popupNode%20%3D%20node%3B%0A%09popup.showPopup%28node%2C%20x%2C%20y%2C%20%22popup%22%2C%20null%2C%20null%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

(вроде, через event.clientX (Y) больше похоже на обычное поведение :))

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

Я проблемой мануального отображения контекстного меню в практике конструирования кнопок не занимался никогда. this.showPopup - это из кнопок LouCypher'а. То есть, готового кода нет у меня и не попадалось.

Ммм? Не понял...

Ну, там было что-то вроде file:///D:/....

Anton написал:

Ну, там было что-то вроде file:///D:/....

Было, но текст, который ты процитировал («Забыл сконвертировать картинку в base64... – исправил.»), я добавил вместе с исправлением кода кнопки. Это меня и смутило.

То есть, готового кода нет у меня и не попадалось.

Ясно.
Однако у меня есть подозрение, что способ показа контекстного меню сохраняется где-то в about:config (впрочем, может, расширение какое делает), потому как если мой основной профиль (под Windows) использовать в Linux, контекстное меню будет показываться по нажал-отпустил. Будет время – поковыряюсь... [позже: видимо, это делает Mouse Gestures в включенными жестами вида ПКМ-ЛКМ.]

Написал скрипт для вставки URL (а также времени сохранения) в сохраняемую страницу.
Если текущая страница – about:blank, то открывается диалог «Открыть файл». Во всех остальных случаях – диалог сохранения. Если установлено ILO, будет включена политика «загружать только из кэша».

Код:

if(getBrowser().currentURI.spec == "about:blank")
    BrowserOpenFileWindow();
else {
    try { ILO.indicatorClick(3); } catch(e) {}
    var doc = content.document;
    var html = doc.getElementsByTagName("html");
    if(html.length) {
        html = html[0];
        var loc = doc.location.href;
        var info = " Saved from (" + new Date().toLocaleString() + "): " + loc + " ";
        var comm = doc.createComment(info);
        var fch = html.firstChild;
        html.insertBefore(doc.createTextNode("\n"), fch);
        html.insertBefore(comm, fch);
        html.insertBefore(doc.createTextNode("\n"), fch);
    }
    saveDocument(doc);
}

P.S. Ох уж эта жуткая тавтология с «сохранить» :D

Кнопка для Thunderbird, показывающая меню, аналогичное Настройки – Формат. Как и оригинальное меню, доступно только из HTML-редактора. По клику средней кнопкой мыши переключает на простой текст.
Код: http://pastebin.mozilla-russia.org/91283
Инициализация: http://pastebin.mozilla-russia.org/91284

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

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EsetBackgroundColor%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Btry%0A%7B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09doc.%20body.%20style.%20backgroundColor%20%3D%20%22rgb%28236%2C233%2C216%29%22%3B%0A%09doc.%20body.%20style.%20lineHeight%20%3D%20%222%22%3B%0A%09doc.%20body.%20style.%20textIndent%20%3D%20%223em%22%3B%0A%09doc.%20body.%20style.%20textHeight%20%3D%20%223%25%22%3B%0A%09doc.%20body.%20style.%20textAlign%20%3D%20%22justify%22%3B%0A%7D%0Acatch%20%28e%29%20%7B%7D%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%3C/custombutton%3E

[ul][uli]Делает цвет фона страницы таким же, как у панелей инструментов[/uli][uli]Выравнивает текст по ширине[/uli][uli]Увеличивает отступы первой строки в абзацах[/uli][uli]Увеличивает междустрочный интервал[/uli][/ul]

UPD 26.05.08 - поправил код кнопки, так как первоначальный не выравнивал текст по ширине

Anton, а не проше ли делать так: http://pastebin.mozilla-russia.org/91285?
Кстати, на тему удобочитаемости: http://forum.mozilla-russia.org/viewtop … 42#p230242 :)
Это я к тому, что можно сделать аналогичную штуку только при помощи закладок, да еще и с выключением.

P.S. Спасибо за апдейт :beer:

Infocatcher написал:

Anton, а не проше ли делать так: http://pastebin.mozilla-russia.org/91285?

В данном конкретном и простом случае - конечно проще. Но с некоторых пор я не сторонник использования with, да и не ставил себе целью "заточку" кода этой кнопки. В исходном варианте там была всего одна строка - на background.

Конструкцию with лучше совсем не использовать - поверь моему опыту как разработчика Pastebin Panel.

Кстати, на тему удобочитаемости: http://forum.mozilla-russia.org/viewtop … 42#p230242 :)
Это я к тому, что можно сделать аналогичную штуку только при помощи закладок, да еще и с выключением.

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

Anton

Конструкцию with лучше совсем не использовать - поверь моему опыту как разработчика Pastebin Panel.

А можно поподробнее? А то у меня никаких идей, кроме создания «лишней» области видимости, нет...

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

Ну, с этим все просто. Редактируется скрипт в нормальном виде, потом удаляются комментарии, пробелы, переводы строк и все это запускается черех адресную строку.
В моем конкретном случае это AkelPad + плагин Scripts + простенький скрипт

Добавлено Sun May 11 02:35:58 2008 :
P.S. Кстати, Pastebin что-то плохо переваривает регулярные выражения (в их подсветке пока что побеждает Notepad++)...

Вот для примера: http://pastebin.mozilla-russia.org/91287
Спустя год, мне уже неочевидно какие поля и методы содержит PastebinRDFService. (да даже и полгода спустя, прошлым летом, было неочевидно).
Надо сверяться с idl. Если сделаю опечатку в названии метода, мне никто не скажет, что у PastebinRDFService нет такого метода, и надо будет выяснять, почему registry_file не определена. Если выявится ошибка где-нибудь на rdfService, надо будет выяснять что это такое - переменная, или поле PastebinRDFService. Ещё при именовании временных переменных в пределах with блока надо помнить о возможности коллизий с дополнительной областью видимости.

Anton

Вот для примера

И в таких случаях лучше обозвать pastebinRDFService каким-нибудь prs (var prs = pastebinRDFService;) и так дальше и обращаться? И, кстати, как определить, что «попало в переменную» – ссылка на исходный объект или значение? Т.е. не вредно ли делать штуки вида var d = document; ?

И в таких случаях лучше обозвать pastebinRDFService каким-нибудь prs

Хотя бы так. Можно и в развёрнутом виде. В конкретном случае с pastebin panel - ещё и переработать интерфейсы компонентов - не очень удачные.

не вредно ли делать штуки вида var d = document; ?

Иногда просто необходимо.

Кнопка для Thunderbird, сохраняет выделенные сообщения в указанный каталог на диске

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EsaveSelected%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20Cc%20%3D%20Components.%20classes%3B%0Avar%20Ci%20%3D%20Components.%20interfaces%3B%0Afunction%20getDirectory%20%28%29%0A%7B%0A%09var%20fp%20%3D%20Cc%20%5B%22@mozilla.org/filepicker%3B1%22%5D.%0A%09%09%20createInstance%20%28Ci.%20nsIFilePicker%29%3B%0A%09fp.%20init%20%28window%2C%20%22%22%2C%20fp.%20modeGetFolder%29%3B%0A%09var%20res%20%3D%20fp.%20show%20%28%29%3B%0A%09return%20fp.%20file%3B%0A%7D%0Afunction%20saveAsFile%20%28uri%2C%20dir%29%0A%7B%0A%09var%20content%20%3D%20%22%22%3B%0A%09var%20subject%20%3D%20messenger.%20messageServiceFromURI%20%28uri%29.%0A%09%09%20%20%20%20%20%20messageURIToMsgHdr%20%28uri%29.%20mime2DecodedSubject%3B%0A%09filename%20%3D%20GenerateValidFilename%20%28subject%2C%20%22.eml%22%29%3B%0A%09var%20msgService%20%3D%20messenger.%20messageServiceFromURI%20%28uri%29%3B%0A%09var%20msgStream%20%3D%20%20Cc%20%5B%22@mozilla.org/network/sync-stream-listener%3B1%22%5D.%20createInstance%20%28%29%3B%0A%09var%20consumer%20%3D%20msgStream.%20QueryInterface%20%28Ci.%20nsIInputStream%29%3B%0A%09var%20scriptInput%20%3D%20Cc%20%5B%22@mozilla.org/scriptableinputstream%3B1%22%5D.%0A%09%09%09%20%20createInstance%20%28%29%3B%0A%09var%20scriptInputStream%20%3D%20scriptInput.%20QueryInterface%28Ci.%20nsIScriptableInputStream%29%3B%0A%09scriptInputStream.%20init%20%28consumer%29%3B%0A%09try%0A%09%7B%0A%09%09msgService.%20streamMessage%20%28uri%2C%20msgStream%2C%20msgWindow%2C%20null%2C%20false%2C%20null%29%3B%0A%09%7D%0A%09catch%20%28ex%29%0A%09%7B%0A%09%09alert%28%22error%3A%20%22+ex%29%0A%09%7D%0A%09scriptInputStream.%20available%20%28%29%3B%0A%09while%20%28scriptInputStream.%20available%20%28%29%29%0A%09%7B%0A%09%09content%20%3D%20content%20+%20scriptInputStream.%20read%20%28512%29%3B%0A%09%7D%0A%09var%20subject%20%3D%20msgService.%20messageURIToMsgHdr%20%28uri%29.%0A%09%09%20%20%20%20%20%20mime2DecodedSubject%3B%0A%09var%20fileName%20%3D%20GenerateValidFilename%20%28subject%2C%20%22.eml%22%29%3B%0A%09var%20file%20%3D%20dir.%20clone%20%28%29%3B%0A%09file.%20append%20%28fileName%29%3B%0A%09var%20foStream%20%3D%20Cc%20%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.%0A%09%09%20%20%20%20%20%20%20createInstance%20%28Ci.%20nsIFileOutputStream%29%3B%0A%09var%20flags%20%3D%200x02%20%7C%200x08%20%7C%200x20%3B%0A%09foStream.%20init%20%28file%2C%20flags%2C%200664%2C%200%29%3B%0A%09foStream.%20write%20%28content%2C%20content.%20length%29%3B%0A%09foStream.%20close%20%28%29%3B%0A%7D%0Avar%20dir%20%3D%20getDirectory%20%28%29%3B%0Aif%20%28%21dir%29%0A%09return%3B%0Avar%20messageArray%20%3D%20GetSelectedMessages%28%29%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20messageArray.%20length%3B%20i++%29%0A%09saveAsFile%20%28messageArray%20%5Bi%5D%2C%20dir%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%3C/custombutton%3E

Anton
Помнится, был способ с помощью кнопки, но держать лишний элемент интерфейса, по-моему, неудобно... В общем, как мне кажется, стоит добавить в Thunderbird пункт меню для добавления кнопки из кода вида custombutton://...

P.S. Ты в аське, указанной в профиле, бываешь?

Помнится, был способ с помощью кнопки,...

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

P.S. Ты в аське, указанной в профиле, бываешь?

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

иначе бы не стал писать, взял бы готовую.

Я это к тому, что удобно было бы добавить функционал простого добавления кнопок в виде «URL'а» в расширение.

Если надо - давай договоримся о времени.

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

добавить функционал простого добавления кнопок в виде «URL'а» в расширение

Ага, понял. А "Клонировать" -> "Обновить" ? Для пункта меню надо будет делать дополнительный контроллер, проверяющий содержимое буфера обмена. Не то, чтобы лень - сомнения в целесообразности.

Друзья!Следующая ситуация.Есть кнопка из гугля,для перевода,на яве

Код:

javascript:var t=((window.getSelection&&window.getSelection())||(document.getSelection&&document.getSelection())||(document.selection&&document.selection.createRange&&document.selection.createRange().text));var e=(document.charset||document.characterSet);if(t!=''){location.href='http://translate.google.com/translate_t?text='+t+'&hl=ru&langpair=auto|en&tbb=1&ie='+e;}else{location.href='http://translate.google.com/translate?u='+escape(location.href)+'&hl=ru&langpair=auto|en&tbb=1&ie='+e;};

Но она скорее не кнопка,а ссылка.Сидит в закладках.Может кто сообразит,как из нее сделать нормальную кнопку,для панели инструментов.У меня мозгов не хватает.

Добавлено Tue May 20 16:52:56 2008 :

Код:

javascript:var t=((window.getSelection&&window.getSelection())||(document.getSelection&&document.getSelection())||(document.selection&&document.selection.createRange&&document.selection.createRange().text));var e=(document.charset||document.characterSet);if(t!=''){location.href='http://translate.google.com/translate_t?text='+t+'&hl=ru&langpair=auto|en&tbb=1&ie='+e;}else{location.href='http://translate.google.com/translate?u='+escape(location.href)+'&hl=ru&langpair=auto|en&tbb=1&ie='+e;};

Добавлено Tue May 20 16:53:37 2008 :
Блин смайлика тута нетю :cry: хад такой.

Проще всего записать

Код:

getBrowser (). contentDocument. location. href = "

потом текст закладурки и, наконец поставить закрывающую кавычку.

сделал так но не пашет.Что еще добавить треба?Или вообще не так сделал?

getBrowser (). contentDocument. location. href = "javascript:var t=((window.getSelection&&window.getSelection())||(document.getSelection&&document.getSelection())||(document.selection&&document.selection.createRange&&document.selection.createRange().text));var e=(document.charset||document.characterSet);if(t!=''){location.href='http://translate.google.com/translate_t?text='+t+'&hl=ru&langpair=auto|ru&tbb=1&ie='+e;}else{location.href='http://translate.google.com/translate?u='+escape(location.href)+'&hl=ru&langpair=auto|ru&tbb=1&ie='+e;};
Нет,не получаеться у меня,правильно показать вам

В конце должна быть кавычка. То есть, пишем текст

Код:

getBrowser (). contentDocument. location. href = ""

а между кавычками вставляем текст закладурки

Anton

:beer: Супер!Респектуха вам гуру.
Может еще подскажете,как делать в посте,окошко с кодами.Хочу поделиться кнопарями с народом.Зачем лишнии расширения ставить,когда можно кнопками поделиться и заюзать их.
А то мну не умеет :blush: Усе,не надо.Спасибки вам,за правку поста.Просмотрел и сам понял как.:rock::beer:

как делать в посте,окошко с кодами

[code]code[/code]

А чем кнопка лучше закладок ?

Anton

Ну мне так удобнее.Легче в профили переносить.Да  и люблю я,что бы у меня постоянно все было.Короче спасибо вам большое.Если что,надеюсь мона обратиться за помощью?:angel:

А чем кнопка лучше закладок ?

Тем, что можно сделать открытие в новой вкладке :)

Перевести через Google:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGoogle%20Translate%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20t%20%3D%20content.getSelection%28%29.toString%28%29%3B%0Avar%20c%20%3D%20content.document.characterSet%3B%0Avar%20loc%20%3D%20content.location.href%3B%0AgetBrowser%28%29.loadOneTab%28%0A%09t%0A%09%09%3F%20%22http%3A//translate.google.com/translate_t%3Ftext%3D%22%20+%20t%20+%20%22%26hl%3Dru%26langpair%3Den%7Cru%26tbb%3D1%26ie%3D%22%20+%20c%0A%09%09%3A%20/%5Ehttps%3F%3A%5C/%5C//i.test%28loc%29%0A%09%09%09%3F%20%22http%3A//translate.google.com/translate%3Fu%3D%22%20+%20escape%28loc%29%20+%20%22%26hl%3Dru%26langpair%3Den%7Cru%26tbb%3D1%26ie%3D%22%20+%20c%0A%09%09%09%3A%20%22http%3A//translate.google.com/translate_t%3Fhl%3Dru%22%2C%0A%09null%2C%20null%2C%20null%2C%20false%20/*%20load%20in%20background%20*/%2C%20false%0A%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%3C/custombutton%3E

(http://pastebin.mozilla-russia.org/91351)

Infocatcher

К сожалению,ваша кнопка не работает.Сдесь я выложил рабочие
http://forum.mozilla-russia.org/viewtop … 49&p=7

Добавлено Wed May 21 10:20:38 2008 :

Anton

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

Infocatcher

Тем, что можно сделать открытие в новой вкладк

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

vv07

Если что,надеюсь мона обратиться за помощью?

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

К сожалению,ваша кнопка не работает.

Может быть, кнопка была установлена неправильно ? Код Infocatcher'а надо поместить в адресную строку браузера и нажать enter. Потом "вытащить" установленную кнопку из диалога настройки панелей инструментов.
Или, скопировав код в буфер обмена, клонировать и обновить уже существующую кнопку (в контекстном меню кнопок есть соответствующие пункты).

Уважаемый гуру.

Мне это не нравится. Так что будьте любезны, без лишних церемоний.

...нельзя ли сделать,своего рода,собрание разных,готовых кнопок?Типа текстового файлика.

Не понял, о чём речь. Если нужны готовые кнопки, то можно найти в этой теме, на офф. сайте расширения - http://xsms.nm.ru/custombuttons, у Dark-Demon'а на сайте - http://dark-demon.nm.ru, на сайте поддержки (адрес - у меня в профиле), на старом форуме расширения - http://custombuttons.phpbbnow.com, на форуме расширения custombuttons2 - http://custombuttons2.com. Кое-какие кнопки с последних двух сайтов могут не работать.

Anton

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

Кстати, нашел багу. При таком добавлении кнопки теряются переводы строк в коде. Наблюдаю на fx 2.0.0.14 + cb 0.0.3 при добавлении моей кнопки для перевода через Гугл.

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

И не только при таком. Давно видел. На основном профиле. В соседнем - не теряются.
В чём дело, однако - не знаю. Так что пока wontfix.

p.s.
Infocatcher
NoScript ? noscript.fixURI <- false (не выяснил ещё, какой настройке в диалоге NoScript это соответствует)

Anton

NoScript ? noscript.fixURI <- false (не выяснил ещё, какой настройке в диалоге NoScript это соответствует)

Да, он самый.
Интересно, почему он еще не удален с тестового профиля? :-/

(не выяснил ещё, какой настройке в диалоге NoScript это соответствует)

И соответствует ли вообще...

Либо noscript.fixURI.exclude <- ^custombutton://[\s\S]*$

И соответствует ли вообще...

Похоже на то.

Попробую отписать разработчику NoScript.

Попробую отписать разработчику NoScript.

=)
А зачем
[\s\S]*$
?
Это же «любые символы в конце строки»...

^custombutton://\S+$ (там действительно не бывает пробелов?)
или
^custombutton://

А зачем
[\s\S]*$
?

Привычка.

Привычка.

Поподробнее бы... Меня несколько иного рода причины интересуют.
И почему тогда не
.*$
?

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

Anton

Уважаемый Антон.Я думаю вы знаете о таком расширении,как Fast Dial.
Так вот,у него есть возможность добавления ссылок, из контекстного меню.Это не совсем удобно.Нельзя ли кнопочку придумать?:angel:

Уважаемый Антон.

Короче, без эпитетов.

По теме:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EAddToFastDial%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bdocument.%20getElementById%20%28%22fastdial-add-menu%22%29.%20doCommand%20%28%29%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%3C/custombutton%3E

Думаю, спросить у самого разработчика Fast Dial было бы короче, да и код он бы дал более корректный.

Короче, без эпитетов.

Блин,да не умею обращаться к незнакомым людям просто.
Мне 45 лет и воспитание малость другое.Терпите уж.Спасибо за кнопку:beer:.К автору как то недобняк было, с этим.Мы и так достали его уже.

vv07

Блин,да не умею обращаться к незнакомым людям просто.

Ничего страшного. Я не требую и мне так комфортней. Да и 45 мне ещё не скоро, так что, если ситуация верна, то мне даже и не положено.

За ум положено:cool: Чего мне не хватает:tongue2:

Infocatcher написал:

...
или
^custombutton://

Оказывается, это список протоколов, разделённый чем угодно, кроме латинских букв, цифр и знака подчёркивания. Так что можно просто custombutton.

Anton

Есть замечательное расширение profileswitcher,позволяющее работать с профилями.Переключение через контекстное меню.Вопрос,можно ли создать кнопку с выпадающим меню выбора профилей?А еще более сложное дело,создание кнопки позволяющей запускать разные профили без перезагрузки лисы:angel:
Второй вопрос архиважный,по крайней мере для меня.Есть кнопка для скрытия статусной строки,но она работает только до перезагрузки лисы.Есть ли возможность,сварганить кнопарь,который бы скрывал строку до ручного включения,независимо от того,перегрузилась лиса или нет.Автохайды не интересуют,так как не очень хорошо работают.Буду признателен.:dumb:

vv07

можно ли создать кнопку с выпадающим меню выбора профилей?

Примерно так: http://pastebin.mozilla-russia.org/91358 (код добавлять в секцию «инициализация»).

var _href = null; – открывать текущую ссылку
var _href = "about:blank"; – открывать указанную ссылку
var _paths = ["путь_к_exe-файлу-0", "путь_к_exe-файлу-1"]; – пути к файлам
var _args = [["arg-0-0", "arg-0-1", "arg-0-2"], ["arg-1-0", "arg-1-1", "arg-1-2"]]; – аргументы

Если аргументы не нужны, надо указать «[]»:

Код:

var _href = null;
var _paths = ["c:\\Program Files\\Opera\\Opera.exe", "c:\\Program Files\\Opera 9.5 beta\\opera.exe"];
var _args = [[], []];
var _labels = ["Opera", "Opera 9.50 b2"];

["-no-remote", "-p", "MyProfile"] запустит штуку вида
путь_к_exe -no-remote -p MyProfile
-no-remote – для запуска нескольких профилей одновременно.
-p – запуск менеджера профилей
-p "ИмяПрофиля" – запуск конкретного профиля

var _labels = ["2.0 MyProfile", "3.0 RC 1 fx3"]; – названия пунктов меню

Только ссылки с кириллицей заглючат...

Infocatcher

Так откуда мне код взять?По ссылке или сдесь.Не совсем понятно.Однако спасибо за оперативность.

Так откуда мне код взять?По ссылке или сдесь.

Код брать по ссылке. А «здесь» – пояснения по его использованию.

Добавлено Fri May 23 07:58:48 2008 :
P.S. Забыл уточнить, что код по ссылке надо добавлять в секцию «инициализация» – предыдущее сообщение подкорректировал.

Кнопка заработала,но как то не так.В выпадающем показывает My profile и не существущую тройку.При клике на My profile,открываеться менеджер профилей.Не совсем то,что я имел в виду,но тоже пойдет :beer: Я то имел в виду,что бы в выпадающем отображались существующие,мои профили.Default и  Default User centurion.

Вопрос,можно ли создать кнопку с выпадающим меню выбора профилей?

Можно. Вот, для работы в паре с profileswitcher:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EprofilesMenu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20_this%20%3D%20this%3B%0Athis.%20cbInit%20%3D%20function%20%28%29%0A%7B%0A%09var%20profileLauncherPrefs%20%3D%20Components.%20classes%20%5B%22@mozilla.org/preferences-service%3B1%22%5D.%0A%09%09%09%09%09%09%09%20%20%20getService%20%28Components.%20interfaces.%20nsIPrefBranch%29%3B%0A%09var%20popup%20%3D%20document.%20createElement%20%28%22menupopup%22%29%3B%0A%09if%20%28profileLauncherPrefs.%20getPrefType%20%28%22profiles.list%22%29%20%21%3D%200%29%0A%09%7B%0A%09%09var%20profilesListPref%20%3D%20profileLauncherPrefs.%0A%09%09%09%09%09%09%09%20%20%20getComplexValue%20%28%22profiles.list%22%2C%20Components.%20interfaces.%20nsISupportsString%29.%0A%09%09%09%09%09%09%09%20%20%20data%3B%0A%09%09var%20profilesList%20%3D%20profilesListPref.%20split%20%28%22%2C%2C%2C%22%29%3B%0A%09%09for%20%28i%20%3D%200%3B%20i%20%3C%20profilesList.%20length%3B%20i++%29%0A%09%09%7B%0A%09%09%09var%20item%20%3D%20document.%20createElement%20%28%22menuitem%22%29%3B%0A%09%09%09item.%20setAttribute%20%28%22label%22%2C%20profilesList%20%5Bi%5D%29%3B%0A%09%09%09item.%20setAttribute%20%28%22oncommand%22%2C%20%22profileLauncher.runScript%28this%29%22%29%3B%0A%09%09%09popup.%20appendChild%28item%29%3B%0A%09%09%7D%0A%09%7D%0A%09_this.%20appendChild%20%28popup%29%3B%0A%09_this.%20type%20%3D%20%22menu%22%3B%0A%09_this.%20orient%20%3D%20%22horizontal%22%3B%0A%7D%3B%0AsetTimeout%20%28this.%20cbInit%2C%202000%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

создание кнопки позволяющей запускать разные профили без перезагрузки лисы

Это мне не по силам.

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

Так:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Estatusbar%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20sb%20%3D%20document.%20getElementById%20%28%22status-bar%22%29%3B%0Asb.%20hidden%20%3D%20true%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20sb%20%3D%20document.%20getElementById%20%28%22status-bar%22%29%3B%0Asb.%20hidden%20%3D%20%21sb.%20hidden%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%3C/custombutton%3E

?

Ух ти,круть.:rock:

vv07

Я то имел в виду,что бы в выпадающем отображались существующие,мои профили.Default и  Default User centurion.

Угу. Так оно, конечно, удобнее, но поиск и парсинг profiles.ini несколько труднее, чем запуск предопределенных пользователем приложений.
Так что в моем скрипте надо самостоятельно прописать пути к исполняемым файлам и параметры, с которыми их надо запускать.
Т.е. начало (от «var _href =» до «var _labels = ... ;») надо настраивать самостоятельно. Должно получиться нечто подобное:

Код:

var _href = null; // URL or null for use current page
var _paths = ["c:\\Program Files\\Mozilla Firefox\\firefox.exe", "c:\\Program Files\\Mozilla Firefox\\firefox.exe"];
var _args = [["-no-remote", "-p", "Default"], ["-no-remote", "-p", "Default User centurion"]];
var _labels = ["Default", "Default User centurion"];

Добавлено Fri May 23 20:21:04 2008 :
P.S. Антон, а для чего

Код:

setTimeout (this. cbInit, 2000);

?
(Разве не достаточно нулевого таймаута или вообще какого-нибудь load-обработчика?)

Разве не достаточно нулевого таймаута или вообще какого-нибудь load-обработчика?

Я попробовал без тайм-аута - не работает, пока не будет открыто меню profileswitcher, ну и поставил с запасом - а вдруг с нулевым тайм-аутом не сработает - чтобы не проверять лишний раз. load-обработчик снимать надо, и вообще нетривиально.

Infocatcher

Вы сделали даже больше чем я ожидал.Ваша кнопка переключает профили,без перезагрузки и практически незаметно:rock:

Добавлено Sat May 24 02:03:30 2008 :
Блин мужики,я незнаю что и как,не разбираюсь в этом,но вы на верном пути :D
Вот такой вариант я собрал по вашим кодам

Код:

var _href = null; // URL or null for use current page
var _paths = ["c:\\Program Files\\Mozilla Firefox\\firefox.exe", "c:\\Program Files\\Mozilla Firefox\\firefox.exe"];
var _args = [["-no-remote", "-p", "Default"], ["-no-remote", "-p", "Default User centurion"]];
var _labels = ["Default", "Default User centurion"];

this.runProcess = function(path, args) {
    args.push(_href ? _href : content.location.href);
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath(path);
    if(!file.exists() || !file.isExecutable() || /\.lnk$/i.test(path)) {
        alert("Invalid path!\n" + path);
        return;
    }
    var process = Components.classes["@mozilla.org/process/util;1"]
        .getService(Components.interfaces.nsIProcess);
    process.init(file);
    process.run(false, args, args.length);
};
var mp = document.createElement("menupopup");
var template = document.createElement("menuitem");
template.className = "menuitem-iconic";
template.setAttribute("oncommand", "_this.runProcess(this.path, this.args);");
var mi;
for(var i = 0, len = _paths.length; i < len; i++) {
    mi = template.cloneNode(true);
    mi.path = _paths[i];
    mi.args = _args[i];
    mi.label = _labels[i];
    mi.tooltipText = _paths[i] + " " + _args[i].join(" ");
    mi.setAttribute("image", "moz-icon:file://" + _paths[i]);
    mi._this = this;
    mp.appendChild(mi);
}
this.appendChild(mp);
this.type = "menu";
this.orient = "horizontal";

Два моих профиля.Так вот,при переключении запускаеться профиль,но и второй остаеться в работе :lol::lol::lol: То есть оба профиля одновременно.Давайте парни,кумекайте,возможно это рабочий вариант.
Правда иногда появляеться нюанс"FF уже запущен,закройте сперва окно"но при этом все таки запускаеться.:dumb::beer:
Пардон,забыл уточнить.При этом папка второго профиля находиться,на другом диске,воть.Уф як тяжело енто все для мну.

То есть оба профиля одновременно.

Это эффект от запуска firefox.exe с аргументом -no-remote.
Но при этом открытие локальных html'ек происходит в профиле, запущенном без -no-remote. Если такого в данный момент нет, он будет запущен.

создание кнопки позволяющей запускать разные профили без перезагрузки лисы

Я так понимаю, что profileswitcher (это только предположение – код расширения не смотрел) таким образом обходит описанную выше трудность с -no-remote.

Друзья!Есть кнопка для скрытия панели закладок,но она работает только до перезапуска лисы.Не могли бы вы поправить код,как сделали мне для статусстроки.Что бы она отключала панель закладок,до ручного включения,по аналогу статус.
Вот код

Код:

var mb = document.getElementById("PersonalToolbar"); mb.collapsed = !mb.collapsed;

Надоел уже наверное со своими просьбами:angel:

vv07

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

Хотел объяснить как внести соответствующие исправления в кнопку для скрытия строки состояния, но обнаружил в ней экспериментальные ляпы. Так что код для той кнопки я исправил (см. выше).

Для скрытия панели закладок:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Epersonalbar%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.%20cbInit%20%3D%20function%20%28%29%0A%7B%0A%09var%20mb%20%3D%20document.%20getElementById%20%28%22PersonalToolbar%22%29%3B%0A%09mb.%20collapsed%20%3D%20true%3B%0A%7D%3B%0AsetTimeout%20%28this.%20cbInit%2C%201000%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20mb%20%3D%20document.%20getElementById%20%28%22PersonalToolbar%22%29%3B%0Amb.%20collapsed%20%3D%20%21mb.%20collapsed%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%3C/custombutton%3E

Хотел объяснить как внести соответствующие исправления в кнопку для скрытия строки состояния, но обнаружил в ней экспериментальные ляпы. Так что код для той кнопки я исправил (см. выше).

Да незнаю.Она у меня прекрасно работает

а в чем ошибка?

Лишний код.

Еще один вопрос.Я создал новую панель.Обозвал ее work.Возможно ли создание кнопки,для скрытия таких панелей.Второе,надыбал интересный стиль,который автоскрывает панель навигации.По аналогу возможно ли создание кнопки,при запуске которой,автоскрывались все панели или хотя бы на каждую панель,отдельный кнопарь.

Для work:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EhideWork%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20tb%20%3D%20document.%20getElementById%20%28%22__customToolbar_work%22%29%3B%0Atb.%20collapsed%20%3D%20%21tb.%20collapsed%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%3C/custombutton%3E

создание кнопки,при запуске которой,автоскрывались все панели

F11 ?
Для всех панелей (по умолчанию назначена клавиша F12)

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EhideToolbars%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28typeof%20%28this.%20cbCollapse%29%20%3D%3D%20%22undefined%22%29%0A%09this.%20cbCollapse%20%3D%20true%3B%0Aelse%0A%09this.%20cbCollapse%20%3D%20%21this.%20cbCollapse%3B%0Avar%20tbs%20%3D%20document.%20getElementsByTagName%20%28%22toolbar%22%29%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20tbs.%20length%3B%20i++%29%0A%7B%0A%09if%20%28%21this.%20cbCollapse%29%0A%09%7B%0A%09%09tbs%20%5Bi%5D.%20collapsed%20%3D%20tbs%20%5Bi%5D.%20cbHideToolbars%3B%0A%09%7D%0A%09else%0A%09%7B%0A%09%09tbs%20%5Bi%5D.%20cbHideToolbars%20%3D%20tbs%20%5Bi%5D.%20collapsed%3B%0A%09%09tbs%20%5Bi%5D.%20collapsed%20%3D%20true%3B%0A%09%7D%0A%7D%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5BF12%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%3C/custombutton%3E

Нет Антон.F11 полноэкранный режим,не то.Мне нужно скрытие панелей,но при этом сама лиса оставалась в режиме обычного окна.

Добавлено Mon May 26 10:07:00 2008 :

Для всех панелей (по умолчанию назначена клавиша F12)

По идее то что и нужно.Только вот F12 зря назначена.При ее нажатиивозникают следующие проблемы.Не могу писать в форуме,не работает копирование,остальное пока незнаю.Надо придумать другой вариант.

Только вот F12 зря назначена.

Так можно назначить любую другую. "Редактировать" -> "Настройки кнопки"

.Не могу писать в форуме,не работает копирование

Ну вот, я себе эту кнопку поставил, нажал F12, залогинился, пишу ответ, всё в порядке, копирование работает.

Спасибо

спасибо за програмульку.
Нашел баг в Вашей кнопке.

кнопка:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EsetBackgroundColor%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Btry%20%7B%20%20var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%20%20doc.%20body.%20style.%20backgroundColor%20%3D%20%22rgb%28236%2C233%2C216%29%22%3B%20%20doc.%20body.%20style.%20lineHeight%20%3D%20%222%22%3B%20%20doc.%20body.%20style.%20textIndent%20%3D%20%223em%22%3B%20%20doc.%20body.%20style.%20textHeight%20%3D%20%223%25%22%3B%20%7D%20catch%20%28e%29%20%7B%7D%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%3C/custombutton%3E

попробуйте здесь нажать её
http://forum.mozilla-russia.org/viewtopic.php?id=9591&p=22
и посмотрите, что будет ссылками на следующие страницы. Она их обрежет. Т.е. были доступны 23, 24, и тд.. После нажатия, исчезнут. Лишь 22(та, на которой кнопку нажали) будет доступна.


мои данные:
Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9) Gecko/2008051206 Firefox/3.0 ID:2008051206

Adblock Plus 0.7.5.4
AI Roboform Toolbar for Firefox 6.9.89
Auto Copy 0.6.4
BBCode 0.5.2.2
BlockSite 0.7
Custom Buttons 0.0.3
Fast Dial 1.89
Greasemonkey 0.7.20080121.0
ImgLikeOpera 0.6.15
Nightly Tester Tools 2.0.2
NoScript 1.6.5
Tab Mix Plus 0.3.6.1.080416
User Agent Switcher 0.6.11

Нашел баг в Вашей кнопке.

Если это вообще можно назвать багом, то это баг форума, а не кнопки. )

Если это вообще можно назвать багом, то это баг форума, а не кнопки. )

Я просто не силен в программировании. Поэтому написал, что в кнопке. Так как после её нажатия такое происходит. Потом если нажать "Обновить(F5)", то всё на свои места становится =).

Так как после её нажатия такое происходит.

Это происходит ещё до её нажатия.

Впрочем, неважно. Всё равно, кнопка не предназначена для использования на всех подряд сайтах и работает как заявлено не везде.

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

Пытаюсь клонировать вкладку в Firefox 3.0 RC1:
http://pastebin.mozilla-russia.org/91378

В 2.0 все просто:

Код:

setTimeout(
    function() {
        br.selectedTab = tab;
        win.scrollTo(cx, cy);
    },
    0
);

– без setInterval
А в 3.0 – ни в какую...
Я ничего не упускаю? А то уж больно код какой-то некультурный :D

P.S. Как клонировать историю вкладки?

Добавлено Tue May 27 01:50:56 2008 :
P.P.S. Увидел себя в contributor'ах. Был приятно удивлен =)

Я ничего не упускаю?

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

Как клонировать историю вкладки?

Примерно так: http://pastebin.mozilla-russia.org/91380

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

Гм, странно... не получается. На что load-обработчик вешать-то?

Придумал еще один способ:

Код:

var int = setInterval(
    function() {
        if(win.scrollMaxY >= cy) { // cx и cy – положение прокрутки исходной вкладки
            win.scrollTo(cx, cy);
            clearInterval(int);
        }
    },
    20
);

Но на ссылках вида http://example.com/page.html#someanchor получаем фокусировку на someanchor.
Впрочем, это все равно бесполезно при наличии на странице крупноразмерных картинок.

Расковырял FireGestures.
Клонирование вкладки для fx >= 3.0:

Код:

var orgTab = gBrowser.mCurrentTab;
var newTab = gBrowser.duplicateTab(orgTab);
gBrowser.moveTabTo(newTab, ++orgTab._tPos);
gBrowser.selectedTab = newTab; // переключаемся на вкладку (в оригинале не было)

Сам метод: http://pastebin.mozilla-russia.org/91384
Увы, в fx 2.0 мы вываливаемся в catch.

P.S. А что делает QueryInterface?

P.P.S. Правда, еще можно расковырять Tab Mix Plus или Tab Clicking Options и посмотреть, как сделано там (первое не смотрел, а в последнем много кода, ссылающегося на другие функции расширения, – решил, что проще и интереснее поиграться самому :D).

На что load-обработчик вешать-то?

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

А что делает QueryInterface?

Открывает интерфейс, если объект его реализует.

раз уж выдался случай, тот код я дополнил,

а киньте ссылку на него(на кнопку)

MILLennium
http://forum.mozilla-russia.org/viewtop … 28#p233728

Можно код от кнопки Downloads ?

macuache
А что это за кнопка ?

Это кнопка, которая открывает окно текущих закачек.

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

macuache

Она есть в стандартном наборе.

В стандартном наборе чего?

в стандартном наборе иконок Fierfox.

Точно есть! В тройке посмотрел. А в двойке она у меня на боковой панели стоит — подумал что нету.

macuache

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EDownloads%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH2AUeCw4tnZYFJAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAd5JREFUeNpj3LZlx38GMoGntzsjC4jh4eX27f9/4s358+cvw97d+7hAbLABIM07t+/mItYAdw8XOJsFWcLMWe/btbfnGLSEjRiQaVtpb7ia7Vt3oliEYsCNd+cZbr67xMDEyIhCIxuADlAM+HSemUuawYjh0yMGBmR6+6OdBAz4/5/LztHuGycHO16///37lwEa2FyoBgABMxMT2CCPBenfcBmwK3kOmP4HNAhuwM7z94GhysDAxsoCNnXv09MMkyPaGQTZ2Bne//rKwMHMynDm3V2GmdtnA6PvD1gTKGxA+jy9oS4ILe5A2CrEwPAdCP/8+MHw/e9Phhuf3jIcfnMZLBVe0glT9U1WRBhsISMQWyA7k6lRb+/U0BYGZlZmhhUP9jNcfn+LgfHvf4Y3tx4y/Ku/5IysFhgeJ1hABEyAsUH3a1NgOQMfOxfDtc8PGZ5+vMFgzsXDIMz8k8HERYIh9///vf/rL3GjWIgSSj95p/Wsms1w/+tLhnOvzzDocnAymPL+YDDh+8pQv/U9A8MPnmnoAcuIngcYE/SyGH587M5OiwYG5C0Gvt9vGcpmvwaGMlPp/wWXCBsAFqy06mZ+/CULHv+yPNP+tx8rxRa1jLhyISMjIzxwkcMJHQAA3rPFyJ2JzWoAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.%20setAttribute%20%28%22ondragdrop%22%2C%20%22nsDragAndDrop.drop%28event%2C%20DownloadsButtonDNDObserver%29%3B%20event.stopPropagation%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22ondragover%22%2C%20%22nsDragAndDrop.dragOver%28event%2C%20DownloadsButtonDNDObserver%29%3B%20event.stopPropagation%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22ondragenter%22%2C%20%22nsDragAndDrop.dragEnter%28event%2C%20DownloadsButtonDNDObserver%29%3B%20event.stopPropagation%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22ondragexit%22%2C%20%22nsDragAndDrop.dragExit%28event%2C%20DownloadsButtonDNDObserver%29%3B%20event.stopPropagation%28%29%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BtoOpenWindowByType%28%27Download%3AManager%27%2C%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%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%27chrome%3A//mozapps/content/downloads/downloads.xul%27%2C%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%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%27chrome%2Cdialog%3Dno%2Cresizable%27%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%3C/custombutton%3E

она ?

Да. это она. Спасибо. Один только момент. У меня стоит расширение Download Manager Tweak, которое позволяет открывать во вкладке окно загрузок.
https://addons.mozilla.org/en-US/firefox/addon/256

Сейчас, когда я жду на эту кнопку, у меня открывается отдельное окно. Что нужно добавить, чтобы окно это открывалось во вкладке при нажатии на эту кнопку ?

Надо заменить код в разделе "Код" следующей строкой:

Код:

toggleDownloadMgr(true,true);

Отлично. Спасибо!

Anton
ты уже помогал мне с кнопкой fav apps в которой реализовано всплывающее меню с различными командами explorera, а возможно ли сделать тоже самое только не с внешними командами, а с кнопками уже от самого фаерфокса? так сказать all in 1 =)

возможно ли сделать тоже самое только не с внешними командами, а с кнопками уже от самого фаерфокса?

Идея не очень понятна. Наверное возможно, другой вопрос, сколько усилий потребуется на реализацию той или команды. Вот за bookmarks я точно браться не буду, может, ещё за что-то "в лоб" не решаемое. Спрашивай, помогу чем смогу.

Добавлено Sun Jun  1 17:49:37 2008 :
p.s. Вот тут: http://custombuttons2.com/forum/viewtopic.php?f=35&t=889
http://custombuttons2.com/forum/viewtopic.php?f=35&t=786
http://custombuttons2.com/forum/viewtopic.php?f=35&t=784
кнопки, которые прячут все или отдельные пункты меню в кнопки. Скорее всего, не то, что надо, но на всякий случай.

ну там не то. там просто кнопка с кодом "Tools", причем когда ее ставишь tools на menubare изчезает. меня интересует возможно ли вообще создание: код кнопки в коде кнопки. очень удобно было бы если все созданые кнопки хранились в одной единственной кнопке-popupe.

ну например

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname/%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADL0lEQVR42l2SW2gTWRjH/2eSySSTTpMmvdq4vaSW9UbByFKWFfsourKLFlnqpV5a6CJeH9wHxUof1IcFK7ugVATBuw8uFpbdJdBFRbu7UtSSWopKm2raJG0SJpk26Uxmzp6pXch24Dtwvvn+v/PdCJZ/u0I17DzHrIVZ7ZJ3AobxCHruMn75YpzFtDNfLx6sKyXLxO2eYmvv11vL3b5aBzgLB5vNgpySx+hIGo+fJpCU1Zuind87rxpgAA8pEDd5JMurjkM+xNMq0lkCjufB23jY7TxWeDmUFxn4tT+KQMCFC70TJqCyEPDn/raqlhU+AYm4Ckni4SkVkMsTpBgsqxFIIsHqSoAQis6jowWApdcb/E78M5SioLoZNSg6hC+/anZjc4sHhtWK6QyFwAMNpRwOnywEtA6fA8d1F/Fz0wvpVEybS17GQFs/1h9zYdWe8zWflXx3+oc6TMzqyBkUjWVWdB0vBOx8fbtIVP1OGg7GYkYIwV0PmVfHjqEmWIWB1m1l7sYGEayni8Yx1dkfwwWALf0r/VXRknhUJxmFTOJpV2ops2/ZeYKVZAEo97+JUUPGw437yZsGMWVzlbmXr4OWzUCVkz1NEVxkV2eHBG9tsddTIgiiIzPFHZzBMPPnybtADa070gcsLLCk84DDAeVFEOFgX6gvrnzzs4wYC1SDVdhHi1dWVmSjnTC0v5s+Yp9Z5idAG3skGgFrP0hdPVIDdxB5/cfzREa5y9bld0KwW+CwVXK6V7nKqks+jI+c2jSFKwwwvwiob7sAzMZBs/Og1AD1epFXFWTePENuNgxDV2GTKiD5A4j99QD3x8MbTyfBxoDsIsB/+KrZFND370DlBKtEg87uuiCAOp0MoIOzi1DfD+Ht45vXmiM4w8Rmo7VFQHlzK2Ze9KN6y/ewiW7o05PQ0jLyDJRnC8RXVYMmI5h8cmvk0ofZHdcziDKxwswgo2s8VNPU0JisdDe6ino8NevXSvUBOHyfm9sINR6GPDaIxMTLwUtTyoEbCuJLYs2cFhn2ofdKGj8xM1NS71Vgg8+C7XaCdWz4xXMUg7KB0LYofmP/F8zGmXH/jftfxs1e2EaqEmMAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20confirmRestart%20%3D%20window.confirm%28%27Are%20you%20sure%20you%20want%20to%20restart%20firefox%3F%27%29%3B%0Aif%28%21confirmRestart%29%20return%3B%0A%20%20%20%20%0Avar%20appStartup%20%3D%20Components.interfaces.nsIAppStartup%3B%0A//%20if%20%28canQuitApplication%28%29%29%20//%20uncomment%20if%20using%20zeniko%27s%20Session%20Manager%0AComponents.classes%5B%22@mozilla.org/toolkit/app-startup%3B1%22%5D%0A.getService%28appStartup%29.quit%28appStartup.eRestart%20%7C%20appStartup.eAttemptQuit%29%3B%20%20%20%20%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%3C/custombutton%3E

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EEnlarge%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BZoomManager.prototype.getInstance%28%29.enlarge%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%3C/custombutton%3E

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EReduce%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BZoomManager.prototype.getInstance%28%29.reduce%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%3C/custombutton%3E

возможно ли это забить в попап?

pshenk

очень удобно было бы если все созданые кнопки хранились в одной единственной кнопке-popupe.

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

Для приведённых выше кнопок:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Emultibutton%20sample%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20menu%20%3D%20%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%20%20%20%20%0Aoncommand%3D%22this.parentNode.cbButtonDoMenuCommand%28event%29%22%3E%0A%09%3Cmenuitem%20value%3D%22Restart%22%20label%3D%22Restart%22/%3E%0A%09%3Cmenuitem%20value%3D%22Enlarge%22%20label%3D%22Enlarge%22/%3E%0A%09%3Cmenuitem%20value%3D%22Reduce%22%20label%3D%22Reduce%22/%3E%0A%3C/menupopup%3E%3B%0Amenu%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28menu.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Amenu.%20setAttribute%20%28%22id%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20setAttribute%20%28%22popup%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20cbButtonDoMenuCommand%20%3D%20function%20%28event%29%0A%7B%0A%09var%20itemNum%20%3D%20event.%20target.%20getAttribute%20%28%22value%22%29%3B%0A%09switch%20%28itemNum%29%0A%09%7B%0A%09%09case%20%22Restart%22%3A%0A%09%09%09this.%20cbFunctionRestart%20%28%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22Enlarge%22%3A%0A%09%09%09ZoomManager.prototype.getInstance%28%29.enlarge%28%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22Reduce%22%3A%0A%09%09%09ZoomManager.prototype.getInstance%28%29.reduce%28%29%3B%0A%09%7D%0A%7D%3B%0A//%20commands%0Athis.%20cbFunctionRestart%20%3D%20function%20%28%29%0A%7B%0A%09var%20confirmRestart%20%3D%20window.confirm%28%27Are%20you%20sure%20you%20want%20to%20restart%20firefox%3F%27%29%3B%0A%09if%28%21confirmRestart%29%20return%3B%0A%09%20%20%20%20%0A%09var%20appStartup%20%3D%20Components.interfaces.nsIAppStartup%3B%0A%09//%20if%20%28canQuitApplication%28%29%29%20//%20uncomment%20if%20using%20zeniko%27s%20Session%20Manager%0A%09Components.classes%5B%22@mozilla.org/toolkit/app-startup%3B1%22%5D%0A%09.getService%28appStartup%29.quit%28appStartup.eRestart%20%7C%20appStartup.eAttemptQuit%29%3B%20%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

А какой язык нужен? Хочу сделать кнопку для закрытия всех вкладок с предупреждением о закрытии. Как этого добиться?

PulSar.CE3194694

А какой язык нужен?

Кнопки пишутся на ecmascript.

Хочу сделать кнопку для закрытия всех вкладок с предупреждением о закрытии. Как этого добиться?

Посмотреть, как это делает tabbrowser. В данном случае код будет такой:

Код:

var tbr = getBrowser ();
if (tbr. warnAboutClosingTabs (true))
{
    var childNodes = tbr. mTabContainer. childNodes;
    for (var i = childNodes. length - 1; i >= 0; --i)
    {
        tbr. removeTab (childNodes [i]);
    }
}

Из отзыва на AMO:

...I would love to be able to store my toolbars and right-click menu remotely as an OPML or RSS feed. Needs help dialogs for easy stuff like links and available XUL menus.

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

..I would love to be able to store my toolbars and right-click menu remotely as an OPML or RSS feed.

Было бы неплохо сохранять линки,на панели инструментов,правым кликом на OPML и RSS (дословно с сайтов или удаленный источник)Вторая часть немного непонятна из за XUL.Я не знаю что это такое.А так-Нужно разьяснение,как легче ввести(засунуть :D ) одиноковые линки в имеющееся ................Пардон

Anton

Кто-нибудь может растолковать, о чём речь ?

Рискну предположить, что нужен некий способ копирования кода кнопки. :/
Возможно – бэкапа.
http://ru.wikipedia.org/wiki/OPML

Добавлено Wed Jun 11 16:44:21 2008 :
Впрочем, лучше уточнить у самого вопрошающего...

Anton написал:

Из отзыва на AMO:

...I would love to be able to store my toolbars and right-click menu remotely as an OPML or RSS feed. Needs help dialogs for easy stuff like links and available XUL menus.

Мне бы хотелось иметь возможность сохранять мои тулбары и меню ПКМ дистанционно, как OPML или в RSS. Кстати нужно бы сделать "хэлп" для таких простых вещей, как ссылки и доступные XUL менюшки.

По-моему он ввиду то, что я сейчас написал, но не понятно только как можно сохранять right-click menu. Я с этим разрешением не знаком вообще (просто решил помочь с переводом), может так и можно.

Anton

...I would love to be able to store my toolbars and right-click menu remotely as an OPML or RSS feed.

Я так понимаю, он хочет хранить свои панели инструментов и контекстное меню на удалённом сервере в виде OPML или RSS и подгружать их с этого сервера.

vv07
Infocatcher
amzoom
Unghost
Спасибо за помощь. У меня были сомнения в отношении терминов 'toolbars' и 'right-click menu' - т. е., может быть, подразумевались панели, составленные из самодельных кнопок и меню этих кнопок. Дискуссию на AMO затевать не хотелось - там сообщения очень долго модерируются, да и сам ресурс на моём соединении очень неудобен. Буду считать, что к CB это не относится - "чистые" панели инструментов и контекстные меню.

Если актуально, можно сделать загрузку оверлея с кнопками из сети, не в виде OPML/RSS, а в виде XUL. Тогда необходимо описание, как это должно выглядеть с точки зрения пользователя. Если действительно актуально.

Anton

Позвольте позаимствовать,вашу подпись?:blush:
Я ярый фанат лисы и ваша подпись,круть полная.

vv07
Флаг в руки, как говорится.

Anton

Пасябки :rock:

а как создать эффект при наведении мышки на кнопку и нажатии ? Я просто использую не стандартную тему для лисы, поэтому у меня все custom buttons не реагирует визуально.

macuache
Думаю, общего подхода в разрешении конфликта с темами со стороны расширения не существует в принципе и идей по этому поводу нет никаких, может быть пока нет.
Боюсь, только вручную, кодом в секцию "Инициализация" с подбором нужных значений для setProperty:

Код:

this. cbSetDefaultStyle = function (event)
{
    this. style. setProperty ("padding", "3px", "");
    this. style. setProperty ("border", "1px solid transparent", "");
    this. style. setProperty ("background-color", "transparent", "");
    this. style. setProperty ("outline", "", "");
    this. style. setProperty ("-moz-outline-offset", "", "");
}
this. onmousedown = function (event)
{
    this. style. setProperty ("border-color", "ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow", "");
    this. style. setProperty ("padding-top", "4px", "");
    this. style. setProperty ("padding-bottom", "2px", "");
    this. style. setProperty ("-moz-padding-start", "4px", "");
    this. style. setProperty ("-moz-padding-end", "2px", "");
}
this. onmouseover = function (event)
{
    //this. style. setProperty ("background-color", "-moz-buttonhoverface", "");
    this. style. setProperty ("background-color", "ThreeDFace", "");
    this. style. setProperty ("border-color", "ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight", "");
    this. style. setProperty ("outline", "1px -moz-DialogText", "");
    this. style. setProperty ("-moz-outline-offset", "-2px", "");
}
this. onmouseup = this. cbSetDefaultStyle;
this. onmouseout = this. cbSetDefaultStyle;

Infocatcher
пост 567

Тем, что можно сделать открытие в новой вкладке smile

Перевести через Google:
Код:

Этот код действительно не работает. Сообщение браузера: "Кнопка не может быть создана, потому что содержит ошибки!"
Просмотрел дальше эту тему, но исправлений не нашел. Сам исправит не могу - не понимаю, как это сделать.
Меня интересует:
1. перевод в новой вкладке
2. перевод выделенного текста во всплывающем окошке
В Opera у меня кнопка с этими функциями работает прекрасно, а в Firefox не могу найти такую кнопку.
Или кнопку с выпадающим меню, где можно прописать эти две строчки. Именно перевод Google, другие переводчики мне не нравятся.
Кнопка, как предлагает vv07 (№568), у меня есть, но она переводит в том же окне.
И еще вопрос.
Страницы https не переводятся. Это Google не может взять страницу или что-то настроить надо в браузере?
Пожалуйста, помогите, не проходите мимо :whiteflag:

Vvld

пост 567...
...Этот код действительно не работает. Сообщение браузера: "Кнопка не может быть создана, потому что содержит ошибки!"...

Какая версия расширения ?
Для версии 0.0.3.2 кнопка из сообщения 567 устанавливается нормально. Надо выделить весь текст custombutton://.... (с прокруткой), скопировать, вставить в строку адреса, нажать Enter.

Anton написал:

Vvld

пост 567...
...Этот код действительно не работает. Сообщение браузера: "Кнопка не может быть создана, потому что содержит ошибки!"...

Какая версия расширения ?
Для версии 0.0.3.2 кнопка из сообщения 567 устанавливается нормально. Надо выделить весь текст custombutton://.... (с прокруткой), скопировать, вставить в строку адреса, нажать Enter.

Я извиняюсь, но какое расширение должно стоять (имя)? Браузер обновлен до версии 2.0.0.15. Кнопка перевода (работающая) создана расширением Custom Buttons 0.0.1.2 (сегодня автообновилось до версии 0.0.1.3). Хотелось бы иметь перевод с функциями, описанными мною выше. Ищу, пробую. Если надо, установлю еще расширение, но подскажите какое? Надо будет, Custom Buttons отключу, другое расширение поставлю, но какое? Хотя, на мой взгляд, Google и переводит лучше, чем другие переводчики, но все равно надо сравнивать текст перевода с оригиналом и перевод лучше иметь в другом окне.
А кнопку из сообщения Infocatcher я пытался поставить так, как Вы описываете, но увы...

Кнопка перевода (работающая) создана расширением Custom Buttons 0.0.1.2 (сегодня автообновилось до версии 0.0.1.3).

А кнопку из сообщения Infocatcher я пытался поставить так, как Вы описываете, но увы...

Кнопка из сообщения Infocatcher'а создана более свежей версией расширения (рискну предположить, это было Custom Buttons 0.0.2.9). Сейчас доступна 0.0.3.2.

Что касается

2. перевод выделенного текста во всплывающем окошке

то, думаю, такой кнопки не существует. Может быть, есть на custombuttons2.com

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

Anton

Кнопка из сообщения Infocatcher'а создана более свежей версией расширения (рискну предположить, это было Custom Buttons 0.0.2.9). Сейчас доступна 0.0.3.2.

Увы. Этот Custom Buttons я не знаю. Сайт Custom Buttons 0.0.1.3 - http://xsms.nm.ru/custombuttons/, Custom Buttons 2.0.7.6 я брал и пробовал на страничке https://addons.mozilla.org/ru/firefox/addon/5066, а это расширение с версией 0.0.2.9 или 0.0.3.2 я не знаю. Подскажите, пожалуйста, я и его попробую. Кстати, после установки Custom Buttons 2.0.7.6 с браузером что-то непонятное случилось и я его сразу удалил.

Что касается

    2. перевод выделенного текста во всплывающем окошке

то, думаю, такой кнопки не существует. Может быть, есть на custombuttons2.com

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

Вы правы, такую функцию кнопки в Firefox я ищу давно и пока не нашел. Но это очень удобно. И когда я листаю страницы иностранных сайтов, то перехожу на браузер Opera.
К сожалению, рассказать Вам как работает ява-скрипт в Opera я не смогу, мои изыскания в программировании закончились в 1994 году и вряд ли я смогу сейчас догнать ваши молодые умы, так что приходится собирать по крохам: кода получится, когда нет - это уже мои проблемы. Просто я взял готовый скрипт google-translate.js на сайте http://lexi.ucoz.ru/index/0-5. Естественно, перед этим перебрал много других.
Ну а перевод Google мне нравится тем, что переводит не только чисто один язык на страничке, но (не всегда, как повезет) и смесь языков, в том числе и с японо-китайским. Ну а если полностью страничку не перевело, то очень удобно применить перевод остатка текста в окошке. Мое мнение, что Google с функцией автоопределения языка при переводе - лидер среди других переводчиков online.
Если Вы сможете сделать такое в Firefox, то Вам будут благодарны очень многие обладатели браузера.
Страничка кнопок автоперевода Google - http://translate.google.com/translate_buttons?hl=ru

Забыл добавить:
- переводв окошке предварительно выделенного текста;
- для перевода Google на русский с любого языка достаточно взять ссылку "русский" - это в Opera

Сайт Custom Buttons 0.0.1.3 - http://xsms.nm.ru/custombuttons/

Сейчас все новые версии размещаются здесь: https://addons.mozilla.org/ru/firefox/addon/2707 и здесь: http://custombuttons.mozdev.org/installation.html

Anton

Сейчас все новые версии размещаются здесь: https://addons.mozilla.org/ru/firefox/addon/2707 и здесь: http://custombuttons.mozdev.org/installation.html

Спасибо за новую версию, а я ориентировался на домашнюю страницу.
Кнопка переводит с переходом на другую страницу ;)
Перевод выделенного текста также идет на другой странице, а хотелось бы во всплывающем окошке. Можно поправить код этой кнопки?

а хотелось бы во всплывающем окошке

Мне бы его вообразить как-нибудь. Не представляю как оно должно выглядеть.

Я попробую что-нибудь сделать, правда, заранее результат обещать не могу.

Anton написал:

а хотелось бы во всплывающем окошке

Я попробую что-нибудь сделать, правда, заранее результат обещать не могу.

А вдруг получится? Буду надеяться и ждать.

Добавлено Fri Jul  4 17:12:01 2008 :
Anton
А как с переводом страниц https через Google? Они не переводятся. Это Google не может захватить адрес страницы? Или что-то другое мешает?
Правда в Opera они тоже не переводятся и на форумах Opera я задавал этот вопрос, но нормальных ответов я не получил.

Vvld

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09window.%20cbTranslateButtonX%20%3D%20event.%20screenX%3B%0A%09%09%09window.%20cbTranslateButtonY%20%3D%20event.%20screenY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3Evar%20text%20%3D%20getBrowser%20%28%29.%20contentDocument.%20defaultView.%20getSelection%20%28%29%3B%0Aif%20%28text%20%3D%3D%20%22%22%29%0A%7B%0A%09var%20lng%20%3D%20%28getBrowser%20%28%29.%20contentDocument.%20defaultView.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09var%20url%20%3D%20%22http%3A//translate.google.com/translate%3Fu%3D%22%20+%0A%09%09%09%20%20escape%20%28getBrowser%20%28%29.%20contentDocument.%20location.%20href%29%20+%0A%09%09%09%20%20%22%26amp%3Bhl%3D%22%20+%0A%09%09%09%20%20lng%20+%0A%09%09%09%20%20%22%26amp%3Blangpair%3Dauto%7Cru%26amp%3Btbb%3D1%22%20+%0A%09%09%09%20%20%28getBrowser%20%28%29.%20contentDocument.%20charset%3F%0A%09%09%09%20%20%09%22%26amp%3Bie%3D%22%20+%20getBrowser%20%28%29.%20contentDocument.%20charset%3A%0A%09%09%09%09%20%20%22%22%29%3B%0A%09%09%20%20getBrowser%20%28%29.%20addTab%20%28url%2C%20null%2C%20null%29%3B%0A%09return%3B%0A%7D%0Avar%20x%20%3D%20window.%20cbTranslateButtonX%3B%0Avar%20y%20%3D%20window.%20cbTranslateButtonY%3B%0Aif%20%28%21x%20%7C%7C%20%21y%29%0A%09x%20%3D%20y%20%3D%200%3B%0AXML.%20ignoreProcessingInstructions%20%3D%20false%3B%0Avar%20dialog%20%3D%20%26lt%3B%26gt%3B%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%3F%26gt%3B%0A%26lt%3Bwindow%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09xmlns%3Ahtml%3D%22http%3A//www.w3.org/1999/xhtml%22%0A%09%09id%3D%22dlg01%22%0A%09%09width%3D%22300%22%20height%3D%2250%22%0A%09%09screenX%3D%7Bx%7D%20screenY%3D%7By%7D%0A%09%09title%3D%22Google%20Translate%22%0A%09%09onload%3D%22f%28%29%22%0A%09%09onunload%3D%22f2%28%29%22%26gt%3B%0A%09%26lt%3Bscript%20type%3D%22application/x-javascript%22%26gt%3B%0A%09%09%26lt%3B%21%5BCDATA%5B%0A%09%09%09function%20f%20%28%29%0A%09%09%09%7B%0A%09%09%09%09var%20text%20%3D%20document.%20getElementById%20%28%22lbl01%22%29.%20getAttribute%20%28%22value%22%29%3B%0A%09%09%09%09window.%20addEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%09var%20src%3D%22http%3A//translate.google.com/translate_t%3Ftext%3D%22%20+%0A%09%09%09%09%09%09text%20+%20%22%26amp%3Bamp%3Bhl%3Dru%26amp%3Bamp%3Blangpair%3Dauto%7Cauto%26amp%3Bamp%3Btbb%3D1%26amp%3Bamp%3Bujs%3Dgtt%22%3B%0A%09%09%09%09document.%20getElementById%20%28%22ifr01%22%29.%20setAttribute%20%28%22src%22%2C%20src%29%3B%0A%09%09%09%09window.%20sizeToContent%20%28%29%3B%0A%09%09%09%7D%0A%09%09%09function%20f2%20%28%29%0A%09%09%09%7B%0A%09%09%09%09window.%20removeEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%7D%0A%09%09%09function%20f3%20%28%29%0A%09%09%09%7B%0A%09%09%09%09var%20doc%20%3D%20window.%20frames%20%5B0%5D.%20document%3B%0A%09%09%09%09var%20body%20%3D%20doc.%20body%3B%0A%09%09%09%09var%20t%20%3D%20%28body%20%26amp%3B%26amp%3B%20%21/%23808080/.%20test%20%28body.%20innerHTML%29%29%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20body.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%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%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20title%20+%3D%20%22%20-%20%22%20+%20t%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20r%20%3D%20doc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20getElementById%20%28%22desc01%22%29.%20textContent%20%3D%20r%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20window.%20sizeToContent%20%28%29%3B%0A%09%09%09%7D%0A%09%09%5D%5D%26gt%3B%0A%09%26lt%3B/script%26gt%3B%0A%09%26lt%3Bdescription%20id%3D%22desc01%22%26gt%3B%u041F%u0435%u0440%u0435%u0432%u043E%u0434%u0438%u043C...%26lt%3B/description%26gt%3B%0A%09%26lt%3Blabel%20id%3D%22lbl01%22%20style%3D%22visibility%3Ahidden%3B%22%20value%3D%7Btext%7D/%26gt%3B%0A%09%26lt%3Bhtml%3Aiframe%20id%3D%22ifr01%22%20style%3D%22width%3A0px%3Bheight%3A0px%3Bvisibility%3Ahidden%3B%22/%26gt%3B%0A%26lt%3B/window%26gt%3B%26lt%3B/%26gt%3B%3B%0Awindow.%20openDialog%20%28%22data%3Aapplication/vnd.mozilla.xul+xml%2C%22%20+%20dialog.%20toXMLString%20%28%29%2C%20btoa%20%28escape%20%28text%29%29%2C%20%22chrome%2Cdependent%2Cminimizable%2Cdialog%3Dno%22%29%3B%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%3C/custombutton%3E

Хотя, работает не абсолютно точно как оперный скрипт.

А как с переводом страниц https через Google?

Похоже, это особенность переводчика.

Anton написал:

Vvld

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09window.%20cbTranslateButtonX%20%3D%20event.%20screenX%3B%0A%09%09%09window.%20cbTranslateButtonY%20%3D%20event.%20screenY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3Evar%20text%20%3D%20getBrowser%20%28%29.%20contentDocument.%20defaultView.%20getSelection%20%28%29%3B%0Aif%20%28text%20%3D%3D%20%22%22%29%0A%7B%0A%09var%20lng%20%3D%20%28getBrowser%20%28%29.%20contentDocument.%20defaultView.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09var%20url%20%3D%20%22http%3A//translate.google.com/translate%3Fu%3D%22%20+%0A%09%09%09%20%20escape%20%28getBrowser%20%28%29.%20contentDocument.%20location.%20href%29%20+%0A%09%09%09%20%20%22%26amp%3Bhl%3D%22%20+%0A%09%09%09%20%20lng%20+%0A%09%09%09%20%20%22%26amp%3Blangpair%3Dauto%7Cru%26amp%3Btbb%3D1%22%20+%0A%09%09%09%20%20%28getBrowser%20%28%29.%20contentDocument.%20charset%3F%0A%09%09%09%20%20%09%22%26amp%3Bie%3D%22%20+%20getBrowser%20%28%29.%20contentDocument.%20charset%3A%0A%09%09%09%09%20%20%22%22%29%3B%0A%09%09%20%20getBrowser%20%28%29.%20addTab%20%28url%2C%20null%2C%20null%29%3B%0A%09return%3B%0A%7D%0Avar%20x%20%3D%20window.%20cbTranslateButtonX%3B%0Avar%20y%20%3D%20window.%20cbTranslateButtonY%3B%0Aif%20%28%21x%20%7C%7C%20%21y%29%0A%09x%20%3D%20y%20%3D%200%3B%0AXML.%20ignoreProcessingInstructions%20%3D%20false%3B%0Avar%20dialog%20%3D%20%26lt%3B%26gt%3B%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%3F%26gt%3B%0A%26lt%3Bwindow%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09xmlns%3Ahtml%3D%22http%3A//www.w3.org/1999/xhtml%22%0A%09%09id%3D%22dlg01%22%0A%09%09width%3D%22300%22%20height%3D%2250%22%0A%09%09screenX%3D%7Bx%7D%20screenY%3D%7By%7D%0A%09%09title%3D%22Google%20Translate%22%0A%09%09onload%3D%22f%28%29%22%0A%09%09onunload%3D%22f2%28%29%22%26gt%3B%0A%09%26lt%3Bscript%20type%3D%22application/x-javascript%22%26gt%3B%0A%09%09%26lt%3B%21%5BCDATA%5B%0A%09%09%09function%20f%20%28%29%0A%09%09%09%7B%0A%09%09%09%09var%20text%20%3D%20document.%20getElementById%20%28%22lbl01%22%29.%20getAttribute%20%28%22value%22%29%3B%0A%09%09%09%09window.%20addEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%09var%20src%3D%22http%3A//translate.google.com/translate_t%3Ftext%3D%22%20+%0A%09%09%09%09%09%09text%20+%20%22%26amp%3Bamp%3Bhl%3Dru%26amp%3Bamp%3Blangpair%3Dauto%7Cauto%26amp%3Bamp%3Btbb%3D1%26amp%3Bamp%3Bujs%3Dgtt%22%3B%0A%09%09%09%09document.%20getElementById%20%28%22ifr01%22%29.%20setAttribute%20%28%22src%22%2C%20src%29%3B%0A%09%09%09%09window.%20sizeToContent%20%28%29%3B%0A%09%09%09%7D%0A%09%09%09function%20f2%20%28%29%0A%09%09%09%7B%0A%09%09%09%09window.%20removeEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%7D%0A%09%09%09function%20f3%20%28%29%0A%09%09%09%7B%0A%09%09%09%09var%20doc%20%3D%20window.%20frames%20%5B0%5D.%20document%3B%0A%09%09%09%09var%20body%20%3D%20doc.%20body%3B%0A%09%09%09%09var%20t%20%3D%20%28body%20%26amp%3B%26amp%3B%20%21/%23808080/.%20test%20%28body.%20innerHTML%29%29%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20body.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%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%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20title%20+%3D%20%22%20-%20%22%20+%20t%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20r%20%3D%20doc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20getElementById%20%28%22desc01%22%29.%20textContent%20%3D%20r%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20window.%20sizeToContent%20%28%29%3B%0A%09%09%09%7D%0A%09%09%5D%5D%26gt%3B%0A%09%26lt%3B/script%26gt%3B%0A%09%26lt%3Bdescription%20id%3D%22desc01%22%26gt%3B%u041F%u0435%u0440%u0435%u0432%u043E%u0434%u0438%u043C...%26lt%3B/description%26gt%3B%0A%09%26lt%3Blabel%20id%3D%22lbl01%22%20style%3D%22visibility%3Ahidden%3B%22%20value%3D%7Btext%7D/%26gt%3B%0A%09%26lt%3Bhtml%3Aiframe%20id%3D%22ifr01%22%20style%3D%22width%3A0px%3Bheight%3A0px%3Bvisibility%3Ahidden%3B%22/%26gt%3B%0A%26lt%3B/window%26gt%3B%26lt%3B/%26gt%3B%3B%0Awindow.%20openDialog%20%28%22data%3Aapplication/vnd.mozilla.xul+xml%2C%22%20+%20dialog.%20toXMLString%20%28%29%2C%20btoa%20%28escape%20%28text%29%29%2C%20%22chrome%2Cdependent%2Cminimizable%2Cdialog%3Dno%22%29%3B%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%3C/custombutton%3E

Хотя, работает не абсолютно точно как оперный скрипт.

А как с переводом страниц https через Google?

Похоже, это особенность переводчика.

КЛАСС!!! ;) Основное у Вас получилось!
Есть несколько просьб:
1. чем больше символов в выделенном тексте, тем шире всплывающее окошко и при количестве символов больше, чем помещается на странице, окошко становится шире границ основного окна. И это все при практически неизменной высоте всплывающего окошка.
Можно зафиксировать ширину всплывающего окошка, а по высоте, при достижении определенной высоты, чтобы появилась прокрутка текста?
2. во всплывающем окошке не сохраняется форматирование выделенного текста, и весь текст идет в одну трудночитаемую строчку со всеми символами. Это не относится к переводу страницы полностью - там форматирование полностью сохраняется.
Поправить можно?
3. было бы неплохо, чтобы текст во всплывающем окошке можно было бы выделить и скопировать.
Это возможно?

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

Добавлено Sun Jul  6 16:43:44 2008 :
Anton
Где - то на форуме (я не запомнил эту страницу и сейчас не могу найти) обсуждалась кнопка с меню. Может быть легче сделать, чтобы в меню кнопки перевода было несколько строк (?):
страница
выделенный текст
............... (для нуждающихся в каких-либо дополнительных функциях перевода)

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

На следующей неделе намечаются разъезды, так что, скорее всего я не смогу этим заняться раньше выходных.

Anton написал:

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

На следующей неделе намечаются разъезды, так что, скорее всего я не смогу этим заняться раньше выходных.

Конечно.
Я и так уже блаженствую. Иметь под рукой такую кнопочку...;)

Anton
Хотелось бы то же обратиться к Вам с несколькими вопросами:
Если брать именно оригинальный Гугловский скрипт, можно ли сделать что бы он запускался в новой вкладке, а не как через getBrowser (). contentDocument. location. href = "", в текущей?
Можно попросить кнопку, для Get File Size, что то не соображу какие аргументы прописать, хотелось бы брать текстовые ссылки и если возможно урлы из выделенных.
Сделал кнопку для Promt-X из Promt 7, через goDoCommand ("cmd_copy");, но подозреваю что много лишнего, как приблизительно должен выглядеть код? (Promt-X, сам берёт из буфера выделенное, при запуске).
И последний вопрос - возможно ли сделать проверку орфографии с помощью MS Office, через известный скрипт Spell.vbs.

Deim0s

...оригинальный Гугловский скрипт...

Если для Google Translate, то пост 651 (еще не полностью сделана) или пост 567 - работает

Vvld
Под оригинальным, я имею ввиду тот который отдаёт сам Google, меня он вполне устраивает, хотелось только что бы срабатывал в новой вкладке. В посте № 567 перевод только с английского на руский, надо править en|ru, на auto|ru. К тому же,  при изменении Googl'ом скрипта, случись такое, оба придётся править, в оригинальном варианте - только заменить сам скрипт в " ".

Deim0s
Кнопка поста 567 переводит на другой странице. Исправить en|ru на auto|ru большой проблемы нет.
От изменения скрипта Google никто не застрахован и кнопка перестанет работать.
Мысль

только заменить сам скрипт в " "

- это был бы хороший вариант. Но как это программно сделать - надо с Антоном обсуждать. Дождемся его...
Мне кажется, что такой вариант может получиться в кнопке с выпадающим меню, когда основная часть (перевод) один - первое нажатие кнопки, а где сделать этот перевод - нажатие пункта выпадающего меню. Но это, наверное, сложно.

Vvld

Но как это программно сделать - надо с Антоном обсуждать.

Я к нему с просьбой и обратился. Т.к. скрипт Googl'а сам прекрасно "различает" перевод текста, от перевода страницы, зачем меню? Кому хочется на текущей вкладке и так с оригиналом работает. ИМХО смысл кнопки в удобстве перевода одним нажатием, а если через меню, так это и через закладку можно переводить.

Deim0s

ИМХО смысл кнопки в удобстве перевода одним нажатием, а если через меню, так это и через закладку можно переводить.

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

Vvld

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09window.%20cbTranslateButtonX%20%3D%20event.%20screenX%3B%0A%09%09%09window.%20cbTranslateButtonY%20%3D%20event.%20screenY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3Evar%20text%20%3D%20getBrowser%20%28%29.%20contentDocument.%20defaultView.%20getSelection%20%28%29%3B%0Aif%20%28text%20%3D%3D%20%22%22%29%0A%7B%0A%09var%20lng%20%3D%20%28getBrowser%20%28%29.%20contentDocument.%20defaultView.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09var%20url%20%3D%20%22http%3A//translate.google.com/translate%3Fu%3D%22%20+%0A%09%09%09%20%20escape%20%28getBrowser%20%28%29.%20contentDocument.%20location.%20href%29%20+%0A%09%09%09%20%20%22%26amp%3Bhl%3D%22%20+%0A%09%09%09%20%20lng%20+%0A%09%09%09%20%20%22%26amp%3Blangpair%3Dauto%7Cru%26amp%3Btbb%3D1%22%20+%0A%09%09%09%20%20%28getBrowser%20%28%29.%20contentDocument.%20charset%3F%0A%09%09%09%20%20%09%22%26amp%3Bie%3D%22%20+%20getBrowser%20%28%29.%20contentDocument.%20charset%3A%0A%09%09%09%09%20%20%22%22%29%3B%0A%09%09%20%20getBrowser%20%28%29.%20addTab%20%28url%2C%20null%2C%20null%29%3B%0A%09return%3B%0A%7D%0Avar%20x%20%3D%20window.%20cbTranslateButtonX%3B%0Avar%20y%20%3D%20window.%20cbTranslateButtonY%3B%0Aif%20%28%21x%20%7C%7C%20%21y%29%0A%09x%20%3D%20y%20%3D%200%3B%0AXML.%20ignoreProcessingInstructions%20%3D%20false%3B%0Avar%20dialog%20%3D%20%26lt%3B%26gt%3B%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%3F%26gt%3B%0A%26lt%3B%3Fxml-stylesheet%20href%3D%22resource%3A//gre/res/html.css%22%3F%26gt%3B%0A%26lt%3Bwindow%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09xmlns%3Ahtml%3D%22http%3A//www.w3.org/1999/xhtml%22%0A%09%09id%3D%22dlg01%22%0A%09%09screenX%3D%7Bx%7D%20screenY%3D%7By%7D%0A%09%09title%3D%22Google%20Translate%22%0A%09%09onload%3D%22f%28%29%22%0A%09%09onunload%3D%22f2%28%29%22%26gt%3B%0A%09%26lt%3Bscript%20type%3D%22application/x-javascript%22%26gt%3B%0A%09%09%26lt%3B%21%5BCDATA%5B%0A%09%09%09function%20f%20%28%29%0A%09%09%09%7B%0A%09%09%09%09var%20text%20%3D%20document.%20getElementById%20%28%22lbl01%22%29.%20getAttribute%20%28%22value%22%29%3B%0A%09%09%09%09window.%20addEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%09var%20src%3D%22http%3A//translate.google.com/translate_t%3Ftext%3D%22%20+%0A%09%09%09%09%09%09text%20+%20%22%26amp%3Bamp%3Bhl%3Dru%26amp%3Bamp%3Blangpair%3Dauto%7Cauto%26amp%3Bamp%3Btbb%3D1%26amp%3Bamp%3Bujs%3Dgtt%22%3B%0A%09%09%09%09document.%20getElementById%20%28%22ifr01%22%29.%20setAttribute%20%28%22src%22%2C%20src%29%3B%0A%09%09%09%09window.%20sizeToContent%20%28%29%3B%0A%09%09%09%7D%0A%09%09%09function%20f2%20%28%29%0A%09%09%09%7B%0A%09%09%09%09window.%20removeEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%7D%0A%09%09%09function%20f3%20%28%29%0A%09%09%09%7B%0A%09%09%09%09var%20doc%20%3D%20window.%20frames%20%5B0%5D.%20document%3B%0A%09%09%09%09var%20body%20%3D%20doc.%20body%3B%0A%09%09%09%09var%20t%20%3D%20%28body%20%26amp%3B%26amp%3B%20%21/%23808080/.%20test%20%28body.%20innerHTML%29%29%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20body.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%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%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20title%20+%3D%20%22%20-%20%22%20+%20t%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20r%20%3D%20doc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20getElementById%20%28%22desc01%22%29.%20innerHTML%20%3D%20r%3B%0A%09%09var%20ifr%20%3D%20document.%20getElementById%20%28%22ifr01%22%29%3B%0A%09%09ifr.%20parentNode.%20removeChild%20%28ifr%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20window.%20sizeToContent%20%28%29%3B%0A%09%09%09%7D%0A%09%09%5D%5D%26gt%3B%0A%09%26lt%3B/script%26gt%3B%0A%09%26lt%3Bbox%20width%3D%22350%22%26gt%3B%0A%09%09%26lt%3Blabel%20id%3D%22lbl01%22%20hidden%3D%22true%22%20value%3D%7Btext%7D/%26gt%3B%0A%09%09%26lt%3Bhtml%3Ahtml%20flex%3D%221%22%26gt%3B%0A%09%09%09%26lt%3Bhtml%3Ahead%26gt%3B%0A%09%09%09%09%26lt%3Bhtml%3Astyle%20type%3D%22text/css%22%26gt%3B%0A%09%09%09%09%09%26lt%3B%21%5BCDATA%5B%0A%09%09%09%09%09%09iframe%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09visibility%3A%20hidden%3B%0A%09%09%09%09%09%09%09width%3A%200px%3B%0A%09%09%09%09%09%09%09height%3A%200px%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%0A%09%09%09%09%09%09%23div1%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09left%3A%200%3B%0A%09%09%09%09%09%09%09top%3A%200%3B%0A%09%09%09%09%09%09%09font%3A%2016px%20Times%20New%20Roman%3B%0A%09%09%09%09%09%09%09border%3A%201px%20solid%20gray%3B%0A%09%09%09%09%09%09%09padding%3A%203px%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%0A%09%09%09%09%09%09%23desc01%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09border%3A%201px%20solid%20%23aaaaaa%3B%0A%09%09%09%09%09%09%09margin%3A%202px%200%200%200%3B%0A%09%09%09%09%09%09%09padding%3A%204px%3B%0A%09%09%09%09%09%09%09background-color%3A%20%23fafcfe%3B%0A%09%09%09%09%09%09%09font%3A%2014px%20Times%20New%20Roman%3B%0A%09%09%09%09%09%09%09-moz-user-select%3A%20text%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%5D%5D%26gt%3B%0A%09%09%09%09%26lt%3B/html%3Astyle%26gt%3B%0A%09%09%09%26lt%3B/html%3Ahead%26gt%3B%0A%09%09%09%26lt%3Bhtml%3Abody%26gt%3B%0A%09%09%09%09%26lt%3Bhtml%3Adiv%20id%3D%22div1%22%26gt%3B%0A%09%09%09%09%09%26lt%3Bhtml%3Adiv%20id%3D%22desc01%22%26gt%3B%u041F%u0435%u0440%u0435%u0432%u043E%u0434%u0438%u043C...%26lt%3B/html%3Adiv%26gt%3B%0A%09%09%09%09%26lt%3B/html%3Adiv%26gt%3B%0A%09%09%09%09%26lt%3Bhtml%3Aiframe%20id%3D%22ifr01%22/%26gt%3B%0A%09%09%09%26lt%3B/html%3Abody%26gt%3B%0A%09%09%26lt%3B/html%3Ahtml%26gt%3B%0A%09%26lt%3B/box%26gt%3B%0A%26lt%3B/window%26gt%3B%26lt%3B/%26gt%3B%3B%0Awindow.%20openDialog%20%28%22data%3Aapplication/vnd.mozilla.xul+xml%2C%22%20+%20dialog.%20toXMLString%20%28%29%2C%20btoa%20%28escape%20%28text%29%29%2C%20%22chrome%2Cdependent%2Cminimizable%2Cdialog%3Dno%22%29%3B%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%3C/custombutton%3E

с меню:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3Eif%20%28%21window.%20cbTranslateButton%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09window.%20cbTranslateButtonX%20%3D%20event.%20screenX%3B%0A%09%09%09window.%20cbTranslateButtonY%20%3D%20event.%20screenY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%0A%7D%0A%0Avar%20menu%20%3D%20%26lt%3Bmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%20%20%20%20%0Aoncommand%3D%22this.parentNode.cbButtonDoMenuCommand%28event%29%22%26gt%3B%0A%09%26lt%3Bmenuitem%20value%3D%22Selection%22%20label%3D%22%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%22/%26gt%3B%0A%09%26lt%3Bmenuitem%20value%3D%22Page%22%20label%3D%22%u0421%u0442%u0440%u0430%u043D%u0438%u0446%u0430%22/%26gt%3B%0A%26lt%3B/menupopup%26gt%3B%3B%0Amenu%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28menu.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Amenu.%20setAttribute%20%28%22id%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20setAttribute%20%28%22popup%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20cbButtonDoMenuCommand%20%3D%20function%20%28event%29%0A%7B%0A%09var%20itemNum%20%3D%20event.%20target.%20getAttribute%20%28%22value%22%29%3B%0A%09switch%20%28itemNum%29%0A%09%7B%0A%09%09case%20%22Selection%22%3A%0A%09%09%09this.%20cbTranslateSelection%20%28%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22Page%22%3A%0A%09%09%09this.%20cbTranslatePage%20%28%29%3B%0A%09%09%09break%3B%0A%09%7D%0A%7D%3B%0Athis.%20cbTranslateSelection%20%3D%20function%20%28%29%0A%7B%0A%09var%20text%20%3D%20getBrowser%20%28%29.%20contentDocument.%20defaultView.%20getSelection%20%28%29%3B%0A%09var%20x%20%3D%20window.%20cbTranslateButtonX%3B%0A%09var%20y%20%3D%20window.%20cbTranslateButtonY%3B%0A%09if%20%28%21x%20%7C%7C%20%21y%29%0A%09%09x%20%3D%20y%20%3D%200%3B%0A%09XML.%20ignoreProcessingInstructions%20%3D%20false%3B%0A%09var%20dialog%20%3D%20%26lt%3B%26gt%3B%0A%09%26lt%3B%3Fxml-stylesheet%20href%3D%22chrome%3A//global/skin/%22%3F%26gt%3B%0A%09%26lt%3B%3Fxml-stylesheet%20href%3D%22resource%3A//gre/res/html.css%22%3F%26gt%3B%0A%09%26lt%3Bwindow%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09%09xmlns%3Ahtml%3D%22http%3A//www.w3.org/1999/xhtml%22%0A%09%09%09id%3D%22dlg01%22%0A%09%09%09screenX%3D%7Bx%7D%20screenY%3D%7By%7D%0A%09%09%09title%3D%22Google%20Translate%22%0A%09%09%09onload%3D%22f%28%29%22%0A%09%09%09onunload%3D%22f2%28%29%22%26gt%3B%0A%09%09%26lt%3Bscript%20type%3D%22application/x-javascript%22%26gt%3B%0A%09%09%09%26lt%3B%21%5BCDATA%5B%0A%09%09%09%09function%20f%20%28%29%0A%09%09%09%09%7B%0A%09%09%09%09%09var%20text%20%3D%20document.%20getElementById%20%28%22lbl01%22%29.%20getAttribute%20%28%22value%22%29%3B%0A%09%09%09%09%09window.%20addEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%09%09var%20src%3D%22http%3A//translate.google.com/translate_t%3Ftext%3D%22%20+%0A%09%09%09%09%09%09%09text%20+%20%22%26amp%3Bamp%3Bhl%3Dru%26amp%3Bamp%3Blangpair%3Dauto%7Cauto%26amp%3Bamp%3Btbb%3D1%26amp%3Bamp%3Bujs%3Dgtt%22%3B%0A%09%09%09%09%09document.%20getElementById%20%28%22ifr01%22%29.%20setAttribute%20%28%22src%22%2C%20src%29%3B%0A%09%09%09%09%09window.%20sizeToContent%20%28%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09function%20f2%20%28%29%0A%09%09%09%09%7B%0A%09%09%09%09%09window.%20removeEventListener%20%28%22DOMContentLoaded%22%2C%20f3%2C%20true%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09function%20f3%20%28%29%0A%09%09%09%09%7B%0A%09%09%09%09%09var%20doc%20%3D%20window.%20frames%20%5B0%5D.%20document%3B%0A%09%09%09%09%09var%20body%20%3D%20doc.%20body%3B%0A%09%09%09%09%09var%20t%20%3D%20%28body%20%26amp%3B%26amp%3B%20%21/%23808080/.%20test%20%28body.%20innerHTML%29%29%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20body.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%27%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20title%20+%3D%20%22%20-%20%22%20+%20t%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20r%20%3D%20doc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.%20getElementById%20%28%22desc01%22%29.%20innerHTML%20%3D%20r%3B%0A%09%09%09var%20ifr%20%3D%20document.%20getElementById%20%28%22ifr01%22%29%3B%0A%09%09%09ifr.%20parentNode.%20removeChild%20%28ifr%29%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20window.%20sizeToContent%20%28%29%3B%0A%09%09%09%09%7D%0A%09%09%09%5D%5D%26gt%3B%0A%09%09%26lt%3B/script%26gt%3B%0A%09%09%26lt%3Bbox%20width%3D%22350%22%26gt%3B%0A%09%09%09%26lt%3Blabel%20id%3D%22lbl01%22%20hidden%3D%22true%22%20value%3D%7Btext%7D/%26gt%3B%0A%09%09%09%26lt%3Bhtml%3Ahtml%20flex%3D%221%22%26gt%3B%0A%09%09%09%09%26lt%3Bhtml%3Ahead%26gt%3B%0A%09%09%09%09%09%26lt%3Bhtml%3Astyle%20type%3D%22text/css%22%26gt%3B%0A%09%09%09%09%09%09%26lt%3B%21%5BCDATA%5B%0A%09%09%09%09%09%09%09iframe%0A%09%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%09visibility%3A%20hidden%3B%0A%09%09%09%09%09%09%09%09width%3A%200px%3B%0A%09%09%09%09%09%09%09%09height%3A%200px%3B%0A%09%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%09%0A%09%09%09%09%09%09%09%23div1%0A%09%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%09left%3A%200%3B%0A%09%09%09%09%09%09%09%09top%3A%200%3B%0A%09%09%09%09%09%09%09%09font%3A%2016px%20Times%20New%20Roman%3B%0A%09%09%09%09%09%09%09%09border%3A%201px%20solid%20gray%3B%0A%09%09%09%09%09%09%09%09padding%3A%203px%3B%0A%09%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%09%0A%09%09%09%09%09%09%09%23desc01%0A%09%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%09border%3A%201px%20solid%20%23aaaaaa%3B%0A%09%09%09%09%09%09%09%09margin%3A%202px%200%200%200%3B%0A%09%09%09%09%09%09%09%09padding%3A%204px%3B%0A%09%09%09%09%09%09%09%09background-color%3A%20%23fafcfe%3B%0A%09%09%09%09%09%09%09%09font%3A%2014px%20Times%20New%20Roman%3B%0A%09%09%09%09%09%09%09%09-moz-user-select%3A%20text%3B%0A%09%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%5D%5D%26gt%3B%0A%09%09%09%09%09%26lt%3B/html%3Astyle%26gt%3B%0A%09%09%09%09%26lt%3B/html%3Ahead%26gt%3B%0A%09%09%09%09%26lt%3Bhtml%3Abody%26gt%3B%0A%09%09%09%09%09%26lt%3Bhtml%3Adiv%20id%3D%22div1%22%26gt%3B%0A%09%09%09%09%09%09%26lt%3Bhtml%3Adiv%20id%3D%22desc01%22%26gt%3B%u041F%u0435%u0440%u0435%u0432%u043E%u0434%u0438%u043C...%26lt%3B/html%3Adiv%26gt%3B%0A%09%09%09%09%09%26lt%3B/html%3Adiv%26gt%3B%0A%09%09%09%09%09%26lt%3Bhtml%3Aiframe%20id%3D%22ifr01%22/%26gt%3B%0A%09%09%09%09%26lt%3B/html%3Abody%26gt%3B%0A%09%09%09%26lt%3B/html%3Ahtml%26gt%3B%0A%09%09%26lt%3B/box%26gt%3B%0A%09%26lt%3B/window%26gt%3B%26lt%3B/%26gt%3B%3B%0A%09window.%20openDialog%20%28%22data%3Aapplication/vnd.mozilla.xul+xml%2C%22%20+%20dialog.%20toXMLString%20%28%29%2C%20btoa%20%28escape%20%28text%29%29%2C%20%22chrome%2Cdependent%2Cminimizable%2Cdialog%3Dno%22%29%3B%0A%7D%3B%0Athis.%20cbTranslatePage%20%3D%20function%20%28%29%0A%7B%0A%09var%20lng%20%3D%20%28getBrowser%20%28%29.%20contentDocument.%20defaultView.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09var%20url%20%3D%20%22http%3A//translate.google.com/translate%3Fu%3D%22%20+%0A%09%09%09%20%20escape%20%28getBrowser%20%28%29.%20contentDocument.%20location.%20href%29%20+%0A%09%09%09%20%20%22%26amp%3Bhl%3D%22%20+%0A%09%09%09%20%20lng%20+%0A%09%09%09%20%20%22%26amp%3Blangpair%3Dauto%7Cru%26amp%3Btbb%3D1%22%20+%0A%09%09%09%20%20%28getBrowser%20%28%29.%20contentDocument.%20charset%3F%0A%09%09%09%20%20%09%22%26amp%3Bie%3D%22%20+%20getBrowser%20%28%29.%20contentDocument.%20charset%3A%0A%09%09%09%09%20%20%22%22%29%3B%0A%09%09%20%20getBrowser%20%28%29.%20addTab%20%28url%2C%20null%2C%20null%29%3B%0A%09return%3B%0A%7D%3B%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

Deim0s

Если брать именно оригинальный Гугловский скрипт, можно ли сделать что бы он запускался в новой вкладке, а не как через getBrowser (). contentDocument. location. href = "", в текущей?

У меня на этот счёт пока что нет никаких обещающих идей, к сожалению.

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

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

Сделал кнопку для Promt-X из Promt 7, через goDoCommand ("cmd_copy");, но подозреваю что много лишнего, как приблизительно должен выглядеть код? (Promt-X, сам берёт из буфера выделенное, при запуске).

Сложно сказать, не видя кода.

И последний вопрос - возможно ли сделать проверку орфографии с помощью MS Office, через известный скрипт Spell.vbs.

Я нашёл в google код для запуска spell.vbs:

Код:

Item, "проверка орфографии" = Select all & Copy & Execute Program, "Spell.vbs","%c"

по аналогии, должно быть что-то вроде

Код:

goDoCommand ("cmd_selectAll");
goDoCommand ("cmd_copy");
function startProcess (path, arg1, arg2)
{
    var file = Components. classes["@mozilla.org/file/local;1"].
           createInstance (Components.interfaces.nsILocalFile);
    var process = Components. classes ["@mozilla.org/process/util;1"].
              getService (Components. interfaces. nsIProcess);
    file. initWithPath (path);
    process. init (file);
    process. run (false, [arg1, arg2], 2); 
}
startProcess ("c:\\winxp\\system32\\wscript.exe", "c:\\path\\to\\vbsspell\\spell.vbs", "\"" + getBrowser (). contentDocument. defaultView. getSelection () + "\"");

Но проверить не могу, MSO у меня сейчас нет (как и Promt'а)

Anton
По скрипту для spell.vbs:
Спасибо большое, работает отлично, я правда (и в опере то же) убрал "selectAll", что бы проверять только выделенный текст, в том скрипте, что Вы написали, все функции работают как надо - проверяет любой выделенный текст (если убрать "cmd_selectAll"), предлагает замену ошибочных слов, в форме ответа автоматически заменяет выбранное, ещё раз спасибо, неплохое дополнение к стандартной проверке FF.
По Promt-X из Promt 7:
Запускаю скриптом, который нашёл в начале топика, у меня выглядит так:

Код:

goDoCommand ("cmd_copy");
var path='D:\\Soft\\PRMT6\\PRMTX\\prmtx.exe';  var arguments=['']; var file = Components.classes['@mozilla.org/file/local;1']     .createInstance(Components.interfaces.nsILocalFile); var process = Components.classes['@mozilla.org/process/util;1']     .getService(Components.interfaces.nsIProcess);  file.initWithPath(path);   process.init(file);  process.run(false,arguments,arguments.length);

всё работает, но хотел спросить, может лишнее что то?
По Get File Size:
Есть такая не плохая утилита Get-File-Size, у меня стоит расширение Extended Link Properties, с аналогичными функциями, но он не берёт текстовые ссылки вида _http://www.ru/программа.exe, хотелось бы кнопку для Get-File-Size. Для оперы выглядит так:

Код:

Execute Program,"C:\Program Files\UnH Solutions\Get File Size\GetFileSize.exe","/url:%t"

.

всё работает, но хотел спросить, может лишнее что то?

По-моему, ничего лишнего. Разве что, наверное можно через file. launch (), раз без аргументов, но это, не особенно важно, я думаю.

Для Get-File-Size, кажется, так:

Код:

function startProcess (path, arg1)
{
    var file = Components. classes["@mozilla.org/file/local;1"].
           createInstance (Components.interfaces.nsILocalFile);
    var process = Components. classes ["@mozilla.org/process/util;1"].
              getService (Components. interfaces. nsIProcess);
    file. initWithPath (path);
    process. init (file);
    process. run (false, [arg1], 1); 
}
startProcess ("c:\\program files\\UnH Solutions\\Get File Size\\GetFileSize.exe", "/url:" + getBrowser (). contentDocument. defaultView. getSelection ());

Deim0s не проще ли поставить Get File Size ;)

Anton

Для Get-File-Size, кажется, так:

Не много не получается, если взять любую текстовую ссылку, к примеру ту же: _http://www.ru/программа.exe, выделить всё после _, то в опере получается нормально:
http://i016.radikal.ru/0807/3a/2fe395f81d7b.png
В FF, через код который Вы написали, получается так:
http://i082.radikal.ru/0807/79/984b2f150621.png
и почему то не берёт ссылки из полей ввода.
Z&N
Спасибо, но я расширениями не увлекаюсь, стоят несколько штук, только самые необходимые, без которых ни как, всё остальное стараюсь делать через: userChrome.css и userContent.css, ещё и познавательно к тому же :). Да и Get-File-Size всё равно установлен, почему б не попользоваться.

Deim0s
Тогда так:

Код:

function startProcess (path, arg1)
{
    var file = Components. classes["@mozilla.org/file/local;1"].
           createInstance (Components.interfaces.nsILocalFile);
    var process = Components. classes ["@mozilla.org/process/util;1"].
              getService (Components. interfaces. nsIProcess);
    file. initWithPath (path);
    process. init (file);
    process. run (false, [arg1], 1); 
}
var sel = document. commandDispatcher. focusedWindow. getSelection (). toString () ||
      document. commandDispatcher. focusedElement. value;
var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
suc. charset = "windows-1251";
sel = suc. ConvertFromUnicode (sel);
startProcess ("c:\\program files\\UnH Solutions\\Get File Size\\GetFileSize.exe", "/url:" + sel);

Anton
Спасибо, так работает как надо, осталось маленькое но (если я Вам не надоел ещё, с этим GetFileSize'oм :)), в поле ответа копирует не только выделенное, а всё. Выглядит так, если к примеру в поле ответа ссылка вида: Скачать_http://www.ru/программа.exe
и я выделяю всё что после "Скачать_", то получается так:
http://i012.radikal.ru/0807/22/1c3fc906b5f7.png
И отсюда ещё вопрос: вот Вы написали скрипт для GetFileSize, он берёт выделенное ото всюду и из полей ввода в том числе, а вот скрипт Google-translate, не может брать не из полей ввода, не из полей ответа, можно это исправить? (для скрипта из поста № 567, к примеру, он попроще вроде).

Anton
СПАСИБО!!!
Релиз кнопок состоялся. Замечательные кнопочки получились!!!

Погонял кнопочки по сайтам и обнаружились некоторые неудобства касательно всплывающего окошка:
1. Переведенный текст теряет исходный формат. Трудно читать и сравнивать с оригиналом.
2. Выделить мышкой текст во всплывающем окошке можно, а скопировать через контекстое меню в буфер обмена не получается - само меню не появляется. А хотелось бы.
3. Размер всплывающего окошка.
Ширина хорошая, больше не надо.
В зависимости от знаков в тексте окошко меняет свою высоту.
Для эксперимента (хотя это скорее всего не понадобится) попробовал перевод большого текста. Получилась большая высота окошка и стало неудобно сравнивать перевод с оригиналом.
Оптимально - соотношение ширины и высоты - 1 : 1,0...1,1 с прокруткой текста.
Можно поправить?

Deim0s
Надо заменить

Код:

var sel = document. commandDispatcher. focusedWindow. getSelection (). toString () ||
      document. commandDispatcher. focusedElement. value;

на

Код:

var sel = document. commandDispatcher. focusedWindow. getSelection (). toString ();
if (!sel)
{
    var el = document. commandDispatcher. focusedElement;
    sel = el. value. substring (el. selectionStart, el. selectionEnd);
}

То же самое и для google-трансляторов

Vvld

1. Переведенный текст теряет исходный формат. Трудно читать и сравнивать с оригиналом.

Поскольку мне неочевидно, как это сделать в реализации с всплывающим окошком, пришлось сделать реализацию, копирующую поведение (и код) скрипта для Opera более точно. После чего все последующие замечания отпадают.
кнопка без меню:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton2%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09window.%20cbTranslateButton2X%20%3D%20event.%20clientX%3B%0A%09%09%09window.%20cbTranslateButton2Y%20%3D%20event.%20clientY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%3B%0A%09window.%20cbTranslateButton2%20%3D%20true%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%09original%20script%20is%20operajs%20Google-Translate%20v%201.6.12%0A%09opera%20ujs%20is%20http%3A//lexi.ucoz.ru/google-translate.js%0A%09original%20author%3A%20Lex1%0A%09modified%20by%20Anton%0A*/%0A%0Aconst%20UJS_TOOLBAR_ID%20%3D%20%22ujs_toolbar%22%3B%0Aconst%20UJS_GOOGLE_TRANSLATE_FRAME_ID%20%3D%20%22ujs_googletranslateframe%22%3B%0A%0Afunction%20ujs_createWindow%20%28txt%29%0A%7B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20win%20%3D%20doc.%20defaultView%3B%0A%09var%20h%2C%20w%3B%0A%20%20%20%20var%20txtLen%20%3D%20txt.%20length%3B%0A%20%20%20%20var%20tbId%20%3D%20UJS_TOOLBAR_ID%3B%0A%20%20%20%20if%20%28arguments.%20length%20%3E%202%29%0A%20%20%20%20%20%20%20%20tbId%20+%3D%20arguments%20%5B2%5D%3B%0A%09var%20toolbar%20%3D%20doc.%20getElementById%20%28tbId%29%3B%0A%20%20%20%20if%20%28toolbar%29%0A%20%20%20%20%20%20%20%20toolbar.%20parentNode.%20removeChild%20%28toolbar%29%3B%0A%20%20%20%20toolbar%20%3D%20doc.%20createElement%20%28%27div%27%29%3B%0A%20%20%20%20toolbar.%20id%20%3D%20tbId%3B%0A%09if%20%28arguments.%20length%20%3D%3D%205%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20w%20%3D%20arguments%20%5B3%5D%3B%0A%20%20%20%20%20%20%20%20h%20%3D%20arguments%20%5B4%5D%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20h%20%3D%2015%3B%0A%20%20%20%20%20%20%20%20w%20%3D%2020%3B%0A%20%20%20%20%20%20%20%20if%20%28txtLen%20%3E%202000%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2050%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2066%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20%28txtLen%20%3E%20250%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2025%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2033%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20h%20%3D%20parseInt%20%28h%20*%20win.%20innerHeight%20/%20100%29%3B%0A%20%20%20%20%20%20%20%20w%20%3D%20parseInt%20%28w%20*%20win.%20innerWidth%20/%20100%29%0A%20%20%20%20%7D%3B%0A%09var%20title%20%3D%20%28arguments.%20length%20%3E%201%29%20%3Farguments%20%5B1%5D%3A%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%3B%0A%09toolbar.%20innerHTML%20%3D%20%27%3Cimg%20src%3D%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAStJREFUOE+1k9tqhDAQhtOHqO37P4E3IlQFQQSvBBVEl1TBVVi1B+1C8XAx3QmNqIVqhBV+DEPmy8z8ycPX9Ruq6kLqqiRHvkfpiUjSMyGUJtB1HfR9D8MwCAlz6voNkEGCIGDJeZ5DURTCatoWNE0D4nk+jOMoDMBD8fDPpoGXu4OyLAPUutV1/N+KcPPNPaY4jidYktwG+hunlLL4ZmsI4EloxhxiGAY4jgNpmm6D8DQEcBj/I8SyrKnSzYr4bDzPm2CKoiwgu1rDTfN2eEWu6y4M2KxoPRNVVRcz4xXvdm0+k/nMwjDc5xraa9v2n5kgwDRNMdfQXtT6Us7jy9Z8n738Iw82O5/hUpag6zqQ0+kVmqZld0NUURSxl48M8v5xZQtZlg8Jc5HxA5fIE73hTda3AAAAAElFTkSuQmCC%22%20title%3D%22Close%22%20width%3D%2218%22%20height%3D%2218%22%3E%26nbsp%3B%27%20+%20title%20+%20%27%3Cdiv%3E%3C/div%3E%27%3B%0A%09toolbar.%20setAttribute%28%27style%27%2C%20%27position%3Afixed%3Bbackground%3Awhite%3Bdisplay%3Ablock%3Bvisibility%3Ahidden%3Bleft%3A0%3Btop%3A0%3Bheight%3Aauto%3Bwidth%3A%27%20+%20w%20+%20%27px%3Bfont%3A16px%20Times%20New%20Roman%3Bborder%3A1px%20solid%20gray%3Bpadding%3A3px%3Bz-index%3A9997%3Boverflow%3Avisible%3Bcursor%3Amove%3B%27%29%3B%0A%09toolbar.%20addEventListener%0A%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%27mousedown%27%2C%0A%20%20%20%20%20%20%20%20function%20%28e%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28e.%20target%20%3D%3D%20toolbar%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.%20preventDefault%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20toolbar.%20style.%20zIndex%20%3D%209998%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20grabX%20%3D%20e.%20clientX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20grabY%20%3D%20e.%20clientY%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20origX%20%3D%20parseInt%20%28toolbar.%20style.%20left%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20origY%20%3D%20parseInt%20%28toolbar.%20style.%20top%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20dnd%20%3D%20function%20%28e%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%09%09%09%09%20%20%20%20toolbar.%20style.%20left%20%3D%20origX%20+%20e.%20clientX%20-%20grabX%20+%20%27px%27%3B%0A%09%09%09%09%20%20%20%20toolbar.%20style.%20top%20%3D%20origY%20+%20e.%20clientY%20-%20grabY%20+%20%27px%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20addEventListener%20%28%27mousemove%27%2C%20dnd%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20addEventListener%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27mouseup%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20function%20%28e%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20removeEventListener%20%28%27mousemove%27%2C%20dnd%2C%20false%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%20toolbar.%20style.%20zIndex%20%3D%209997%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20false%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20false%0A%20%20%20%20%29%3B%0A%09var%20clse%20%3D%20toolbar.%20firstChild%3B%0A%20%20%20%20clse.%20setAttribute%20%28%27style%27%2C%20%27float%3Aright%3Bbackground%3Awhite%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3Anone%3Bcursor%3Apointer%3B%27%29%3B%0A%09clse.%20addEventListener%0A%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%27click%27%2C%20function%20%28%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20toolbar.%20parentNode.%20removeChild%20%28toolbar%29%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20false%0A%20%20%20%20%29%3B%0A%09var%20textbar%20%3D%20toolbar.%20lastChild%3B%0A%20%20%20%20textbar.%20innerHTML%20%3D%20txt%3B%0A%09textbar.%20setAttribute%20%28%27style%27%2C%20%27display%3Ablock%3Bborder%3A1px%20solid%20%23aaaaaa%3Bmargin%3A2px%200%200%200%3Bpadding%3A4px%3Bbackground-color%3A%23fafcfe%3Bfont%3A14px%20Times%20New%20Roman%3Bheight%3A%27%20+%20h%20+%20%27px%3Bwidth%3Aauto%3Boverflow%3Aauto%3Bcursor%3Atext%3B%27%29%3B%0A%09doc.%20documentElement.%20appendChild%20%28toolbar%29%3B%0A%09var%20halfWidth%20%3D%20parseInt%20%28toolbar.%20offsetWidth%20/%202%29%3B%0A%09var%20strict%20%3D%20doc.%20compatMode%20%3D%3D%20%27CSS1Compat%27%3B%0A%09var%20mX%20%3D%20%28strict%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientWidth%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientWidth%29%20-%20toolbar.%20offsetWidth%3B%0A%09var%20mY%20%3D%20%28strict%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientHeight%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientHeight%29%20-%20toolbar.%20offsetHeight%3B%0A%20%20%20%20var%20lastClickX%20%3D%20window.%20cbTranslateButton2X%3B%0A%20%20%20%20var%20lastClickY%20%3D%20window.%20cbTranslateButton2Y%3B%0A%09toolbar.%20style.%20left%20%3D%20%28%28lastClickX%20%3C%20mX%20+%20halfWidth%29%3F%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%28lastClickX%20%3E%20halfWidth%3F%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%28lastClickX%20-%20halfWidth%29%3A%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%200%29%3A%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%20mX%29%20+%20%22px%22%3B%0A%09toolbar.%20style.%20top%20%3D%20%28%28lastClickY%20%3C%20mY%29%3F%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%20lastClickY%3A%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%20mY%29%20+%20%22px%22%3B%0A%09toolbar.%20style.%20visibility%20%3D%20%27visible%27%3B%0A%20%20%20%20return%20textbar%3B%0A%7D%0A%0Afunction%20frameOnLoad%20%28event%29%0A%7B%0A%09var%20fr%20%3D%20event.%20currentTarget%3B%0A%09var%20tbId%20%3D%20fr.%20id.%20substring%20%28UJS_GOOGLE_TRANSLATE_FRAME_ID.%20length%29%3B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20toolbar%20%3D%20doc.%20getElementById%20%28UJS_TOOLBAR_ID%20+%20tbId%29%3B%0A%09var%20frdoc%20%3D%20fr.%20contentDocument%3B%0A%09var%20a%20%3D%20frdoc.%20getElementById%20%28%27autotrans%27%29%3B%0A%09var%20title%20%3D%20%28a%20%26%26%20%21/%23808080/.%20test%20%28a.%20innerHTML%29%29%3F%0A%09%09%09%09%09%27%26nbsp%3B-%26nbsp%3B%27%20+%20a.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%0A%09%09%09%09%09%27%27%3B%0A%09var%20result%20%3D%20frdoc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%09var%20ancor%20%3D%20toolbar.%20getElementsByTagName%20%28%22a%22%29%20%5B0%5D%3B%0A%09ancor.%20innerHTML%20+%3D%20title%3B%0A%09ancor.%20nextSibling.%20innerHTML%20%3D%20result%3B%0A%09setTimeout%0A%09%28%0A%09%09function%20%28%29%0A%09%09%7B%0A%09%09%09fr.%20parentNode.%20removeChild%20%28fr%29%3B%0A%09%09%7D%2C%0A%09%090%0A%09%29%3B%0A%7D%0A%0Afunction%20google_translate%20%28language%29%0A%7B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20win%20%3D%20doc.%20defaultView%3B%0A%09var%20t%20%3D%20document.%20commandDispatcher.%20focusedWindow.%20getSelection%20%28%29.%20toString%20%28%29%3B%0A%09var%20lng%20%3D%20%28win.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%20%20%20%20if%20%28t%20%26%26%20location.%20hostname%20%21%3D%20%27translate.google.com%27%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ujs_createWindow%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%28lng%20%3D%3D%20%27ru%27%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu041F%5Cu0435%5Cu0440%5Cu0435%5Cu0432%5Cu043E%5Cu0434%5Cu0438%5Cu043C%27%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27Translating%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu2026%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20btoa%20%28escape%20%28t%29%29%0A%20%20%20%20%20%20%20%20%29%3B%0A%09%09var%20gtfId%20%3D%20UJS_GOOGLE_TRANSLATE_FRAME_ID%3B%0A%09%09var%20fr%20%3D%20doc.%20getElementById%20%28gtfId%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21fr%29%0A%20%20%20%20%20%20%20%20%20%20%20%20fr%20%3D%20doc.%20createElement%20%28%27iframe%27%29%3B%0A%09%09fr.%20setAttribute%20%28%27id%27%2C%20gtfId%20+%20btoa%20%28escape%20%28t%29%29%29%3B%0A%20%20%20%20%20%20%20%20fr.%20setAttribute%20%28%27frameborder%27%2C%20%270%27%29%3B%0A%09%09fr.%20setAttribute%20%28%27style%27%2C%20%27width%3A0px%3Bheight%3A0px%3Bvisibility%3Ahidden%3Bposition%3Aabsolute%3Bleft%3A-999em%3B%27%29%3B%0A%09%09fr.%20setAttribute%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%27src%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate_t%3Ftext%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%20%28t%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%26ujs%3Dgtt%27%0A%20%20%20%20%20%20%20%20%29%3B%0A%09%09fr.%20addEventListener%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%27load%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20frameOnLoad%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20false%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20doc.%20documentElement.%20appendChild%20%28fr%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%09getBrowser%20%28%29.%20addTab%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate%3Fu%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20escape%20%28doc.%20location.%20href%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%28doc.%20charset%3F%20%27%26ie%3D%27%20+%20doc.%20charset%3A%20%27%27%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20null%0A%20%20%20%20%20%20%20%20%29%3B%0A%09%7D%0A%7D%0A%0Agoogle_translate%20%28%22auto%7Cru%22%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%3C/custombutton%3E

кнопка с меню:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton2%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09window.%20cbTranslateButton2X%20%3D%20event.%20clientX%3B%0A%09%09%09window.%20cbTranslateButton2Y%20%3D%20event.%20clientY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%3B%0A%09window.%20cbTranslateButton2%20%3D%20true%3B%0A%7D%0Avar%20menu%20%3D%20%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%20%20%20%20%0Aoncommand%3D%22this.parentNode.cbButtonDoMenuCommand%28event%29%22%3E%0A%09%3Cmenuitem%20value%3D%22Selection%22%20label%3D%22%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%22/%3E%0A%09%3Cmenuitem%20value%3D%22Page%22%20label%3D%22%u0421%u0442%u0440%u0430%u043D%u0438%u0446%u0430%22/%3E%0A%3C/menupopup%3E%3B%0Amenu%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28menu.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Amenu.%20setAttribute%20%28%22id%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20setAttribute%20%28%22popup%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20cbButtonDoMenuCommand%20%3D%20function%20%28event%29%0A%7B%0A%09var%20itemNum%20%3D%20event.%20target.%20getAttribute%20%28%22value%22%29%3B%0A%09switch%20%28itemNum%29%0A%09%7B%0A%09%09case%20%22Selection%22%3A%0A%09%09%09google_translate%20%28%22auto%7Cru%22%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22Page%22%3A%0A%09%09%09this.%20cbTranslatePage%20%28%22auto%7Cru%22%29%3B%0A%09%09%09break%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20cbTranslatePage%20%3D%20function%20%28language%29%0A%7B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20win%20%3D%20doc.%20defaultView%3B%0A%09var%20t%20%3D%20document.%20commandDispatcher.%20focusedWindow.%20getSelection%20%28%29.%20toString%20%28%29%3B%0A%09var%20lng%20%3D%20%28win.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09getBrowser%20%28%29.%20addTab%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate%3Fu%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20escape%20%28doc.%20location.%20href%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%28doc.%20charset%3F%20%27%26ie%3D%27%20+%20doc.%20charset%3A%20%27%27%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20null%0A%20%20%20%20%20%20%20%20%29%3B%0A%7D%3B%0A%0Aconst%20UJS_TOOLBAR_ID%20%3D%20%22ujs_toolbar%22%3B%0Aconst%20UJS_GOOGLE_TRANSLATE_FRAME_ID%20%3D%20%22ujs_googletranslateframe%22%3B%0A%0Afunction%20ujs_createWindow%20%28txt%29%0A%7B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20win%20%3D%20doc.%20defaultView%3B%0A%09var%20h%2C%20w%3B%0A%20%20%20%20var%20txtLen%20%3D%20txt.%20length%3B%0A%20%20%20%20var%20tbId%20%3D%20UJS_TOOLBAR_ID%3B%0A%20%20%20%20if%20%28arguments.%20length%20%3E%202%29%0A%20%20%20%20%20%20%20%20tbId%20+%3D%20arguments%20%5B2%5D%3B%0A%09var%20toolbar%20%3D%20doc.%20getElementById%20%28tbId%29%3B%0A%20%20%20%20if%20%28toolbar%29%0A%20%20%20%20%20%20%20%20toolbar.%20parentNode.%20removeChild%20%28toolbar%29%3B%0A%20%20%20%20toolbar%20%3D%20doc.%20createElement%20%28%27div%27%29%3B%0A%20%20%20%20toolbar.%20id%20%3D%20tbId%3B%0A%09if%20%28arguments.%20length%20%3D%3D%205%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20w%20%3D%20arguments%20%5B3%5D%3B%0A%20%20%20%20%20%20%20%20h%20%3D%20arguments%20%5B4%5D%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20h%20%3D%2015%3B%0A%20%20%20%20%20%20%20%20w%20%3D%2020%3B%0A%20%20%20%20%20%20%20%20if%20%28txtLen%20%3E%202000%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2050%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2066%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20%28txtLen%20%3E%20250%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2025%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2033%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20h%20%3D%20parseInt%20%28h%20*%20win.%20innerHeight%20/%20100%29%3B%0A%20%20%20%20%20%20%20%20w%20%3D%20parseInt%20%28w%20*%20win.%20innerWidth%20/%20100%29%0A%20%20%20%20%7D%3B%0A%09var%20title%20%3D%20%28arguments.%20length%20%3E%201%29%20%3Farguments%20%5B1%5D%3A%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%3B%0A%09toolbar.%20innerHTML%20%3D%20%27%3Cimg%20src%3D%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAStJREFUOE+1k9tqhDAQhtOHqO37P4E3IlQFQQSvBBVEl1TBVVi1B+1C8XAx3QmNqIVqhBV+DEPmy8z8ycPX9Ruq6kLqqiRHvkfpiUjSMyGUJtB1HfR9D8MwCAlz6voNkEGCIGDJeZ5DURTCatoWNE0D4nk+jOMoDMBD8fDPpoGXu4OyLAPUutV1/N+KcPPNPaY4jidYktwG+hunlLL4ZmsI4EloxhxiGAY4jgNpmm6D8DQEcBj/I8SyrKnSzYr4bDzPm2CKoiwgu1rDTfN2eEWu6y4M2KxoPRNVVRcz4xXvdm0+k/nMwjDc5xraa9v2n5kgwDRNMdfQXtT6Us7jy9Z8n738Iw82O5/hUpag6zqQ0+kVmqZld0NUURSxl48M8v5xZQtZlg8Jc5HxA5fIE73hTda3AAAAAElFTkSuQmCC%22%20title%3D%22Close%22%20width%3D%2218%22%20height%3D%2218%22%3E%26nbsp%3B%27%20+%20title%20+%20%27%3Cdiv%3E%3C/div%3E%27%3B%0A%09toolbar.%20setAttribute%28%27style%27%2C%20%27position%3Afixed%3Bbackground%3Awhite%3Bdisplay%3Ablock%3Bvisibility%3Ahidden%3Bleft%3A0%3Btop%3A0%3Bheight%3Aauto%3Bwidth%3A%27%20+%20w%20+%20%27px%3Bfont%3A16px%20Times%20New%20Roman%3Bborder%3A1px%20solid%20gray%3Bpadding%3A3px%3Bz-index%3A9997%3Boverflow%3Avisible%3Bcursor%3Amove%3B%27%29%3B%0A%09toolbar.%20addEventListener%0A%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%27mousedown%27%2C%0A%20%20%20%20%20%20%20%20function%20%28e%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28e.%20target%20%3D%3D%20toolbar%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.%20preventDefault%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20toolbar.%20style.%20zIndex%20%3D%209998%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20grabX%20%3D%20e.%20clientX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20grabY%20%3D%20e.%20clientY%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20origX%20%3D%20parseInt%20%28toolbar.%20style.%20left%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20origY%20%3D%20parseInt%20%28toolbar.%20style.%20top%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20dnd%20%3D%20function%20%28e%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%09%09%09%09%20%20%20%20toolbar.%20style.%20left%20%3D%20origX%20+%20e.%20clientX%20-%20grabX%20+%20%27px%27%3B%0A%09%09%09%09%20%20%20%20toolbar.%20style.%20top%20%3D%20origY%20+%20e.%20clientY%20-%20grabY%20+%20%27px%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20addEventListener%20%28%27mousemove%27%2C%20dnd%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20addEventListener%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27mouseup%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20function%20%28e%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20removeEventListener%20%28%27mousemove%27%2C%20dnd%2C%20false%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%20toolbar.%20style.%20zIndex%20%3D%209997%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20false%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20false%0A%20%20%20%20%29%3B%0A%09var%20clse%20%3D%20toolbar.%20firstChild%3B%0A%20%20%20%20clse.%20setAttribute%20%28%27style%27%2C%20%27float%3Aright%3Bbackground%3Awhite%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3Anone%3Bcursor%3Apointer%3B%27%29%3B%0A%09clse.%20addEventListener%0A%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%27click%27%2C%20function%20%28%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20toolbar.%20parentNode.%20removeChild%20%28toolbar%29%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20false%0A%20%20%20%20%29%3B%0A%09var%20textbar%20%3D%20toolbar.%20lastChild%3B%0A%20%20%20%20textbar.%20innerHTML%20%3D%20txt%3B%0A%09textbar.%20setAttribute%20%28%27style%27%2C%20%27display%3Ablock%3Bborder%3A1px%20solid%20%23aaaaaa%3Bmargin%3A2px%200%200%200%3Bpadding%3A4px%3Bbackground-color%3A%23fafcfe%3Bfont%3A14px%20Times%20New%20Roman%3Bheight%3A%27%20+%20h%20+%20%27px%3Bwidth%3Aauto%3Boverflow%3Aauto%3Bcursor%3Atext%3B%27%29%3B%0A%09doc.%20documentElement.%20appendChild%20%28toolbar%29%3B%0A%09var%20halfWidth%20%3D%20parseInt%20%28toolbar.%20offsetWidth%20/%202%29%3B%0A%09var%20strict%20%3D%20doc.%20compatMode%20%3D%3D%20%27CSS1Compat%27%3B%0A%09var%20mX%20%3D%20%28strict%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientWidth%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientWidth%29%20-%20toolbar.%20offsetWidth%3B%0A%09var%20mY%20%3D%20%28strict%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientHeight%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientHeight%29%20-%20toolbar.%20offsetHeight%3B%0A%20%20%20%20var%20lastClickX%20%3D%20window.%20cbTranslateButton2X%3B%0A%20%20%20%20var%20lastClickY%20%3D%20window.%20cbTranslateButton2Y%3B%0A%09toolbar.%20style.%20left%20%3D%20%28%28lastClickX%20%3C%20mX%20+%20halfWidth%29%3F%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%28lastClickX%20%3E%20halfWidth%3F%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%28lastClickX%20-%20halfWidth%29%3A%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%200%29%3A%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%20mX%29%20+%20%22px%22%3B%0A%09toolbar.%20style.%20top%20%3D%20%28%28lastClickY%20%3C%20mY%29%3F%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%20lastClickY%3A%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%20mY%29%20+%20%22px%22%3B%0A%09toolbar.%20style.%20visibility%20%3D%20%27visible%27%3B%0A%20%20%20%20return%20textbar%3B%0A%7D%0A%0Afunction%20frameOnLoad%20%28event%29%0A%7B%0A%09var%20fr%20%3D%20event.%20currentTarget%3B%0A%09var%20tbId%20%3D%20fr.%20id.%20substring%20%28UJS_GOOGLE_TRANSLATE_FRAME_ID.%20length%29%3B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20toolbar%20%3D%20doc.%20getElementById%20%28UJS_TOOLBAR_ID%20+%20tbId%29%3B%0A%09var%20frdoc%20%3D%20fr.%20contentDocument%3B%0A%09var%20a%20%3D%20frdoc.%20getElementById%20%28%27autotrans%27%29%3B%0A%09var%20title%20%3D%20%28a%20%26%26%20%21/%23808080/.%20test%20%28a.%20innerHTML%29%29%3F%0A%09%09%09%09%09%27%26nbsp%3B-%26nbsp%3B%27%20+%20a.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%0A%09%09%09%09%09%27%27%3B%0A%09var%20result%20%3D%20frdoc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%09var%20ancor%20%3D%20toolbar.%20getElementsByTagName%20%28%22a%22%29%20%5B0%5D%3B%0A%09ancor.%20innerHTML%20+%3D%20title%3B%0A%09ancor.%20nextSibling.%20innerHTML%20%3D%20result%3B%0A%09setTimeout%0A%09%28%0A%09%09function%20%28%29%0A%09%09%7B%0A%09%09%09fr.%20parentNode.%20removeChild%20%28fr%29%3B%0A%09%09%7D%2C%0A%09%090%0A%09%29%3B%0A%7D%0A%0Afunction%20google_translate%20%28language%29%0A%7B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20win%20%3D%20doc.%20defaultView%3B%0A%09var%20t%20%3D%20document.%20commandDispatcher.%20focusedWindow.%20getSelection%20%28%29.%20toString%20%28%29%3B%0A%09var%20lng%20%3D%20%28win.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%20%20%20%20if%20%28t%20%26%26%20location.%20hostname%20%21%3D%20%27translate.google.com%27%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ujs_createWindow%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%28lng%20%3D%3D%20%27ru%27%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu041F%5Cu0435%5Cu0440%5Cu0435%5Cu0432%5Cu043E%5Cu0434%5Cu0438%5Cu043C%27%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27Translating%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu2026%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20btoa%20%28escape%20%28t%29%29%0A%20%20%20%20%20%20%20%20%29%3B%0A%09%09var%20gtfId%20%3D%20UJS_GOOGLE_TRANSLATE_FRAME_ID%3B%0A%09%09var%20fr%20%3D%20doc.%20getElementById%20%28gtfId%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21fr%29%0A%20%20%20%20%20%20%20%20%20%20%20%20fr%20%3D%20doc.%20createElement%20%28%27iframe%27%29%3B%0A%09%09fr.%20setAttribute%20%28%27id%27%2C%20gtfId%20+%20btoa%20%28escape%20%28t%29%29%29%3B%0A%20%20%20%20%20%20%20%20fr.%20setAttribute%20%28%27frameborder%27%2C%20%270%27%29%3B%0A%09%09fr.%20setAttribute%20%28%27style%27%2C%20%27width%3A0px%3Bheight%3A0px%3Bvisibility%3Ahidden%3Bposition%3Aabsolute%3Bleft%3A-999em%3B%27%29%3B%0A%09%09fr.%20setAttribute%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%27src%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate_t%3Ftext%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%20%28t%29%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%26ujs%3Dgtt%27%0A%20%20%20%20%20%20%20%20%29%3B%0A%09%09fr.%20addEventListener%0A%20%20%20%20%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%27load%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20frameOnLoad%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20false%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20doc.%20documentElement.%20appendChild%20%28fr%29%3B%0A%20%20%20%20%7D%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%09original%20script%20is%20operajs%20Google-Translate%20v%201.6.12%0A%09opera%20ujs%20is%20http%3A//lexi.ucoz.ru/google-translate.js%0A%09original%20author%3A%20Lex1%0A%09modified%20by%20Anton%0A*/%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%3C/custombutton%3E

Anton

Надо заменить... на...

Спасибо, для GetFileSize, всё работает отлично, берёт текстовые ссылки от куда угодно и правильно.

То же самое и для google-трансляторов

Покрутил я извилинами, но безрезультатно, помогите если не трудно, пользую такой скрипт (как из поста № 567):

Код:

var t = content.getSelection().toString();
var c = content.document.characterSet;
var loc = content.location.href;
getBrowser().loadOneTab(
    t
        ? "http://translate.google.ru/translate_t?text=" + t + "&hl=ru&langpair=auto|ru&tbb=1&ie=" + c
        : /^https?:\/\//i.test(loc)
            ? "http://translate.google.ru/translate?u=" + escape(loc) + "&hl=ru&langpair=auto|ru&tbb=1&ie=" + c
            : "http://translate.google.ru/translate_t?hl=ru",
    null, null, null, false /* load in background */, false
);

Ещё к Вам, как к разработчику, такой вопрос: если в сторонних установленных расширениях не указан собственный адрес "Страницы поддержки", они все берут его от Custom Buttons, примеры:
http://i005.radikal.ru/0807/6e/f6e9b1bcb0d7.png
http://i069.radikal.ru/0807/e7/af57dcddc968.png
абсолютно ни чему не мешает, просто любопытство.

Покрутил я извилинами, но безрезультатно, помогите если не трудно, пользую такой скрипт (как из поста № 567):

Код:

var t = document. commandDispatcher. focusedWindow. getSelection (). toString ();
if (!t)
{
    var el = document. commandDispatcher. focusedElement;
    t = el. value. substring (el. selectionStart, el. selectionEnd);
}

Далее без изменений:

Код:

var c = content.document.characterSet;
var loc = content.location.href;
getBrowser().loadOneTab(
    t
        ? "http://translate.google.ru/translate_t?text=" + t + "&hl=ru&langpair=auto|ru&tbb=1&ie=" + c
        : /^https?:\/\//i.test(loc)
            ? "http://translate.google.ru/translate?u=" + escape(loc) + "&hl=ru&langpair=auto|ru&tbb=1&ie=" + c
            : "http://translate.google.ru/translate_t?hl=ru",
    null, null, null, false /* load in background */, false
);

если в сторонних установленных расширениях не указан собственный адрес "Страницы поддержки", они все берут его от Custom Buttons, примеры:

Это нехорошо, будет исправлено. Спасибо за информацию об ошибке.

Anton
Всё, что Вы написали - отлично работает, спасибо большое!
P.S. Чуть поторопился. В таком варианте, выделенный текст берёт отовсюду и переводит, а страницу перестал переводить. В Консоли ошибок, ссылается на эту строку:

Код:

t = el. value. substring (el. selectionStart, el. selectionEnd);

Исправил ошибку для предыдущего варианта кнопок перевода, связанную с переключением вкладок в момент перевода:
без меню:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton2%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09getBrowser%20%28%29.%20contentDocument.%20defaultView.%20cbTranslateButton2X%20%3D%20event.%20clientX%3B%0A%09%09%09getBrowser%20%28%29.%20contentDocument.%20defaultView.%20cbTranslateButton2Y%20%3D%20event.%20clientY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%3B%0A%09window.%20cbTranslateButton2%20%3D%20true%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%09original%20script%20is%20operajs%20Google-Translate%20v%201.6.12%0A%09opera%20ujs%20is%20http%3A//lexi.ucoz.ru/google-translate.js%0A%09original%20author%3A%20Lex1%0A%09modified%20by%20Anton%0A*/%0A%0Aconst%20UJS_TOOLBAR_ID%20%3D%20%22ujs_toolbar%22%3B%0Aconst%20UJS_GOOGLE_TRANSLATE_FRAME_ID%20%3D%20%22ujs_googletranslateframe%22%3B%0A%0Afunction%20cbTranslatorButton%20%28browser%29%0A%7B%0A%09this.%20doc%20%3D%20browser.%20contentDocument%3B%0A%09this.%20win%20%3D%20browser.%20contentDocument.%20defaultView%3B%0A%7D%0AcbTranslatorButton.%20prototype%20%3D%0A%7B%0A%09doc%3A%20null%2C%0A%09win%3A%20null%2C%0A%09toolbar%3A%20null%2C%0A%09clse%3A%20null%2C%0A%09frame%3A%20null%2C%0A%09%0A%09grabX%3A%200%2C%0A%09origX%3A%200%2C%0A%09grabY%3A%200%2C%0A%09origY%3A%200%2C%0A%09%0A%09handleEvent%3A%20function%20%28event%29%0A%09%7B%0A%09%09switch%20%28event.%20type%29%0A%09%09%7B%0A%09%09%09case%20%22mousedown%22%3A%0A%09%09%09%09this.%20tbOnMouseDown%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22mousemove%22%3A%0A%09%09%09%09this.%20tbOnMouseMove%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22mouseup%22%3A%0A%09%09%09%09this.%20tbOnMouseUp%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22click%22%3A%0A%09%09%09%09this.%20clseOnClick%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22load%22%3A%0A%09%09%09%09this.%20frameOnLoad%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09default%3A%3B%0A%09%09%7D%0A%09%7D%2C%0A%09%0A%09tbOnMouseMove%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20toolbar.%20style.%20left%20%3D%20this.%20origX%20+%20event.%20clientX%20-%20this.%20grabX%20+%20%27px%27%3B%0A%09%09this.%20toolbar.%20style.%20top%20%3D%20this.%20origY%20+%20event.%20clientY%20-%20this.%20grabY%20+%20%27px%27%3B%0A%09%7D%2C%0A%09%0A%09tbOnMouseUp%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20doc.%20removeEventListener%20%28%27mousemove%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.%20toolbar.%20style.%20zIndex%20%3D%209997%3B%0A%09%7D%2C%0A%09%0A%09tbOnMouseDown%3A%20function%20%28event%29%0A%09%7B%0A%09%09if%20%28event.%20target%20%3D%3D%20this.%20toolbar%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20event.%20preventDefault%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20toolbar.%20style.%20zIndex%20%3D%209998%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20grabX%20%3D%20event.%20clientX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20grabY%20%3D%20event.%20clientY%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20origX%20%3D%20parseInt%20%28this.%20toolbar.%20style.%20left%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20origY%20%3D%20parseInt%20%28this.%20toolbar.%20style.%20top%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20doc.%20addEventListener%20%28%27mousemove%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20doc.%20addEventListener%20%28%27mouseup%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%09%7D%2C%0A%09%0A%09removeEventListener%3A%20function%20%28element%2C%20eventType%2C%20captureFlag%29%0A%09%7B%0A%09%09try%0A%09%09%7B%0A%09%09%09element.%20removeEventListener%20%28eventType%2C%20this%2C%20captureFlag%29%3B%0A%09%09%7D%0A%09%09catch%20%28err%29%20%7B%7D%0A%09%7D%2C%0A%09%0A%09removeElement%3A%20function%20%28element%29%0A%09%7B%0A%09%09try%0A%09%09%7B%0A%09%09%09element.%20parentNode.%20removeChild%20%28element%29%3B%0A%09%09%7D%0A%09%09catch%20%28err%29%20%7B%7D%0A%09%7D%2C%0A%09%0A%09clseOnClick%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20clse.%20removeEventListener%20%28%27click%27%2C%20this%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20toolbar%2C%20%27mousedown%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20doc%2C%20%27mousemove%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20doc%2C%20%27mouseup%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20frame%2C%20%27load%27%2C%20false%29%3B%0A%09%09this.%20removeElement%20%28this.%20toolbar%29%3B%0A%09%09this.%20removeElement%20%28this.%20frame%29%3B%0A%09%09this.%20frame%20%3D%20null%3B%0A%09%09this.%20clse%20%3D%20null%3B%0A%09%09this.%20toolbar%20%3D%20null%3B%0A%09%09this.%20win%20%3D%20null%3B%0A%09%09this.%20doc%20%3D%20null%3B%0A%09%7D%2C%0A%09%0A%09ujs_createWindow%3A%20function%20%28txt%29%0A%09%7B%0A%09%09var%20doc%20%3D%20this.%20doc%3B%0A%09%09var%20win%20%3D%20this.%20win%3B%0A%09%09var%20h%2C%20w%3B%0A%09%20%20%20%20var%20txtLen%20%3D%20txt.%20length%3B%0A%09%20%20%20%20var%20tbId%20%3D%20UJS_TOOLBAR_ID%3B%0A%09%20%20%20%20if%20%28arguments.%20length%20%3E%202%29%0A%09%20%20%20%20%20%20%20%20tbId%20+%3D%20arguments%20%5B2%5D%3B%0A%09%09var%20toolbar%20%3D%20doc.%20getElementById%20%28tbId%29%3B%0A%09%20%20%20%20if%20%28toolbar%29%0A%09%20%20%20%20%20%20%20%20toolbar.%20parentNode.%20removeChild%20%28toolbar%29%3B%0A%09%20%20%20%20toolbar%20%3D%20doc.%20createElement%20%28%27div%27%29%3B%0A%09%20%20%20%20this.%20toolbar%20%3D%20toolbar%3B%0A%09%20%20%20%20toolbar.%20id%20%3D%20tbId%3B%0A%09%09if%20%28arguments.%20length%20%3D%3D%205%29%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20w%20%3D%20arguments%20%5B3%5D%3B%0A%09%20%20%20%20%20%20%20%20h%20%3D%20arguments%20%5B4%5D%0A%09%20%20%20%20%7D%0A%09%20%20%20%20else%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20h%20%3D%2015%3B%0A%09%20%20%20%20%20%20%20%20w%20%3D%2020%3B%0A%09%20%20%20%20%20%20%20%20if%20%28txtLen%20%3E%202000%29%0A%09%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2050%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2066%0A%09%20%20%20%20%20%20%20%20%7D%0A%09%20%20%20%20%20%20%20%20else%20if%20%28txtLen%20%3E%20250%29%0A%09%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2025%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2033%0A%09%20%20%20%20%20%20%20%20%7D%3B%0A%09%20%20%20%20%20%20%20%20h%20%3D%20parseInt%20%28h%20*%20win.%20innerHeight%20/%20100%29%3B%0A%09%20%20%20%20%20%20%20%20w%20%3D%20parseInt%20%28w%20*%20win.%20innerWidth%20/%20100%29%0A%09%20%20%20%20%7D%3B%0A%09%09var%20title%20%3D%20%28arguments.%20length%20%3E%201%29%20%3Farguments%20%5B1%5D%3A%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%3B%0A%09%09toolbar.%20innerHTML%20%3D%20%27%3Cimg%20src%3D%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAStJREFUOE+1k9tqhDAQhtOHqO37P4E3IlQFQQSvBBVEl1TBVVi1B+1C8XAx3QmNqIVqhBV+DEPmy8z8ycPX9Ruq6kLqqiRHvkfpiUjSMyGUJtB1HfR9D8MwCAlz6voNkEGCIGDJeZ5DURTCatoWNE0D4nk+jOMoDMBD8fDPpoGXu4OyLAPUutV1/N+KcPPNPaY4jidYktwG+hunlLL4ZmsI4EloxhxiGAY4jgNpmm6D8DQEcBj/I8SyrKnSzYr4bDzPm2CKoiwgu1rDTfN2eEWu6y4M2KxoPRNVVRcz4xXvdm0+k/nMwjDc5xraa9v2n5kgwDRNMdfQXtT6Us7jy9Z8n738Iw82O5/hUpag6zqQ0+kVmqZld0NUURSxl48M8v5xZQtZlg8Jc5HxA5fIE73hTda3AAAAAElFTkSuQmCC%22%20title%3D%22Close%22%20width%3D%2218%22%20height%3D%2218%22%3E%26nbsp%3B%27%20+%20title%20+%20%27%3Cdiv%3E%3C/div%3E%27%3B%0A%09%09toolbar.%20setAttribute%28%27style%27%2C%20%27position%3Afixed%3Bbackground%3Awhite%3Bdisplay%3Ablock%3Bvisibility%3Ahidden%3Bleft%3A0%3Btop%3A0%3Bheight%3Aauto%3Bwidth%3A%27%20+%20w%20+%20%27px%3Bfont%3A16px%20Times%20New%20Roman%3Bborder%3A1px%20solid%20gray%3Bpadding%3A3px%3Bz-index%3A9997%3Boverflow%3Avisible%3Bcursor%3Amove%3B%27%29%3B%0A%09%09toolbar.%20addEventListener%20%28%27mousedown%27%2C%20this%2C%20false%29%3B%0A%09%09var%20clse%20%3D%20toolbar.%20firstChild%3B%0A%09%09this.%20clse%20%3D%20clse%3B%0A%09%20%20%20%20clse.%20setAttribute%20%28%27style%27%2C%20%27float%3Aright%3Bbackground%3Awhite%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3Anone%3Bcursor%3Apointer%3B%27%29%3B%0A%09%09clse.%20addEventListener%20%28%27click%27%2C%20this%2C%20false%29%3B%0A%09%09var%20textbar%20%3D%20toolbar.%20lastChild%3B%0A%09%20%20%20%20textbar.%20innerHTML%20%3D%20txt%3B%0A%09%09textbar.%20setAttribute%20%28%27style%27%2C%20%27display%3Ablock%3Bborder%3A1px%20solid%20%23aaaaaa%3Bmargin%3A2px%200%200%200%3Bpadding%3A4px%3Bbackground-color%3A%23fafcfe%3Bfont%3A14px%20Times%20New%20Roman%3Bheight%3A%27%20+%20h%20+%20%27px%3Bwidth%3Aauto%3Boverflow%3Aauto%3Bcursor%3Atext%3B%27%29%3B%0A%09%09doc.%20documentElement.%20appendChild%20%28toolbar%29%3B%0A%09%09var%20halfWidth%20%3D%20parseInt%20%28toolbar.%20offsetWidth%20/%202%29%3B%0A%09%09var%20strict%20%3D%20doc.%20compatMode%20%3D%3D%20%27CSS1Compat%27%3B%0A%09%09var%20mX%20%3D%20%28strict%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientWidth%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientWidth%29%20-%20toolbar.%20offsetWidth%3B%0A%09%09var%20mY%20%3D%20%28strict%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientHeight%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientHeight%29%20-%20toolbar.%20offsetHeight%3B%0A%09%20%20%20%20var%20lastClickX%20%3D%20win.%20cbTranslateButton2X%3B%0A%09%20%20%20%20var%20lastClickY%20%3D%20win.%20cbTranslateButton2Y%3B%0A%09%09toolbar.%20style.%20left%20%3D%20%28%28lastClickX%20%3C%20mX%20+%20halfWidth%29%3F%0A%09%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%28lastClickX%20%3E%20halfWidth%3F%0A%09%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%28lastClickX%20-%20halfWidth%29%3A%0A%09%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%200%29%3A%0A%09%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%20mX%29%20+%20%22px%22%3B%0A%09%09toolbar.%20style.%20top%20%3D%20%28%28lastClickY%20%3C%20mY%29%3F%0A%09%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%20lastClickY%3A%0A%09%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%20mY%29%20+%20%22px%22%3B%0A%09%09toolbar.%20style.%20visibility%20%3D%20%27visible%27%3B%0A%09%20%20%20%20return%20textbar%3B%0A%09%7D%2C%0A%09%0A%09frameOnLoad%3A%20function%20%28event%29%0A%09%7B%0A%09%09var%20fr%20%3D%20event.%20currentTarget%3B%0A%09%09fr.%20removeEventListener%20%28%27load%27%2C%20this%2C%20false%29%3B%0A%09%09var%20tbId%20%3D%20fr.%20id.%20substring%20%28UJS_GOOGLE_TRANSLATE_FRAME_ID.%20length%29%3B%0A%09%09var%20toolbar%20%3D%20this.%20doc.%20getElementById%20%28UJS_TOOLBAR_ID%20+%20tbId%29%3B%0A%09%09var%20frdoc%20%3D%20fr.%20contentDocument%3B%0A%09%09var%20a%20%3D%20frdoc.%20getElementById%20%28%27autotrans%27%29%3B%0A%09%09var%20title%20%3D%20%28a%20%26%26%20%21/%23808080/.%20test%20%28a.%20innerHTML%29%29%3F%0A%09%09%09%09%09%09%27%26nbsp%3B-%26nbsp%3B%27%20+%20a.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%0A%09%09%09%09%09%09%27%27%3B%0A%09%09var%20result%20%3D%20frdoc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%09%09var%20ancor%20%3D%20toolbar.%20getElementsByTagName%20%28%22a%22%29%20%5B0%5D%3B%0A%09%09ancor.%20innerHTML%20+%3D%20title%3B%0A%09%09ancor.%20nextSibling.%20innerHTML%20%3D%20result%3B%0A%09%09setTimeout%0A%09%09%28%0A%09%09%09function%20%28%29%0A%09%09%09%7B%0A%09%09%09%09fr.%20parentNode.%20removeChild%20%28fr%29%3B%0A%09%09%09%7D%2C%0A%09%09%090%0A%09%09%29%3B%0A%09%7D%2C%0A%09%0A%09google_translate%3A%20function%20%28language%29%0A%09%7B%0A%09%09var%20doc%20%3D%20this.%20doc%3B%0A%09%09var%20win%20%3D%20this.%20win%3B%0A%09%09var%20t%20%3D%20document.%20commandDispatcher.%20focusedWindow.%20getSelection%20%28%29.%20toString%20%28%29%3B%0A%09%09var%20lng%20%3D%20%28win.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09%20%20%20%20if%20%28t%20%26%26%20location.%20hostname%20%21%3D%20%27translate.google.com%27%29%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20this.%20ujs_createWindow%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%28lng%20%3D%3D%20%27ru%27%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu041F%5Cu0435%5Cu0440%5Cu0435%5Cu0432%5Cu043E%5Cu0434%5Cu0438%5Cu043C%27%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27Translating%27%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu2026%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20btoa%20%28escape%20%28t%29%29%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%09var%20gtfId%20%3D%20UJS_GOOGLE_TRANSLATE_FRAME_ID%3B%0A%09%09%09var%20fr%20%3D%20doc.%20getElementById%20%28gtfId%29%3B%0A%09%20%20%20%20%20%20%20%20if%20%28%21fr%29%0A%09%20%20%20%20%20%20%20%20%20%20%20%20fr%20%3D%20doc.%20createElement%20%28%27iframe%27%29%3B%0A%09%20%20%20%20%20%20%20%20this.%20frame%20%3D%20fr%3B%0A%09%09%09fr.%20setAttribute%20%28%27id%27%2C%20gtfId%20+%20btoa%20%28escape%20%28t%29%29%29%3B%0A%09%20%20%20%20%20%20%20%20fr.%20setAttribute%20%28%27frameborder%27%2C%20%270%27%29%3B%0A%09%09%09fr.%20setAttribute%20%28%27style%27%2C%20%27width%3A0px%3Bheight%3A0px%3Bvisibility%3Ahidden%3Bposition%3Aabsolute%3Bleft%3A-999em%3B%27%29%3B%0A%09%09%09fr.%20setAttribute%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27src%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate_t%3Ftext%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%20%28t%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%26ujs%3Dgtt%27%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%09fr.%20addEventListener%20%28%27load%27%2C%20this%2C%20false%29%3B%0A%09%20%20%20%20%20%20%20%20doc.%20documentElement.%20appendChild%20%28fr%29%3B%0A%09%20%20%20%20%7D%0A%09%20%20%20%20else%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%09getBrowser%20%28%29.%20addTab%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate%3Fu%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20escape%20%28doc.%20location.%20href%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%28doc.%20charset%3F%20%27%26ie%3D%27%20+%20doc.%20charset%3A%20%27%27%29%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20null%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20null%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%3B%0A%0Avar%20ct%20%3D%20getBrowser%20%28%29.%20selectedTab%3B%0Aif%20%28%21ct.%20cbTranslateButton5%29%0A%09ct.%20cbTranslateButton5%20%3D%20%5B%5D%3B%0Avar%20translator%20%3D%20new%20cbTranslatorButton%20%28getBrowser%20%28%29%29%3B%0Act.%20cbTranslateButton5.%20push%20%28translator%29%3B%0Atranslator.%20google_translate%20%28%22auto%7Cru%22%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%3C/custombutton%3E

с меню:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETranslateButton%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton2%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09getBrowser%20%28%29.%20contentDocument.%20defaultView.%20cbTranslateButton2X%20%3D%20event.%20clientX%3B%0A%09%09%09getBrowser%20%28%29.%20contentDocument.%20defaultView.%20cbTranslateButton2Y%20%3D%20event.%20clientY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%3B%0A%09window.%20cbTranslateButton2%20%3D%20true%3B%0A%7D%0Avar%20menu%20%3D%20%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%20%20%20%20%0Aoncommand%3D%22this.parentNode.cbButtonDoMenuCommand%28event%29%22%3E%0A%09%3Cmenuitem%20value%3D%22Selection%22%20label%3D%22%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u0438%u0435%22/%3E%0A%09%3Cmenuitem%20value%3D%22Page%22%20label%3D%22%u0421%u0442%u0440%u0430%u043D%u0438%u0446%u0430%22/%3E%0A%3C/menupopup%3E%3B%0Amenu%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28menu.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Amenu.%20setAttribute%20%28%22id%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20setAttribute%20%28%22popup%22%2C%20this.%20id%20+%20%22-menu%22%29%3B%0Athis.%20cbButtonDoMenuCommand%20%3D%20function%20%28event%29%0A%7B%0A%09var%20itemNum%20%3D%20event.%20target.%20getAttribute%20%28%22value%22%29%3B%0A%09switch%20%28itemNum%29%0A%09%7B%0A%09%09case%20%22Selection%22%3A%0A%09%09%09var%20ct%20%3D%20getBrowser%20%28%29.%20selectedTab%3B%0A%09%09%09if%20%28%21ct.%20cbTranslateButton5%29%0A%09%09%09%09ct.%20cbTranslateButton5%20%3D%20%5B%5D%3B%0A%09%09%09var%20translator%20%3D%20new%20cbTranslatorButton%20%28getBrowser%20%28%29%29%3B%0A%09%09%09ct.%20cbTranslateButton5.%20push%20%28translator%29%3B%0A%09%09%09translator.%20google_translate%20%28%22auto%7Cru%22%29%3B%0A%09%09%09break%3B%0A%09%09case%20%22Page%22%3A%0A%09%09%09this.%20cbTranslatePage%20%28%22auto%7Cru%22%29%3B%0A%09%09%09break%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20cbTranslatePage%20%3D%20function%20%28language%29%0A%7B%0A%09var%20doc%20%3D%20getBrowser%20%28%29.%20contentDocument%3B%0A%09var%20win%20%3D%20doc.%20defaultView%3B%0A%09var%20t%20%3D%20document.%20commandDispatcher.%20focusedWindow.%20getSelection%20%28%29.%20toString%20%28%29%3B%0A%09var%20lng%20%3D%20%28win.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09getBrowser%20%28%29.%20addTab%0A%20%20%20%20%28%0A%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate%3Fu%3D%27%20+%0A%20%20%20%20%20%20%20%20escape%20%28doc.%20location.%20href%29%20+%0A%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%20%20%20%20%20%20%20%20lng%20+%0A%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%20%20%20%20%20%20%20%20language%20+%0A%20%20%20%20%20%20%20%20%27%26tbb%3D1%27%20+%0A%20%20%20%20%20%20%20%20%28doc.%20charset%3F%20%27%26ie%3D%27%20+%20doc.%20charset%3A%20%27%27%29%2C%0A%20%20%20%20%20%20%20%20null%2C%0A%20%20%20%20%20%20%20%20null%0A%20%20%20%20%29%3B%0A%7D%3B%0A%0Aconst%20UJS_TOOLBAR_ID%20%3D%20%22ujs_toolbar%22%3B%0Aconst%20UJS_GOOGLE_TRANSLATE_FRAME_ID%20%3D%20%22ujs_googletranslateframe%22%3B%0A%0Afunction%20cbTranslatorButton%20%28browser%29%0A%7B%0A%09this.%20doc%20%3D%20browser.%20contentDocument%3B%0A%09this.%20win%20%3D%20browser.%20contentDocument.%20defaultView%3B%0A%7D%0AcbTranslatorButton.%20prototype%20%3D%0A%7B%0A%09doc%3A%20null%2C%0A%09win%3A%20null%2C%0A%09toolbar%3A%20null%2C%0A%09clse%3A%20null%2C%0A%09frame%3A%20null%2C%0A%09%0A%09grabX%3A%200%2C%0A%09origX%3A%200%2C%0A%09grabY%3A%200%2C%0A%09origY%3A%200%2C%0A%09%0A%09handleEvent%3A%20function%20%28event%29%0A%09%7B%0A%09%09switch%20%28event.%20type%29%0A%09%09%7B%0A%09%09%09case%20%22mousedown%22%3A%0A%09%09%09%09this.%20tbOnMouseDown%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22mousemove%22%3A%0A%09%09%09%09this.%20tbOnMouseMove%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22mouseup%22%3A%0A%09%09%09%09this.%20tbOnMouseUp%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22click%22%3A%0A%09%09%09%09this.%20clseOnClick%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22load%22%3A%0A%09%09%09%09this.%20frameOnLoad%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09default%3A%3B%0A%09%09%7D%0A%09%7D%2C%0A%09%0A%09tbOnMouseMove%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20toolbar.%20style.%20left%20%3D%20this.%20origX%20+%20event.%20clientX%20-%20this.%20grabX%20+%20%27px%27%3B%0A%09%09this.%20toolbar.%20style.%20top%20%3D%20this.%20origY%20+%20event.%20clientY%20-%20this.%20grabY%20+%20%27px%27%3B%0A%09%7D%2C%0A%09%0A%09tbOnMouseUp%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20doc.%20removeEventListener%20%28%27mousemove%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.%20toolbar.%20style.%20zIndex%20%3D%209997%3B%0A%09%7D%2C%0A%09%0A%09tbOnMouseDown%3A%20function%20%28event%29%0A%09%7B%0A%09%09if%20%28event.%20target%20%3D%3D%20this.%20toolbar%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20event.%20preventDefault%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20toolbar.%20style.%20zIndex%20%3D%209998%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20grabX%20%3D%20event.%20clientX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20grabY%20%3D%20event.%20clientY%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20origX%20%3D%20parseInt%20%28this.%20toolbar.%20style.%20left%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20origY%20%3D%20parseInt%20%28this.%20toolbar.%20style.%20top%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20doc.%20addEventListener%20%28%27mousemove%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20doc.%20addEventListener%20%28%27mouseup%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%09%7D%2C%0A%09%0A%09removeEventListener%3A%20function%20%28element%2C%20eventType%2C%20captureFlag%29%0A%09%7B%0A%09%09try%0A%09%09%7B%0A%09%09%09element.%20removeEventListener%20%28eventType%2C%20this%2C%20captureFlag%29%3B%0A%09%09%7D%0A%09%09catch%20%28err%29%20%7B%7D%0A%09%7D%2C%0A%09%0A%09removeElement%3A%20function%20%28element%29%0A%09%7B%0A%09%09try%0A%09%09%7B%0A%09%09%09element.%20parentNode.%20removeChild%20%28element%29%3B%0A%09%09%7D%0A%09%09catch%20%28err%29%20%7B%7D%0A%09%7D%2C%0A%09%0A%09clseOnClick%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20clse.%20removeEventListener%20%28%27click%27%2C%20this%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20toolbar%2C%20%27mousedown%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20doc%2C%20%27mousemove%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20doc%2C%20%27mouseup%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20frame%2C%20%27load%27%2C%20false%29%3B%0A%09%09this.%20removeElement%20%28this.%20toolbar%29%3B%0A%09%09this.%20removeElement%20%28this.%20frame%29%3B%0A%09%09this.%20frame%20%3D%20null%3B%0A%09%09this.%20clse%20%3D%20null%3B%0A%09%09this.%20toolbar%20%3D%20null%3B%0A%09%09this.%20win%20%3D%20null%3B%0A%09%09this.%20doc%20%3D%20null%3B%0A%09%7D%2C%0A%09%0A%09ujs_createWindow%3A%20function%20%28txt%29%0A%09%7B%0A%09%09var%20doc%20%3D%20this.%20doc%3B%0A%09%09var%20win%20%3D%20this.%20win%3B%0A%09%09var%20h%2C%20w%3B%0A%09%20%20%20%20var%20txtLen%20%3D%20txt.%20length%3B%0A%09%20%20%20%20var%20tbId%20%3D%20UJS_TOOLBAR_ID%3B%0A%09%20%20%20%20if%20%28arguments.%20length%20%3E%202%29%0A%09%20%20%20%20%20%20%20%20tbId%20+%3D%20arguments%20%5B2%5D%3B%0A%09%09var%20toolbar%20%3D%20doc.%20getElementById%20%28tbId%29%3B%0A%09%20%20%20%20if%20%28toolbar%29%0A%09%20%20%20%20%20%20%20%20toolbar.%20parentNode.%20removeChild%20%28toolbar%29%3B%0A%09%20%20%20%20toolbar%20%3D%20doc.%20createElement%20%28%27div%27%29%3B%0A%09%20%20%20%20this.%20toolbar%20%3D%20toolbar%3B%0A%09%20%20%20%20toolbar.%20id%20%3D%20tbId%3B%0A%09%09if%20%28arguments.%20length%20%3D%3D%205%29%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20w%20%3D%20arguments%20%5B3%5D%3B%0A%09%20%20%20%20%20%20%20%20h%20%3D%20arguments%20%5B4%5D%0A%09%20%20%20%20%7D%0A%09%20%20%20%20else%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20h%20%3D%2015%3B%0A%09%20%20%20%20%20%20%20%20w%20%3D%2020%3B%0A%09%20%20%20%20%20%20%20%20if%20%28txtLen%20%3E%202000%29%0A%09%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2050%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2066%0A%09%20%20%20%20%20%20%20%20%7D%0A%09%20%20%20%20%20%20%20%20else%20if%20%28txtLen%20%3E%20250%29%0A%09%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2025%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2033%0A%09%20%20%20%20%20%20%20%20%7D%3B%0A%09%20%20%20%20%20%20%20%20h%20%3D%20parseInt%20%28h%20*%20win.%20innerHeight%20/%20100%29%3B%0A%09%20%20%20%20%20%20%20%20w%20%3D%20parseInt%20%28w%20*%20win.%20innerWidth%20/%20100%29%0A%09%20%20%20%20%7D%3B%0A%09%09var%20title%20%3D%20%28arguments.%20length%20%3E%201%29%20%3Farguments%20%5B1%5D%3A%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%3B%0A%09%09toolbar.%20innerHTML%20%3D%20%27%3Cimg%20src%3D%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAStJREFUOE+1k9tqhDAQhtOHqO37P4E3IlQFQQSvBBVEl1TBVVi1B+1C8XAx3QmNqIVqhBV+DEPmy8z8ycPX9Ruq6kLqqiRHvkfpiUjSMyGUJtB1HfR9D8MwCAlz6voNkEGCIGDJeZ5DURTCatoWNE0D4nk+jOMoDMBD8fDPpoGXu4OyLAPUutV1/N+KcPPNPaY4jidYktwG+hunlLL4ZmsI4EloxhxiGAY4jgNpmm6D8DQEcBj/I8SyrKnSzYr4bDzPm2CKoiwgu1rDTfN2eEWu6y4M2KxoPRNVVRcz4xXvdm0+k/nMwjDc5xraa9v2n5kgwDRNMdfQXtT6Us7jy9Z8n738Iw82O5/hUpag6zqQ0+kVmqZld0NUURSxl48M8v5xZQtZlg8Jc5HxA5fIE73hTda3AAAAAElFTkSuQmCC%22%20title%3D%22Close%22%20width%3D%2218%22%20height%3D%2218%22%3E%26nbsp%3B%27%20+%20title%20+%20%27%3Cdiv%3E%3C/div%3E%27%3B%0A%09%09toolbar.%20setAttribute%28%27style%27%2C%20%27position%3Afixed%3Bbackground%3Awhite%3Bdisplay%3Ablock%3Bvisibility%3Ahidden%3Bleft%3A0%3Btop%3A0%3Bheight%3Aauto%3Bwidth%3A%27%20+%20w%20+%20%27px%3Bfont%3A16px%20Times%20New%20Roman%3Bborder%3A1px%20solid%20gray%3Bpadding%3A3px%3Bz-index%3A9997%3Boverflow%3Avisible%3Bcursor%3Amove%3B%27%29%3B%0A%09%09toolbar.%20addEventListener%20%28%27mousedown%27%2C%20this%2C%20false%29%3B%0A%09%09var%20clse%20%3D%20toolbar.%20firstChild%3B%0A%09%09this.%20clse%20%3D%20clse%3B%0A%09%20%20%20%20clse.%20setAttribute%20%28%27style%27%2C%20%27float%3Aright%3Bbackground%3Awhite%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3Anone%3Bcursor%3Apointer%3B%27%29%3B%0A%09%09clse.%20addEventListener%20%28%27click%27%2C%20this%2C%20false%29%3B%0A%09%09var%20textbar%20%3D%20toolbar.%20lastChild%3B%0A%09%20%20%20%20textbar.%20innerHTML%20%3D%20txt%3B%0A%09%09textbar.%20setAttribute%20%28%27style%27%2C%20%27display%3Ablock%3Bborder%3A1px%20solid%20%23aaaaaa%3Bmargin%3A2px%200%200%200%3Bpadding%3A4px%3Bbackground-color%3A%23fafcfe%3Bfont%3A14px%20Times%20New%20Roman%3Bheight%3A%27%20+%20h%20+%20%27px%3Bwidth%3Aauto%3Boverflow%3Aauto%3Bcursor%3Atext%3B%27%29%3B%0A%09%09doc.%20documentElement.%20appendChild%20%28toolbar%29%3B%0A%09%09var%20halfWidth%20%3D%20parseInt%20%28toolbar.%20offsetWidth%20/%202%29%3B%0A%09%09var%20strict%20%3D%20doc.%20compatMode%20%3D%3D%20%27CSS1Compat%27%3B%0A%09%09var%20mX%20%3D%20%28strict%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientWidth%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientWidth%29%20-%20toolbar.%20offsetWidth%3B%0A%09%09var%20mY%20%3D%20%28strict%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientHeight%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientHeight%29%20-%20toolbar.%20offsetHeight%3B%0A%09%20%20%20%20var%20lastClickX%20%3D%20win.%20cbTranslateButton2X%3B%0A%09%20%20%20%20var%20lastClickY%20%3D%20win.%20cbTranslateButton2Y%3B%0A%09%09toolbar.%20style.%20left%20%3D%20%28%28lastClickX%20%3C%20mX%20+%20halfWidth%29%3F%0A%09%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%28lastClickX%20%3E%20halfWidth%3F%0A%09%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%28lastClickX%20-%20halfWidth%29%3A%0A%09%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%200%29%3A%0A%09%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%20mX%29%20+%20%22px%22%3B%0A%09%09toolbar.%20style.%20top%20%3D%20%28%28lastClickY%20%3C%20mY%29%3F%0A%09%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%20lastClickY%3A%0A%09%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%20mY%29%20+%20%22px%22%3B%0A%09%09toolbar.%20style.%20visibility%20%3D%20%27visible%27%3B%0A%09%20%20%20%20return%20textbar%3B%0A%09%7D%2C%0A%09%0A%09frameOnLoad%3A%20function%20%28event%29%0A%09%7B%0A%09%09var%20fr%20%3D%20event.%20currentTarget%3B%0A%09%09fr.%20removeEventListener%20%28%27load%27%2C%20this%2C%20false%29%3B%0A%09%09var%20tbId%20%3D%20fr.%20id.%20substring%20%28UJS_GOOGLE_TRANSLATE_FRAME_ID.%20length%29%3B%0A%09%09var%20toolbar%20%3D%20this.%20doc.%20getElementById%20%28UJS_TOOLBAR_ID%20+%20tbId%29%3B%0A%09%09var%20frdoc%20%3D%20fr.%20contentDocument%3B%0A%09%09var%20a%20%3D%20frdoc.%20getElementById%20%28%27autotrans%27%29%3B%0A%09%09var%20title%20%3D%20%28a%20%26%26%20%21/%23808080/.%20test%20%28a.%20innerHTML%29%29%3F%0A%09%09%09%09%09%09%27%26nbsp%3B-%26nbsp%3B%27%20+%20a.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%0A%09%09%09%09%09%09%27%27%3B%0A%09%09var%20result%20%3D%20frdoc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%09%09var%20ancor%20%3D%20toolbar.%20getElementsByTagName%20%28%22a%22%29%20%5B0%5D%3B%0A%09%09ancor.%20innerHTML%20+%3D%20title%3B%0A%09%09ancor.%20nextSibling.%20innerHTML%20%3D%20result%3B%0A%09%09setTimeout%0A%09%09%28%0A%09%09%09function%20%28%29%0A%09%09%09%7B%0A%09%09%09%09fr.%20parentNode.%20removeChild%20%28fr%29%3B%0A%09%09%09%7D%2C%0A%09%09%090%0A%09%09%29%3B%0A%09%7D%2C%0A%09%0A%09google_translate%3A%20function%20%28language%29%0A%09%7B%0A%09%09var%20doc%20%3D%20this.%20doc%3B%0A%09%09var%20win%20%3D%20this.%20win%3B%0A%09%09var%20t%20%3D%20document.%20commandDispatcher.%20focusedWindow.%20getSelection%20%28%29.%20toString%20%28%29%3B%0A%09%09var%20lng%20%3D%20%28win.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09%20%20%20%20if%20%28t%20%26%26%20location.%20hostname%20%21%3D%20%27translate.google.com%27%29%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20this.%20ujs_createWindow%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%28lng%20%3D%3D%20%27ru%27%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu041F%5Cu0435%5Cu0440%5Cu0435%5Cu0432%5Cu043E%5Cu0434%5Cu0438%5Cu043C%27%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27Translating%27%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu2026%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20btoa%20%28escape%20%28t%29%29%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%09var%20gtfId%20%3D%20UJS_GOOGLE_TRANSLATE_FRAME_ID%3B%0A%09%09%09var%20fr%20%3D%20doc.%20getElementById%20%28gtfId%29%3B%0A%09%20%20%20%20%20%20%20%20if%20%28%21fr%29%0A%09%20%20%20%20%20%20%20%20%20%20%20%20fr%20%3D%20doc.%20createElement%20%28%27iframe%27%29%3B%0A%09%20%20%20%20%20%20%20%20this.%20frame%20%3D%20fr%3B%0A%09%09%09fr.%20setAttribute%20%28%27id%27%2C%20gtfId%20+%20btoa%20%28escape%20%28t%29%29%29%3B%0A%09%20%20%20%20%20%20%20%20fr.%20setAttribute%20%28%27frameborder%27%2C%20%270%27%29%3B%0A%09%09%09fr.%20setAttribute%20%28%27style%27%2C%20%27width%3A0px%3Bheight%3A0px%3Bvisibility%3Ahidden%3Bposition%3Aabsolute%3Bleft%3A-999em%3B%27%29%3B%0A%09%09%09fr.%20setAttribute%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27src%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate_t%3Ftext%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%20%28t%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%26ujs%3Dgtt%27%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%09fr.%20addEventListener%20%28%27load%27%2C%20this%2C%20false%29%3B%0A%09%20%20%20%20%20%20%20%20doc.%20documentElement.%20appendChild%20%28fr%29%3B%0A%09%20%20%20%20%7D%0A%09%7D%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%09original%20script%20is%20operajs%20Google-Translate%20v%201.6.12%0A%09opera%20ujs%20is%20http%3A//lexi.ucoz.ru/google-translate.js%0A%09original%20author%3A%20Lex1%0A%09modified%20by%20Anton%0A*/%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%3C/custombutton%3E

Deim0s

В таком варианте, выделенный текст берёт отовсюду и переводит, а страницу перестал переводить.

Ну тогда

Код:

    if (el)
        t = el. value. substring (el. selectionStart, el. selectionEnd);

или

Код:

t = el && el. value. substring (el. selectionStart, el. selectionEnd) || "";

вместо

Код:

t = el. value. substring (el. selectionStart, el. selectionEnd);

Anton
Да, в таком, общем, виде:

Код:

var t = document. commandDispatcher. focusedWindow. getSelection (). toString ();
if (!t)
{
    var el = document. commandDispatcher. focusedElement;
    t = el && el. value. substring (el. selectionStart, el. selectionEnd) || "";
}
var c = content.document.characterSet;
var loc = content.location.href;
getBrowser().loadOneTab(
    t
        ? "http://translate.google.ru/translate_t?text=" + t + "&hl=ru&langpair=auto|ru&tbb=1&ie=" + c
        : /^https?:\/\//i.test(loc)
            ? "http://translate.google.ru/translate?u=" + escape(loc) + "&hl=ru&langpair=auto|ru&tbb=1&ie=" + c
            : "http://translate.google.ru/translate_t?hl=ru",
    null, null, null, false /* load in background */, false
);

всё заработало, как хотелось. Проверил где только возможно - всё работает.
Остался один вопрос - сделал я простенькую кнопочку "Закрыть все вкладки, кроме активной", можно ли какой-нибудь хитростью (с помощью Custom Buttons и скриптов) перенести её в tabs-alltabs-box, заменив tabs-alltabs-button? Скрин как хотелось:
http://ipicture.ru/uploads/080714/gto00MZ2PR.png
Или только Overlay писать?

можно ли какой-нибудь хитростью (с помощью Custom Buttons и скриптов) перенести её в tabs-alltabs-box, заменив tabs-alltabs-button?

Вот код:

Код:

var tbr = document. getElementById ("content");
var tbx = document. getAnonymousNodes (tbr). item (1);
var an = tbx. firstChild. nextSibling. firstChild. nextSibling. nextSibling;
var atb = document. getAnonymousElementByAttribute (an, "anonid", "alltabs-button");
atb. parentNode. insertBefore (this, atb);
atb. setAttribute ("hidden", "true");

Но поддерживать я его не буду. Хотите - пользуйтесь, если что-нибудь не устроит - просьба не беспокоить.

Anton
Deim0s
Vvld
Приветствую, Уважаемые!
Не будете ль Вы столь любезны научить неуча этим пользоваться:
- как правильно копировать и сохранять скрипты со страницы,
- какое расширение присваивать скриптам
- как и в каком виде вставлять в Custom Buttons
- что не следует делать.
Имею ввиду скрипты этой темы, в частности, кнопки перевода из Google.
Буду рад оказаной помощи.
Спасибо!

camo
Ответы на большинство поставленных вопросов - в первом сообщении этой темы.

Anton
Thanks!
Понемногу разбираюсь.

Добавление кнопок "Сохранить страницу" и "Сохранить ссылку" на панель закладок с помощью расширения Custom Buttons.

картинка: chrome://scrapbook/skin/capture_entire.png
код: sbBrowserOverlay.execCapture(2, false, false, event.originalTarget.id);

картинка: chrome://scrapbook/skin/capture_target.png
код: sbBrowserOverlay.execBookmark(event.originalTarget.id);

В расширении toolbar buttons была кнопка которая включала и выключала загрузку картинок. Я его нашел и распотрошил но столкнулся с тем что у него в реализации используются два режима отображения кнопки ВКЛЮЧЕНО и ВЫКЛЮЧЕНО (т.е. 2 пиктограммы) можно ли это сделать в Custom Buttons и как.

AndreyPA

Если я правильно понял, то

Код:

if (state == 0)
    this. image = "file:///c:/greenicon.png";
else
    this. image = "file:///c:/redicon.png";

---

Кстати, просьба к пользователям с linux: помогите с разработкой кода для запуска shell-скриптов.

Ребята, те кто постоянно в этой ветке варятся, соберите, пожалуйста, то что наработано в один пост. Я имею в виду то, что пишется в поле код. Как выжимку. Буду очень признателен, как пользователь, который редко сюда заходит. Ведь реально много сделано. У вас где-то есть исправления где-то вы друг друга с полуслова поняли. Расширение прекрасное, а так таким чайникам как я будет легче.

Вижу странную работу кода вида
new DOMParser().parseFromString( ... )

Правда, Custom Buttons тут ни при чем – ошибку я словил при разработке расширения. Но раз уж за основу был взят код отсюда, не будем плодить лишних сущностей топиков.

Выдернул проблемный код (будем надеяться, ссылок на то, чего уже нет, не осталось) и сделал кнопку для демонстрации (дабы легче тестировать =)):

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%7EDOMParser%20test%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20obj%20%3D%20%7B%0A%09_test%3A%20function%28e%29%20%7B%0A%09%09this.origItem%20%3D%20e.originalTarget%3B%0A%09%09this.copyOfEvent%20%3D%20e%3B%0A%09%09this.cMenu%20%3D%20document.getElementById%28%22custombuttons-contextpopup%22%29%3B%0A%0A%09%09var%20xml%20%3D%20%3Cpopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09%09oncommand%3D%22alert%28event.target.label%29%22%3E%0A%09%09%09%09%3Cmenuitem%20label%3D%22Item%20-%200%22%20/%3E%0A%09%09%09%09%3Cmenuitem%20label%3D%22Item%20-%201%22%20/%3E%0A%09%09%09%09%3Cmenuitem%20label%3D%22Item%20-%202%22%20/%3E%0A%09%09%09%09%3Cmenuseparator%20/%3E%0A%09%09%09%09%3Cmenu%20label%3D%22Menu%22%3E%0A%09%09%09%09%09%3Cmenupopup%3E%0A%09%09%09%09%09%09%3Cmenuitem%20label%3D%22Subitem%20-%200%22%20/%3E%0A%09%09%09%09%09%09%3Cmenuitem%20label%3D%22Subitem%20-%201%22%20/%3E%0A%09%09%09%09%09%3C/menupopup%3E%0A%09%09%09%09%3C/menu%3E%0A%09%09%09%3C/popup%3E%3B%0A%09%09this.showGeneratedFromXMLPopup%28xml%29%3B%0A%09%7D%2C%0A%09showGeneratedFromXMLPopup%3A%20function%28xml%29%20%7B%0A%09%09var%20popup%20%3D%20this.getPopup%28xml%29%3B%0A%09%09this.showPopupOnCurrentItem%28popup%29%3B%0A%09%09return%20popup%3B%0A%09%7D%2C%0A%09getPopup%3A%20function%28xml%29%20%7B%0A%09%09var%20pSet%20%3D%20document.getElementById%28%22mainPopupSet%22%29%3B%0A%09%09var%20id%20%3D%20%22handyClicks-generatedPopup%22%3B%0A%09%09var%20popup%20%3D%20document.getElementById%28id%29%3B%0A%09%09if%28popup%29%0A%09%09%09pSet.removeChild%28popup%29%3B%0A%09%09popup%20%3D%20xml%0A%09%09%09%3F%20new%20DOMParser%28%29.parseFromString%28xml.toXMLString%28%29%2C%20%22application/xml%22%29.documentElement%0A%09%09%09%3A%20document.createElement%28%22popup%22%29%3B%0A%09%09if%28xml%29%20%7B%0A%09%09%09//%20Bug%3A%20labels%20of%20%3Cmenu%3E%20does%20not%20shown.%0A%09%09%7D%0A%09%09popup.id%20%3D%20id%3B%0A%09%09popup.tooltip%20%3D%20%22handyClicks-tooltip%22%3B%0A%09%09pSet.appendChild%28popup%29%3B%0A%09%09return%20popup%3B%0A%09%7D%2C%0A%09showPopupOnCurrentItem%3A%20function%28popup%29%20%7B%0A%09%09var%20node%20%3D%20this.origItem%3B%0A%09%09var%20e%20%3D%20this.copyOfEvent%3B%0A%0A%09%09if%28this.isFx%282%29%20%26%26%20this.cMenu.id%20%3D%3D%20%22contentAreaContextMenu%22%29%20%7B%20//%20workaround%20for%20spellchecker%20bug%0A%09%09%09//%20if%28this.getPref%28%22forceHideContextMenu%22%29%29%0A%09%09%09//%09window.removeEventListener%28%22contextmenu%22%2C%20this%2C%20true%29%3B%0A%0A%09%09%09var%20evt%20%3D%20document.createEvent%28%22MouseEvents%22%29%3B%20//%20thanks%20to%20Tab%20Scope%21%0A%09%09%09evt.initMouseEvent%28%0A%09%09%09%09%22click%22%2C%20true%2C%20false%2C%20node.ownerDocument.defaultView%2C%201%2C%0A%09%09%09%09e.screenX%2C%20e.screenY%2C%20e.clientX%2C%20e.clientY%2C%0A%09%09%09%09false%2C%20false%2C%20false%2C%20false%2C%0A%09%09%09%092%2C%20null%0A%09%09%09%29%3B%0A%09%09%09node.dispatchEvent%28evt%29%3B%0A%0A%09%09%09//%20this.disabledBy.cMenu%20%3D%20true%3B%0A%09%09%09//%20this.blinkNode%28%29%3B%0A%09%09%09return%3B%0A%09%09%7D%0A%09%09document.popupNode%20%3D%20node%3B%0A%09%09var%20xy%20%3D%20this.getXY%28e%29%3B%0A%09%09popup.showPopup%28this.isFx%283%29%20%3F%20node%20%3A%20e.target%2C%20xy.x%2C%20xy.y%2C%20%22popup%22%2C%20null%2C%20null%29%3B%0A%09%7D%2C%0A%09getXY%3A%20function%28e%29%20%7B%0A%09%09var%20isFx3%20%3D%20this.isFx%283%29%3B%0A%09%09return%20%7B%0A%09%09%09x%3A%20isFx3%20%3F%20e.screenX%20%3A%20e.clientX%2C%0A%09%09%09y%3A%20isFx3%20%3F%20e.screenY%20%3A%20e.clientY%0A%09%09%7D%3B%0A%09%7D%2C%0A%09get%20fxVersion%28%29%20%7B%0A%09%09if%28typeof%20this._fxVersion%20%3D%3D%20%22undefined%22%29%0A%09%09%09this._fxVersion%20%3D%20Components.classes%5B%22@mozilla.org/xre/app-info%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIXULAppInfo%29%0A%09%09%09%09.version%3B%0A%09%09return%20this._fxVersion%3B%0A%09%7D%2C%0A%09isFx%3A%20function%28version%29%20%7B%0A%09%09return%20this.fxVersion.indexOf%28version%20+%20%22.%22%29%20%3D%3D%200%3B%0A%09%7D%0A%7D%3B%0Athis._obj%20%3D%20obj%3B%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%09if%28e.button%20%21%3D%202%29%0A%09%09this._obj._test%28e%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

Суть проблемы:
var xml = ... ; // задаем XML с вложенным меню
=>
var popup = this.getPopup(xml); // добавляем к mainPopupSet new DOMParser().parseFromString( ... ).documentElement
=>
popup.showPopup( ... ) // показываем pop-up

При этом не видно label у menu. И, если посмотреть в DOM Inspector'е, у menu нету «anonymous nodes» (которые показываются красным), задаваемых binding'ом.
Единственный способ показать label, который я нашел, – что-то вроде (увы, код я уже удалил, так что точно не помню, но все равно работал он весьма криво):

Код:

var _menu = document.createElement("menu");
_menu.setAttribute("label", menu.getAttribute("label")); // а если перенести все menu.childNodes, то работать уже не будет =/
menu.parentNode.replaceChild(_menu, menu);

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

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

Идей нет.

Anton

Идей нет.

Видимо, придется делать менее «прозрачные» способы задания меню. :/

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EPop-up%20menu%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20obj%20%3D%20%7B%0A%09_test%3A%20function%28e%29%20%7B%0A%09%09this.origItem%20%3D%20e.originalTarget%3B%0A%09%09this.copyOfEvent%20%3D%20e%3B%0A%09%09this.cMenu%20%3D%20document.getElementById%28%22custombuttons-contextpopup%22%29%3B%0A%0A%09%09var%20items%20%3D%20%5B%0A%09%09%09%7B%20label%3A%20%22Label%20-%200%22%20%7D%2C%0A%09%09%09%7B%7D%2C%0A%09%09%09%7B%20label%3A%20%22Label%20-%201%22%20%7D%2C%0A%09%09%09%7B%20label%3A%20%22Label%20-%202%22%20%7D%2C%0A%09%09%09%7B%20label%3A%20%22Label%20-%203%22%20%7D%2C%0A%09%09%09%5B%0A%09%09%09%09%7B%20label%3A%20%22Menu%20-%204%22%20%7D%2C%0A%09%09%09%09%5B%0A%09%09%09%09%09%7B%20label%3A%20%22Label%20-%204%20-%200%22%20%7D%2C%0A%09%09%09%09%09%5B%0A%09%09%09%09%09%09%7B%20label%3A%20%22Menu%20-%204%20-%201%22%20%7D%2C%0A%09%09%09%09%09%09%5B%0A%09%09%09%09%09%09%09%7B%20label%3A%20%22Label%20-%204%20-%201%20-%201%22%20%7D%0A%09%09%09%09%09%09%5D%0A%09%09%09%09%09%5D%2C%0A%09%09%09%09%09%7B%20label%3A%20%22Label%20-%204%20-%201%22%20%7D%2C%0A%09%09%09%09%09%7B%20label%3A%20%22Label%20-%204%20-%202%22%20%7D%0A%09%09%09%09%5D%0A%09%09%09%5D%0A%09%09%5D%3B%0A%09%09var%20popup%20%3D%20this.showGeneratedPopup%28items%29%3B%0A%09%09popup.setAttribute%28%22oncommand%22%2C%20%22alert%28event.target.label%29%3B%22%29%3B%0A%09%7D%2C%0A%09showGeneratedPopup%3A%20function%28items%29%20%7B%0A%09%09var%20popup%20%3D%20this.createPopup%28items%29%3B%0A%09%09this.showPopupOnCurrentItem%28popup%29%3B%0A%09%09return%20popup%3B%0A%09%7D%2C%0A%09createPopup%3A%20function%28items%29%20%7B%0A%09%09var%20popup%20%3D%20this.popup%3B%0A%09%09this.appendChilds%28popup%2C%20items%29%3B%0A%09%09return%20popup%3B%0A%09%7D%2C%0A%09get%20popup%28%29%20%7B%0A%09%09var%20pSet%20%3D%20document.getElementById%28%22mainPopupSet%22%29%3B%0A%09%09var%20id%20%3D%20%22handyClicks-generatedPopup%22%3B%0A%09%09var%20popup%20%3D%20document.getElementById%28id%29%3B%0A%09%09if%28popup%29%0A%09%09%09pSet.removeChild%28popup%29%3B%0A%09%09popup%20%3D%20document.createElement%28%22popup%22%29%3B%0A%09%09popup.id%20%3D%20id%3B%0A%09%09popup.tooltip%20%3D%20%22handyClicks-tooltip%22%3B%0A%09%09pSet.appendChild%28popup%29%3B%0A%09%09return%20popup%3B%0A%09%7D%2C%0A%09appendChilds%3A%20function%28parent%2C%20childs%29%20%7B%0A%09%09for%28var%20i%20%3D%200%3B%20i%20%3C%20childs.length%3B%20i++%29%0A%09%09%09this%5B%22appendMenu%22%20+%20%28childs%5Bi%5D%20instanceof%20Array%20%3F%20%22%22%20%3A%20%22item%22%29%5D%28parent%2C%20childs%5Bi%5D%29%3B%0A%09%7D%2C%0A%09appendMenu%3A%20function%28parent%2C%20itemsArr%29%20%7B%0A%09%09var%20menu%20%3D%20document.createElement%28%22menu%22%29%3B%0A%09%09this.setAttributes%28menu%2C%20itemsArr%5B0%5D%29%3B%0A%09%09var%20mPopup%20%3D%20document.createElement%28%22menupopup%22%29%3B%0A%09%09this.appendChilds%28mPopup%2C%20itemsArr%5B1%5D%29%3B%0A%09%09menu.appendChild%28mPopup%29%3B%0A%09%09parent.appendChild%28menu%29%3B%0A%09%7D%2C%0A%09appendMenuitem%3A%20function%28parent%2C%20attrs%29%20%7B%0A%09%09var%20mi%20%3D%20document.createElement%28attrs.label%20%3F%20%22menuitem%22%20%3A%20%22menuseparator%22%29%3B%0A%09%09this.setAttributes%28mi%2C%20attrs%29%3B%0A%09%09parent.appendChild%28mi%29%3B%0A%09%7D%2C%0A%09setAttributes%3A%20function%28item%2C%20attrs%29%20%7B%0A%09%09for%28var%20p%20in%20attrs%29%20%7B%0A%09%09%09if%28typeof%20attrs%5Bp%5D%20%21%3D%20%22string%22%20%7C%7C%20p.indexOf%28%22__%22%29%20%3D%3D%200%29%0A%09%09%09%09item%5Bp%5D%20%3D%20attrs%5Bp%5D%3B%20//%20not%20works%20for%20%22oncommand%22%0A%09%09%09else%0A%09%09%09%09item.setAttribute%28p%2C%20attrs%5Bp%5D%29%3B%0A%09%09%7D%0A%09%7D%2C%0A%09showPopupOnCurrentItem%3A%20function%28popup%29%20%7B%0A%09%09var%20node%20%3D%20this.origItem%3B%0A%09%09var%20e%20%3D%20this.copyOfEvent%3B%0A%0A%09%09if%28this.isFx%282%29%20%26%26%20this.cMenu.id%20%3D%3D%20%22contentAreaContextMenu%22%29%20%7B%20//%20workaround%20for%20spellchecker%20bug%0A%09%09%09//%20if%28this.getPref%28%22forceHideContextMenu%22%29%29%0A%09%09%09//%09window.removeEventListener%28%22contextmenu%22%2C%20this%2C%20true%29%3B%0A%0A%09%09%09var%20evt%20%3D%20document.createEvent%28%22MouseEvents%22%29%3B%20//%20thanks%20to%20Tab%20Scope%21%0A%09%09%09evt.initMouseEvent%28%0A%09%09%09%09%22click%22%2C%20true%2C%20false%2C%20node.ownerDocument.defaultView%2C%201%2C%0A%09%09%09%09e.screenX%2C%20e.screenY%2C%20e.clientX%2C%20e.clientY%2C%0A%09%09%09%09false%2C%20false%2C%20false%2C%20false%2C%0A%09%09%09%092%2C%20null%0A%09%09%09%29%3B%0A%09%09%09node.dispatchEvent%28evt%29%3B%0A%0A%09%09%09//%20this.disabledBy.cMenu%20%3D%20true%3B%0A%09%09%09//%20this.blinkNode%28%29%3B%0A%09%09%09return%3B%0A%09%09%7D%0A%09%09document.popupNode%20%3D%20node%3B%0A%09%09var%20xy%20%3D%20this.getXY%28e%29%3B%0A%09%09popup.showPopup%28this.isFx%283%29%20%3F%20node%20%3A%20e.target%2C%20xy.x%2C%20xy.y%2C%20%22popup%22%2C%20null%2C%20null%29%3B%0A%09%7D%2C%0A%09getXY%3A%20function%28e%29%20%7B%0A%09%09var%20isFx3%20%3D%20this.isFx%283%29%3B%0A%09%09return%20%7B%0A%09%09%09x%3A%20isFx3%20%3F%20e.screenX%20%3A%20e.clientX%2C%0A%09%09%09y%3A%20isFx3%20%3F%20e.screenY%20%3A%20e.clientY%0A%09%09%7D%3B%0A%09%7D%2C%0A%09get%20fxVersion%28%29%20%7B%0A%09%09if%28typeof%20this._fxVersion%20%3D%3D%20%22undefined%22%29%0A%09%09%09this._fxVersion%20%3D%20Components.classes%5B%22@mozilla.org/xre/app-info%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIXULAppInfo%29%0A%09%09%09%09.version%3B%0A%09%09return%20this._fxVersion%3B%0A%09%7D%2C%0A%09isFx%3A%20function%28version%29%20%7B%0A%09%09return%20this.fxVersion.indexOf%28version%20+%20%22.%22%29%20%3D%3D%200%3B%0A%09%7D%0A%7D%3B%0Athis._obj%20%3D%20obj%3B%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%09if%28e.button%20%21%3D%202%29%0A%09%09this._obj._test%28e%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

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

P.S.

Когда-то хотел сделать mrn

Сделать menu? Или очепятка, или я чего-то не догоняю.

Сделать menu? Или очепятка, или я чего-то не догоняю.

mozilla-russia navigator

Черт,возникла неприятная ситуация.Обновился до версии 0,0,3,3.Половина кнопок слетела почему то.При этом не могу откатиться назад.Не сохранилась версия 0,0,3,2.Или подскажите,в чем проблема,или дайте ссылку,на 0,0,3,2.:whiteflag:

vv07

Половина кнопок слетела почему то.

Что значит "слетела" ?

дайте ссылку,на 0,0,3,2.

https://addons.mozilla.org/ru/firefox/addon/2707 - на странице есть ссылка "Отобразить все версии".
или (без автообновления) - http://custombuttons.mozdev.org/installation.html

Не думаю, что корень проблемы в расширении, но на всякий случай, если не трудно - отправьте до установки 0.0.3.2 файлы (buttonsoverlay.xul и buttonsoverlay.xul.bak) из подкаталога custombuttons профиля на адрес custombuttonsextension@gmail.com.

Anton

Извините меня пожалуйста за поспешность.Сильно расстроился блин.Разобрался в чем проблема.Дело в том,что папку с иконками для расширения,расположил в корневой папке.При установке обновления,папка полностью обновилась и иконки были утрачены.именно поэтому,кнопки перестали отображаться.Может стоит,как то исключить такую возможность,в последующем.Просто удобнее держать иконки,именно в директории расширения.

AndreyA написал:

Добавление кнопок "Сохранить страницу" и "Сохранить ссылку" на панель закладок с помощью расширения Custom Buttons.

картинка: chrome://scrapbook/skin/capture_entire.png
код: sbBrowserOverlay.execCapture(2, false, false, event.originalTarget.id);

картинка: chrome://scrapbook/skin/capture_target.png
код: sbBrowserOverlay.execBookmark(event.originalTarget.id);

Вот эта штука сохраняет старницу далеко в "C:\Documents and Settings\Администратор\Application Data\Mozilla\Firefox\Profiles\ksc247o6.default\ScrapBook\data\20080912165717\"

Да и каждый раз в разную директорию...

А как сделать так что бы всегда в одну директорию? Да и которую я хочу явно задать... скажем в коде...

Если я правильно понял,речь о расширении ScrapBook,так в нем можно задать директорию,в настройках.Скопируйте или перенесите папку ScrapBook,в любое удобное для вас место.В настройках укажите эту папку.Все,по умолчанию будет сохраняться туда.

vv07 написал:

Если я правильно понял,речь о расширении ScrapBook,так в нем можно задать директорию,в настройках.Скопируйте или перенесите папку ScrapBook,в любое удобное для вас место.В настройках укажите эту папку.Все,по умолчанию будет сохраняться туда.

Спасибо!
Нашел настройки. Почти все хорошо. Корневую папку указать можно. D:\TEMP\MyData\
Но при этом сохранение идет в дальше каждый раз в папку с другим именем типа data\20080913115945\
Это уже конечно решаемы вопрос.
Но идеально было бы что бы сохраняло всегда в одну папку.

vv07

папку с иконками для расширения,расположил в корневой папке

В корневой папке чего ? В каталог, где находится установленное расширение ?

Просто удобнее держать иконки,именно в директории расширения.

А в перекодированном в base64 виде или в подкаталоге custombuttons профиля не пойдёт ?

Mashinist
Если достаточно сохранения в каталог загрузок Firefox, можно воспользоваться кнопкой с таким кодом:

Код:

saveDocument (window. content. document, true);

Если недостаточно, можно попробовать такой код:

Код:

var saveDirectory = "c:\\savedhtml";
var doc = window. content. document;
var url = doc. location. href;
var charset = doc. characterSet;
var contentType = doc. contentType;
var fileInfo = new FileInfo ("");
initFileInfo (fileInfo, url, charset, doc, contentType, null);
var file = Components. classes ["@mozilla.org/file/local;1"]. createInstance (Components. interfaces. nsILocalFile);
file. initWithPath (saveDirectory);
var dir = file. clone ();
dir. append (fileInfo. fileName);
file. append (fileInfo. fileName + "." + fileInfo. fileExt);
var fileURL = makeFileURI (file);
var persist = makeWebBrowserPersist ();
var persistArgs =
{
    source      : doc,
    contentType : contentType,
    target      : fileURL,
    postData    : getPostData (),
    bypassCache : false // aShouldBypassCache
};
var encodingFlags = Components. interfaces. nsIWebBrowserPersist. ENCODE_FLAGS_ENCODE_BASIC_ENTITIES;
var tr = Components. classes ["@mozilla.org/transfer;1"]. createInstance (Components. interfaces. nsITransfer);
tr.init (fileInfo. uri, persistArgs. target, "", null, null, null, persist);
//persist.persistFlags = Components. interfaces. nsIWebBrowserPersist. PERSIST_FLAGS_BYPASS_CACHE;
persist.persistFlags = Components. interfaces. nsIWebBrowserPersist. PERSIST_FLAGS_FROM_CACHE;
persist. progressListener = tr;
persist. saveDocument (persistArgs.source, persistArgs.target, dir, persistArgs.contentType, encodingFlags, 80);

в первой строке которого задаём нужный каталог.

Anton написал:

Спасибо!
Второй вариант подошел.
Хотя в принципе подошело дополнение ScrepBook с одной командой на кнопке sbBrowserOverlay.execCapture(2, false, false, event.originalTarget.id);

Да речь,о корневой папке расширения custombuttons@xsms.org.Держу иконки там,в подпапке Icon.Насчет

А в перекодированном в base64 виде

незнаю,а вот

или в подкаталоге custombuttons профиля не пойдёт ?

думаю нормально.Главное,что бы,при обновлениях,директория,в которой будут находиться иконки,не изменялась.Пусть основной каталог меняеться,а подкаталог нет.Тогда при обновах,иконки будут сохраняться и не надо морочиться,держать их хрен знает где.Я пользуюсь еще и портаблелисом,переношу конфигу из системной.Не надо ничего менять.Пути все прописываються по умолчанию.Никаких проблем.Раньше держал иконки в отдельной папке,на другом диске.Приходилось,каждый раз,по новому кнопки править.Поэтому и прошу о правке.

vv07 написал:

Да речь,о корневой папке расширения custombuttons@xsms.org.Держу иконки там,в подпапке Icon.Насчет

А в перекодированном в base64 виде

незнаю

В диалоговом окне редактирования кнопки есть кнопка "=> base64", которая преобразует файл изображения в строку символов, которая хранится вместе с кодом кнопки.

или в подкаталоге custombuttons профиля не пойдёт ?

думаю нормально.Главное,что бы,при обновлениях,директория,в которой будут находиться иконки,не изменялась.Пусть основной каталог меняеться,а подкаталог нет.Тогда при обновах,иконки будут сохраняться и не надо морочиться,держать их хрен знает где.Я пользуюсь еще и портаблелисом,переношу конфигу из системной.Не надо ничего менять.Пути все прописываються по умолчанию.Никаких проблем.Раньше держал иконки в отдельной папке,на другом диске.Приходилось,каждый раз,по новому кнопки править.Поэтому и прошу о правке.

В custombuttons уже есть один механизм, позволяющий исключить зависимость от места расположения изображений кнопок - это кодирование в base64. Стоит ли создавать второй ? Я подумаю, но ничего не обещаю.

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

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

vurdalak

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

По-хорошему, вроде, надо делать расширение с XPCOM-компонентой...
Тем не менее, можно попробовать сделать вот так:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EStartup%20/%20Shutdown%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bfunction%20getWindowsCount%28%29%20%7B%0A%09var%20wins%20%3D%20Components.classes%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D%0A%09%09.getService%28Components.interfaces.nsIWindowMediator%29%0A%09%09.getEnumerator%28%22navigator%3Abrowser%22%29%3B%0A%09var%20count%20%3D%200%3B%0A%09while%28wins.hasMoreElements%28%29%29%20%7B%0A%09%09wins.getNext%28%29%3B%0A%09%09count++%3B%0A%09%7D%0A%09return%20count%3B%0A%7D%0Afunction%20_log%28%29%20%7B%0A%09alert%28%22Startup%20/%20Shutdown%20button%20-%3E%20%22%20+%20arguments.callee.caller.name%29%3B%0A%7D%0Afunction%20startup%28%29%20%7B%0A%09_log%28%29%3B%0A%7D%0Afunction%20shutdown%28%29%20%7B%0A%09_log%28%29%3B%0A%7D%0Afunction%20eventHandler%28e%29%20%7B%0A%09window.removeEventListener%28e.type%2C%20arguments.callee%2C%20false%29%3B%0A%09if%28e.type%20%3D%3D%20%22load%22%20%26%26%20getWindowsCount%28%29%20%3D%3D%201%29%0A%09%09startup%28%29%3B%0A%09else%20if%28e.type%20%3D%3D%20%22unload%22%20%26%26%20getWindowsCount%28%29%20%3D%3D%200%29%0A%09%09shutdown%28%29%3B%0A%7D%0Aif%28%21window%5B%22__listeners__%22%20+%20this.id%5D%29%20%7B%0A%09window%5B%22__listeners__%22%20+%20this.id%5D%20%3D%20true%3B%0A%09window.addEventListener%28%22load%22%2C%20eventHandler%2C%20false%29%3B%0A%09window.addEventListener%28%22unload%22%2C%20eventHandler%2C%20false%29%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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%3C/custombutton%3E

Внутри функций startup и shutdown

Код:

function startup() {
    _log();
}
function shutdown() {
    _log();
}

пишем то, что должно выполняться при запуске и закрытии соответственно. Учитывается только «главное» окно. Например, если оставить загрузки и закрыть все другие окна, скрипт решит, что произошел выход.


размещение курсора в адресной строке, по аналогу F6

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EFocus%20URL%20Bar%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20uBar%20%3D%20document.getElementById%28%22urlbar%22%29%3B%0AuBar.focus%28%29%3B%0AuBar.select%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%3C/custombutton%3E

16-09-2008 23:49:58



P.S. Идея. При добавлении кнопки через custombutton-протокол сделать возможность посмотреть код (по аналогии с Greasemonkey). Из тех же соображений безопасности (или есть способ добраться до кода кнопки без запуска инициализации?).

Спасибо за быстрый ответ.
Все вроде бы неплохо, в функции "startup" я прописал код запуска приложения, все нормально запускается, но выгружать приложения в функции shutdown я собираюсь через "taskkill.exe". И дело в том, что если такой код работает:

Код:

var file = Components. classes ["@mozilla.org/file/local;1"].
           createInstance (Components. interfaces. nsILocalFile);
var process = Components. classes ["@mozilla.org/process/util;1"].
    getService (Components. interfaces. nsIProcess);
file. initWithPath ("C:\\windows\\system32\\calc.exe"); 
process. init (file);
process. run (false,[''],1);

То уже:

Код:

file. initWithPath ("C:\\windows\\system32\\cmd.exe");

работать отказывается
Не знаю в чем может быть дело ?

P.S. Хм... Или может не через taskkill.exe можна ?

vurdalak

P.S. Хм... Или может не через taskkill.exe можна ?

Гм, у меня вот так заработало:

Код:

function startProcess(path, args) {
    args = args || [];
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath(path);
    if(!file.exists()) {
        alert(path + "\nnot found!");
        return;
    }
    var process = Components.classes["@mozilla.org/process/util;1"]
        .getService(Components.interfaces.nsIProcess);
    process.init(file);
    process.run(false, args, args.length);
}
function killProcess(name) {
    startProcess("c:\\WINDOWS\\system32\\taskkill.exe", ["/F", "/IM" , name]);
}
killProcess("notepad.exe");
killProcess("Opera.exe");

17-09-2008 01:06:57
P.S. А cmd.exe в скрытом виде стартует...

P.P.S. Или функция startProcess +

Код:

function killProcesses() {
    var args = ["/F"];
    for(var i = 0; i < arguments.length; i++)
        args.push("/IM"), args.push(arguments[i]);
    startProcess("c:\\WINDOWS\\system32\\taskkill.exe", args);
}
killProcesses("notepad.exe", "Opera.exe");

17-09-2008 01:28:56
Добавил в кнопку «Startup / Shutdown» проверку наличия обработчиков (иначе каждый раз после редактирования кнопки вызывалась инициализация и плодила обработчики).
Код кнопки обновил.

Все работает на ура. Видимо я где-то допускал ошибку.
Спасибо, очень помог

Нужна кнопка Open notebook. Та, что в статус баре от приложения Google notebook. Мне не нравится статус бар. Я хотел бы иметь кнопку на тулбаре. Но код этой кнопки я не знаю.

Infocatcher

Идея. При добавлении кнопки через custombutton-протокол сделать возможность посмотреть ко

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

А cmd.exe в скрытом виде стартует...

Я уже говорил об этом, кажется. В тройке process.run запускает cmd.exe так, что окна не видно.
Только launch() на саму cmd.exe или пакетный файл способны показать окно консоли.

macuache

Нужна кнопка Open notebook.

Код:

document.getElementById("gnotes-statusbar").click()

вроде, работает.

Anton

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

Примерно так:
0. Открываем custombutton-ссылку.
1. Выскакивает окошко:
Установить кнопку " ... "?
Установить | Посмотреть код кнопки | Отмена
2. По «Посмотреть код кнопки» открываем обычное окно редактирования, но в заголовке пишем что-то вроде «Предварительный просмотр кода кнопки», а из кнопок – только «Установить кнопку» и «Отмена». И надо запретить возможность менять текст (или внесенные изменения должны применяться).

P.S.

В cb2 давно уже есть, но "утягивать" один-в-один мне не хочется.

Гм, может, конечно, искал плохо, но не увидел.

Infocatcher

Установить | Посмотреть код кнопки | Отмена

Понятно. Прямо сейчас не могу, но сделаю, как появится свободное время.

Гм, может, конечно, искал плохо, но не увидел.

В контекстном меню custombutton:// ссылки есть пункт "View Custom Button Codes".

Anton

В контекстном меню custombutton:// ссылки есть пункт "View Custom Button Codes".

Ааа... А я в адресную строку код пихал. =)
Не очень-то удобно (пришлось писать букмарклет, чтобы сотворить ссылку :D).

Добрый день, а нет ли уже готовой кнопки для Thunderbird, которая по клику пересылала бы выбранные сообщения на заранее определенный адрес (нужно для обучения серверного байес фильтра)?
Встроенная функция MsgForwardAsAttachment и MsgForwardMessage к сожалению не позволяет задать адрес на который пересылать :angry:

Будьте добры. Нужна кнопка "Organize bookmarks"

macuache
Bookmark Manager?

macuache

Будьте добры. Нужна кнопка "Organize bookmarks"

DOM Inspector (для Firefox 2.0.0.x и ниже нужно при установке выбрать выборочную установку и поставить соответствующую галочку)

Теперь набор пояснительных скриншотов.

0. Запускаем DOM Inspector:
http://s47.radikal.ru/i115/0811/2a/7209c9c958e4t.jpg

1. Выбираем нужный документ для исследования:
http://i022.radikal.ru/0811/86/931ebcbd0515t.jpg

2. Выбираем поиск:
http://s42.radikal.ru/i095/0811/29/c75cd70cf5abt.jpg
Вместо поиска можно выбрать нужный элемент интерфейса кликом (см. кнопку слева от поиска).

3. Ищем по атрибуту.
Атрибут: label
Значение: название искомого пункта меню
(Если искать по всплывающей подсказке, то вместо «label» использовать «tooltiptext».)
http://s41.radikal.ru/i092/0811/01/314c492fd765t.jpg

4. (Справа нужно выбрать отображение «DOM Node».) Затем нужно найти атрибут oncommand, command или onclick и скопировать его значение, выбрав в контекстном меню редактирование:
http://i036.radikal.ru/0811/3a/ce62f0601fdft.jpg http://s57.radikal.ru/i158/0811/5d/6f27703f60eft.jpg

5. Для oncommand и onclick искомым кодом является скопированное ранее значение атрибута.
Для command нужно найти соответствующую команду.

5.1. Ищем по идентификатору, в качестве которого берем значение атрибута command:
http://s51.radikal.ru/i132/0811/63/4f89d5316deat.jpg

5.2. У найденного элемента ищем атрибут oncommand и копируем его (это и есть искомый код):
http://s60.radikal.ru/i170/0811/11/9f1c7bb6c38at.jpg



В итоге получаем:

Код:

PlacesCommandHook.showPlacesOrganizer('AllBookmarks');

спасибо

Дайте пожалуйста кнопку, при нажатии на которую открывается нужная папка закладок (в виде меню над этой кнопкой).

Infocatcher
Просьба к спецу.
1.Дано: новая панель инструментов, названная №1, в которую перенесены почти все кнопки с панели навигации + доп. кнопки.
2.Необходимо создать доп. кнопку, при клике по которой, новая панель будет открываться и закрываться. Аналог - кнопка, скрывающая панель закладок.
Буду очень благодарен.
З.Ы. Из готовых кнопок подходящей нет. Сделать свою - :dumb:

68agasfer написал:

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

Секция «код»:

Код:

var tName = "toolbarName"; // Вместо toolbarName – название добавленной панели инструментов
var tBar = document.getElementById("__customToolbar_" + tName.replace(/\s/, "_"));
tBar.collapsed = !tBar.collapsed;

Почему-то добавленные панели инструментов свое состояние не запоминают (точнее, с почему понятно – специально атрибута нету, а вот зачем так сделано – совершенно неясно).
В общем, если нужно скрывать панель по умолчанию (во всех новых окнах), надо добавить в секцию «инициализация» следующее:

Код:

var tName = "toolbarName"; // Вместо toolbarName – название добавленной панели инструментов
document.getElementById("__customToolbar_" + tName.replace(/ /, "_")).collapsed = true;

Кстати, с заменой пробелов на подчеркивания тоже глюк какой-то – только первый заменяется. =/

СПС большое!:beer: Вечером попробую.

Заработала!!!:D:D:D :beer: :tongue2: :D
Класс!!!
[fx]+[tb]=THE BEST!

Infocatcher

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

Код:

...replace (/ /g, "_")...

?

saab написал:

Добрый день, а нет ли уже готовой кнопки для Thunderbird, которая по клику пересылала бы выбранные сообщения на заранее определенный адрес (нужно для обучения серверного байес фильтра)?
Встроенная функция MsgForwardAsAttachment и MsgForwardMessage к сожалению не позволяет задать адрес на который пересылать :angry:

Сделал вот такую:

Код:

function forwardTo (uri, email)
{
    var gIOService = Components. classes ["@mozilla.org/network/io-service;1"]. getService (Components. interfaces. nsIIOService);
    var hdr = messenger. messageServiceFromURI (uri). messageURIToMsgHdr (uri);
    // полям hdr лучше ничего не присваивать - это отразится на исходном сообщении
    var sMsgComposeService = Components. classes ["@mozilla.org/messengercompose;1"]. getService (Components. interfaces. nsIMsgComposeService);
    var msgWindow = Components. classes ["@mozilla.org/messenger/msgwindow;1"]. createInstance();
    msgWindow = msgWindow. QueryInterface (Components. interfaces. nsIMsgWindow);
    msgWindow. SetDOMWindow (window);
    msgWindow. rootDocShell. allowAuth = true;
    var folder = hdr. folder;
    var smtpService = Components. classes ["@mozilla.org/messengercompose/smtp;1"]. getService (Components. interfaces. nsISmtpService);
    var accountManager = Components. classes ["@mozilla.org/messenger/account-manager;1"]. getService (Components. interfaces. nsIMsgAccountManager);
    var server = accountManager. defaultAccount. incomingServer;
    sMsgComposeService. forwardMessage (email, hdr, msgWindow, server);
}
var messageArray = GetSelectedMessages ();
for (var i = 0; i < messageArray. length; i++)
    forwardTo (messageArray [i], "box@mail.com");

Есть одна неприятность при использовании, у некоторых писем тема контейнера (но не исходного письма) выходит "кракозябрами". Приблизительно, это письма, тема которых с кириллицей в кодировке windows-1251 начинается латиницей.

Anton написал:

Infocatcher

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

Код:

...replace (/ /g, "_")...

?

Про «g» я в курсе. =)
Сам Firefox при добавлении панели инструментов присваивает ей id. Так вот, при этом только самый первый пробел заменяется на «_» (а не все, что было бы логичнее).
Проверяется, например, добавлением панели с именем «0  1  2».

USER написал:

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

cHeRsAnYa написал:

Дайте пожалуйста кнопку, при нажатии на которую открывается нужная папка закладок (в виде меню над этой кнопкой).

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

Хотелось бы узнать мнение пользователей по поводу организации интерфейса расширения в Thunderbird.
Дело в том, что в Thunderbird расширение работает в трёх типах окон - главное окно, окно просмотра сообщения и окно составления сообщения.
Сейчас есть баг, связанный с удалением кнопок (удаляемая кнопка удаляется из всех окон).

Есть 3 варианта касающиеся добавления/изменения (не удаления) кнопок:

1. Пользователь формирует набор кнопок для каждого типа окна самостоятельно. При изменении кнопки, она изменяется только для того типа окон, в котором была вызвана команда изменения.
2. Расширение автоматически добавляет кнопку в наборы для всех типов окон. При изменении кнопки, она изменяется только для того типа окон, в котором была вызвана команда изменения.
3. Расширение автоматически добавляет кнопку в наборы для всех типов окон. При изменении кнопки, она изменяется для всех типов окон.

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

Какой вариант считаете лучшим ?

p.s.: "изменение" - это собственно, изменение кода, а также клонирование кнопки.

AntonНа третьем финале тройки,расширение почему то не работает.Не могу добавить новую кнопку.Правда оговорюсь,речь о портабле,но наверное и на стационарке такая же петрушка будет.

vv07
О какой версии идёт речь ? Если о 3.1b2 и выше, то об этом знаю, исправления готовы, я их тестирую сейчас на TB/SB и FF младших версий.

AntonНет,3.0.5

vv07 написал:

AntonНет,3.0.5

Тогда мне нужно более развёрнутое описание неполадки, чтобы я смог её воспроизвести и выяснить, что надо править.
На 3.0.5 я сейчас добавил "пустую" кнопку через "Вид" -> "Добавить новую кнопку...", вытащил её на панель, открыл новое окно - новая кнопка на месте.

В общем ситуация следующая.Сейчас я установлю стационарку и после отпишусь.

Да,видимо проблема была,именно в портабельной от App,что б им пусто было.На стационарке работает нормально.

vv07

Да,видимо проблема была,именно в портабельной от App,что б им пусто было.На стационарке работает нормально.

Кстати, у меня валялась какой-то portable firefox версии 3.0.4, я его обновил автоапдейтом до 3.0.5 - проблем с расширением не обнаружил. Может, конечно, не в ту сторону копал, поскольку не имею инструкций по воспроизведению ошибки.

Anton Это относиться,только к псевдопортабельным сборкам,сделанными аутолитом.Если портабелка нормальная,то проблем никаких не должно быть.А эти сборки,нарушают работу установленных стационарно и мешают друг другу.Видимо по этой причине и произошел сбой.Потому что у меня ко всему,еще и двойка слетела,потому что папки профиля смешались.:usch: Потому и говорю,что бы им пусто было.

AntonЕсть просьба Уважаемый!Тут возникла необходимость в использовании расширения Listat от http://www.liveinternet.ru/,но оно работает только через контекстное меню.Скажите,нельзя ли кнопочку сварганить?

vv07
Попробуйте вот такой:

Код:

getBrowser().selectedTab = getBrowser().addTab('http://www.liveinternet.ru/stat/' + content.window.location.hostname + '/')

в раздел "Код".

Anton написал:

vv07
Попробуйте вот такой:

Код:

getBrowser().selectedTab = getBrowser().addTab('http://www.liveinternet.ru/stat/' + content.window.location.hostname + '/')

в раздел "Код".

Отлично работает.Спасибо.Блин,как же научиться самому стряпать кнопки :usch:

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

four2four Есть расширение такое. Называется Hide MenuBar. Работает по нажатию Alt.
https://addons.mozilla.org/ru/firefox/addon/4762
Поройте на АМО поиском по слову HIDE - найдёте несколько подобных, на все случаи жизни.

four2four
Вот такой:

Код:

var tbmb = document. getElementById ("toolbar-menubar");
tbmb. _collapsed = !tbmb. _collapsed;
tbmb. collapsed = !tbmb. collapsed;
document. persist ("toolbar-menubar", "collapsed");

код для кнопки. Должен работать независимо от того, установлено расширение personal menu или нет.

Anton Спасибо большое то что надо!
68agasfer знаю про это расширение но меня не устраивает показ на кнопку alt

Друзья, помогите с кнопкой. Код ниже взят из начала темы по кнопке смены кодировки. Она отлично работает в браузере FF, но не работает в Thunderbird.Что нужно изменить в коде. что бы она реагировала на окно почтового клиента. Чувствую дело в этом куске oncommand="this.parentNode.changeEncoding(event)"  Вот что надо вставить вместо parentNode

Код:

custombutton://%u0412%u044B%u0431%u043E%u0440%20%u043A%u043E%u0434%u0438%u0440%u043E%u0432%u043A%u0438%5D%5B%5D%5B%5D%5Bvar%20menu%20%3D%0A%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%20%20%20oncommand%3D%22this.parentNode.changeEncoding%28event%29%22%3E%0A%09%3Cmenuitem%20charset%3D%22KOI8-R%22%20label%3D%22%u041A%u0438%u0440%u0438%u043B%u043B%u0438%u0446%u0430%20%28KOI8-R%29%22/%3E%0A%09%3Cmenuitem%20charset%3D%22IBM866%22%20label%3D%22%u041A%u0438%u0440%u0438%u043B%u043B%u0438%u0446%u0430/%u0420%u043E%u0441%u0441%u0438%u044F%20%28CP-866%29%22/%3E%0A%09%3Cmenuitem%20charset%3D%22windows-1251%22%20label%3D%22%u041A%u0438%u0440%u0438%u043B%u043B%u0438%u0446%u0430%20%28Windows-1251%29%22/%3E%0A%09%3Cmenuitem%20charset%3D%22UTF-8%22%20label%3D%22Unicode%20%28UTF-8%29%22/%3E%0A%3C/menupopup%3E%3B%0Amenu%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28menu.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Athis.%20orient%20%3D%20%22horizontal%22%3B%0Athis.%20type%20%3D%20%22menu-button%22%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20changeEncoding%20%3D%20function%20%28event%29%0A%7B%0A%09var%20encoding%20%3D%20event.%20target.%20getAttribute%20%28%22charset%22%29%3B%0A%09SetForcedCharset%20%28encoding%29%3B%0A%09SetDefaultCharacterSet%20%28encoding%29%3B%0A%7D

Вот так выглядит сам код. Хотелось бы что бы он менял кодировку письма в Thunderbird

Код:

var menu =
<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
       oncommand="this.parentNode.changeEncoding(event)">
    <menuitem charset="KOI8-R" label="Кириллица (KOI8-R)"/>
    <menuitem charset="IBM866" label="Кириллица/Россия (CP-866)"/>
    <menuitem charset="windows-1251" label="Кириллица (Windows-1251)"/>
    <menuitem charset="UTF-8" label="Unicode (UTF-8)"/>
</menupopup>;
menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
this. orient = "horizontal";
this. type = "menu-button";
this. appendChild (menu);
this. changeEncoding = function (event)
{
    var encoding = event. target. getAttribute ("charset");
    SetForcedCharset (encoding);
    SetDefaultCharacterSet (encoding);
}

2gigagertz: Я когда-то подолбался-подолбался с этим и плюнул: MenuManipulator'ом вытащил подменю "Кодировка" в строку основного меню. imho вполне удобно получилось.

gigagertz

Код:

var menu =
<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
       oncommand="this.parentNode.changeEncoding(event)">
    <menuitem charset="KOI8-R" label="Кириллица (KOI8-R)"/>
    <menuitem charset="IBM866" label="Кириллица/Россия (CP-866)"/>
    <menuitem charset="windows-1251" label="Кириллица (Windows-1251)"/>
    <menuitem charset="UTF-8" label="Unicode (UTF-8)"/>
</menupopup>;
menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
this. orient = "horizontal";
this. type = "menu-button";
this. appendChild (menu);
this. changeEncoding = function (event)
{
    var encoding = event. target. getAttribute ("charset");
    MessengerSetForcedCharacterSet (encoding);
    //SetDefaultCharacterSet (encoding);
}

Спасибо, большое!
Оба варианта работают:)
Еще одна просьбочка:) что убрать из кода что бы сделать одну отдельную кнопку на конкретную кодировку(например koi8-r)? Т.е. мне не нужно выпадающее меню, а нужно что бы кнопка сразу назначала конкретную кодировку. У меня что-то не получается

gigagertz

что убрать из кода что бы сделать одну отдельную кнопку на конкретную кодировку

Из раздела "Инициализация" - убрать всё.
В раздел код поместить строчку

Код:

MessengerSetForcedCharacterSet ("KOI8-R");

(для koi8-r)

Anton написал:

gigagertz

что убрать из кода что бы сделать одну отдельную кнопку на конкретную кодировку

Из раздела "Инициализация" - убрать всё.
В раздел код поместить строчку

Код:

MessengerSetForcedCharacterSet ("KOI8-R");

(для koi8-r)

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

И вообще есть какой-нить хелп для по написанию этих кодов?

Нет, хелпа нет.

чем отличаются окно инициализации от окна кода?

Код из раздела "код" выполняется при нажатии на кнопку.
Код из раздела "инициализация" выполняется при создании кнопки.

Нужна новая кнопка.
Можно ли с помощью данного расширения создать кнопку с необходимой мне функцией? Буду рад помощи, т.к. самому мозгов не хватает - :sick:
Описание функции: при нажатии кнопки создаётся бэкап закладок в формате HTML (в принципе, подойдёт и JSON) и помещается в указанную папку. Адрес папки - L:\PRIVAT\BOOKMARKS
Пытался настроить Foxmarks на сохранение своих данных на другом сервере - отказывается. Чем-то ему данный ресурс ( http://www.livedrive.com/ ) неугоден.
Помогите, пожалуйста.

Duble3

Код:

var backupdir = Components. classes ["@mozilla.org/file/local;1"].
                createInstance (Components. interfaces. nsILocalFile);
backupdir. QueryInterface (Components. interfaces. nsIFile);
backupdir. initWithPath ("L:\\PRIVAT\\BOOKMARKS");
var backup = backupdir. clone ();
backup. append ("bookmarks.html");
if (backup. exists())
    backup. remove (false);
var exporter = Components. classes ["@mozilla.org/browser/places/import-export-service;1"].
               getService (Components. interfaces. nsIPlacesImportExportService);
exporter. exportHTMLToFile (backup);

создаёт в L:\PRIVAT\BOOKMARKS файл bookmarks.html

Anton

:beer:

А в "инициализации" что писать?

P.S. Работает замечательно. Только один минус есть - при обычном сохранении к имени файла добавляется дата "bookmarks 5.02.2009", а при работе кнопки - нет.:angry:
В итоге файл bookmarks при следующем сохранении заменяется новым, а хотелось бы, чтоб при добавлении нового старый сохранялся.

ничего

Duble3
Уважаемый, позвольте поинтересоваться, вы с какой целью правите свои предыдущие сообщения после того, как в теме уже появились новые ?

при обычном сохранении к имени файла добавляется дата "bookmarks 5.02.2009", а при работе кнопки - нет

Код:

var backupdir = Components. classes ["@mozilla.org/file/local;1"].
                createInstance (Components. interfaces. nsILocalFile);
backupdir. QueryInterface (Components. interfaces. nsIFile);
backupdir. initWithPath ("L:\\PRIVAT\\BOOKMARKS");
var backup = backupdir. clone ();
var date = new Date ();
var month = date. getMonth () + 1;
if (month < 9)
    month = "0" + month;
date = date. getDate () + "." + month + "." + date. getFullYear ();
alert (date);
backup. append ("bookmarks " + date + ".html");
if (backup. exists())
    backup. remove (false);
var exporter = Components. classes ["@mozilla.org/browser/places/import-export-service;1"].
               getService (Components. interfaces. nsIPlacesImportExportService);
exporter. exportHTMLToFile (backup);

добавляет текущую дату к имени файла с закладками.

Anton
Когда правил, следующих сообщений ещё не было. :angel:
СПС за исправления.

08-02-2009 20:17:40
З.Ы. ОНО! Именно то, что доктор прописал. Ещё б для Sxipper'а такое сделать. Но тут, я думаю, будет посложнее.
Ещё раз СПС!

Duble3

Когда правил, следующих сообщений ещё не было.

Ваше сообщение пополнено спустя 10 минут после размещения моего.
Я это к тому, что о таким образом размещённых запросах я могу узнать только случайно.

Учту на будущее.

Помогите разобраться со странным поведением панели меню при использовании данного расширения.
   Добавляю кнопки на панель меню. В одной из кнопок в коде инициализации прописываю следующее: this.parentNode.setAttribute("mode", "icons");. Эта запись помогает избавиться от названий кнопок. Всё работает как надо, пока не приходится добавлять владку в закладки. При, первом за сессию, выполнении этого действа у кнопок в панели меню появляются названия и сама панель расширяется(по высоте). Ставил последнюю версию расширения и иностранную версию,-проблемма сохраняется. Проблемма появилась при переходе с firefoxPortable 2 на firefoxPortable 3. Если зайти в режим редактирования кнопки, то достаточно ничего не изменять, а просто нажать ОК и панель принимает прежний вид. В дальнейшем при добавлении закладок такое не наблюдается, до следующей перезагрузки браузера.
   Кнопки в панель меню добавляю для похожести на макстон, ну и просто для личного удобства :)

Duble3

Ещё б для Sxipper'а такое сделать.

Для этого надо переносить и адаптировать много кода из Sxipper'а. За это не возьмусь.

alexmac

При, первом за сессию, выполнении этого действа у кнопок в панели меню появляются названия и сама панель расширяется(по высоте).

Мне удаётся это воспроизвести только в случае, когда в диалоге настройки панелей инструментов в поле "Показывать" установлено "Значки и текст". Но в этом случае, браузер и должен отображать и значки и названия кнопок.
Если установлено "Только значки", воспроизвести не удаётся. Firefox Portable 3.0.5/3.0.6.

Anton
Понимаю. Потому и не обращался с конкретной просьбой, а просто помечтал. :)

Anton

Мне удаётся это воспроизвести только в случае, когда в диалоге настройки панелей инструментов в поле "Показывать" установлено "Значки и текст". Но в этом случае, браузер и должен отображать и значки и названия кнопок.
Если установлено "Только значки", воспроизвести не удаётся. Firefox Portable 3.0.5/3.0.6.

Ну ...  у меня в настройуах - "Значки и текст". Просто подумал, что раз во 2-ой версии такого не было то и в Firefox Portable 3.0.5 не должно.
Если я правильно понял, то это не лечится и дело тут не в Custom Buttons. Жаль, было бы удобно...

alexmac
Если позарез нужны "Значки и текст", можно попробовать сменить метод реализации необходимого эффекта:

Код:

document. getAnonymousElementByAttribute (this, "class", "toolbarbutton-text"). setAttribute ("hidden", "true");

to Anton:
я не силён в воппросе написания кнопок, отсюда вопрос:
Это нужно добавить в код инициализации, вместо this.parentNode.setAttribute("mode", "icons")?
Если да, то не работает. И если не вместо а после this.parentNode.setAttribute("mode", "icons"), то тоже не работает...

alexmac

Это нужно добавить в код инициализации, вместо this.parentNode.setAttribute("mode", "icons")?

Вместо, или вместе, без разницы

Если да, то не работает.

У меня работает. Ctrl+D/Bookmark this page с такой строкой не "ломает" строку меню.
Но вызов диалога настройки панелей инструментов может "сломать".

Других вариантов пока нет. В очередной версии расширения постараюсь включить правило css на какой-нибудь атрибут или ещё как-нибудь обеспечить надёжное неотображение подписи в подобных случаях.

to Anton:
Мне не помогло, но всё равно, спасибо за помощь и за

В очередной версии расширения постараюсь включить правило css на какой-нибудь атрибут или ещё как-нибудь обеспечить надёжное неотображение подписи в подобных случаях

Anton Требуеться помощь!Не знаю какое расширение стало причиной,но у меня из настроек панелей исчезла кнопка,закрыть окно.Очень удобно,когда открываються отдельные окна.Сейчас приходиться сворачивать и закрывать из трея.Как бы кнопочку сварганить?:blush:

vv07

Код:

window. close ()

?

Anton[firefox]

Работает да еще как :lol::lol::lol: Только не окно закрывает а лису полностью :tongue2:

vv07
Стало быть, мне нужны подробности. Покамест, я не могу догадаться, что должна делать кнопка.

Anton
Повторно обращаюсь за помощью. Суть в следующем - в GoogleReader есть такая функция: делаешь новую закладку на панели с таким адресом

https://www.google.com/reader/next?go=nextauto&t=145931955611656916 (для меня)

при клике по которой, страницы новостей поочерёдно открываются на текущей странице. Довольно удобно, но ... Т.к. я терпеть не могу всякие тулбары и панели, то панель закладок у меня большую часть времени скрыта. Хотелось бы получить кнопку с подобной функцией, чтобы не открывать каждый раз эту панель для доступа к кнопке. Пробовал Google Reader Notifier - не то.

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

Anton
Имеем к примеру сайт,на котором проклятая реклама дает новое окно браузера.Это то окно и надо закрыть.Раньше была кнопка,закрыть вкладку кажеться.Я с помощью нее и закрывал.А сейчас приходиться сворачивать в трей и оттуда уже,через контекстное,закрывать блин. :angry:

Duble3
Если надо загрузить указанный url, то

Код:

loadURI ("https://www.google.com/reader/next?go=nextauto&t=145931955611656916");

По значкам - ничем не могу помочь.

vv07

Раньше была кнопка,закрыть вкладку кажеться.

Не видел никогда такой кнопки. Если эта кнопка делает то же, что и "Файл" -> "Закрыть вкладку", тогда

Код:

BrowserCloseTabOrWindow();

Если нет - ну, тогда не знаю. Вообще, ситуацию не могу представить, вроде бы, у всплывающих окон есть системные кнопки свернуть-развернуть-закрыть в заголовке.

Anton
Вроде она.Спасибо.

Anton
Не работает. :angry: пишет "permission denied". А родная кнопка открывает нормально.

Duble3

Не работает. :angry: пишет "permission denied". А родная кнопка открывает нормально.

Проверьте правильность ссылки в коде кнопки. Кажется, там не хватает одной цифры.

Anton
O'K . Разобрался. Ошибка в последней цифре. Исправил - работает. СПС!

alexmac
Версия расширения 0.0.3.9 позволяет скрывать название кнопки с помощью атрибута cb-style, если в нём содержится значение 'hidelabel'. Пока так.
То есть, в раздел "Инициализация" надо добавить строку

Код:

this. setAttribute ("cb-style", "hidelabel");

to Anton
Спасибо за поддержку, но к сожелению не помогло. И после установки новой версии перестала работать кнопка:

Код:

/*Initialization Code*/
if( getBoolPref('browser.offline') )
  {
   BrowserOffline.toggleOfflineStatus();
  }

alexmac

Спасибо за поддержку, но к сожелению не помогло.

Может быть, код в разделе "Инициализация", предшествующий коду "this.setAttribute..." содержит ошибку ?
Попробуйте разместить скрывающий название код в самой первой строке раздела "Инициализация".
Разобранный ранее пример у меня не вызывает расширения строки меню.
На всякий случай вот код:

Код:

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%3Etest%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%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.%20setAttribute%20%28%22cb-style%22%2C%20%22hidelabel%22%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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

для установки через адресную строку кнопки, которая не делает ничего, только скрывает своё название.

И после установки новой версии перестала работать кнопка:

Я подозреваю, работать она перестала много раньше обновления до версии 0.0.3.9, поскольку не могу добиться её "работоспособности" ни с одной из версий, начиная с 0.0.3.6 на Firefox Portable версий 3.0.4 и 3.0.6.
Кстати, для чего предназначена эта кнопка ? Если для автоматического включения режима автономной работы, то предоставленый Вами код неверный. По меньшей мере, в нём отсутствует один знак. Рекомендую в качестве замены такой код в раздел "Инициализация":

Код:

var ios = Components. classes ["@mozilla.org/network/io-service;1"]. getService (Components. interfaces. nsIIOService);
ios. offline = true;

или, готовый код для установки через адресную строку:

Код:

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%3EtoggleOffline%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20ios%20%3D%20Components.%20classes%20%5B%22@mozilla.org/network/io-service%3B1%22%5D.%20getService%20%28Components.%20interfaces.%20nsIIOService%29%3B%0Aios%20%3D%20true%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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

to Anton
Ваша тестовая кнопка не помогла, надо попробовать на чистом профиле.
Кнопка, код которой приведён мною в посте №774, служит для сохранения текущего состояния автономной работы (вкл/выкл) после перезапуска браузера :)

05-03-2009 11:11:31
to Anton
На чистом профиле надпись не появляется, заработало :)
А вот состояние "автономной работы" по прежнему не сохраняется.

alexmac

На чистом профиле надпись не появляется, заработало :)

Понятно. Буду придумывать что-нибудь более надёжное. Спасибо за информацию.

А вот состояние "автономной работы" по прежнему не сохраняется.

Попробуйте

Код:

var pref = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
var ios = Components. classes ["@mozilla.org/network/io-service;1"]. getService (Components. interfaces. nsIIOService);
if( pref.getBoolPref('browser.offline') )
  {
ios. offline = !ios. offline;
  }

Плиз, объясните непутёвому на каком языке кнопки писать и есть ли какой справочник о том, как это делается в mozilla (ну названия компонентов браузера и пр.

Najlus
Код для кнопок пишется на javascript. А справочника нет.

Добрый вечер, хотелось бы встроить в боковую панель панели ресурсов и поиска, которыми пользовался ещё со времен MyIE. Смысл задачи - создание кнопки для запуска *.htm файла в боковой панели, причём путь к файлу должен быть "относительным", т.к. планируется использование с портабельной версией лисы. Возможно ли написать подобную кнопку?

3Jlou написал:

Смысл задачи - создание кнопки для запуска *.htm файла в боковой панели, причём путь к файлу должен быть "относительным", т.к. планируется использование с портабельной версией лисы. Возможно ли написать подобную кнопку?

Код:

openWebPanel(title, uri);

*.htm конвертируете в base64 и используете результат в качестве uri.

16-03-2009 02:05:38
P.S. И не проще ли сделать закладку?

Infocatcher, прошу прощения за свою неграмотность, но можно ли расписать поподробней?
Что есть "*.htm конвертируете в base64" и как прописать относительный путь к htm-файлу, если например он лежит в ".../Папка профиля/Sidebars/resource.htm"?
Спасибо!

Хоелось бы иметь аналог "Закладки Ru-Board   1.6beta2" из Maxthon.
Плагин показывает в боковой панели список выбранных мной тем форума и цифрой количество новых не прочтеных сообщений.При наведении на строку темы появляется всплывающее окно с последним сообщением при нажатии-переход на страницу с сообщением.

http://s47.radikal.ru/i116/0901/45/162479323ee5t.jpg

3Jlou написал:

Что есть "*.htm конвертируете в base64" и как прописать относительный путь к htm-файлу, если например он лежит в ".../Папка профиля/Sidebars/resource.htm"?

  • Открываете *.htm в Firefox. Получаете ссылку вида file://<...>.htm. Копируете эту ссылку.
  • Вид – Добавить новую кнопку
    В поле «Картинка» вставляете полученную ранее ссылку и жмете на «=> base64».
  • Копируете строку вида data:text/html;base64,<...>.


Далее или делаете кнопку

Код:

openWebPanel("Заголовок панели", "data:text/html;base64,<и_еще_куча_символов>");

, или закладку на base64-ссылку.

Подскажите пожалуйста.Как написать code для кнопки которая будет открывать окошко добовления ссылки в черный список в расширении blocksite
http://s46.radikal.ru/i113/0903/d3/7c9ad1bc9690t.jpg

wald

Хоелось бы иметь аналог "Закладки Ru-Board   1.6beta2" из Maxthon.

Извините, не могу за это взяться. Я не пользователь ни ru-board, ни maxton. Может быть, сделаю позже, но обещать ничего не могу.

BALANCE

Как написать code для кнопки которая будет открывать окошко добовления ссылки в черный список в расширении blocksite

Несложно:

Код:

window.open('chrome://blocksite/content/BlockSiteSetWebsite.xul', '', 'chrome,centerscreen');

только это окошко blocksite обречено работать только из окна настроек расширения.
Если надо добавлять адреса в список blocksite, могу предложить такое решение:

Код:

var Cc = Components. classes;
var Ci = Components. interfaces;
var NSISSI = Ci. nsISupportsString;
var newLocation = prompt ("Add new location", getBrowser (). contentDocument. location. href);
var blockedWebsitesArray;
var BlockSitePrefBranch = Cc ["@mozilla.org/preferences-service;1"]. getService (Ci. nsIPrefService). getBranch("BlockSite.");
if (BlockSitePrefBranch. prefHasUserValue ("locations"))
{
    blockedWebsitesString = BlockSitePrefBranch. getComplexValue ("locations", NSISSI). data;
    blockedWebsitesArray = blockedWebsitesString. split ("|||");
}
else
{
    blockedWebsitesArray = new Array();
}
blockedWebsitesArray. push (newLocation);
var locationNsIString = Cc ["@mozilla.org/supports-string;1"]. createInstance (NSISSI);
locationNsIString. data = blockedWebsitesArray. join ("|||");
BlockSitePrefBranch. setComplexValue ("locations", NSISSI, locationNsIString);

Anton, Спасибо тебе огромное!! Все супер работает!! Очень теперь удобно!)

Только есть проблема если нажимаешь на отмену... но он блокирует как бы все ссылки, помогает помогает только перезагрузка мазилы!

BALANCE

Только есть проблема если нажимаешь на отмену

Да, не подумал. Надо после строки

Код:

var newLocation = prompt ("Add new location", getBrowser (). contentDocument. location. href);

добавить строку

Код:

if (!newLocation) return;

Anton Здорово спасибо!

Слушай а нет какого нибудь справочного материала? чтобы самому научится?)

Infocatcher, большое спасибо, получилось.
Но данный метод имеет ограничения. Как быть если ссылки на открываемой в боковой панели странице ведут на локальные html-файлы, лежащие рядом с исходной html'кой, которую мы перекодировали в base64?

Я долго ковырял кнопки, в итоге подсмотрел код у кнопки OpenLocation от Dark-Demon'a, а именно 1-ю строку инициализации:

Код:

this.url2xul= 'chrome://local/content/open_location.xul';

Из описания кнопки стало ясно что указанный путь ведет в папку ...\Firefox\chrome\local\, закинул туда html-файлы и вбил подправленный код в поле инициализации новой кнопки (остальные строки кода взял от кнопки Менеджер расширений от того же Dark-Demon'a), пример одной из кнопок - SuperUploader: сохраняем страницу в ...\Firefox\chrome\local\superuploader.htm, создаем кнопку:
Картинка:

Код:

data:image/gif;base64,R0lGODlhEAAQAJECAGqbzAAAZv///wAAACH5BAEAAAIALAAAAAAQABAAAAIkFI6Zpu0aXgtUIoot3m97Cx4REGXOWIqniq4kWbmp1oYSEwoFADs=

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

Код:

this.url2xul= 'chrome://local/content/superuploader.htm';
this.onClick= function(e)
{
    switch (e.button)
    {
        case 0: if (document.getElementById('sidebar-box').getAttribute('sidebarcommand')) // close sidebar
                toggleSidebar();
            else  // open in sidebar
                openWebPanel(this.tooltipText, this.url2xul); 
            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;
    };
};
this.setAttribute('onclick','this.onClick(event);');

Есть несколько вопросов:
1) Кнопка работает, но нет ли "подводных камней" в коде и вообще при таком способе написания ссылок и размещении файлов в папке chrome?
2) Можно ли как нибудь указать путь к папке/подпапке с профилем Firefox (хочу перекинуть html'ки туда) по аналогии с методом, описанным выше (chrome://local/content/superuploader.htm)?
3) Как должен выглядеть код, чтобы открытая панель закрывалась при повторном нажатии кнопку (сейчас так и происходит), но не закрывалась при нажатии на другую кнопу, а открывала в панели содержимое, вызываемое нажатием другой кнопки (как в All-in-one sidebar)?

18-03-2009 13:34:58
Infocatcher, пример 2-х кнопок, сделанных конвертированием html-файла в base64-ссылку, почему то они нормально открываются только со 2-го нажатия :(

1) SuperUploader
Картинка:

Код:

openWebPanel("Заголовок панели", "data:text/html;base64,PCFET0NUWVBFIEhUTUwgU1lTVEVNICJodHRwOi8vdGFnc291cC5jb20vZHRkLyI+CjxodG1sIGxhbmc9ImVuIj48aGVhZD4NCgoKCTx0aXRsZT5TdXBlciBVcGxvYWRlcjwvdGl0bGU+DQoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KCTxtZXRhIG5hbWU9IkRlc2NyaXB0aW9uIiBjb250ZW50PSJTdXBlciBVcGxvYWRlciBpcyBhIHBhbmVsIHRvIHF1aWNrbHkgdXBsb2FkIGZpbGVzIHRvIGltYWdlc2hhc2sudXMsIHJhcGlkc2hhcmUuY29tIGFuZCBzb21lIG90aGVyIGZpbGUtc2hhcmluZyBzZXJ2aWNlcy4iPg0KCTxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iaHR0cDovL3VwbG9hZGVyLXBhbmVsLmNvbS9pL3VwMy5naWYiPg0KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJKiB7bWFyZ2luOjA7IHBhZGRpbmc6MH0NCglodG1sIHtiYWNrZ3JvdW5kOiNFQUVDRjE7IGNvbG9yOiMzMzM7fQ0KCWJvZHkge2ZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIC43NWVtLzEuOGVtIEFyaWFsLFRhaG9tYSxzYW5zLXNlcmlmO30NCglpbWcge2JvcmRlcjowfQ0KCXVsIHttYXJnaW4tbGVmdDo0cHg7fQ0KCWxpIHtsaXN0LXN0eWxlLXR5cGU6bm9uZX0NCgloMSB7Zm9udC1zaXplOjEuNWVtfQ0KCWEgc3BhbiB7ZGlzcGxheTpibG9jazsgd2lkdGg6MTUwcHg7IG1hcmdpbjowIGF1dG87IHBhZGRpbmc6LjRlbSAwIC40ZW0gNHB4OyBmb250LXdlaWdodDo1MDB9DQoJI3ZlcnNpb24gc3BhbiB7cGFkZGluZy1sZWZ0OjhweH0NCglkaXYge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjE2MnB4OyBtYXJnaW46MCBhdXRvfQ0KCS5uIHtkaXNwbGF5Om5vbmV9DQoJOnRhcmdldCB7YmFja2dyb3VuZDojOGJjYzZhO30NCglkaXYuZmlsZWlucHV0cyB7cG9zaXRpb246cmVsYXRpdmU7IHdpZHRoOiAxNDRweDsgaGVpZ2h0OiAyNHB4OyBvdmVyZmxvdzogaGlkZGVuOyBtYXJnaW4tbGVmdDowfQ0KCWRpdi5mYWtlZmlsZSB7cG9zaXRpb246YWJzb2x1dGU7IHRvcDowcHg7IGxlZnQ6MHB4OyB6LWluZGV4OjF9DQoJZGl2LmZha2VmaWxlIGEge3BhZGRpbmc6IDAgNHB4OyB9DQoJaW5wdXQuZmlsZSB7cG9zaXRpb246YWJzb2x1dGU7IHJpZ2h0OjA7IGRpc3BsYXk6YmxvY2s7IHdpZHRoOjMwMHB4OyBmb250LXNpemU6M2VtICFpbXBvcnRhbnQ7IGhlaWdodDozMHB4OyB0ZXh0LWFsaWduOiByaWdodDsgb3BhY2l0eTogMDsgLW1vei1vcGFjaXR5OjA7IGZpbHRlcjphbHBoYShvcGFjaXR5OiAwKTsvKiovei1pbmRleDogMn0NCg0KCS5qcyAuc3VibWl0IHtkaXNwbGF5Om5vbmV9DQoNCgkvKiBMaW5rcyAqLwkNCglhIHtkaXNwbGF5OmJsb2NrOyBjb2xvcjojMDM2OyB0ZXh0LWRlY29yYXRpb246bm9uZTsgbWFyZ2luLXJpZ2h0OjFweH0NCgkuZmFrZWZpbGUgYSB7cGFkZGluZy1ib3R0b206LjFlbX0NCgkjdmVyc2lvbiBhIHtjb2xvcjojYTNiOGNjfQ0KCWE6aG92ZXIsIGgxOmhvdmVyIGEge2NvbG9yOiNmNGY1ZjggIWltcG9ydGFudH0NCglhOmhvdmVyLCBoMTpob3ZlciB7YmFja2dyb3VuZDojNmE5YmNjfQ0KCWEuYnRuLCBhLmJ0bnJlYWR5IHtmb250LXNpemU6IDlwdDsgY3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDE0MHB4OyBoZWlnaHQ6IDI0cHg7IG1hcmdpbjogMnB4IDAgMCAycHh9ICANCglhLmJ0bnJlYWR5IHtjb2xvcjogI2ZmZjsgYmFja2dyb3VuZDogIzhiY2Q2YX0NCglhIGltZyB7ZmxvYXQ6bGVmdDsgcGFkZGluZzo0cHggMCAwOyAvKnBvc2l0aW9uOnJlbGF0aXZlOyBsZWZ0Oi0xOHB4OyBwYWRkaW5nOjAgNHB4IDAgMDsgbWFyZ2luLWJvdHRvbTotMjBweCovfQ0KDQoJLyogQ3Vyc29yICovDQoJYSwgYnV0dG9uLCBsYWJlbCwgaW5wdXQge2N1cnNvcjpwb2ludGVyICFpbXBvcnRhbnR9DQoJDQoJLyogSW50ZXJuZXQgRXhwbG9yZXIgKi8NCgkqIGh0bWwgaW1nIHtkaXNwbGF5Om5vbmV9DQoJKjpmaXJzdC1jaGlsZCtodG1sIGltZyB7ZGlzcGxheTpub25lO30NCgkNCglAbWVkaWEgYWxsIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApIHsNCgkJaDEsIGEgey13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAuNHMgZWFzZS1vdXR9DQoJfQ0KCTwvc3R5bGU+DQoJPGxpbmsgcmVsPSJhbHRlcm5hdGUgZmVlZCIgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vY2hhbmdlbG9nLnhtbCIgdGl0bGU9IlVwbG9hZGVyIHBhbmVsOiBjaGFuZ2Vsb2ciPg0KCTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vIiB0aXRsZT0iVXBsb2FkZXIgcGFuZWwiPg0KCTxsaW5rIHJlbD0icHJldmlvdXMiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vdXAuaHRtbCIgdGl0bGU9IlVwbG9hZGVyIj4NCgk8bGluayByZWw9ImhlbHAiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vZmFxLyIgdGl0bGU9IkZBUSI+DQoJPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJNaWtpdmFuY2gsIHByb2ZpVCDQuCDRh9GD0YLRjC3Rh9GD0YLRjCDQndC40LrQuNGC0LAg0JLQsNGB0LjQu9GM0LXQsiI+DQoJPGxpbmsgcmVsPSJhdXRob3IiIGhyZWY9Imh0dHA6Ly9lbHYxcy5ydS8iIHRpdGxlPSLQndC40LrQuNGC0LAg0JLQsNGB0LjQu9GM0LXQsiI+CQ0KPC9oZWFkPjxib2R5IGxpbmtpZnltYXg9IjAiIGxpbmtpZnljdXJyZW50PSIwIiBsaW5raWZ5aW5nPSJ0cnVlIiBjbGFzcz0ianMiPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KCWRvY3VtZW50LmJvZHkuY2xhc3NOYW1lKz0nIGpzJzsJDQo8L3NjcmlwdD4NCjxoMSBpZD0idG9wIj4NCgk8YSBocmVmPSIiIHRhcmdldD0iX2JsYW5rIj4NCgkJPHNwYW4+U3VwZXIgVXBsb2FkZXI8L3NwYW4+CQkNCgk8L2E+DQo8L2gxPg0KPHVsPg0KDQo8IS0tbGkgaWQ9ImZ1bmt5aW1nIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9mdW5reWltZy5jb20vIj48aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFMTUFBQUVCUk1mYjhJcVJud01uaGVQdDl5bGRyOHJOMVdweWd4WklvZUxrNnFxdnV1VG03SksyNE9yczhRQUFBQUFBQUNINUJBQUFBQUFBTEFBQUFBQVFBQkFBQUFRbXNNbEpxNzA0NjgyNy8walJBVVBBWkl0QU1vUjVKY0t4dHVkbHhLU2JHWW9RZnNDZ0pRSUFPdz09IiBhbHQ9IiI+PC9hPgo8Zm9ybSBhY3Rpb249Imh0dHA6Ly9mdW5reWltZy5jb20vdXAucGhwIiBuYW1lPSJ1cCIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiB0YXJnZXQ9Il9ibGFuayI+Cgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4KCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgcmVxdWlyZWQgY2xhc3M9ImZpbGUiIHNpemU9IjEiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fZnVua3lpbWdfY29tJykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX2Z1bmt5aW1nX2NvbScpIiBvbmNoYW5nZT0ic2V0UmVhZHkyKCdidG5fZnVua3lpbWdfY29tJywgdGhpcykiPgoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9mdW5reWltZ19jb20iIGNsYXNzPSJidG4iPkZ1bmt5aW1nLmNvbTwvYT4KCQk8L2Rpdj4KCTwvZGl2PgoJPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgbmFtZT0idXBsb2FkIiB2YWx1ZT0iVXBsb2FkIj4KCTxpbnB1dCBjbGFzcz0ibiIgdHlwZT0icmFkaW8iIG5hbWU9InVwdHlwZSIgdmFsdWU9ImZpbGUiIGNoZWNrZWQ+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNQVhfRklMRV9TSVpFIiB2YWx1ZT0iMzE0NTcyOCI+Cgk8aW5wdXQgY2xhc3M9Im4iIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJhZGRJbmZvIiBjaGVja2VkPgo8L2Zvcm0+CjwvZGl2PjwvbGktLT4NCg0KPGxpIGlkPSJiYXlpbWciPjxkaXY+PGEgaHJlZj0iaHR0cDovL2JheWltZy5jb20vIj48aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFOVS9BT2pzOWFxOTNmVHk3dGZtOUxURTI5dmo3clRINGRyYTJhUys0NXExM2JuUjdZcXAyV21MeWZMeThzVGI4NnpHNTM2ZDBuT1N5NFdqMUUxenZNdmg5dGJmN1ptdTFIK2F5K0hoNGNETjR1M3I2Y25iN3FmQjVlZm41dC9mMzU2NTRmRHU2Ky91N3M3aytNL2g4VGxpc3JmUDdOemY0OHZmOGNUWTdzclY1Ny9QNTQrczJZZWZ6V0dEd1c2T3lPam82TFBKNXMzVzZkYmQ1bnVYemNIWDhKYXgzYS9JNkorejA3L0szZUxxOHFuQTRwR3UyM21aME0vYzY3TEw2Ly8vL3lINUJBRUFBRDhBTEFBQUFBQVFBQkFBQUFhQ3dKOXdTQ3dhajBpaXdaQWM1bUFmU2FVNUtEMFNrRXR5UkNzaEZyeFpha29NblNnMDJ5ZWcydGdXQmFLbTRGRG9lZ09LN3dNSkZEc29QZ2taSWdvY0t4RVJSakljT3pjYkR6VVFEQk1aUlJvR0N4Y0VVUzRUSkJaR0poSXVCQXNNTFN3eFJ3STRCUTBXQVFBQ0FnZEhJQ0FlSVNFZEJ4Z05SdzBlSFJnSEwwMU5RUUE3IiBhbHQ9IiI+PC9hPgo8Zm9ybSBhY3Rpb249Imh0dHA6Ly9iYXlpbWcuY29tL3VwbG9hZCIgbmFtZT0idXBsb2FkIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPgoJCTxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9iYXlpbWdfY29tJykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX2JheWltZ19jb20nKSIgb25jaGFuZ2U9InNldFJlYWR5MignYnRuX2JheWltZ19jb20nLCB0aGlzKSI+CgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPgoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2JheWltZ19jb20iIGNsYXNzPSJidG4iPmJheWltZy5jb208L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiPgoJPGlucHV0IGNsYXNzPSJuIiB0eXBlPSJ0ZXh0IiBuYW1lPSJjb2RlIiB2YWx1ZT0idXBsb2FkZXIiPgoJPGlucHV0IGNsYXNzPSJuIiB0eXBlPSJ0ZXh0IiBuYW1lPSJ0YWdzIiB2YWx1ZT0idXBsb2FkZXIiPgkKCTxpbnB1dCBjbGFzcz0ibiIgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlc2l6ZSI+Cgk8aW5wdXQgY2xhc3M9Im4iIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvZmZlbnNpdmUiPgkKPC9mb3JtPgo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9ImltYWdlc2hhY2siPjxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy5pbWFnZXNoYWNrLnVzLyI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQU1RZkFLczlGbWx0VEtpV0s0WjJIc3UzSFJVWUhYWitkajVIUHE2QkZjM015cVpQR1VaalRPWEJFK3JvS3EzYzdkNmJGREU0TmxwWlY4UmhFOXUySnRPSkV1cThIRU0zSnFTbWwvelVGWkU0SUlna0d1U3FGUFRIR1pRckZHTlBKT3JzOFNINUJBRUFBQjhBTEFBQUFBQVFBQkFBQUFXZzRDY21seEVFeGhWNG5wRjhGeHNNUk5NUWczQmRnbmNkRzg0RVF5UUtBZzZIeVJPaFBDaEJEb2NBT1VDdWhVRUVzZGxVT01TSnBVQ0daQTBlNkpmSThFQVdpNE5GOElFb0pHb09BK0d4K0JFVk1CWVpBSGhlRXdJREhseUJNQWNlaEhnVEV3UUVGUnNUSWlJUmtCMkZEeE5nUXBvZkNSQVpIYWwzRkY4Y3BJS29xWjZHcng4Umc2a2FxWVcxdHBBYXdNQUF2YllXd2JyRHhCRVJHYzEzSVFBNyI+PC9hPg0KPGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LmltYWdlc2hhY2sudXMvaW5kZXgucGhwIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4NCgk8aW5wdXQgdmFsdWU9IjEwNDg1NzYiIG5hbWU9Ik1BWF9GSUxFX1NJWkUiIHR5cGU9ImhpZGRlbiI+DQoJPGlucHV0IHZhbHVlPSJibGFuayIgbmFtZT0idHlwZSIgdHlwZT0iaGlkZGVuIj4NCgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4NCgkJPGlucHV0IG5hbWU9ImZpbGV1cGxvYWQiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX2ltYWdlc2hhY2tfdXMnKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5faW1hZ2VzaGFja191cycpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9pbWFnZXNoYWNrX3VzJywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2ltYWdlc2hhY2tfdXMiIGNsYXNzPSJidG4iPkltYWdlc2hhY2sudXM8L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPGxpIGlkPSJpZm9sZGVyIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9lbHYxcy5pZm9sZGVyLnJ1LyI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQUxNQUFBRUJSTWZiOElxUm53TW5oZVB0OXlsZHI4ck4xV3B5Z3haSW9lTGs2cXF2dXVUbTdKSzI0T3JzOFFBQUFBQUFBQ0g1QkFBQUFBQUFMQUFBQUFBUUFCQUFBQVFtc01sSnE3MDQ2ODI3LzBqUkFVUEFaSXRBTW9SNUpjS3h0dWRseEtTYkdZb1Fmc0NnSlFJQU93PT0iPjwvYT4NCjxmb3JtIGFjdGlvbj0iaHR0cDovL3VwbC5zdGcyMy5pZm9sZGVyLnJ1Lz9zZXJpYWw9ZjNkZjhjOTdjMmRkZmVkNjQ5YWYzNmIzYzFjNmNlNjMiIG5hbWU9InRoZXVwbG9hZGZvcm0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgdGFyZ2V0PSJfYmxhbmsiPg0KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPg0KCQk8aW5wdXQgbmFtZT0iZmlsZW5hbWUiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX2lmb2xkZXJfcnUnKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5faWZvbGRlcl9ydScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9pZm9sZGVyX3J1JywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2lmb2xkZXJfcnUiIGNsYXNzPSJidG4iPmlGb2xkZXIucnU8L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBuYW1lPSJ1cGxvYWRfcGFyYW1zIiB2YWx1ZT0iYmYwYWYzNTdmOWY0NzFkODYwNDZmMGQzMjQ2ZTg0ZGExOTVlNzMyYzZiNjRjNTRjZDkyODExYmZmYTcxYzExN2QzMjY0ZjQ4N2EwNjRhYTJmNzRiOTgxMGM4MGZlZDc5N2RhNTY2Y2Q2MTczNzNhNiIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0iY2xvbmUiIHZhbHVlPSJlbHYxcy5pZm9sZGVyLnJ1IiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJwcm9ncmVzc19iYXIiIHZhbHVlPSJmM2RmOGM5N2MyZGRmZWQ2NDlhZjM2YjNjMWM2Y2U2MyIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0idXBsb2FkX2hvc3QiIHZhbHVlPSJzdGcyMy5pZm9sZGVyLnJ1IiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJNQVhfRklMRV9TSVpFIiB2YWx1ZT0iMTA0ODU3NjAwIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0ic2hvd19wcm9ncmVzc19iYXIiIHZhbHVlPSIwIiB0eXBlPSJjaGVja2JveCI+DQoJPGlucHV0IGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiIHR5cGU9InN1Ym1pdCI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9InNsaWwiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3NsaWwucnUvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTVFkQUJVVkZUUTBNek0wTkRRek5CVVdGWDkvZ0JVV0ZuK0FnSUNBZ0tlbnBzdkx6SCtBZjRDQWY4ekx5MzkvZnhZV0Zzdkx5eFVWRmxoWVdUUXpNNEIvZ0JZV0ZhZW1wNEIvZnhZVkZxZW5welEwTkZoWVdBQUFBUC8vL3dBQUFBQUFBQ0g1QkFFQUFCMEFMQUFBQUFBUUFCQUFBQVZoWUNlT1pHbWVwNktZRFZSbVNaYTk4MWpjMStHUXh6SnV3Q0R3dHhrTk5KM0FvS09aakRSSVVVUmtNSWdBSXdPMnhPR012SjJ1Q053QlBFWUVUS2VDSlJCR0FzRW9vS0VManRIT2tBaVVGRWNVUGlRSURBd0lKVEVtRmpVb2pZNG1JUUE3Ij48L2E+DQo8Zm9ybSBhY3Rpb249Imh0dHA6Ly96YWxpbC5ydS91cGxvYWQvIiBuYW1lPSJzZW5kZm9ybSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQ9IiIgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9zbGlsX3J1JykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX3NsaWxfcnUnKSIgb25jaGFuZ2U9InNldFJlYWR5KCdidG5fc2xpbF9ydScsIHRoaXMpIiB0eXBlPSJmaWxlIj4NCgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9zbGlsX3J1IiBjbGFzcz0iYnRuIj5zbGlsLnJ1PC9hPg0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0Ij4NCjwvZm9ybT4NCjwvZGl2PjwvbGk+DQoNCjxsaSBpZD0iZHVtcCI+PGRpdj48YSBocmVmPSJodHRwOi8vZHVtcC5ydS8iIHJlbD0ibm9mb2xsb3ciPjxpbWcgYWx0PSIiIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFOVS9BSVBRNndHaDBsU3hBYlRkazFPd0FIek42bksrTFhYSzVnT2YwUnlwMmNYa3FVUzUzbWE3SEcyOUp3V2gxV0hFNUJTbTFxRFVjenExM1Z5MkRYckNPd1NnMDFHeUFRU2cwVGV5MjczaW5YUENNeWV2MlFXZjA5anR4SnJSYkhmTjVsS3dBZ0tnejZ6aDg4N291TG5pMnJIYmlUKzEyNmpaZnNMbHBjcmxycUxlNW4vUDZLcmY3OS94eTlYc3Zwdlk3Uyt5M0Zhd0FWT3lBS2ZjN2dTZjFWZTFDUU9lMW9USFJ0M3V5azY5NGIzbThyL2tvUWFpMDUzVmNtVzNGLy8vL3lINUJBRUFBRDhBTEFBQUFBQVFBQkFBQUFhTXdKOVFxQnNhajhQUERNbjhBUzZycHZDUXVBUWNJWXlxcERnbUtyUUtBc0dCUkEyZW9RUlJDVWtXbGR3UUo0Z0lMdzZiNkZlSUdtOENJejhWRnd0Q0xFZzdBZzAvTUFnUFVpNFdBaDB2RGlaSUtFSVpCQVFEUHdzOFJ5a0dQeTArQXA1Q0VKQkNKeUFNRkJZeEZqVkdHeUlEREFLcE1ha1RYVVlISkQwVEJBSXlCblpTUHcwYXpFY1VTRUVBT3c9PSI+PC9hPg0KPGZvcm0gYWN0aW9uPSJodHRwOi8vZHVtcC5ydTo4MDgwL2NnaS1iaW4vdXVfdXBsb2FkLnBsP3RtcF9zaWQ9YmUxOTMxMjQ4ZTg0NDg4OTU2MmRmZGFkZWI1OThlZDAmYW1wO2NvbmZpZ19maWxlPXV1X2RlZmF1bHRfY29uZmlnIiBuYW1lPSJmb3JtX3VwbG9hZCIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiB0YXJnZXQ9Il9ibGFuayI+DQoJPGlucHV0IG5hbWU9InVwbG9hZF9yYW5nZSIgdmFsdWU9IjEiIHR5cGU9ImhpZGRlbiI+DQoJPGlucHV0IG5hbWU9Im5vX3NjcmlwdCIgdmFsdWU9IjEiIHR5cGU9ImhpZGRlbiI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJ1cGZpbGVfMCIgY2xhc3M9ImZpbGUiIHNpemU9IjEiIHJlcXVpcmVkPSIiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fZHVtcF9ydScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9kdW1wX3J1JykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX2R1bXBfcnUnLCB0aGlzKSIgdHlwZT0iZmlsZSI+DQoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fZHVtcF9ydSIgY2xhc3M9ImJ0biI+ZHVtcC5ydTwvYT4NCgkJPC9kaXY+DQoJPC9kaXY+DQoJPGlucHV0IGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiIHR5cGU9InN1Ym1pdCI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9InJhcGlkc2hhcmUtY29tIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9yYXBpZHNoYXJlLmNvbS8iIHJlbD0ibm9mb2xsb3ciPjxpbWcgYWx0PSIiIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFMTUFBQUVCUk1mYjhJcVJud01uaGVQdDl5bGRyOHJOMVdweWd4WklvZUxrNnFxdnV1VG03SksyNE9yczhRQUFBQUFBQUNINUJBQUFBQUFBTEFBQUFBQVFBQkFBQUFRbXNNbEpxNzA0NjgyNy8walJBVVBBWkl0QU1vUjVKY0t4dHVkbHhLU2JHWW9RZnNDZ0pRSUFPdz09Ij48L2E+DQo8Zm9ybSBhY3Rpb249Imh0dHA6Ly9yczY1bDMucmFwaWRzaGFyZS5jb20vY2dpLWJpbi91cGxvYWQuY2dpP3JzdXBsb2FkaWQ9MTQxNTQ5MDU1NTYwMjk3NzA1IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJ1bCIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+DQoJPCEtLSA8aW5wdXQgbmFtZT0ibWlycm9yIiB0eXBlPSJyYWRpbyI+TGV2ZWwoMykgPGlucHV0IGNoZWNrZWQgbmFtZT0ibWlycm9yIiB0eXBlPSJyYWRpbyI+VGVsaWEgPGlucHV0IG5hbWU9Im1pcnJvciIgdHlwZT0icmFkaW8iPiAtLT4NCgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4NCgkJPGlucHV0IG5hbWU9ImZpbGVjb250ZW50IiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQ9IiIgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9yYXBpZHNoYXJlX2NvbScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9yYXBpZHNoYXJlX2NvbScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9yYXBpZHNoYXJlX2NvbScsIHRoaXMpIiB0eXBlPSJmaWxlIj4NCgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9yYXBpZHNoYXJlX2NvbSIgY2xhc3M9ImJ0biI+UmFwaWRzaGFyZS5jb208L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPCEtLWxpIGlkPSJ1cGxvYWQyIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly93d3cudXBsb2FkMi5uZXQvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1BQUFFQlJNZmI4SXFSbndNbmhlUHQ5eWxkcjhyTjFXcHlneFpJb2VMazZxcXZ1dVRtN0pLMjRPcnM4UUFBQUFBQUFDSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBUW1zTWxKcTcwNDY4MjcvMGpSQVVQQVpJdEFNb1I1SmNLeHR1ZGx4S1NiR1lvUWZzQ2dKUUlBT3c9PSI+PC9hPgo8Zm9ybSBhY3Rpb249Imh0dHA6Ly93d3c1LnVwbG9hZDIubmV0L3VwbG9hZC5waHAiIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik1BWF9GSUxFX1NJWkUiIHZhbHVlPSIyNzAwMDAwMCI+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYWdlIiB2YWx1ZT0idXBsb2FkIj4KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPgoJCTxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl91cGxvYWQyX25ldCcpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl91cGxvYWQyX25ldCcpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl91cGxvYWQyX25ldCcsIHRoaXMpIj4KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fdXBsb2FkMl9uZXQiIGNsYXNzPSJidG4iPlVwbG9hZDIubmV0PC9hPgoJCTwvZGl2PgoJPC9kaXY+Cgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIj4KPC9mb3JtPgo8L2Rpdj48L2xpLS0+DQoNCjwhLS1saSBpZD0iZWdvc2hhcmUiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy5lZ29zaGFyZS5jb20vIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1KQVA4QUFLcXFxb2lJaU4zZDNVUkVSSGQzZC8vLy81bVptUUFBQVAvLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBQUFrQUxBQUFBQUFRQUJBQUFBUlhNTW1KQ3BvWVYzTE11Vm15ZGNOZ2VLQlljRVZibklCSFhFZnAzZ2ZSQ2dnU2xBTlhiamREZkh6QllVRlE1Q0Y3bkVPdXgrd2RmNzFzRmVIRUlxSlRidkU2eUZLYlBTKzRXUlE5emRzTVZCb09VY3oydkQwQ0FEcz0iPjwvYT4KPGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LmVnb3NoYXJlLmNvbS8iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgdGFyZ2V0PSJfYmxhbmsiPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9InRydWUiIG5hbWU9InVwbG9hZCI+Cgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4KCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0idXBmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9lZ29zaGFyZV9jb20nKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5fZWdvc2hhcmVfY29tJykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX2Vnb3NoYXJlX2NvbScsIHRoaXMpIj4KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fZWdvc2hhcmVfY29tIiBjbGFzcz0iYnRuIj5FZ29zaGFyZS5jb208L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiPgo8L2Zvcm0+CjwvZGl2PjwvbGktLT4NCg0KPGxpIGlkPSJzZW5kc3BhY2UiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy5zZW5kc3BhY2UuY29tLyIgcmVsPSJub2ZvbGxvdyI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQUxNQUFBRUJSTWZiOElxUm53TW5oZVB0OXlsZHI4ck4xV3B5Z3haSW9lTGs2cXF2dXVUbTdKSzI0T3JzOFFBQUFBQUFBQ0g1QkFBQUFBQUFMQUFBQUFBUUFCQUFBQVFtc01sSnE3MDQ2ODI3LzBqUkFVUEFaSXRBTW9SNUpjS3h0dWRseEtTYkdZb1Fmc0NnSlFJQU93PT0iPjwvYT4NCjxmb3JtIGFjdGlvbj0iaHR0cDovL2ZzMDJ1LnNlbmRzcGFjZS5jb20vcHJvY2Vzc3VwbG9hZC5odG1sIiBuYW1lPSJ1cGxvYWQiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgdGFyZ2V0PSJfYmxhbmsiPg0KCTxpbnB1dCBuYW1lPSJNQVhfRklMRV9TSVpFIiB2YWx1ZT0iMzE0NTcyODAwIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJVUExPQURfSURFTlRJRklFUiIgdmFsdWU9IjIwODI3NzkxOTUuMTE3NjI4OTIxMy41NDVFMDUzOC4xNS4wIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJERVNUSU5BVElPTl9ESVIiIHZhbHVlPSIxMCIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0ianNfZW5hYmxlZCIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJmaWxlXzAiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX3NlbmRzcGFjZV9jb20nKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5fc2VuZHNwYWNlX2NvbScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9zZW5kc3BhY2VfY29tJywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX3NlbmRzcGFjZV9jb20iIGNsYXNzPSJidG4iPnNlbmRzcGFjZS5jb208L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPGxpIGlkPSJyYWRpa2FsIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9mb3RvLnJhZGlrYWwucnUvIiByZWw9Im5vZm9sbG93IiBsYW5nPSJydSI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQU1RZkFBNFVFemhtSUZsWldjckt5amMzTjB4cFBTb3FLam82T3FPam83Mit2a3hVU1Q0K1BnMDFTUmhnaFI5RldWZXdLSUNBZ0RsU1lOWFYxVWhNUlpXWWs0aUxqUnMxRFY1ZVhsR2pKbVZsWlJsa2kxcGFXMWl4S1JwbmpqTXpNLy8vL3lINUJBRUFBQjhBTEFBQUFBQVFBQkFBQUFWMjRDZCtWY1JjWXpvbVR0TnBLTEI0M21HSWJLZkRuNWRDbTQ5RHQ0c2RhSVFid0VYa0dTQUF3VUFFSUJaN0lnUkI4V0ZZWHlpSTZuUFltTS9qdEVyQmJrOCtnNk5nbE1Gdzd2Y0FHYUdxNCs4RlBUUWVCQXNmZm5nWUZEMThLWWdjRDRHTWZYYVFBUklpQjJOK0dBV1lhajBXQUFBcElRQTciPjwvYT4NCjxmb3JtIGFjdGlvbj0iaHR0cDovL2ZvdG8ucmFkaWthbC5ydS9hY3Rpb24uYXNweCIgbmFtZT0idXBsb2FkIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4NCgk8aW5wdXQgbmFtZT0idXBsb2FkIiB2YWx1ZT0ieWVzIiB0eXBlPSJoaWRkZW4iPg0KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPg0KCQk8aW5wdXQgbmFtZT0iRiIgY2xhc3M9ImZpbGUiIHNpemU9IjEiIHJlcXVpcmVkPSIiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fcmFkaWthbF9ydScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9yYWRpa2FsX3J1JykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX3JhZGlrYWxfcnUnLCB0aGlzKSIgdHlwZT0iZmlsZSI+DQoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fcmFkaWthbF9ydSIgY2xhc3M9ImJ0biI+0KDQsNC00LjQutCw0Lst0KTQvtGC0L48L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KCTxpbnB1dCBuYW1lPSJDUCIgdmFsdWU9InllcyIgY2hlY2tlZD0iY2hlY2tlZCIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0iVk0iIHZhbHVlPSIyMDAiIHR5cGU9ImhpZGRlbiI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9ImxldGl0Yml0Ij48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9sZXRpdGJpdC5uZXQvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1BQUFFQlJNZmI4SXFSbndNbmhlUHQ5eWxkcjhyTjFXcHlneFpJb2VMazZxcXZ1dVRtN0pLMjRPcnM4UUFBQUFBQUFDSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBUW1zTWxKcTcwNDY4MjcvMGpSQVVQQVpJdEFNb1I1SmNLeHR1ZGx4S1NiR1lvUWZzQ2dKUUlBT3c9PSI+PC9hPg0KPGZvcm0gbmFtZT0iRjEiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGFjdGlvbj0iaHR0cDovL3IyLmxldGl0Yml0Lm5ldC9jZ2ktYmluL2hvbWVyL3VwbG9hZC5jZ2k/dXBsb2FkX2lkPSIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJjaGVja2JveCIgdmFsdWU9ImNoZWNrYm94IiB0eXBlPSJjaGVja2JveCI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJhY2NlcHQiIHZhbHVlPSIwIiBjaGVja2VkPSJjaGVja2VkIiB0eXBlPSJjaGVja2JveCI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJteWZpbGUiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX2xldGl0Yml0X25ldCcpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9sZXRpdGJpdF9uZXQnKSIgb25jaGFuZ2U9InNldFJlYWR5KCdidG5fbGV0aXRiaXRfbmV0JywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2xldGl0Yml0X25ldCIgY2xhc3M9ImJ0biI+bGV0aXRiaXQubmV0PC9hPg0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0Ij4NCgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InNlbGZfZGVzYyIgdmFsdWU9InVwbG9hZGVyLXBhbmVsLmNvbSIgdHlwZT0idGV4dCI+DQoJPGlucHV0IG5hbWU9Ik1BWF9GSUxFX1NJWkUiIHZhbHVlPSIxMjAwMDAwMDAwIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJ1aWQiIHZhbHVlPSIxMjMiIHR5cGU9ImhpZGRlbiI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9ImlwaWN0dXJlIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9pcGljdHVyZS5ydS8iIHJlbD0ibm9mb2xsb3ciPjxpbWcgYWx0PSIiIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFNUUFBUC8vLzRDQWdNM055elF5THhVU0Roc1lGS1drbzVtWWwzVnpjYkt4c0JrV0VrQkFRQ0lmRy96TzN1NFdZZ0FBQUx5OHVzVER3cXFwcUxHd3NPYm01bmw0ZHZWNnBiQ3ZyWStPakhOeGIycG9abHBYVk1uSng5emMzQjRiRjM1OGVpSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBVjQ0QktNWkZtS0FOQllEY0FaaHNTbHdKaGFqZ1ZrWHFFb21wUk54UUlnQ2hmQlJoR3BCV2cwaEVJQWlCQU96aFJra0RCT1hRUk1GcEFnR0x6VU1uWllQaU04aU0rQTBSbTNqWXo4WUNKOGtzMUdCUkFVVUd5QVVsU0ZmaE9IWHc4MGhtNEZpWkIrQ1FWbkZSNVVqNDlEVUtDUUlpYWtJd3NoQURzPSI+PC9hPg0KPGZvcm0gYWN0aW9uPSJodHRwOi8vaXBpY3R1cmUucnUvVXBsb2FkLyIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJ1cGxvYWQiIHRhcmdldD0iX2JsYW5rIj4NCgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9Im9wdGltaXplIiB0eXBlPSJjaGVja2JveCI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJ0aHVtYl9yZXNpemVfb24iIGNoZWNrZWQ9ImNoZWNrZWQiIHR5cGU9ImNoZWNrYm94Ij4NCgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InRodW1iX3Jlc2l6ZSIgc2l6ZT0iOCIgdmFsdWU9IjIwMCIgdHlwZT0idGV4dCI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJzdHJpbmdfc21hbGxfb24iIHR5cGU9ImNoZWNrYm94Ij4JDQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJtZXRob2QiIHZhbHVlPSJmaWxlIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0idXBsb2FkdHlwZSIgdmFsdWU9IjEiIHR5cGU9InJhZGlvIj4NCgk8bGFiZWwgY2xhc3M9Im4iPtCd0LDQtNC/0LjRgdGMINC90LAg0L/RgNC10LLRjNGOIDxpbnB1dCBjbGFzcz0ibiIgc2l6ZT0iMTMiIG5hbWU9InN0cmluZ19zbWFsbCIgdmFsdWU9IiIgdHlwZT0idGV4dCI+PC9sYWJlbD4NCgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4NCgkJPGlucHV0IG5hbWU9InVzZXJmaWxlIiBzaXplPSIxIiBjbGFzcz0iZmlsZSIgcmVxdWlyZWQ9IiIgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9pcGljdHVyZV9ydScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9pcGljdHVyZV9ydScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9pcGljdHVyZV9ydScsIHRoaXMpIiB0eXBlPSJmaWxlIj4NCgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9pcGljdHVyZV9ydSIgY2xhc3M9ImJ0biI+aVBpY3R1cmUucnU8L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPGxpIGlkPSJ6c2hhcmUiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3pzaGFyZS5uZXQvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1BQUFFQlJNZmI4SXFSbndNbmhlUHQ5eWxkcjhyTjFXcHlneFpJb2VMazZxcXZ1dVRtN0pLMjRPcnM4UUFBQUFBQUFDSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBUW1zTWxKcTcwNDY4MjcvMGpSQVVQQVpJdEFNb1I1SmNLeHR1ZGx4S1NiR1lvUWZzQ2dKUUlBT3c9PSI+PC9hPg0KPGZvcm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSJodHRwOi8vNjkuODAuMjU1LjEzMC91cGxvYWQucGhwIiBtZXRob2Q9InBvc3QiIG5hbWU9InVwbG9hZCIgdGFyZ2V0PSJfYmxhbmsiPg0KCTxpbnB1dCB2YWx1ZT0iMSIgbmFtZT0iVE9TIiBjaGVja2VkPSJjaGVja2VkIiBjbGFzcz0ibiIgdHlwZT0iY2hlY2tib3giPg0KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPg0KCQk8aW5wdXQgbmFtZT0iZmlsZSIgc2l6ZT0iMSIgY2xhc3M9ImZpbGUiIHJlcXVpcmVkPSIiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fenNoYXJlJykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX3pzaGFyZScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl96c2hhcmUnLCB0aGlzKSIgdHlwZT0iZmlsZSI+DQoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fenNoYXJlIiBjbGFzcz0iYnRuIj56c2hhcmUubmV0PC9hPg0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0Ij4NCjwvZm9ybT4NCg0KPCEtLTxsaSBpZD0iZnJlZXNoYXJlIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9mcmVlc2hhcmUudXMvIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+ZnJlZXNoYXJlLnVzPC9hPgo8Zm9ybSBuYW1lPSJ1cGxvYWQiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGFjdGlvbj0iaHR0cDovL2ZyZWVzaGFyZS51cy91cGxvYWQxLnBocCIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+Cgk8aW5wdXQgY2xhc3M9Im4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9InVwbG9hZCIgbmFtZT0iYWN0aW9uIj4KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0idXBsb2FkIiB0eXBlPSJyYWRpbyIgdmFsdWU9ImZpbGUiIGNoZWNrZWQ+Cgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InVwbG9hZCIgdHlwZT0icmFkaW8iIHZhbHVlPSJ1cmwiPgoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+CgkJPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9ImZpbGVuYW1lIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9mcmVlc2hhcmVfdXMnKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5fZnJlZXNoYXJlX3VzJykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX2ZyZWVzaGFyZV91cycsIHRoaXMpIj4KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fZnJlZXNoYXJlX3VzIiBjbGFzcz0iYnRuIj5mcmVlc2hhcmUudXM8L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0icHVibGljIiB0eXBlPSJyYWRpbyIgdmFsdWU9IjEiIGNoZWNrZWQ+Cgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InB1YmxpYyIgdHlwZT0icmFkaW8iIHZhbHVlPSIwIj4KCQo8L2Zvcm0+CjwvZGl2PjwvbGk+LS0+DQoNCjwvZGl2PjwvbGk+PC91bD4NCg0KPHAgaWQ9InZlcnNpb24iPg0KCTxhIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vIj4NCgkJPHNwYW4+U3VwZXIgVXBsb2FkZXIgMC4yNiAoMTIuMDYuMjAwOCk8L3NwYW4+DQoJPC9hPg0KPC9wPg0KDQo8ZGl2IGNsYXNzPSJyb2JvdHMtbm9jb250ZW50Ij4NCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoJZnVuY3Rpb24gc2hvd0Zvcm0ob2JqKSB7DQoJCWlmKCFvYmopIHJldHVybjsNCgkJb2JqLmNsYXNzTmFtZT0ndmlzaWJsZSc7DQoJCWlmKCFvYmouZm9ybSkgcmV0dXJuOw0KCQlvYmouZm9ybS5jbGFzc05hbWU9J3Zpc2libGUnfQ0KIA0KICBmdW5jdGlvbiBvbk92ZXJCdG4oYnRuKQ0KICB7DQogICAgaWYoYnRuKSANCiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NvbG9yOiAjZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjNmE5YmNkOycsIGZhbHNlKQ0KICAgICAgfQ0KICANCiAgZnVuY3Rpb24gb25PdXRCdG4oYnRuKQ0KICB7DQogICAgaWYoYnRuKQ0KICAgICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnLCBmYWxzZSl9DQogIA0KICBmdW5jdGlvbiBvbk92ZXJGaWxlKGlkKQ0KICB7DQogICAgdmFyIGJ0biA9IGdldEJ0bihpZCk7DQogICAgb25PdmVyQnRuKGJ0bil9DQogIA0KICBmdW5jdGlvbiBvbk91dEZpbGUoaWQpDQogIHsNCg0KICAgIHZhciBidG4gPSBnZXRCdG4oaWQpOw0KICAgIG9uT3V0QnRuKGJ0bil9DQogIA0KICBmdW5jdGlvbiBzZXRSZWFkeShpZCwgZmlsZU9iaikNCiAgew0KICAgIHZhciBidG4gPSBnZXRCdG4oaWQpOw0KICAgIGlmKGJ0bikNCiAgICAgIGJ0bi5jbGFzc05hbWUgPSAnYnRucmVhZHknOw0KICAgICAgDQogICAgaWYoZmlsZU9iaikNCiAgICAgIGZpbGVPYmouZm9ybS5zdWJtaXQoKX0NCiAgDQogIGZ1bmN0aW9uIHNldFJlYWR5MihpZCwgZmlsZU9iaikNCiAgew0KICAgIHZhciBidG4gPSBnZXRCdG4oaWQpOw0KICAgIGlmKGJ0bikNCiAgICAgIGJ0bi5jbGFzc05hbWUgPSAnYnRucmVhZHknOw0KICAgICAgDQogICAgdmFyIGZvcm0gPSBmaWxlT2JqLmZvcm07DQogICAgaWYoZm9ybSkgIA0KICAgIHsNCiAgICAgIGZvcih2YXIgaSA9IGZvcm0uZWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pDQogICAgICB7DQogICAgICAgIGlmKGZvcm0uZWxlbWVudHNbaV0udGFnTmFtZSA9PSAnSU5QVVQnICYmIGZvcm0uZWxlbWVudHNbaV0udHlwZSA9PSAnc3VibWl0JykNCiAgICAgICAgew0KICAgICAgICAgIGZvcm0uZWxlbWVudHNbaV0uY2xpY2soKTsNCiAgICAgICAgICBicmVha30NCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBnZXRCdG4oaWQpDQogIHsNCiAgICBpZighaWQpDQogICAgICByZXR1cm47DQogICAgICANCiAgICB2YXIgb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KICAgIGlmKG9iaiAmJiBvYmoudGFnTmFtZSA9PSAnQScpDQogICAgew0KICAgICAgcmV0dXJuIG9ian0NCiAgICANCiAgICByZXR1cm4gbnVsbH0JDQoJPC9zY3JpcHQ+DQoNCjwvZGl2Pg0KPC9ib2R5PjwvaHRtbD4=");

2) GISMETEO.RU: Погода
Картинка:

Код:

openWebPanel("Заголовок панели", "data:text/html;base64,PGh0bWw+PGhlYWQ+DQoNCjx0aXRsZT5HSVNNRVRFTy5SVTogz+7j7uTgPC90aXRsZT4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MSI+DQo8c3R5bGU+DQpib2R5LHRhYmxlLHRke2ZvbnQtZmFtaWx5OkFyaWFsLFNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxM3B4O30NCi5iaWd7Zm9udC1mYW1pbHk6IEFyaWFsLFNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTdweDsgZm9udC13ZWlnaHQ6IGJvbGQ7fQ0KPC9zdHlsZT4NCjwvaGVhZD48Ym9keSBsaW5raWZ5dGltZT0iMTUiIGxpbmtpZmllZD0iMCIgbGlua2lmeWluZz0iZmFsc2UiIHRvcG1hcmdpbj0iMCIgbGVmdG1hcmdpbj0iMCIgdGV4dD0iIzAwMDAwMCIgdmxpbms9IiMwMDAwODAiIGFsaW5rPSIjZmYwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIiBsaW5rPSIjMDAwMDgwIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIj4NCg0KPHRhYmxlIHdpZHRoPSIyMjUiIGJvcmRlcj0iMCI+DQogIDx0Ym9keT48dHI+DQogICAgPHRkIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjMzM5OWZmIj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4NCiAgICAgIDx0Ym9keT48dHI+DQogICAgICAgIDx0ZCB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+DQo8YSBocmVmPSJodHRwOi8vd3d3Lmdpc21ldGVvLnJ1Ij48Yj53d3cuZ2lzbWV0ZW8ucnU8L2I+PC9hPiAgICAgICAgDQogICAgICA8L3RyPg0KICAgIDwvdGJvZHk+PC90YWJsZT4NCiAgICA8L3RkPg0KICA8L3RyPg0KICAgICAgICA8L3Rib2R5PjwvdGFibGU+DQogICAgICAgIDwvdGQ+DQogICAgICA8L3RyPg0KICAgIDwvdGJvZHk+PC90YWJsZT4NCiAgICA8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjMzM5OWZmIj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4NCiAgICAgIDx0Ym9keT48dHI+DQogICAgICAgIDx0ZCB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI2ZmZmZmZiI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMSI+DQogICAgICAgICAgPHRib2R5Pjx0cj4NCiAgICAgICAgICAgIDx0ZCBjbGFzcz0iYmlnIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI2JiZTBmZiI+PGNlbnRlcj7P7uPu5OAg7+4g4+7w7uTg7DwvY2VudGVyPjwvdGQ+DQogICAgICAgICAgPC90cj4NCiAgICAgICAgICA8dHI+DQogICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNlMGUwZTAiPjxiPtDu8fHo/zwvYj48L3RkPg0KICAgICAgICAgIDwvdHI+DQogICAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAlIj4NCiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjQiPg0KICAgICAgICAgICAgIDx0Ym9keT48dHI+DQogICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCIgbm93cmFwPSJub3dyYXAiPiANCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI3NjEyLmh0bSIgdGFyZ2V0PSJfc2VsZiI+PGI+zO7x6uLgPC9iPjwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNjA2My5odG0iIHRhcmdldD0iX3NlbGYiPjxiPtEuLc/l8uXw4fPw4zwvYj48L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjk4NjUuaHRtIiB0YXJnZXQ9Il9zZWxmIj7A4eDq4O08L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjI1NTAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7A8PXg7ePl6/zx6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zNDg4MC5odG0iIHRhcmdldD0iX3NlbGYiPsDx8vDg9eDt/DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yOTgzOC5odG0iIHRhcmdldD0iX3NlbGYiPsHg8O3g8+s8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzQyMTQuaHRtIiB0YXJnZXQ9Il9zZWxmIj7B5evj7vDu5DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zMTUxMC5odG0iIHRhcmdldD0iX3NlbGYiPsHr4OPu4uX55e3x6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNjg5OC5odG0iIHRhcmdldD0iX3NlbGYiPsHw/+3x6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zMTk2MC5odG0iIHRhcmdldD0iX3NlbGYiPsLr4OTo4u7x8u7qPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM3MjI4Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+wuvg5Ojq4OLq4Oc8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc1MzIuaHRtIiB0YXJnZXQ9Il9zZWxmIj7C6+Dk6Ozo8DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zNDU2MC5odG0iIHRhcmdldD0iX3NlbGYiPsLu6+Pu4/Dg5DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNzAzNy5odG0iIHRhcmdldD0iX3NlbGYiPsLu6+7j5OA8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzQxMjIuaHRtIiB0YXJnZXQ9Il9zZWxmIj7C7vDu7eXmPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM2MDUyLmh0bSIgdGFyZ2V0PSJfc2VsZiI+w+7w7e4twOvy4Onx6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zNzIzNS5odG0iIHRhcmdldD0iX3NlbGYiPsPw7uft++k8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzc0NzAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7E5fDh5e3yPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI4NDQwLmh0bSIgdGFyZ2V0PSJfc2VsZiI+xerg8uXw6O3h8/DjPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI3MzQ3Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+yOLg7e7i7jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yODQxMS5odG0iIHRhcmdldD0iX3NlbGYiPsjm5eLx6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS85OTk5MC5odG0iIHRhcmdldD0iX3NlbGYiPsnu+Org8C3O6+A8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzA3MTAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7I8Orz8vHqPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI3NTk1Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+yuDn4O38PC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI2NzAyLmh0bSIgdGFyZ2V0PSJfc2VsZiI+yuDr6O3o7ePw4OQ8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc3MDMuaHRtIiB0YXJnZXQ9Il9zZWxmIj7K4Ovz4+A8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzcxMTYuaHRtIiB0YXJnZXQ9Il9zZWxmIj7K4PDg9+Dl4vHqPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI5NjQyLmh0bSIgdGFyZ2V0PSJfc2VsZiI+yuXs5fDu4u48L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjcxOTYuaHRtIiB0YXJnZXQ9Il9zZWxmIj7K6PDu4jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNzMzMy5odG0iIHRhcmdldD0iX3NlbGYiPsru8fLw7uzgPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM0OTI5Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+yvDg8e3u5ODwPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI5NTc0Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+yvDg8e3u//Dx6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yODExNi5odG0iIHRhcmdldD0iX3NlbGYiPsrz5Pvs6uDwPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI4NjYxLmh0bSIgdGFyZ2V0PSJfc2VsZiI+yvPw4+DtPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM0MDA5Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+yvPw8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzYwOTYuaHRtIiB0YXJnZXQ9Il9zZWxmIj7K++f76zwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNzkzMC5odG0iIHRhcmdldD0iX3NlbGYiPsvo7+X26jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNTkxMy5odG0iIHRhcmdldD0iX3NlbGYiPszg4+Dk4O08L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzcwMjEuaHRtIiB0YXJnZXQ9Il9zZWxmIj7M4Onq7u88L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzc0NzIuaHRtIiB0YXJnZXQ9Il9zZWxmIj7M4PXg9+rg6+A8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzcwNTQuaHRtIiB0YXJnZXQ9Il9zZWxmIj7M6O0uwu7k+zwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yMjExMy5odG0iIHRhcmdldD0iX3NlbGYiPszz8Ozg7fHqPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM3MjEyLmh0bSIgdGFyZ2V0PSJfc2VsZiI+zeDr/Pfo6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yODUwNi5odG0iIHRhcmdldD0iX3NlbGYiPs3g4eXwLtfl6+37PC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1Lzk5OTQ2Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+zeDn8ODt/DwvYT4NCiAgICAgICAgICAgICAgPC90ZD48dGQgd2lkdGg9IjMiPiZuYnNwOw0KICAgICAgICAgICAgICA8L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCIgbm93cmFwPSJub3dyYXAiPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjM4NDguaHRtIiB0YXJnZXQ9Il9zZWxmIj7N5fTy5f7j4O3x6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yMzQ3MS5odG0iIHRhcmdldD0iX3NlbGYiPs3o5u3l4uDw8u7i8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc1NTMuaHRtIiB0YXJnZXQ9Il9zZWxmIj7NLs3u4uPu8O7kPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI2MTc5Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+ze7i4+7w7uQ8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzcwMDYuaHRtIiB0YXJnZXQ9Il9zZWxmIj7N7uLu8O7x8ejp8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjk2MzQuaHRtIiB0YXJnZXQ9Il9zZWxmIj7N7uLu8ejh6PDx6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yMzA3OC5odG0iIHRhcmdldD0iX3NlbGYiPs3u8Ojr/PHqPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI4Njk4Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+zuzx6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNzkwNi5odG0iIHRhcmdldD0iX3NlbGYiPs7w5es8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzUxMjEuaHRtIiB0YXJnZXQ9Il9zZWxmIj7O8OXt4fPw4zwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNzk2Mi5odG0iIHRhcmdldD0iX3NlbGYiPs/l7efgPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI4MjI1Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+z+Xw7Pw8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjI4MjAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7P5fLw7ufg4u7k8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzI1NDAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7P5fLw7u8uLcrg7PcuPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI2MjU4Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+z/Hq7uI8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzcwNTAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7P//Lo4+7w8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzQ3MzEuaHRtIiB0YXJnZXQ9Il9zZWxmIj7Q7vHy7uIt7eAtxC48L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc3MzEuaHRtIiB0YXJnZXQ9Il9zZWxmIj7Q/+fg7fw8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjg5MDAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7R4Ozg8OA8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc3NjAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7R4PDg7fHqPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM0MTcyLmh0bSIgdGFyZ2V0PSJfc2VsZiI+0eDw4PLu4jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNjc4MS5odG0iIHRhcmdldD0iX3NlbGYiPtHs7uvl7fHqPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM3MDk5Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+0e736DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zNDk0OS5odG0iIHRhcmdldD0iX3NlbGYiPtHy4OLw7u/u6/w8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjM4NDkuaHRtIiB0YXJnZXQ9Il9zZWxmIj7R8/Dj8/I8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjM4MDQuaHRtIiB0YXJnZXQ9Il9zZWxmIj7R++ry++Lq4PA8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc5NDcuaHRtIiB0YXJnZXQ9Il9zZWxmIj7S4Ozh7uI8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc0MDIuaHRtIiB0YXJnZXQ9Il9zZWxmIj7S4uXw/DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNzg5MC5odG0iIHRhcmdldD0iX3NlbGYiPtLu6/z/8vLoPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI5NDMwLmh0bSIgdGFyZ2V0PSJfc2VsZiI+0u7s8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc3MTkuaHRtIiB0YXJnZXQ9Il9zZWxmIj7S8+vgPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI4MzY3Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+0v7s5e38PC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzMwODIzLmh0bSIgdGFyZ2V0PSJfc2VsZiI+0+vg7S3T5P08L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjc3ODYuaHRtIiB0YXJnZXQ9Il9zZWxmIj7T6/z/7e7i8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjg3MjIuaHRtIiB0YXJnZXQ9Il9zZWxmIj7T9OA8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzE3MzUuaHRtIiB0YXJnZXQ9Il9zZWxmIj7V4OHg8O7i8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjM5MzMuaHRtIiB0YXJnZXQ9Il9zZWxmIj7V4O3y+y3M4O3xLjwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNzU4MS5odG0iIHRhcmdldD0iX3NlbGYiPtfl4e7q8eDw+zwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yODY0Mi5odG0iIHRhcmdldD0iX3NlbGYiPtfl6//h6O3x6jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zMDc1OC5odG0iIHRhcmdldD0iX3NlbGYiPtfo8uA8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzQ4NjEuaHRtIiB0YXJnZXQ9Il9zZWxmIj7d6+jx8uA8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzIxNTAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7eLi3R4PXg6+jt8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjQ5NTkuaHRtIiB0YXJnZXQ9Il9zZWxmIj7f6vPy8eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjczMzEuaHRtIiB0YXJnZXQ9Il9zZWxmIj7f8O7x6+Di6/w8L2E+DQogICAgICAgICAgICAgIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+DQogICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgPC90cj4NCiAgICAgICAgICA8dHI+DQogICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNlMGUwZTAiPjxiPtHNwyDoIMHg6/Lo/yA8L2I+PC90ZD4NCiAgICAgICAgICA8L3RyPg0KICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTAwJSI+DQogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSI0Ij4NCiAgICAgICAgICAgICA8dGJvZHk+PHRyPg0KICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMDAiIG5vd3JhcD0ibm93cmFwIj4gDQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zNjg3MC5odG0iIHRhcmdldD0iX3NlbGYiPsDr7OAtwPLgPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM1MTg4Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+wPHy4O3gPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM4ODgwLmh0bSIgdGFyZ2V0PSJfc2VsZiI+wPj14OHg5DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zNzg1MC5odG0iIHRhcmdldD0iX3NlbGYiPsHg6vM8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzgzNTMuaHRtIiB0YXJnZXQ9Il9zZWxmIj7B6Pjq5eo8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMjY3MzAuaHRtIiB0YXJnZXQ9Il9zZWxmIj7C6Ov87f7xPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM4ODM2Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+xPP44O3h5TwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8zNzc4OS5odG0iIHRhcmdldD0iX3NlbGYiPsXw5eLg7TwvYT4NCiAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjMiPiZuYnNwOzwvdGQ+DQogICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCIgbm93cmFwPSJub3dyYXAiPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzMzNDUuaHRtIiB0YXJnZXQ9Il9zZWxmIj7K6OXiPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzMzODE1Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+yuj46O3l4jwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNjg1MC5odG0iIHRhcmdldD0iX3NlbGYiPszo7fHqPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzI2NDIyLmh0bSIgdGFyZ2V0PSJfc2VsZiI+0Ojj4DwvYT48YnI+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS8yNjAzOC5odG0iIHRhcmdldD0iX3NlbGYiPtLg6+vo7e08L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvMzg0NTcuaHRtIiB0YXJnZXQ9Il9zZWxmIj7S4Pjq5e3yPC9hPjxicj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcGRhLmdpc21ldGVvLnJ1LzM3NTQ5Lmh0bSIgdGFyZ2V0PSJfc2VsZiI+0uHo6+jx6DwvYT48YnI+DQogICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgIDwvdGJvZHk+PC90YWJsZT4NCiAgICAgICAgICA8L3RkPg0KICAgICAgICAgIDwvdHI+DQoNCg0KICAgICAgPHRib2R5Pjx0cj4NCiAgICAgICAgPHRkIHdpZHRoPSIxMDAlIj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIxIj4NCiAgICAgICAgICA8dGJvZHk+PHRyPg0KICAgICAgICAgICAgPHRkIGNsYXNzPSJiaWciIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjYmJlMGZmIj48Y2VudGVyPsjt9O7w7OD26P88L2NlbnRlcj48L3RkPg0KICAgICAgICAgIDwvdHI+DQogICAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAlIj4NCiAgICAgICAgICAgIC0gPGEgaHJlZj0iaHR0cDovL3BkYS5naXNtZXRlby5ydS9hYm91dC5odG0iIHRhcmdldD0iX3NlbGYiPs4g7/Du5ery5TwvYT48YnI+DQogICAgICAgICAgICAtIDxhIGhyZWY9Imh0dHA6Ly9wZGEuZ2lzbWV0ZW8ucnUvIiB0YXJnZXQ9Il9zZWxmIj5wZGEuZ2lzbWV0ZW8ucnU8L2E+PGJyPg0KICAgICAgICAgICAgLSA8YSBocmVmPSJodHRwOi8vd2FwLmdpc21ldGVvLnJ1LyIgdGFyZ2V0PSJfc2VsZiI+d2FwLmdpc21ldGVvLnJ1PC9hPg0KICAgICAgICAgICA8L3RkPg0KICAgICAgICAgIDwvdHI+DQogICAgICAgIDwvdGJvZHk+PC90YWJsZT4NCiAgICAgICAgPC90ZD4NCiAgICAgIDwvdHI+DQogICAgPC90Ym9keT48L3RhYmxlPg0KICAgIDwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiMzMzk5ZmYiPjx0YWJsZSB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI2ZmZmZmZiIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPg0KPC90YWJsZT4NCiAgICA8L3RkPg0KICA8L3RyPg0KICA8dHI+DQoNCiAgICAgIDwvdHI+DQogICAgPC90Ym9keT48L3RhYmxlPg0KICAgIDwvdGQ+DQogIDwvdHI+DQo8L3Rib2R5PjwvdGFibGU+DQo8L2JvZHk+PC9odG1sPg==");

3Jlou написал:

3) Как должен выглядеть код, чтобы открытая панель закрывалась при повторном нажатии кнопку (сейчас так и происходит), но не закрывалась при нажатии на другую кнопу, а открывала в панели содержимое, вызываемое нажатием другой кнопки (как в All-in-one sidebar)?

Код:

        case 0: if (document.getElementById('sidebar-box').getAttribute('sidebarcommand')) // close sidebar
                toggleSidebar();
            else  // open in sidebar
                openWebPanel(this.tooltipText, this.url2xul);
            break;

заменить на

Код:

                openWebPanel(this.tooltipText, this.url2xul); // open in sidebar
            break;

3Jlou написал:

пример 2-х кнопок, сделанных конвертированием html-файла в base64-ссылку, почему то они нормально открываются только со 2-го нажатия :(

Секция «код»:

Код:

openWebPanel("SuperUploader", "data:text/html;base64,PCFET0NUWVBFIEhUTUwgU1lTVEVNICJodHRwOi8vdGFnc291cC5jb20vZHRkLyI+CjxodG1sIGxhbmc9ImVuIj48aGVhZD4NCgoKCTx0aXRsZT5TdXBlciBVcGxvYWRlcjwvdGl0bGU+DQoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KCTxtZXRhIG5hbWU9IkRlc2NyaXB0aW9uIiBjb250ZW50PSJTdXBlciBVcGxvYWRlciBpcyBhIHBhbmVsIHRvIHF1aWNrbHkgdXBsb2FkIGZpbGVzIHRvIGltYWdlc2hhc2sudXMsIHJhcGlkc2hhcmUuY29tIGFuZCBzb21lIG90aGVyIGZpbGUtc2hhcmluZyBzZXJ2aWNlcy4iPg0KCTxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iaHR0cDovL3VwbG9hZGVyLXBhbmVsLmNvbS9pL3VwMy5naWYiPg0KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJKiB7bWFyZ2luOjA7IHBhZGRpbmc6MH0NCglodG1sIHtiYWNrZ3JvdW5kOiNFQUVDRjE7IGNvbG9yOiMzMzM7fQ0KCWJvZHkge2ZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIC43NWVtLzEuOGVtIEFyaWFsLFRhaG9tYSxzYW5zLXNlcmlmO30NCglpbWcge2JvcmRlcjowfQ0KCXVsIHttYXJnaW4tbGVmdDo0cHg7fQ0KCWxpIHtsaXN0LXN0eWxlLXR5cGU6bm9uZX0NCgloMSB7Zm9udC1zaXplOjEuNWVtfQ0KCWEgc3BhbiB7ZGlzcGxheTpibG9jazsgd2lkdGg6MTUwcHg7IG1hcmdpbjowIGF1dG87IHBhZGRpbmc6LjRlbSAwIC40ZW0gNHB4OyBmb250LXdlaWdodDo1MDB9DQoJI3ZlcnNpb24gc3BhbiB7cGFkZGluZy1sZWZ0OjhweH0NCglkaXYge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjE2MnB4OyBtYXJnaW46MCBhdXRvfQ0KCS5uIHtkaXNwbGF5Om5vbmV9DQoJOnRhcmdldCB7YmFja2dyb3VuZDojOGJjYzZhO30NCglkaXYuZmlsZWlucHV0cyB7cG9zaXRpb246cmVsYXRpdmU7IHdpZHRoOiAxNDRweDsgaGVpZ2h0OiAyNHB4OyBvdmVyZmxvdzogaGlkZGVuOyBtYXJnaW4tbGVmdDowfQ0KCWRpdi5mYWtlZmlsZSB7cG9zaXRpb246YWJzb2x1dGU7IHRvcDowcHg7IGxlZnQ6MHB4OyB6LWluZGV4OjF9DQoJZGl2LmZha2VmaWxlIGEge3BhZGRpbmc6IDAgNHB4OyB9DQoJaW5wdXQuZmlsZSB7cG9zaXRpb246YWJzb2x1dGU7IHJpZ2h0OjA7IGRpc3BsYXk6YmxvY2s7IHdpZHRoOjMwMHB4OyBmb250LXNpemU6M2VtICFpbXBvcnRhbnQ7IGhlaWdodDozMHB4OyB0ZXh0LWFsaWduOiByaWdodDsgb3BhY2l0eTogMDsgLW1vei1vcGFjaXR5OjA7IGZpbHRlcjphbHBoYShvcGFjaXR5OiAwKTsvKiovei1pbmRleDogMn0NCg0KCS5qcyAuc3VibWl0IHtkaXNwbGF5Om5vbmV9DQoNCgkvKiBMaW5rcyAqLwkNCglhIHtkaXNwbGF5OmJsb2NrOyBjb2xvcjojMDM2OyB0ZXh0LWRlY29yYXRpb246bm9uZTsgbWFyZ2luLXJpZ2h0OjFweH0NCgkuZmFrZWZpbGUgYSB7cGFkZGluZy1ib3R0b206LjFlbX0NCgkjdmVyc2lvbiBhIHtjb2xvcjojYTNiOGNjfQ0KCWE6aG92ZXIsIGgxOmhvdmVyIGEge2NvbG9yOiNmNGY1ZjggIWltcG9ydGFudH0NCglhOmhvdmVyLCBoMTpob3ZlciB7YmFja2dyb3VuZDojNmE5YmNjfQ0KCWEuYnRuLCBhLmJ0bnJlYWR5IHtmb250LXNpemU6IDlwdDsgY3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDE0MHB4OyBoZWlnaHQ6IDI0cHg7IG1hcmdpbjogMnB4IDAgMCAycHh9ICANCglhLmJ0bnJlYWR5IHtjb2xvcjogI2ZmZjsgYmFja2dyb3VuZDogIzhiY2Q2YX0NCglhIGltZyB7ZmxvYXQ6bGVmdDsgcGFkZGluZzo0cHggMCAwOyAvKnBvc2l0aW9uOnJlbGF0aXZlOyBsZWZ0Oi0xOHB4OyBwYWRkaW5nOjAgNHB4IDAgMDsgbWFyZ2luLWJvdHRvbTotMjBweCovfQ0KDQoJLyogQ3Vyc29yICovDQoJYSwgYnV0dG9uLCBsYWJlbCwgaW5wdXQge2N1cnNvcjpwb2ludGVyICFpbXBvcnRhbnR9DQoJDQoJLyogSW50ZXJuZXQgRXhwbG9yZXIgKi8NCgkqIGh0bWwgaW1nIHtkaXNwbGF5Om5vbmV9DQoJKjpmaXJzdC1jaGlsZCtodG1sIGltZyB7ZGlzcGxheTpub25lO30NCgkNCglAbWVkaWEgYWxsIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApIHsNCgkJaDEsIGEgey13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAuNHMgZWFzZS1vdXR9DQoJfQ0KCTwvc3R5bGU+DQoJPGxpbmsgcmVsPSJhbHRlcm5hdGUgZmVlZCIgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vY2hhbmdlbG9nLnhtbCIgdGl0bGU9IlVwbG9hZGVyIHBhbmVsOiBjaGFuZ2Vsb2ciPg0KCTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vIiB0aXRsZT0iVXBsb2FkZXIgcGFuZWwiPg0KCTxsaW5rIHJlbD0icHJldmlvdXMiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vdXAuaHRtbCIgdGl0bGU9IlVwbG9hZGVyIj4NCgk8bGluayByZWw9ImhlbHAiIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vZmFxLyIgdGl0bGU9IkZBUSI+DQoJPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJNaWtpdmFuY2gsIHByb2ZpVCDQuCDRh9GD0YLRjC3Rh9GD0YLRjCDQndC40LrQuNGC0LAg0JLQsNGB0LjQu9GM0LXQsiI+DQoJPGxpbmsgcmVsPSJhdXRob3IiIGhyZWY9Imh0dHA6Ly9lbHYxcy5ydS8iIHRpdGxlPSLQndC40LrQuNGC0LAg0JLQsNGB0LjQu9GM0LXQsiI+CQ0KPC9oZWFkPjxib2R5IGxpbmtpZnltYXg9IjAiIGxpbmtpZnljdXJyZW50PSIwIiBsaW5raWZ5aW5nPSJ0cnVlIiBjbGFzcz0ianMiPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KCWRvY3VtZW50LmJvZHkuY2xhc3NOYW1lKz0nIGpzJzsJDQo8L3NjcmlwdD4NCjxoMSBpZD0idG9wIj4NCgk8YSBocmVmPSIiIHRhcmdldD0iX2JsYW5rIj4NCgkJPHNwYW4+U3VwZXIgVXBsb2FkZXI8L3NwYW4+CQkNCgk8L2E+DQo8L2gxPg0KPHVsPg0KDQo8IS0tbGkgaWQ9ImZ1bmt5aW1nIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9mdW5reWltZy5jb20vIj48aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFMTUFBQUVCUk1mYjhJcVJud01uaGVQdDl5bGRyOHJOMVdweWd4WklvZUxrNnFxdnV1VG03SksyNE9yczhRQUFBQUFBQUNINUJBQUFBQUFBTEFBQUFBQVFBQkFBQUFRbXNNbEpxNzA0NjgyNy8walJBVVBBWkl0QU1vUjVKY0t4dHVkbHhLU2JHWW9RZnNDZ0pRSUFPdz09IiBhbHQ9IiI+PC9hPgo8Zm9ybSBhY3Rpb249Imh0dHA6Ly9mdW5reWltZy5jb20vdXAucGhwIiBuYW1lPSJ1cCIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiB0YXJnZXQ9Il9ibGFuayI+Cgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4KCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgcmVxdWlyZWQgY2xhc3M9ImZpbGUiIHNpemU9IjEiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fZnVua3lpbWdfY29tJykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX2Z1bmt5aW1nX2NvbScpIiBvbmNoYW5nZT0ic2V0UmVhZHkyKCdidG5fZnVua3lpbWdfY29tJywgdGhpcykiPgoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9mdW5reWltZ19jb20iIGNsYXNzPSJidG4iPkZ1bmt5aW1nLmNvbTwvYT4KCQk8L2Rpdj4KCTwvZGl2PgoJPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgbmFtZT0idXBsb2FkIiB2YWx1ZT0iVXBsb2FkIj4KCTxpbnB1dCBjbGFzcz0ibiIgdHlwZT0icmFkaW8iIG5hbWU9InVwdHlwZSIgdmFsdWU9ImZpbGUiIGNoZWNrZWQ+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNQVhfRklMRV9TSVpFIiB2YWx1ZT0iMzE0NTcyOCI+Cgk8aW5wdXQgY2xhc3M9Im4iIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJhZGRJbmZvIiBjaGVja2VkPgo8L2Zvcm0+CjwvZGl2PjwvbGktLT4NCg0KPGxpIGlkPSJiYXlpbWciPjxkaXY+PGEgaHJlZj0iaHR0cDovL2JheWltZy5jb20vIj48aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFOVS9BT2pzOWFxOTNmVHk3dGZtOUxURTI5dmo3clRINGRyYTJhUys0NXExM2JuUjdZcXAyV21MeWZMeThzVGI4NnpHNTM2ZDBuT1N5NFdqMUUxenZNdmg5dGJmN1ptdTFIK2F5K0hoNGNETjR1M3I2Y25iN3FmQjVlZm41dC9mMzU2NTRmRHU2Ky91N3M3aytNL2g4VGxpc3JmUDdOemY0OHZmOGNUWTdzclY1Ny9QNTQrczJZZWZ6V0dEd1c2T3lPam82TFBKNXMzVzZkYmQ1bnVYemNIWDhKYXgzYS9JNkorejA3L0szZUxxOHFuQTRwR3UyM21aME0vYzY3TEw2Ly8vL3lINUJBRUFBRDhBTEFBQUFBQVFBQkFBQUFhQ3dKOXdTQ3dhajBpaXdaQWM1bUFmU2FVNUtEMFNrRXR5UkNzaEZyeFpha29NblNnMDJ5ZWcydGdXQmFLbTRGRG9lZ09LN3dNSkZEc29QZ2taSWdvY0t4RVJSakljT3pjYkR6VVFEQk1aUlJvR0N4Y0VVUzRUSkJaR0poSXVCQXNNTFN3eFJ3STRCUTBXQVFBQ0FnZEhJQ0FlSVNFZEJ4Z05SdzBlSFJnSEwwMU5RUUE3IiBhbHQ9IiI+PC9hPgo8Zm9ybSBhY3Rpb249Imh0dHA6Ly9iYXlpbWcuY29tL3VwbG9hZCIgbmFtZT0idXBsb2FkIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPgoJCTxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9iYXlpbWdfY29tJykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX2JheWltZ19jb20nKSIgb25jaGFuZ2U9InNldFJlYWR5MignYnRuX2JheWltZ19jb20nLCB0aGlzKSI+CgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPgoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2JheWltZ19jb20iIGNsYXNzPSJidG4iPmJheWltZy5jb208L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiPgoJPGlucHV0IGNsYXNzPSJuIiB0eXBlPSJ0ZXh0IiBuYW1lPSJjb2RlIiB2YWx1ZT0idXBsb2FkZXIiPgoJPGlucHV0IGNsYXNzPSJuIiB0eXBlPSJ0ZXh0IiBuYW1lPSJ0YWdzIiB2YWx1ZT0idXBsb2FkZXIiPgkKCTxpbnB1dCBjbGFzcz0ibiIgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlc2l6ZSI+Cgk8aW5wdXQgY2xhc3M9Im4iIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvZmZlbnNpdmUiPgkKPC9mb3JtPgo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9ImltYWdlc2hhY2siPjxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy5pbWFnZXNoYWNrLnVzLyI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQU1RZkFLczlGbWx0VEtpV0s0WjJIc3UzSFJVWUhYWitkajVIUHE2QkZjM015cVpQR1VaalRPWEJFK3JvS3EzYzdkNmJGREU0TmxwWlY4UmhFOXUySnRPSkV1cThIRU0zSnFTbWwvelVGWkU0SUlna0d1U3FGUFRIR1pRckZHTlBKT3JzOFNINUJBRUFBQjhBTEFBQUFBQVFBQkFBQUFXZzRDY21seEVFeGhWNG5wRjhGeHNNUk5NUWczQmRnbmNkRzg0RVF5UUtBZzZIeVJPaFBDaEJEb2NBT1VDdWhVRUVzZGxVT01TSnBVQ0daQTBlNkpmSThFQVdpNE5GOElFb0pHb09BK0d4K0JFVk1CWVpBSGhlRXdJREhseUJNQWNlaEhnVEV3UUVGUnNUSWlJUmtCMkZEeE5nUXBvZkNSQVpIYWwzRkY4Y3BJS29xWjZHcng4Umc2a2FxWVcxdHBBYXdNQUF2YllXd2JyRHhCRVJHYzEzSVFBNyI+PC9hPg0KPGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LmltYWdlc2hhY2sudXMvaW5kZXgucGhwIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4NCgk8aW5wdXQgdmFsdWU9IjEwNDg1NzYiIG5hbWU9Ik1BWF9GSUxFX1NJWkUiIHR5cGU9ImhpZGRlbiI+DQoJPGlucHV0IHZhbHVlPSJibGFuayIgbmFtZT0idHlwZSIgdHlwZT0iaGlkZGVuIj4NCgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4NCgkJPGlucHV0IG5hbWU9ImZpbGV1cGxvYWQiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX2ltYWdlc2hhY2tfdXMnKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5faW1hZ2VzaGFja191cycpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9pbWFnZXNoYWNrX3VzJywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2ltYWdlc2hhY2tfdXMiIGNsYXNzPSJidG4iPkltYWdlc2hhY2sudXM8L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPGxpIGlkPSJpZm9sZGVyIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9lbHYxcy5pZm9sZGVyLnJ1LyI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQUxNQUFBRUJSTWZiOElxUm53TW5oZVB0OXlsZHI4ck4xV3B5Z3haSW9lTGs2cXF2dXVUbTdKSzI0T3JzOFFBQUFBQUFBQ0g1QkFBQUFBQUFMQUFBQUFBUUFCQUFBQVFtc01sSnE3MDQ2ODI3LzBqUkFVUEFaSXRBTW9SNUpjS3h0dWRseEtTYkdZb1Fmc0NnSlFJQU93PT0iPjwvYT4NCjxmb3JtIGFjdGlvbj0iaHR0cDovL3VwbC5zdGcyMy5pZm9sZGVyLnJ1Lz9zZXJpYWw9ZjNkZjhjOTdjMmRkZmVkNjQ5YWYzNmIzYzFjNmNlNjMiIG5hbWU9InRoZXVwbG9hZGZvcm0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgdGFyZ2V0PSJfYmxhbmsiPg0KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPg0KCQk8aW5wdXQgbmFtZT0iZmlsZW5hbWUiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX2lmb2xkZXJfcnUnKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5faWZvbGRlcl9ydScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9pZm9sZGVyX3J1JywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2lmb2xkZXJfcnUiIGNsYXNzPSJidG4iPmlGb2xkZXIucnU8L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBuYW1lPSJ1cGxvYWRfcGFyYW1zIiB2YWx1ZT0iYmYwYWYzNTdmOWY0NzFkODYwNDZmMGQzMjQ2ZTg0ZGExOTVlNzMyYzZiNjRjNTRjZDkyODExYmZmYTcxYzExN2QzMjY0ZjQ4N2EwNjRhYTJmNzRiOTgxMGM4MGZlZDc5N2RhNTY2Y2Q2MTczNzNhNiIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0iY2xvbmUiIHZhbHVlPSJlbHYxcy5pZm9sZGVyLnJ1IiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJwcm9ncmVzc19iYXIiIHZhbHVlPSJmM2RmOGM5N2MyZGRmZWQ2NDlhZjM2YjNjMWM2Y2U2MyIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0idXBsb2FkX2hvc3QiIHZhbHVlPSJzdGcyMy5pZm9sZGVyLnJ1IiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJNQVhfRklMRV9TSVpFIiB2YWx1ZT0iMTA0ODU3NjAwIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0ic2hvd19wcm9ncmVzc19iYXIiIHZhbHVlPSIwIiB0eXBlPSJjaGVja2JveCI+DQoJPGlucHV0IGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiIHR5cGU9InN1Ym1pdCI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9InNsaWwiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3NsaWwucnUvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTVFkQUJVVkZUUTBNek0wTkRRek5CVVdGWDkvZ0JVV0ZuK0FnSUNBZ0tlbnBzdkx6SCtBZjRDQWY4ekx5MzkvZnhZV0Zzdkx5eFVWRmxoWVdUUXpNNEIvZ0JZV0ZhZW1wNEIvZnhZVkZxZW5welEwTkZoWVdBQUFBUC8vL3dBQUFBQUFBQ0g1QkFFQUFCMEFMQUFBQUFBUUFCQUFBQVZoWUNlT1pHbWVwNktZRFZSbVNaYTk4MWpjMStHUXh6SnV3Q0R3dHhrTk5KM0FvS09aakRSSVVVUmtNSWdBSXdPMnhPR012SjJ1Q053QlBFWUVUS2VDSlJCR0FzRW9vS0VManRIT2tBaVVGRWNVUGlRSURBd0lKVEVtRmpVb2pZNG1JUUE3Ij48L2E+DQo8Zm9ybSBhY3Rpb249Imh0dHA6Ly96YWxpbC5ydS91cGxvYWQvIiBuYW1lPSJzZW5kZm9ybSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQ9IiIgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9zbGlsX3J1JykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX3NsaWxfcnUnKSIgb25jaGFuZ2U9InNldFJlYWR5KCdidG5fc2xpbF9ydScsIHRoaXMpIiB0eXBlPSJmaWxlIj4NCgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9zbGlsX3J1IiBjbGFzcz0iYnRuIj5zbGlsLnJ1PC9hPg0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0Ij4NCjwvZm9ybT4NCjwvZGl2PjwvbGk+DQoNCjxsaSBpZD0iZHVtcCI+PGRpdj48YSBocmVmPSJodHRwOi8vZHVtcC5ydS8iIHJlbD0ibm9mb2xsb3ciPjxpbWcgYWx0PSIiIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFOVS9BSVBRNndHaDBsU3hBYlRkazFPd0FIek42bksrTFhYSzVnT2YwUnlwMmNYa3FVUzUzbWE3SEcyOUp3V2gxV0hFNUJTbTFxRFVjenExM1Z5MkRYckNPd1NnMDFHeUFRU2cwVGV5MjczaW5YUENNeWV2MlFXZjA5anR4SnJSYkhmTjVsS3dBZ0tnejZ6aDg4N291TG5pMnJIYmlUKzEyNmpaZnNMbHBjcmxycUxlNW4vUDZLcmY3OS94eTlYc3Zwdlk3Uyt5M0Zhd0FWT3lBS2ZjN2dTZjFWZTFDUU9lMW9USFJ0M3V5azY5NGIzbThyL2tvUWFpMDUzVmNtVzNGLy8vL3lINUJBRUFBRDhBTEFBQUFBQVFBQkFBQUFhTXdKOVFxQnNhajhQUERNbjhBUzZycHZDUXVBUWNJWXlxcERnbUtyUUtBc0dCUkEyZW9RUlJDVWtXbGR3UUo0Z0lMdzZiNkZlSUdtOENJejhWRnd0Q0xFZzdBZzAvTUFnUFVpNFdBaDB2RGlaSUtFSVpCQVFEUHdzOFJ5a0dQeTArQXA1Q0VKQkNKeUFNRkJZeEZqVkdHeUlEREFLcE1ha1RYVVlISkQwVEJBSXlCblpTUHcwYXpFY1VTRUVBT3c9PSI+PC9hPg0KPGZvcm0gYWN0aW9uPSJodHRwOi8vZHVtcC5ydTo4MDgwL2NnaS1iaW4vdXVfdXBsb2FkLnBsP3RtcF9zaWQ9YmUxOTMxMjQ4ZTg0NDg4OTU2MmRmZGFkZWI1OThlZDAmYW1wO2NvbmZpZ19maWxlPXV1X2RlZmF1bHRfY29uZmlnIiBuYW1lPSJmb3JtX3VwbG9hZCIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiB0YXJnZXQ9Il9ibGFuayI+DQoJPGlucHV0IG5hbWU9InVwbG9hZF9yYW5nZSIgdmFsdWU9IjEiIHR5cGU9ImhpZGRlbiI+DQoJPGlucHV0IG5hbWU9Im5vX3NjcmlwdCIgdmFsdWU9IjEiIHR5cGU9ImhpZGRlbiI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJ1cGZpbGVfMCIgY2xhc3M9ImZpbGUiIHNpemU9IjEiIHJlcXVpcmVkPSIiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fZHVtcF9ydScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9kdW1wX3J1JykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX2R1bXBfcnUnLCB0aGlzKSIgdHlwZT0iZmlsZSI+DQoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fZHVtcF9ydSIgY2xhc3M9ImJ0biI+ZHVtcC5ydTwvYT4NCgkJPC9kaXY+DQoJPC9kaXY+DQoJPGlucHV0IGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiIHR5cGU9InN1Ym1pdCI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9InJhcGlkc2hhcmUtY29tIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9yYXBpZHNoYXJlLmNvbS8iIHJlbD0ibm9mb2xsb3ciPjxpbWcgYWx0PSIiIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFMTUFBQUVCUk1mYjhJcVJud01uaGVQdDl5bGRyOHJOMVdweWd4WklvZUxrNnFxdnV1VG03SksyNE9yczhRQUFBQUFBQUNINUJBQUFBQUFBTEFBQUFBQVFBQkFBQUFRbXNNbEpxNzA0NjgyNy8walJBVVBBWkl0QU1vUjVKY0t4dHVkbHhLU2JHWW9RZnNDZ0pRSUFPdz09Ij48L2E+DQo8Zm9ybSBhY3Rpb249Imh0dHA6Ly9yczY1bDMucmFwaWRzaGFyZS5jb20vY2dpLWJpbi91cGxvYWQuY2dpP3JzdXBsb2FkaWQ9MTQxNTQ5MDU1NTYwMjk3NzA1IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJ1bCIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+DQoJPCEtLSA8aW5wdXQgbmFtZT0ibWlycm9yIiB0eXBlPSJyYWRpbyI+TGV2ZWwoMykgPGlucHV0IGNoZWNrZWQgbmFtZT0ibWlycm9yIiB0eXBlPSJyYWRpbyI+VGVsaWEgPGlucHV0IG5hbWU9Im1pcnJvciIgdHlwZT0icmFkaW8iPiAtLT4NCgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4NCgkJPGlucHV0IG5hbWU9ImZpbGVjb250ZW50IiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQ9IiIgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9yYXBpZHNoYXJlX2NvbScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9yYXBpZHNoYXJlX2NvbScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9yYXBpZHNoYXJlX2NvbScsIHRoaXMpIiB0eXBlPSJmaWxlIj4NCgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9yYXBpZHNoYXJlX2NvbSIgY2xhc3M9ImJ0biI+UmFwaWRzaGFyZS5jb208L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPCEtLWxpIGlkPSJ1cGxvYWQyIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly93d3cudXBsb2FkMi5uZXQvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1BQUFFQlJNZmI4SXFSbndNbmhlUHQ5eWxkcjhyTjFXcHlneFpJb2VMazZxcXZ1dVRtN0pLMjRPcnM4UUFBQUFBQUFDSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBUW1zTWxKcTcwNDY4MjcvMGpSQVVQQVpJdEFNb1I1SmNLeHR1ZGx4S1NiR1lvUWZzQ2dKUUlBT3c9PSI+PC9hPgo8Zm9ybSBhY3Rpb249Imh0dHA6Ly93d3c1LnVwbG9hZDIubmV0L3VwbG9hZC5waHAiIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik1BWF9GSUxFX1NJWkUiIHZhbHVlPSIyNzAwMDAwMCI+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYWdlIiB2YWx1ZT0idXBsb2FkIj4KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPgoJCTxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl91cGxvYWQyX25ldCcpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl91cGxvYWQyX25ldCcpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl91cGxvYWQyX25ldCcsIHRoaXMpIj4KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fdXBsb2FkMl9uZXQiIGNsYXNzPSJidG4iPlVwbG9hZDIubmV0PC9hPgoJCTwvZGl2PgoJPC9kaXY+Cgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIj4KPC9mb3JtPgo8L2Rpdj48L2xpLS0+DQoNCjwhLS1saSBpZD0iZWdvc2hhcmUiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy5lZ29zaGFyZS5jb20vIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1KQVA4QUFLcXFxb2lJaU4zZDNVUkVSSGQzZC8vLy81bVptUUFBQVAvLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBQUFrQUxBQUFBQUFRQUJBQUFBUlhNTW1KQ3BvWVYzTE11Vm15ZGNOZ2VLQlljRVZibklCSFhFZnAzZ2ZSQ2dnU2xBTlhiamREZkh6QllVRlE1Q0Y3bkVPdXgrd2RmNzFzRmVIRUlxSlRidkU2eUZLYlBTKzRXUlE5emRzTVZCb09VY3oydkQwQ0FEcz0iPjwvYT4KPGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LmVnb3NoYXJlLmNvbS8iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgdGFyZ2V0PSJfYmxhbmsiPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9InRydWUiIG5hbWU9InVwbG9hZCI+Cgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4KCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0idXBmaWxlIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9lZ29zaGFyZV9jb20nKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5fZWdvc2hhcmVfY29tJykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX2Vnb3NoYXJlX2NvbScsIHRoaXMpIj4KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fZWdvc2hhcmVfY29tIiBjbGFzcz0iYnRuIj5FZ29zaGFyZS5jb208L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiPgo8L2Zvcm0+CjwvZGl2PjwvbGktLT4NCg0KPGxpIGlkPSJzZW5kc3BhY2UiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy5zZW5kc3BhY2UuY29tLyIgcmVsPSJub2ZvbGxvdyI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQUxNQUFBRUJSTWZiOElxUm53TW5oZVB0OXlsZHI4ck4xV3B5Z3haSW9lTGs2cXF2dXVUbTdKSzI0T3JzOFFBQUFBQUFBQ0g1QkFBQUFBQUFMQUFBQUFBUUFCQUFBQVFtc01sSnE3MDQ2ODI3LzBqUkFVUEFaSXRBTW9SNUpjS3h0dWRseEtTYkdZb1Fmc0NnSlFJQU93PT0iPjwvYT4NCjxmb3JtIGFjdGlvbj0iaHR0cDovL2ZzMDJ1LnNlbmRzcGFjZS5jb20vcHJvY2Vzc3VwbG9hZC5odG1sIiBuYW1lPSJ1cGxvYWQiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgdGFyZ2V0PSJfYmxhbmsiPg0KCTxpbnB1dCBuYW1lPSJNQVhfRklMRV9TSVpFIiB2YWx1ZT0iMzE0NTcyODAwIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJVUExPQURfSURFTlRJRklFUiIgdmFsdWU9IjIwODI3NzkxOTUuMTE3NjI4OTIxMy41NDVFMDUzOC4xNS4wIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJERVNUSU5BVElPTl9ESVIiIHZhbHVlPSIxMCIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0ianNfZW5hYmxlZCIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJmaWxlXzAiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX3NlbmRzcGFjZV9jb20nKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5fc2VuZHNwYWNlX2NvbScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9zZW5kc3BhY2VfY29tJywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX3NlbmRzcGFjZV9jb20iIGNsYXNzPSJidG4iPnNlbmRzcGFjZS5jb208L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPGxpIGlkPSJyYWRpa2FsIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9mb3RvLnJhZGlrYWwucnUvIiByZWw9Im5vZm9sbG93IiBsYW5nPSJydSI+PGltZyBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQU1RZkFBNFVFemhtSUZsWldjckt5amMzTjB4cFBTb3FLam82T3FPam83Mit2a3hVU1Q0K1BnMDFTUmhnaFI5RldWZXdLSUNBZ0RsU1lOWFYxVWhNUlpXWWs0aUxqUnMxRFY1ZVhsR2pKbVZsWlJsa2kxcGFXMWl4S1JwbmpqTXpNLy8vL3lINUJBRUFBQjhBTEFBQUFBQVFBQkFBQUFWMjRDZCtWY1JjWXpvbVR0TnBLTEI0M21HSWJLZkRuNWRDbTQ5RHQ0c2RhSVFid0VYa0dTQUF3VUFFSUJaN0lnUkI4V0ZZWHlpSTZuUFltTS9qdEVyQmJrOCtnNk5nbE1Gdzd2Y0FHYUdxNCs4RlBUUWVCQXNmZm5nWUZEMThLWWdjRDRHTWZYYVFBUklpQjJOK0dBV1lhajBXQUFBcElRQTciPjwvYT4NCjxmb3JtIGFjdGlvbj0iaHR0cDovL2ZvdG8ucmFkaWthbC5ydS9hY3Rpb24uYXNweCIgbmFtZT0idXBsb2FkIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHRhcmdldD0iX2JsYW5rIj4NCgk8aW5wdXQgbmFtZT0idXBsb2FkIiB2YWx1ZT0ieWVzIiB0eXBlPSJoaWRkZW4iPg0KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPg0KCQk8aW5wdXQgbmFtZT0iRiIgY2xhc3M9ImZpbGUiIHNpemU9IjEiIHJlcXVpcmVkPSIiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fcmFkaWthbF9ydScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9yYWRpa2FsX3J1JykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX3JhZGlrYWxfcnUnLCB0aGlzKSIgdHlwZT0iZmlsZSI+DQoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fcmFkaWthbF9ydSIgY2xhc3M9ImJ0biI+0KDQsNC00LjQutCw0Lst0KTQvtGC0L48L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KCTxpbnB1dCBuYW1lPSJDUCIgdmFsdWU9InllcyIgY2hlY2tlZD0iY2hlY2tlZCIgdHlwZT0iaGlkZGVuIj4NCgk8aW5wdXQgbmFtZT0iVk0iIHZhbHVlPSIyMDAiIHR5cGU9ImhpZGRlbiI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9ImxldGl0Yml0Ij48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9sZXRpdGJpdC5uZXQvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1BQUFFQlJNZmI4SXFSbndNbmhlUHQ5eWxkcjhyTjFXcHlneFpJb2VMazZxcXZ1dVRtN0pLMjRPcnM4UUFBQUFBQUFDSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBUW1zTWxKcTcwNDY4MjcvMGpSQVVQQVpJdEFNb1I1SmNLeHR1ZGx4S1NiR1lvUWZzQ2dKUUlBT3c9PSI+PC9hPg0KPGZvcm0gbmFtZT0iRjEiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGFjdGlvbj0iaHR0cDovL3IyLmxldGl0Yml0Lm5ldC9jZ2ktYmluL2hvbWVyL3VwbG9hZC5jZ2k/dXBsb2FkX2lkPSIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJjaGVja2JveCIgdmFsdWU9ImNoZWNrYm94IiB0eXBlPSJjaGVja2JveCI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJhY2NlcHQiIHZhbHVlPSIwIiBjaGVja2VkPSJjaGVja2VkIiB0eXBlPSJjaGVja2JveCI+DQoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+DQoJCTxpbnB1dCBuYW1lPSJteWZpbGUiIGNsYXNzPSJmaWxlIiBzaXplPSIxIiByZXF1aXJlZD0iIiBvbm1vdXNlb3Zlcj0ib25PdmVyRmlsZSgnYnRuX2xldGl0Yml0X25ldCcpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9sZXRpdGJpdF9uZXQnKSIgb25jaGFuZ2U9InNldFJlYWR5KCdidG5fbGV0aXRiaXRfbmV0JywgdGhpcykiIHR5cGU9ImZpbGUiPg0KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iYnRuX2xldGl0Yml0X25ldCIgY2xhc3M9ImJ0biI+bGV0aXRiaXQubmV0PC9hPg0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0Ij4NCgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InNlbGZfZGVzYyIgdmFsdWU9InVwbG9hZGVyLXBhbmVsLmNvbSIgdHlwZT0idGV4dCI+DQoJPGlucHV0IG5hbWU9Ik1BWF9GSUxFX1NJWkUiIHZhbHVlPSIxMjAwMDAwMDAwIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBuYW1lPSJ1aWQiIHZhbHVlPSIxMjMiIHR5cGU9ImhpZGRlbiI+DQo8L2Zvcm0+DQo8L2Rpdj48L2xpPg0KDQo8bGkgaWQ9ImlwaWN0dXJlIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9pcGljdHVyZS5ydS8iIHJlbD0ibm9mb2xsb3ciPjxpbWcgYWx0PSIiIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFNUUFBUC8vLzRDQWdNM055elF5THhVU0Roc1lGS1drbzVtWWwzVnpjYkt4c0JrV0VrQkFRQ0lmRy96TzN1NFdZZ0FBQUx5OHVzVER3cXFwcUxHd3NPYm01bmw0ZHZWNnBiQ3ZyWStPakhOeGIycG9abHBYVk1uSng5emMzQjRiRjM1OGVpSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBVjQ0QktNWkZtS0FOQllEY0FaaHNTbHdKaGFqZ1ZrWHFFb21wUk54UUlnQ2hmQlJoR3BCV2cwaEVJQWlCQU96aFJra0RCT1hRUk1GcEFnR0x6VU1uWllQaU04aU0rQTBSbTNqWXo4WUNKOGtzMUdCUkFVVUd5QVVsU0ZmaE9IWHc4MGhtNEZpWkIrQ1FWbkZSNVVqNDlEVUtDUUlpYWtJd3NoQURzPSI+PC9hPg0KPGZvcm0gYWN0aW9uPSJodHRwOi8vaXBpY3R1cmUucnUvVXBsb2FkLyIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJ1cGxvYWQiIHRhcmdldD0iX2JsYW5rIj4NCgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9Im9wdGltaXplIiB0eXBlPSJjaGVja2JveCI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJ0aHVtYl9yZXNpemVfb24iIGNoZWNrZWQ9ImNoZWNrZWQiIHR5cGU9ImNoZWNrYm94Ij4NCgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InRodW1iX3Jlc2l6ZSIgc2l6ZT0iOCIgdmFsdWU9IjIwMCIgdHlwZT0idGV4dCI+DQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJzdHJpbmdfc21hbGxfb24iIHR5cGU9ImNoZWNrYm94Ij4JDQoJPGlucHV0IGNsYXNzPSJuIiBuYW1lPSJtZXRob2QiIHZhbHVlPSJmaWxlIiB0eXBlPSJoaWRkZW4iPg0KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0idXBsb2FkdHlwZSIgdmFsdWU9IjEiIHR5cGU9InJhZGlvIj4NCgk8bGFiZWwgY2xhc3M9Im4iPtCd0LDQtNC/0LjRgdGMINC90LAg0L/RgNC10LLRjNGOIDxpbnB1dCBjbGFzcz0ibiIgc2l6ZT0iMTMiIG5hbWU9InN0cmluZ19zbWFsbCIgdmFsdWU9IiIgdHlwZT0idGV4dCI+PC9sYWJlbD4NCgk8ZGl2IGNsYXNzPSJmaWxlaW5wdXRzIj4NCgkJPGlucHV0IG5hbWU9InVzZXJmaWxlIiBzaXplPSIxIiBjbGFzcz0iZmlsZSIgcmVxdWlyZWQ9IiIgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9pcGljdHVyZV9ydScpIiBvbm1vdXNlb3V0PSJvbk91dEZpbGUoJ2J0bl9pcGljdHVyZV9ydScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl9pcGljdHVyZV9ydScsIHRoaXMpIiB0eXBlPSJmaWxlIj4NCgkJPGRpdiBjbGFzcz0iZmFrZWZpbGUiPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9ImJ0bl9pcGljdHVyZV9ydSIgY2xhc3M9ImJ0biI+aVBpY3R1cmUucnU8L2E+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxpbnB1dCBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiPg0KPC9mb3JtPg0KPC9kaXY+PC9saT4NCg0KPGxpIGlkPSJ6c2hhcmUiPjxkaXY+PGEgaHJlZj0iaHR0cDovL3pzaGFyZS5uZXQvIiByZWw9Im5vZm9sbG93Ij48aW1nIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTE1BQUFFQlJNZmI4SXFSbndNbmhlUHQ5eWxkcjhyTjFXcHlneFpJb2VMazZxcXZ1dVRtN0pLMjRPcnM4UUFBQUFBQUFDSDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBUW1zTWxKcTcwNDY4MjcvMGpSQVVQQVpJdEFNb1I1SmNLeHR1ZGx4S1NiR1lvUWZzQ2dKUUlBT3c9PSI+PC9hPg0KPGZvcm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSJodHRwOi8vNjkuODAuMjU1LjEzMC91cGxvYWQucGhwIiBtZXRob2Q9InBvc3QiIG5hbWU9InVwbG9hZCIgdGFyZ2V0PSJfYmxhbmsiPg0KCTxpbnB1dCB2YWx1ZT0iMSIgbmFtZT0iVE9TIiBjaGVja2VkPSJjaGVja2VkIiBjbGFzcz0ibiIgdHlwZT0iY2hlY2tib3giPg0KCTxkaXYgY2xhc3M9ImZpbGVpbnB1dHMiPg0KCQk8aW5wdXQgbmFtZT0iZmlsZSIgc2l6ZT0iMSIgY2xhc3M9ImZpbGUiIHJlcXVpcmVkPSIiIG9ubW91c2VvdmVyPSJvbk92ZXJGaWxlKCdidG5fenNoYXJlJykiIG9ubW91c2VvdXQ9Im9uT3V0RmlsZSgnYnRuX3pzaGFyZScpIiBvbmNoYW5nZT0ic2V0UmVhZHkoJ2J0bl96c2hhcmUnLCB0aGlzKSIgdHlwZT0iZmlsZSI+DQoJCTxkaXYgY2xhc3M9ImZha2VmaWxlIj4NCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fenNoYXJlIiBjbGFzcz0iYnRuIj56c2hhcmUubmV0PC9hPg0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0Ij4NCjwvZm9ybT4NCg0KPCEtLTxsaSBpZD0iZnJlZXNoYXJlIj48ZGl2PjxhIGhyZWY9Imh0dHA6Ly9mcmVlc2hhcmUudXMvIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+ZnJlZXNoYXJlLnVzPC9hPgo8Zm9ybSBuYW1lPSJ1cGxvYWQiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGFjdGlvbj0iaHR0cDovL2ZyZWVzaGFyZS51cy91cGxvYWQxLnBocCIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9Il9ibGFuayI+Cgk8aW5wdXQgY2xhc3M9Im4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9InVwbG9hZCIgbmFtZT0iYWN0aW9uIj4KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0idXBsb2FkIiB0eXBlPSJyYWRpbyIgdmFsdWU9ImZpbGUiIGNoZWNrZWQ+Cgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InVwbG9hZCIgdHlwZT0icmFkaW8iIHZhbHVlPSJ1cmwiPgoJPGRpdiBjbGFzcz0iZmlsZWlucHV0cyI+CgkJPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9ImZpbGVuYW1lIiBjbGFzcz0iZmlsZSIgc2l6ZT0iMSIgcmVxdWlyZWQgb25tb3VzZW92ZXI9Im9uT3ZlckZpbGUoJ2J0bl9mcmVlc2hhcmVfdXMnKSIgb25tb3VzZW91dD0ib25PdXRGaWxlKCdidG5fZnJlZXNoYXJlX3VzJykiIG9uY2hhbmdlPSJzZXRSZWFkeSgnYnRuX2ZyZWVzaGFyZV91cycsIHRoaXMpIj4KCQk8ZGl2IGNsYXNzPSJmYWtlZmlsZSI+CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSJidG5fZnJlZXNoYXJlX3VzIiBjbGFzcz0iYnRuIj5mcmVlc2hhcmUudXM8L2E+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxpbnB1dCBjbGFzcz0ibiIgbmFtZT0icHVibGljIiB0eXBlPSJyYWRpbyIgdmFsdWU9IjEiIGNoZWNrZWQ+Cgk8aW5wdXQgY2xhc3M9Im4iIG5hbWU9InB1YmxpYyIgdHlwZT0icmFkaW8iIHZhbHVlPSIwIj4KCQo8L2Zvcm0+CjwvZGl2PjwvbGk+LS0+DQoNCjwvZGl2PjwvbGk+PC91bD4NCg0KPHAgaWQ9InZlcnNpb24iPg0KCTxhIGhyZWY9Imh0dHA6Ly91cGxvYWRlci1wYW5lbC5jb20vIj4NCgkJPHNwYW4+U3VwZXIgVXBsb2FkZXIgMC4yNiAoMTIuMDYuMjAwOCk8L3NwYW4+DQoJPC9hPg0KPC9wPg0KDQo8ZGl2IGNsYXNzPSJyb2JvdHMtbm9jb250ZW50Ij4NCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoJZnVuY3Rpb24gc2hvd0Zvcm0ob2JqKSB7DQoJCWlmKCFvYmopIHJldHVybjsNCgkJb2JqLmNsYXNzTmFtZT0ndmlzaWJsZSc7DQoJCWlmKCFvYmouZm9ybSkgcmV0dXJuOw0KCQlvYmouZm9ybS5jbGFzc05hbWU9J3Zpc2libGUnfQ0KIA0KICBmdW5jdGlvbiBvbk92ZXJCdG4oYnRuKQ0KICB7DQogICAgaWYoYnRuKSANCiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NvbG9yOiAjZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjNmE5YmNkOycsIGZhbHNlKQ0KICAgICAgfQ0KICANCiAgZnVuY3Rpb24gb25PdXRCdG4oYnRuKQ0KICB7DQogICAgaWYoYnRuKQ0KICAgICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnLCBmYWxzZSl9DQogIA0KICBmdW5jdGlvbiBvbk92ZXJGaWxlKGlkKQ0KICB7DQogICAgdmFyIGJ0biA9IGdldEJ0bihpZCk7DQogICAgb25PdmVyQnRuKGJ0bil9DQogIA0KICBmdW5jdGlvbiBvbk91dEZpbGUoaWQpDQogIHsNCg0KICAgIHZhciBidG4gPSBnZXRCdG4oaWQpOw0KICAgIG9uT3V0QnRuKGJ0bil9DQogIA0KICBmdW5jdGlvbiBzZXRSZWFkeShpZCwgZmlsZU9iaikNCiAgew0KICAgIHZhciBidG4gPSBnZXRCdG4oaWQpOw0KICAgIGlmKGJ0bikNCiAgICAgIGJ0bi5jbGFzc05hbWUgPSAnYnRucmVhZHknOw0KICAgICAgDQogICAgaWYoZmlsZU9iaikNCiAgICAgIGZpbGVPYmouZm9ybS5zdWJtaXQoKX0NCiAgDQogIGZ1bmN0aW9uIHNldFJlYWR5MihpZCwgZmlsZU9iaikNCiAgew0KICAgIHZhciBidG4gPSBnZXRCdG4oaWQpOw0KICAgIGlmKGJ0bikNCiAgICAgIGJ0bi5jbGFzc05hbWUgPSAnYnRucmVhZHknOw0KICAgICAgDQogICAgdmFyIGZvcm0gPSBmaWxlT2JqLmZvcm07DQogICAgaWYoZm9ybSkgIA0KICAgIHsNCiAgICAgIGZvcih2YXIgaSA9IGZvcm0uZWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pDQogICAgICB7DQogICAgICAgIGlmKGZvcm0uZWxlbWVudHNbaV0udGFnTmFtZSA9PSAnSU5QVVQnICYmIGZvcm0uZWxlbWVudHNbaV0udHlwZSA9PSAnc3VibWl0JykNCiAgICAgICAgew0KICAgICAgICAgIGZvcm0uZWxlbWVudHNbaV0uY2xpY2soKTsNCiAgICAgICAgICBicmVha30NCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBnZXRCdG4oaWQpDQogIHsNCiAgICBpZighaWQpDQogICAgICByZXR1cm47DQogICAgICANCiAgICB2YXIgb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KICAgIGlmKG9iaiAmJiBvYmoudGFnTmFtZSA9PSAnQScpDQogICAgew0KICAgICAgcmV0dXJuIG9ian0NCiAgICANCiAgICByZXR1cm4gbnVsbH0JDQoJPC9zY3JpcHQ+DQoNCjwvZGl2Pg0KPC9ib2R5PjwvaHRtbD4=");

Открывается и закрывается панель через встроенную в Firefox функцию. Почему в этом случае панель не закрывается при повторном вызове – не знаю.

BALANCE

Слушай а нет какого нибудь справочного материала? чтобы самому научится?)

Его много, но чтобы научиться - такого нет.

3Jlou

1) Кнопка работает, но нет ли "подводных камней" в коде и вообще при таком способе написания ссылок и размещении файлов в папке chrome?

Возможно, html загружаемый по chrome:// протоколу, будет иметь chrome-привилегии.

2) Можно ли как нибудь указать путь к папке/подпапке с профилем Firefox (хочу перекинуть html'ки туда) по аналогии с методом, описанным выше (chrome://local/content/superuploader.htm)?

Есть такой вариант: в подкаталоге extensions\custombuttons@xsms.org профиля найти файл chrome.manifest, открыть его в редакторе, записать в конец строку

Код:

resuource myresource ../../htmls/

перезапустить браузер. После этого html можно хранить в подкаталоге htmls профиля и ссылаться на них посредством resource://myresource/myhtml.htm.
Недостаток тоже есть, всё содержимое подкаталога, в принципе, будет доступно открываемым в браузере страницам (если странице известен псевдоним 'myresource' и путь к файлам).

Можно в chrome.manifest расширения ничего не писать, и размещать файлы в подкаталоге res каталога установки Firefox. Путь туда - resource://gre/res/

Anton написал:

Есть такой вариант: в подкаталоге extensions\custombuttons@xsms.org профиля найти файл chrome.manifest, открыть его в редакторе, записать в конец строку

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

Код:

var chromeDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("UChrm", Components.interfaces.nsILocalFile);
chromeDir = "file://" + chromeDir.path.replace(/\\/g, "/") + "/";

openWebPanel("", chromeDir + "userChrome-example.css");

chromeDir – путь к папке chrome в профиле.

Или вот так:

Код:

var dir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile);
dir = "file://" + dir.path.replace(/\\/g, "/") + "/my_dir/";

openWebPanel("", dir + "some.html");

dir – путь к папке my_dir в профиле.

Infocatcher, вот теперь точно ОГРОМНОЕ СПАСИБО!!! 2-й вариант как раз то что надо, 5 баллов!
Anton'у тоже благодарность :)

Кстати в чем различия полей Код и Инициализация?

Подскажите какой код на в кнопку написать, что бы туда влезло меню. Ну то которое "файл", "правка", "вид" и т.д. Есть такое расширение Tiny Menu, вот я хочу сделать тоже самое, т.к. Tiny Menu нельзя двигать по тулбару, а кнопку можно.

MAFi0Z0
К чему изобретать велосипед? Compact Menu 2

3Jlou

Кстати в чем различия полей Код и Инициализация?

Код из раздела "Код" выполняется при нажатии на кнопку.
Код из раздела "Инициализация" выполняется, когда браузер создаёт кнопку.

MAFi0Z0

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

Код:

var mp = document. createElement ("menupopup");
this. appendChild (mp);
var mc = document. getElementById ("main-menubar");
while (mc. hasChildNodes ())
    mp. appendChild (mc. firstChild);
this. type = "menu";
this. orient = "horizontal";

в раздел "Инициализация".

Есть расширение Reframe It, которое позволяет сохранять онлайн комментариии и заметки. Я его только установил. Кнопка Reframe It находится в строке состояния. Может я изобретаю велосипед, но через Custom Button (правда у меня CB с двойкой) сделал кнопку для размещения на панели инструментов. Традиционный вопрос - как запускать расширение через эту кнопку? Я в технической информации не профи, поэтому просьба подсказать в популярной форме. Заранее спасибо.

Supernovus

как запускать расширение через эту кнопку?

Что значит "запустить" ?

Anton написал:

Supernovus

как запускать расширение через эту кнопку?

Что значит "запустить" ?

Вроде бы на английском это называется инициализация. А по нашему ВКЛ./ВЫКЛ. Я не хочу кнопку от Reframe It в строке состояния, потому что она длинная (с индикатором сообщений). По этой же причине не хочу на панель инструментов. Я сделал в Custom Buttons кнопку (скопировал с их сайта), но для включения расширения через мою самодельную кнопку нужны коды. Где их скопировать или как сделать?

Supernovus

Вроде бы на английском это называется инициализация. А по нашему ВКЛ./ВЫКЛ.

Непонятно. Надо открыть/закрыть боковую панель ? Тогда пишите в раздел "Код":

Код:

ReframeIt.Extension.onHideButtonClick(event);

Вопрос по аналогичному расширению Custom Buttons².
На его домашней странице есть достаточное количество кнопок, которые не работают в расширении Custom Buttons 0.0.3.9, хотя кнопки от Custom Buttons 0.0.3.9 в расширении Custom Buttons² работают.

Возможно ли как нибудь сделать полную совместимость кнопок в Custom Buttons?
Не хотелось бы переходить на Custom Buttons² из-за его "тяжести" (размер больше аж в 4 раза) и нерусифицированности.

3Jlou

Возможно ли как нибудь сделать полную совместимость кнопок в Custom Buttons?

Со временем будет.

прошу подсказать, что напис́ать в поле Код (мне нужно для FF 3.0.5 создать кнопку для запуска приложения). в этой теме в начале мной найдено вот что :

Код:

/*CODE*/
var path='C:\\Program Files\\Proxomitron\\Proxomitron.exe';

var file = Components.classes['@mozilla.org/file/local;1']
    .createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);
 file.initWithPath(path); 
 process.init(file);
 process.run(false,arguments,arguments.length);

я лишь меняю путь на тот, который мне нужен, но не работает (что, в общем, и не удивительно - тогда ещё FF 3 не было, наверняка в этом причина)

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

austri написал:

создать кнопку для запуска приложения

Я думаю, дело в аргументах.

Вот так должно работать.

Код:

function startProcess(path, args) {
    args = args || [];
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath(path);
    if(!file.exists()) {
        alert(path + "\nnot found!");
        return;
    }
    var process = Components.classes["@mozilla.org/process/util;1"]
        .getService(Components.interfaces.nsIProcess);
    process.init(file);
    process.run(false, args, args.length);
}

startProcess("c:\\WINDOWS\\system32\\notepad.exe");
startProcess("c:\\WINDOWS\\system32\\notepad.exe", ["c:\\boot.ini"]);

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

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

дай, пожалуйста, ответ, можно ли такое осуществить ?

насчёт кнопок от Custom Buttons² я высказался ошибочно, они частично подходят к Custom Buttons.

Есть такая кнопка Top, Bottom and Middle All In One, которая работает заторможенно. Глядя на коды других кнопок, переписал её по своему, работает шустро, но т.к. полный ноль в скриптах, не пойму как повесить меню на среднюю кнопку, а переход в центр страницы на правую кнопку (сейчас на правой - меню, а на средней - переход в центр):

Картиинка:

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAACXBIWXMAAAsTAAALEwEAmpwYAAADGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6egY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBFTAyMHy7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBwgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJAwMDg3N+QWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8EgX3xMw8BSMDVQYqg4jIKAUICxE+CDEESC4tKoMHJQODAIMCgwGDA0MAQyJDPcMChqMMbxjFGV0YSxlXMN5jEmMKYprAdIFZmDmSeSHzGxZLlg6WW6x6rK2s99gs2aaxfWMPZ9/NocTRxfGFM5HzApcj1xZuTe4FPFI8U3mFeCfxCfNN45fhXyygI7BD0FXwilCq0A/hXhEVkb2i4aJfxCaJG4lfkaiQlJM8JpUvLS19QqZMVl32llyfvIv8H4WtioVKekpvldeqFKiaqP5UO6jepRGqqaT5QeuA9iSdVF0rPUG9V/pHDBYY1hrFGNuayJsym740u2C+02KJ5QSrOutcmzjbQDtXe2sHY0cdJzVnJRcFV3k3BXdlD3VPXS8Tbxsfd99gvwT//ID6wIlBS4N3hVwMfRnOFCEXaRUVEV0RMzN2T9yDBLZE3aSw5IaUNak30zkyLDIzs+ZmX8xlz7PPryjYVPiuWLskq3RV2ZsK/cqSql01jLVedVPrHzbqNdU0n22VaytsP9op3VXUfbpXta+x/+5Em0mzJ/+dGj/t8AyNmf2zvs9JmHt6vvmCpYtEFrcu+bYsc/m9lSGrTq9xWbtvveWGbZtMNm/ZarJt+w6rnft3u+45uy9s/4ODOYd+Hmk/Jn58xUnrU+fOJJ/9dX7SRe1LR68kXv13fc5Nm1t379TfU75/4mHeY7En+59lvhB5efB1/lv5dxc+NH0y/fzq64Lv4T8Ffp360/rP8f9/AA0ADzT6lvFdAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAA4ElEQVR42oyRMWoCYRCFvz8sIpjCQpJaBNnKJo0nEOwED5HGLaxyDQsbqwQ8gBYewEpsxGBjWi0DgkUWweZLEZcIgaxvmuHNg5l5D7lUsLofx2mc7sdWDRmfjSOb80VJxJLzhU2ja0HR7miHODgNToijnV2LmaBiP0kRZ2vbtmdrxCS1b+VH0KqLNbcTY4PBeDupiXVtSQQckrdyobO5f+UTgI/4+X05bRzPHCBIhqsWwx82CGS0v5I7cpC7IgKehr1yobPx8XIkPHy9TBvHc2/IKvfNm4zKtfqGsP6J+3sAWOrW//ubszsAAAAASUVORK5CYII=

Код кнопки:

Код:

this.LeftClick=function()
{
  if (content.scrollY > 0) {
    content.scrollTo(0, 0);
  } else {
    content.scrollTo(0, content.document.height);
  }
}

this.MiddleClick=function()
{
    content.scrollTo(0, (content.document.height - content.innerHeight)/2);
}

this.execute= function(evt)
{
    switch(evt.button) 
    {
        case 0:
            this.LeftClick();
            break;

        case 1:
            this.MiddleClick();
            break;
    }
}

this.setAttribute("onclick", "this.execute(event);");
this.tooltipText = "L: Go Top/Bottom | M: Go Middle | R: Menu";

Кстати, что такого в коде, представленном мной, что кнопка работает быстро, а изначальный код "задумывается" при нажатии на кнопку?

austri

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

Не понятно, какую операцию требуется осуществить. Объясните пожалуйста подробней.

3Jlou

не пойму как повесить меню на среднюю кнопку, а переход в центр страницы на правую кнопку (сейчас на правой - меню, а на средней - переход в центр):

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

Кстати, что такого в коде, представленном мной, что кнопка работает быстро, а изначальный код "задумывается" при нажатии на кнопку?

Обработчик gQuot делает задержку в ~350 мс.
Можно записать

Код:

custombuttons. gQuot. dcDelay = 0;
this.setAttribute('onclick', 'gQuot(event, this)');

это отключит задержку для вообще всех кнопок, использующих gQuot. Если надо изменить задержку для отдельной кнопки, можно написать

Код:

this. gQuot = {};
this. gQuot. __proto__ = custombuttons. gQuot;
this. gQuot. dcDelay = 1000;
this. setAttribute ('onclick', 'this.gQuot.mHandler(event, this)');

Anton написал:

austri

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

Не понятно, какую операцию требуется осуществить. Объясните пожалуйста подробней

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

при повторном нажатии - возврат к привычному, стандартному отображению

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

austri
Если я правильно понял, то

Код:

var pn = "browser.display.use_document_colors";
var pref = custombuttonsUtils. getPrefs (pn);
custombuttonsUtils. setPrefs (pn, !pref);

в раздел "Код".

Anton
работает, спасибо. я теперь вообще из л́иса вылезать не буду)

для Custom Buttons есть кнопка которая прячет и показывает панель  закладок, код кнопки:

Код:

var a = document.getElementById("PersonalToolbar");
a.collapsed = !a.collapsed;

Расширение Group/Sort Tabs 1.1.4 создает свою панель TabsGroum Manager GroupBar, вопрос в следующем, на что заменить "PersonalToolbar" из кнопки  чтобы она скрывала\показывала панельку от Group/Sort Tabs 1.1.4

DeeZ

на что заменить "PersonalToolbar"

На "TabGroupsManager.Toolbar"
Но эту панель инструментов создаёт не Group/Sort Tabs 1.1.4, а другое расширение.

Anton
блин! пока разбирался с Custom Buttons  нашел родную кнопку от Group/Sort Tabs 1.1.4, она уже есть оказывается :))))))

но все равно спасибо :)

Anton
Обращаюсь к спецу по кнопкам и новому аддону SmileySidebar - напишите пожалуйста код кнопки для открытия этой панели. Через клавиатуру (Shift+Ctrl+E) неудобно. Хотелось бы прикрутить кнопку к AiOS.  http://www.kolobok.us/smiles/big_standart/help.gif

68agasfer
Попробуй

Код:

toggleSidebar('viewSmileySidebar');

если что - придётся уточнять у автора - у меня нет последней версии Smiley.

Anton
Спасибо!!! :beer: Работает.

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

Vladik а они на компе и  храняться, а  при использовании SmileySidebar  подгружаются на форум с этого сайта > http://www.kolobok.us/,что бы это определить достаточно проследить URL одного из смайликов > http://www.kolobok.us/smiles/big_standart/help.gif :)

Vladik, Крошка Ру тут вообще то обсуждают Custom Buttons, а не смайлики.

П.С. Пользуясь случаем, хочу сказать спасибо автору расширения, а также всем, кто отвечал на вопросы, благодаря вам собрал портабельного лиса, коим сейчас и пользуюсь:
http://pic.ipicture.ru/uploads/090527/thumbs/kCTb7Izu6U.gif

Супер! Мощно у тя получилось! То же такой захотелось :)
Я что хотел спросить. Ребят, как сделать чтобы при нажатии кнопки на панели инструментов браузера начинался 3-х минутный отсчет, а потом страница обновлялась. и так в цикле. а еще лучше, что бы не все окно, а только первая вкладка, и только при определенном ее заголовке, точнее при условии "если заголовок содержит"...причем, что бы, если вкладка не в фокусе, не переключался на нее, а обновлял в фоне. так же, было бы вообще круто, если бы при обнаружении изменения контента страницы на той вкладке, мигало окно в трее. это все реально вообще? :) я просто в js - ноль ваще

150pi, раздаю на торрентс_ру

Поясните мне, как соотносятся Custom Buttons и Custom Buttons2? Был форк или еще что? Просто подумал, что расширению самое место в нашей акции Сделано в России, но 2 аналогичных расширения меня смущают... :)

3Jlou
А можно ссылку? Я что то не нашел

150pi

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

Реально, только сложно.
Я занят сейчас, попробую сделать в выходные.

ragnaar написал:

Поясните мне, как соотносятся Custom Buttons и Custom Buttons2?

Custom Buttons2 делала команда с custombuttons.phpbbnow.com
А меня Yan включил разработчиком на amo страницу исходного расширения. Сам он Custom Buttons уже не разрабатывал. Может быть, участвовал в разработке CB2 - я не знаю, тогда я за этими событиями не следил.

150pi, вбей в поиск: Firefox Portable 3.0.10

Anton написал:

Custom Buttons2 делала команда с custombuttons.phpbbnow.com
А меня Yan включил разработчиком на amo страницу исходного расширения. Сам он Custom Buttons уже не разрабатывал. Может быть, участвовал в разработке CB2 - я не знаю, тогда я за этими событиями не следил.

Между расширениями большая разница? И есть какие-то планы о будущем Custom Buttons? Не хотелось бы рекламировать заведомо остановившийся проект...

ragnaar написал:

Между расширениями большая разница?

Технологическая - большая. CB2 - это всё ещё Custom Buttons 0.0.2 alpha, только с "довесами".
В интерфейсе и предоставляемом функционале есть небольшие отличия.

И есть какие-то планы о будущем Custom Buttons? Не хотелось бы рекламировать заведомо остановившийся проект...

Если мне приходят идеи по поводу улучшений расширения, я их записываю и, по мере возможности реализую. Список пока не пуст, разработку я пока ещё не прекратил.

CB2 недавно включили в группу 'recommended' на amo, так что я бы не против поучаствовать в акции "Сделано в России". В качестве поощрительного приза : ) Всё равно CB2 под условия акции не попадает - главный разработчик этой ветки живёт в США.

Anton
Отлично! Надо - иконка, ссылка, краткое описание из 5-7 слов

3Jlou Спасибо, скачал. А как установить то? Черное окно моргает на секунду и все. Из командной строки то же самое. Поиск че т не помог.

ragnaar

Отлично! Надо - иконка, ссылка, краткое описание из 5-7 слов

Ссылка: https://addons.mozilla.org/ru/firefox/addon/2707
Описание: "Позволяет создавать кнопки для панелей инструментов"
А иконки у меня нет, можно без иконки ?

Без иконки как-то... Стандертную иконку расширения юзать не хочется...
Может вот такая иконка подойдет? http://www.iconfinder.net/icondetails/290/64

Upd:
Вот примерно вот так
http://forum.mozilla-russia.org/uploaded/mir-custombuttons.png

ragnaar

Может вот такая иконка подойдет? http://www.iconfinder.net/icondetails/290/64

Пусть будет такая.
Спасибо.

Кстати, Custom Buttons работает не только в Firefox, но и в Thunderbird и Sunbird/Calendar (ещё - Flock и KompoZer 0.8).

150pi

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

Код:

var searchintab = "";
var searchinpage = "";
var interval = 180;
var tbr = getBrowser ();
var firstTab = tbr. tabContainer. childNodes [0];
var br = tbr. getBrowserForTab (firstTab);
if (!this. timer)
{
    firstTab ["cbTimer"] =
    {
        tab: firstTab,
        browser: br,
        timer: null,
        searchInTab: searchintab,
        searchInPage: searchinpage,
        pause: interval * 1000,
        lastModified: br. contentDocument. lastModified,
        win: window,
        
        QueryInterface: function (iid)
        {
            if (iid. equals (Components. interfaces. nsISupports) ||
                iid. equals (Components. interfaces. nsITimerCallback) ||
                iid. equals (Components. interfaces. nsIEventHandler))
                return this;
            return Components. results. NS_ERROR_NO_INTERFACE;
        },
        
        removeEventListener: function ()
        {
            try
            {
                this. tab. removeEventListener ("load", this, false);
            } catch (e) {}
        },
        
        handleEvent: function (event)
        {
            this. removeEventListener ();
            if (this. isPageMatches ())
                this. win. getAttention ();
        },
        
        isTabMatches: function ()
        {
            if (!this. searchInTab)
                return true;
            return (this. tab. label. indexOf (this. searchInTab) != -1);
        },
        
        isPageMatches: function ()
        {
            var plm = this. browser. contentDocument. lastModified;
            var res = (this. lastModified != plm);
            this. lastModified = plm;
            return res;
        },
        
        notify: function (oTimer)
        {
            if (this. isTabMatches ())
            {
                this. tab. addEventListener ("load", this, false);
                this. browser. reload ();
            }
            this. startTimer ();
        },
        
        startTimer: function ()
        {
            if (!this. timer)
                this. timer = Components. classes ["@mozilla.org/timer;1"].
                              createInstance (Components. interfaces. nsITimer);
            this. timer. initWithCallback (this, this. pause, Components. interfaces. nsITimer. TYPE_ONE_SHOT);
        },
        
        stopTimer: function ()
        {
            this. removeEventListener ();
            if (!this. timer)
                return;
            this. timer. cancel ();
            this. timer = null;
        }
    };
    this. timer = firstTab ["cbTimer"];
    if (!this. timer. isTabMatches ())
        return;
    this. timer. startTimer ();
}
else
{
    this. timer. stopTimer ();
    delete this. timer. tab ["cbTimer"];
    this. timer = null;
}

Если надо искать соответствие в заголовке таба, надо исправить строку

Код:

var searchintab = "";

например:

Код:

var searchintab = "Mozilla";

Супер! Только окно моргает после каждого интервала, а не только если на странице появились обновления...Еще, с заголовком что то не получается.  Обновляет не зависимо от него. А так, все работает правильно - ваще респект!

150pi написал:

Только окно моргает после каждого интервала, а не только если на странице появились обновления...

Код проверяет изменения по lastModified документа, другого не придумалось.
Чтобы отключить "моргание" надо закомментировать строку

Код:

this. tab. addEventListener ("load", this, false);

вот так:

Код:

//this. tab. addEventListener ("load", this, false);

А как выключить скрипт то? :) Можно сделать что бы при клике колесом мыши вырубался?

150pi
Первый щелчок по кнопке запускает таймер, второй - останавливает.

А возможно сделать, что бы иконка кнопки после первого щелчка оставалась нажатой а после второго отжималась? А то не ясно работает в данный момент скрипт или нет. Ну или другими способами как нить сделать такое...msgbox например какой нить

150pi написал:

А возможно сделать, что бы иконка кнопки после первого щелчка оставалась нажатой а после второго отжималась?

Можно добавить в конце

Код:

this. checked = !this. checked;

У меня возникла вот тут всем известная проблема с дублированием русских букв в ФФ. На сколько мне известно, на настоящий момент, решения этой проблеме нет. Можно ли сделать такую кнопку, которая в нажатом состоянии, при наборе текста русским языком после каждого символа, как бы нажимает бэкспейс? Только для русских букв что бы работало. Знаки препинания, спецсимволы, пробелы, английские буквы что бы не трогало. Если возможно такое, вы, фактически, станете первым, кто пофиксил этот редкий, странный баг. :) Попробуйте пожалуйста!!! Очень не хочется расставаться с ФФ!

150pi
Это будет не фикс, а воркэраунд. Т.е. вместо проблемы исправляются её последствия.

150pi

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

Можно, только я не уверен, что это поможет. Проверить не могу, у меня буквы не удваиваются. Вот код:

Код:

var handlerId = "cbKeyboardHandler-" + this. id;
if (!window [handlerId])
{
    window [handlerId] =
    {
        win: window,
        
        QueryInterface: function (iid)
        {
            if (iid. equals (Components. interfaces. nsISupports) ||
                iid. equals (Components. interfaces. nsIEventHandler))
                return this;
            return Components. results. NS_ERROR_NO_INTERFACE;
        },
        
        setHandler: function ()
        {
            this. win. addEventListener ("keypress", this, true);
        },
        
        removeHandler: function ()
        {
            this. win. removeEventListener ("keypress", this, true);
        },
        
        handleEvent: function (event)
        {
            this. removeHandler ();
            var target = event. originalTarget;
            var e = document. createEvent ("KeyEvents");
            e. initKeyEvent
            (
                "keypress", event. bubbles, event. cancelable, event. view,
                event. ctrlKey, event. altKey, event. shiftKey, event. metaKey,
                event. keyCode, event. charCode
            );
            target. dispatchEvent (e);
            e = document. createEvent ("KeyEvents");
            e. initKeyEvent
            (
                "keypress", true, true, event. view, false,
                false, false, false, 8, 8
            );
            target. dispatchEvent (e);
            event. preventDefault ();
            this. setHandler ();
        }
    };
    window [handlerId]. setHandler ();
    this. checked = true;
}
else
{
    window [handlerId]. removeHandler();
    delete window [handlerId];
    this. checked = false;
}

спасибо, проверю, отпишу

Извинияюсь за оффтоп.

150pi

А у вас яндексбар не стоит? У меня, когда он стоял вместе с этим расширением: Locationbar², буквы удваивались, по поводу удвоения букв были темы на форуме, поищите. Или они у вас сами без расширений плодятся? Что-то сомневаюсь. Зачем вам эти костыли в виде кнопки? Лучше поотключайте аддоны и посмотрите, что вызывает проблемы.

нет, не стоит. вообще, слово яндекс даже не разу не набирал в браузере. расширения все стандартные. custom buttons, fast dial, addblock...на тот момент больше не было. темы все читал. вычитал, что возникает иногда при установленом стороннем приложении Shedko Badges. Снес его, ждем повторения. Слышал, что это не поможет уже. Потому и костыли. Сейчас пишу уже с мозиллы. Полет нормальный.

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

ннее ззаассттааввииллоо ссееббяя ддооллггоо жжддааттьь. :) ккоодд ннее ррааббооттааеетт. ннее ддааеетт ппииссааттьь ввооооббщщее ннииккааккииммии ссииммввооллааммии ннии ннаа оодднноомм яяззыыккее. ХХЕЕЛЛПП!

ну, если код не даёт писать вообще никакими символами, значит, он работает.
хотя, я заранее предполагал, что вряд ли поможет.
можно попробовать заменить этот

Код:

target. dispatchEvent (e);
            event. preventDefault ();
            this. setHandler ();

кусок кода на такой:

Код:

//target. dispatchEvent (e);
            event. preventDefault ();
            this. setHandler ();

Опять же, протестировать нечем, а если не поможет - ничем помочь не могу.

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

А как сделать? У меня так все  красиво там сделано...это портируется?

Вот теперь код не работает

Портируется все, но в силу неконтролируемого размножения у вас букв, настройки лучше не переносить, иначе избавиться вам от этой проблемы вряд ли удастся. Настроить потом можно. О создании нового профиля написано подробно в FAQ

спасибо

Подскажите пожалуйста, как реализовать
Есть такой сайт - videosaver.ru, у них есть скрипт, который при вызове его из закладок автоматически выдает ссылки на медиа вконтакте итд. Если его просто вставить в текст кнопки - ничего не получается.
вот он:

Код:

javascript:var%20s=document.createElement('script');s.src='http://videosaver.ru/vs.js?nc='+Math.random();document.body.appendChild(s);void(0);

Как сделать так, что бы его можно было вызывать кнопкой, а не закладкой?
Спасибо

150pi написал:

Как сделать так, что бы его можно было вызывать кнопкой, а не закладкой?

"Завернуть" в loadURI:

Код:

loadURI ("javascript:var%20s=document.createElement('script');s.src='http://videosaver.ru/vs.js?nc='+Math.random();document.body.appendChild(s);void(0);");

Спасибо! Работает!

Anton
Дело идёт к релизу 3.5 :). Есть проблема: во всех последних бетах и RC1 при запуске кнопки вот такого вида:

Код:

goDoCommand ("cmd_copy");
var path='D:\\Soft\\PRMT6\\PRMTX\\prmtx.exe';  var arguments=['']; var file = Components.classes['@mozilla.org/file/local;1']     .createInstance(Components.interfaces.nsILocalFile); var process = Components.classes['@mozilla.org/process/util;1']     .getService(Components.interfaces.nsIProcess);  file.initWithPath(path);   process.init(file);  process.run(false,arguments,arguments.length);

первый раз срабатывает нормально, при второй и последующих попытках запустить, в консоли появляется ошибка и приложение не запускается. Ошибка:

Код:

Ошибка: uncaught exception: [Exception... "Component returned failure code: 0xc1f30002 (NS_ERROR_ALREADY_INITIALIZED) [nsIProcess.init]"  nsresult: "0xc1f30002 (NS_ERROR_ALREADY_INITIALIZED)"  location: "JS frame :: chrome://custombuttons/content/cbbutton.js :: anonymous :: line 276"  data: no]

После перезапуска [firefox] всё так же: первый раз срабатывает, последующие та же ошибка.
Можно поправить как то?

P.S. Да и вообще все кнопки запускающие исполняемые файлы или скрипты, срабатывать один раз только стали, вернее срабатывает первый раз любая кнопка на запуск скрипта или .ехе после другие уже не работают. В ошибках отличается только последняя строка, после location: "JS frame :: chrome://custombuttons/content/cbbutton.js ::...

Deim0s написал:

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

Кажется, оно: https://bugzilla.mozilla.org/show_bug.cgi?id=485379

15-06-2009 14:41:52
Можно посмотреть, как в IE Tab пофиксили: https://addons.mozilla.org/ru/firefox/a … 5.20090525 (chrome\content\ietabExtApp.js)

15-06-2009 14:46:05
P.S. В IE Tab:
Было:

Код:

var nsIProcess = Components.classes["@mozilla.org/process/util;1"].getService(Components.interfaces.nsIProcess);

Стало:

Код:

var nsIProcess = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);

Infocatcher
Вы правы. Заменил все getService на createInstance, всё работает как прежде. Спасибо.

Помогите создать кнопки:
1. Манипуляция с сайдбаром закладок

Код:

toggleSidebar('viewBookmarksSidebar');

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

2. Фокусировка на URL панели
Есть код

Код:

var a = document.getElementById("nav-bar");
a.collapsed = !a.collapsed;

var uBar = document.getElementById("urlbar");
uBar.focus();
uBar.select();

При нажатии кнопки отображается панель адреса и курсор сразу же попадает туда и выделяет всю строку. Хотелось бы чтобы при повторном нажатии панель убиралась (это в принципе в этом коде уже есть) и потом срабатывало действие, которое можна вызвать клавишами Ctrl - Alt - F6 (тоесть сразу после этого можно двигать страницу клавишами стрелок "вверх","вниз")
Как же дописать дальше код ?

P.S. Хочу просто управлять браузером на телевизоре с пульта, поэтому такие извращения :)

vurdalak написал:

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

Примерно вот так:

Код:

toggleSidebar("viewBookmarksSidebar");
var sb = document.getElementById("sidebar");
if(sb.getAttribute("src") == "chrome://browser/content/bookmarks/bookmarksPanel.xul") {
    sb.addEventListener(
        "focus",
        function(e) {
            sb.removeEventListener(e.type, arguments.callee, true);
            var tree = sb.contentDocument.getElementById("bookmarks-view");
            tree.view.selection.select(0);
            setTimeout(
                function() { tree.focus(); },
                0
            );
        },
        true
    );
}

04-07-2009 23:55:07

vurdalak написал:

Хотелось бы чтобы при повторном нажатии панель убиралась (это в принципе в этом коде уже есть) и потом срабатывало действие, которое можна вызвать клавишами Ctrl - Alt - F6 (тоесть сразу после этого можно двигать страницу клавишами стрелок "вверх","вниз")

Про Ctrl+Alt+F6 не понял.
Вот так

Код:

var nb = document.getElementById("nav-bar");
nb.collapsed = !nb.collapsed;
if(nb.collapsed)
    content.focus();
else {
    var uBar = document.getElementById("urlbar");
    uBar.focus();
    uBar.select();
}

подойдет?

:beer::beer::beer::beer::beer:
Спасибо, ну ты прям волшебник.

А насчет Ctrl+Alt+F6 то я перепутал, имелось ввиду Ctrl+Shift+F6

:(
У меня сайдбар с закладками располагается внизу, благодаря расширению MultiSidebar
https://addons.mozilla.org/en-US/firefox/addon/4534
Как оказалось код манипуляции с сайдбаром закладок конфликтует с этим расширением


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

vurdalak написал:

У меня сайдбар с закладками располагается внизу, благодаря расширению MultiSidebar

Там четыре разных сайдбара получается – с разными идентификаторами.
Должно работать:

Код:

var sbCmd = "viewBookmarksSidebar";

toggleSidebar(sbCmd);
var sbId = "sidebar" + ("MultiSidebar" in window ? MultiSidebar.getSidebarSuffix(sbCmd) : "");
var sb = document.getElementById(sbId);
var sbSrc = document.getElementById(sbCmd).getAttribute("sidebarurl");
if(sb.getAttribute("src") == sbSrc) {
    sb.addEventListener(
        "focus",
        function(e) {
            sb.removeEventListener(e.type, arguments.callee, true);
            var tree = sb.contentDocument.getElementById("bookmarks-view");
            setTimeout(
                function() {
                    tree.view.selection.select(0);
                    tree.focus();
                },
                0
            );
        },
        true
    );
}

Несказанно благодарен

Здравствуйте! Можно ли добавить в панель инструментов кнопки из строки состояния? Интересуют кнопки дополнений QuickJava 0.4.2.1 (две кнопки - разрешить/запретить Java и разрешить/запретить JavaScript) и дополнения Yes Popups 0.9.8b (одна кнопка - разрешить/запретить всплывающие окна). Не нашел инструмента для того, чтобы посмотреть код кнопок этих дополнений, также не нашел инструмента для их перемещения. Помогите создать эти кнопки. Заранее спасибо!

E_U

разрешить/запретить Java и разрешить/запретить JavaScript

Есть готовые здесь: http://xsms.nm.ru/custombuttons/en/ - последние две в самом низу страницы.

одна кнопка - разрешить/запретить всплывающие окна

Вот:

Код:

var ps = Components. classes ['@mozilla.org/preferences-service;1'].
     getService (Components. interfaces. nsIPrefBranch);
var state = ps. getIntPref ("privacy.popups.disable_from_plugins");
switch (state)
{
    case 3:
        ps. setCharPref ("dom.popup_allowed_events", "change click dblclick mouseup reset submit");
        ps. setIntPref ("privacy.popups.disable_from_plugins", 0);
        this. image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUA//////8AAAAA/wCgg87HAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfVDAoRIQMsGKdHAAAAKklEQVR42mNgQANaqxqghP7/Bgau9TCCMx9EZAElOEMjGJAIrlUrkLQDAHhSD9klS8gFAAAAAElFTkSuQmCC";
        break;
    case 0:
        ps. setCharPref ("dom.popup_allowed_events", "");
        ps. setIntPref ("privacy.popups.disable_from_plugins", 3);
        this. image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUA//////8AAAD/AACNPwdYAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfVDAoRIRJGqIe1AAAAKklEQVR42mNgQANaqxqghP7/Bgau9TCCMx9EZAElOEMjGJAIrlUrkLQDAHhSD9klS8gFAAAAAElFTkSuQmCC";
        break;
}

Anton
Огромное спасибо! Теперь Firefox стал еще приятнее :)

А что нужно прописать в кнопке, чтобы открыть нужную папку? (на программы такой код видел а вот на папки нет :()

Najlus написал:

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

Код:

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 ("c:\\windows\\explorer.exe", "c:\\temp\\");

Не забывая про двойные слеши, в последней строчке вместо "c:\\temp\\" указываем нужный путь и, если необходимо, уточняем путь к explorer.exe.

Не работает с папками с русским названием =( а мне именно с русским надо (у мя там куча торрентов на раздаче стоит, опять искать - дело неблагодарное)

Najlus написал:

Не работает с папками с русским названием

Тогда в последней строке так:

Код:

startProcess ("c:\\Новая папка\\", "");

Спасибо Антон, всё работает =)

Антон, извини что надоедаю, у меня проблема с переключением профилей без перезагрузки. Вот код:

/*CODE*/
var _href = null; // URL or null for use current page
var _paths = ["e:\\Program Files\\Mozilla Firefox\\firefox.exe", "e:\\Program Files\\Mozilla Firefox\\firefox.exe"];
var _args = [["-no-remote", "-p", "Default"], ["-no-remote", "-p", "experementals"]];
var _labels = ["Default", "experementals"];

this.runProcess = function(path, args) {
    args.push(_href ? _href : content.location.href);
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath(path);
    if(!file.exists() || !file.isExecutable() || /\.lnk$/i.test(path)) {
        alert("Invalid path!\n" + path);
        return;
    }
    var process = Components.classes["@mozilla.org/process/util;1"]
        .getService(Components.interfaces.nsIProcess);
    process.init(file);
    process.run(false, args, args.length);
};
var mp = document.createElement("menupopup");
var template = document.createElement("menuitem");
template.className = "menuitem-iconic";
template.setAttribute("oncommand", "_this.runProcess(this.path, this.args);");
var mi;
for(var i = 0, len = _paths.length; i < len; i++) {
    mi = template.cloneNode(true);
    mi.path = _paths[i];
    mi.args = _args[i];
    mi.label = _labels[i];
    mi.tooltipText = _paths[i] + " " + _args[i].join(" ");
    mi.setAttribute("image", "moz-icon:file://" + _paths[i]);
    mi._this = this;
    mp.appendChild(mi);
}
this.appendChild(mp);
this.type = "menu";
this.orient = "horizontal";

во первых: список возможно вызвать только после одного щелчка по кнопке (после которого и появляется стрелочка рядом с иконкой).
а во вторых: вместо переключения профиля слева от иконуи появляются квадратики:
http://s59.radikal.ru/i164/0907/b7/b5bc804f4ded.png

Najlus

во первых: список возможно вызвать только после одного щелчка по кнопке

Значит, указанный код находится не в том разделе. Перемести его в раздел "Инициализация". После этого должно "отвалиться" и "во-вторых".

И ещё: неплохо бы заменить строку

.getService(Components.interfaces.nsIProcess);

на

.createInstance(Components.interfaces.nsIProcess);

При попытке перехода выдаёт окно менеджера профилей

Najlus написал:

При попытке перехода выдаёт окно менеджера профилей

Это значит что профиль, на который производится переход, ещё не был создан.

Профили существуют =(

Najlus написал:

Профили существуют =(

Проверь внимательно. Вот в этой строке:

Код:

var _args = [["-no-remote", "-p", "Default"], ["-no-remote", "-p", "experementals"]];

вместо "Default" и "experementals" должны быть названия нужных профилей.
Отсутствие профиля - единственная причина появления менеджера профилей.

Но у меня эти 2 профиля и стоят =(

Najlus написал:

Но у меня эти 2 профиля и стоят =(

Но отсутствие требуемого профиля или (что то же самое) несовпадение имени необходимого профиля с указанным в строке "var _args = ..." - это единственная причина, по которой появляется окно менеджера профилей.
Проверь внимательно. Регистр символов в названии профиля имеет значение. Может, не Default, а default или не experementals, а experimentals ?

Помогите написать скрипт Custom Button, где бы при нажатии кнопки:
1. Закрывалась текущая вкладка;
2. Курсор располагался бы в фокусе контента (типа content.focus()) той вкладки, которая отображается после закрытия бывшей текущей. В смысле клавиши вверх, вниз бы смогли двигать страницу сразу же. При обычном CTRL-F4 работает не всегда.
3. Если осталась только одна вкладка, то нажатие кнопки предотвращало ее закрывание и
4. (это  наверное неосуществимо да и не так обязательно) выводилось бы всплывающее сообщение на другой (secondary) монитор, где и расположен Firefox ("осталась одна вкладка и т.д.") при двухмониторной конфигурации.

vurdalak

1. Закрывалась текущая вкладка;
2. Курсор располагался бы в фокусе контента (типа content.focus()) той вкладки, которая отображается после закрытия бывшей текущей. В смысле клавиши вверх, вниз бы смогли двигать страницу сразу же. При обычном CTRL-F4 работает не всегда.
3. Если осталась только одна вкладка, то нажатие кнопки предотвращало ее закрывание

Если я всё правильно понял, то вот:

Код:

var br = getBrowser ();
if (br. tabContainer. childNodes. length > 1)
{
    br. removeCurrentTab ();
    var fe = br. mCurrentBrowser. focusedElement;
    fe && fe. blur ();
    br. contentDocument. documentElement. focus ();
}

выводилось бы всплывающее сообщение на другой (secondary) монитор, где и расположен Firefox ("осталась одна вкладка и т.д.") при двухмониторной конфигурации.

Могу только предложить (последней или предпоследней строкой)

Код:

custombuttons. alertSlide ("Осталось вкладок: ", br. tabContainer. childNodes. length);

Монитор у меня один, проверить и попробовать ничего не могу.

Все вроде нормально, спасибо
Но custombuttons. alertSlide вызывает сообщение к сожалению на 1-м мониторе.  И если есть возможность хотелось бы большими буквами и по центру экрана ...

vurdalak написал:

Но custombuttons. alertSlide вызывает сообщение к сожалению на 1-м мониторе.  И если есть возможность хотелось бы большими буквами и по центру экрана ...

И рад бы помочь, но моделировать нечем - один монитор у меня.

хотя
может быть, так:

Код:

var br = getBrowser ();
if (br. tabContainer. childNodes. length > 1)
{
    br. removeCurrentTab ();
    var fe = br. mCurrentBrowser. focusedElement;
    fe && fe. blur ();
    br. contentDocument. documentElement. focus ();
}
f (this. id);
function f (bid)
{
    var id = "cbpopup" + bid;
    var p = document. getElementById (id);
    if (!p)
    {
        p =    <tooltip xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                 id={id}
                 onpopupshown="setTimeout((function (arg) { return function () {arg. hidePopup ();}})(this), 2000);"/>
        p = new DOMParser (). parseFromString (p. toXMLString (), "application/xml"). documentElement;
        var ps = document. getElementById ("mainPopupSet");
        ps. appendChild (p);
        p. style. fontSize = "x-large";
        p. onpopupshown = "{let THIS = this; setTimeout (function () { THIS. hidePopup (); }, 2);}";
    }
    p. label = "Осталось вкладок: " + br. tabContainer. childNodes. length;
    var pw = p. boxObject. width;
    var ph = p. boxObject. height;
    var x = (window. screen. width - pw) / 2;
    var y = (window. screen. height - ph) / 2;
    p. openPopupAtScreen (x, y, false);
}

?

Теперь работает по центру экрана на другом мониторе :cool:

Сначала надпись была в центре по игреку, но в левом углу по иксу (это касается второго монитора), так как window. screen. width равняется 1280, такое разрешение у 1-го монитора. Если вкупе сложить 2 монитора по иксу то будет 1280+1920=3200
Тоесть 1280 - это начальная точка а дальше уже по формуле (1920 - pw) / 2.

Следовательно я поменял
var x = (window. screen. width - pw) / 2; на
var x = (1920 - pw) / 2 + window. screen. width;

Для полноты кода, надо было бы еще, чтобы  скрипт "знал" window. screen. width второго монитора (которое у меня 1920), да в принципе ладно и так сойдет

Спасибо

Здравствуйте, у меня такой вопрос, а есть ли возможность сделать кнопку, которая будет брать текущий URL и favicon и создавать новую кнопку допустим с названием из <title>? И каким образом можно задать размер иконки?

Господа, что то у меня перестала работать кнопка Backup Custom Buttons. FF 3.0.10, Custom Buttons 0.0.4.3.

Код:

custombutton://%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0443%5D%5B%5D%5Bvar%20docshell%20%3D%20getBrowser%20%28%29.%20webNavigation%3B%0Avar%20doc%20%3D%20docshell.%20document%3B%0Avar%20url%20%3D%20getBrowser%20%28%29.%20currentURI.%20spec%3B%0Avar%20title%2C%20charset%20%3D%20null%3B%0Avar%20description%3B%0Atry%0A%7B%0A%09title%20%3D%20doc.%20title%20%7C%7C%20url%3B%0A%09charset%20%3D%20doc.%20characterSet%3B%0A%09description%20%3D%20BookmarksUtils.%20getDescriptionFromDocument%20%28doc%29%3B%0A%7D%0Acatch%20%28e%29%0A%7B%0A%20%20%20%20title%20%3D%20url%3B%0A%7D%0Avar%20bmroot%20%3D%20RDF.%20GetResource%20%28%22NC%3ABookmarksRoot%22%29%3B%0Avar%20res%20%3D%20BMDS.%20createBookmark%20%28title%2C%20url%2C%20%22%22%2C%20description%2C%20charset%2C%20null%29%3B%0Avar%20sel%20%3D%20BookmarksUtils.%20getSelectionFromResource%20%28res%29%3B%0Avar%20target%20%3D%20BookmarksUtils.%20getTargetFromFolder%20%28bmroot%29%3B%0ABookmarksUtils.%20insertAndCheckSelection%20%28%22newbookmark%22%2C%20sel%2C%20target%29%3B%0Avar%20rds%20%3D%20BMDS.%20QueryInterface%20%28Components.%20interfaces.%20nsIRDFRemoteDataSource%29%3B%0Ards.%20Flush%20%28%29%3B%5D%5Bthis.%20mouseover%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20oldimage%20%3D%20this.%20image%3B%0A%09this.%20image%20%3D%20%22file%3A///H%3A/redicon.png%22%3B%0A%7D%0Athis.%20mouseout%20%3D%20function%20%28event%29%0A%7B%0A%09this.%20image%20%3D%20this.%20oldimage%3B%0A%7D%0Athis.%20setAttribute%20%28%22onmouseover%22%2C%20%22this.%20mouseover%28%29%22%29%3B%0Athis.%20setAttribute%20%28%22onmouseout%22%2C%20%22this.%20mouseout%28%29%22%29%3B

Проверьте плиз

Sloopka

есть ли возможность сделать кнопку, которая будет брать текущий URL и favicon и создавать новую кнопку допустим с названием из <title>?

Так пойдёт:

Код:

var doc = getBrowser (). contentDocument;
var title = doc. title;
var pageURI = makeURI (doc. location. href, null, null);
var iconData = getFaviconData (pageURI);
custombuttons. cloneButton (this);
var newButtonLink = custombuttons. makeButtonLink ("update", this. nextSibling. id);
var params = custombuttons. cbService. getButtonParameters (newButtonLink). wrappedJSObject;
params. image = iconData;
params. name = title;
params. code = "loadURI (\"" + doc. location. href + "\");";
params. wrappedJSObject = params;
custombuttons. cbService. installButton (params);
function makeURI (aURL, aOriginCharset, aBaseURI)
{
    var ioService = Components. classes["@mozilla.org/network/io-service;1"].
            getService (Components. interfaces. nsIIOService);
    return ioService. newURI (aURL, aOriginCharset, aBaseURI);
}
function getFaviconData (pageURI)
{
    var fis = Components. classes ["@mozilla.org/browser/favicon-service;1"].
          getService(Components.interfaces.nsIFaviconService);
    var iconURL = fis. getFaviconForPage (pageURI);
    return fis. getFaviconDataAsDataURL (iconURL);
}

?

И каким образом можно задать размер иконки?

Можно так:

Код:

var elt = document. getAnonymousElementByAttribute (this, "class", "toolbarbutton-icon");
elt. style. height = "100px";
elt. style. width = "100px";

3Jlou

...перестала работать кнопка Backup Custom Buttons

Код:

custombutton://...

...

Это не кнопка "Backup Custom Buttons". Это кнопка "Добавить закладку". Что именно не работает ?

Нашёл у себя какую-то из Backup кнопок, действительно не работает - в 0.0.4.3 отсутствует функция custombuttons. getButtonById.
Пока не выйдет новая версия можно добавить в код кнопки

Код:

custombuttons. getButtonById = function (num)
{
    return document. getElementById ("custombuttons-button" + num);
}

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

Anton

Спасибо огромнейшее=))

А как сделать кнопки перехода вперёд\назад (только без этой ненужной стрелочки сбоку). А то дефлорные в стиль както не вписываются =)

Najlus написал:

как сделать кнопки перехода вперёд\назад

http://custombuttons.mozdev.org/drupal/ … n-buttons/

При установке в
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.1pre) Gecko/20090714 Shiretoko/3.5.1pre
вместо «Button Help» получается XML-мусор.

Сделал новый профиль. Не воспроизводится. Странно. *ковыряет расширения*

Infocatcher написал:

При установке в
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.1pre) Gecko/20090714 Shiretoko/3.5.1pre
вместо «Button Help» получается XML-мусор.

bug #351043, в 3.6 уже поправили : )

Кстати, это не мусор был - разэскейпленная custombutton:// кнопки 'open google page'. Наверное, тестировал help, забыл и размножил.

Спасибо.

Т.е. страничка уже изменилась? (О вреде безлимитных интернетов, ага.)

14-07-2009 23:13:39
Таки информация о странице кажет, что изменилась как раз в районе создания нового профиля.

14-07-2009 23:20:40
Странно.
Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11
Код:

Код:

var pId = "browser.tabs.warnOnClose";
var woc = navigator.preference(pId);
navigator.preference(pId, false);
var appStartup = Components.interfaces.nsIAppStartup;
if(canQuitApplication())
    Components.classes["@mozilla.org/toolkit/app-startup;1"]
        .getService(appStartup)
        .quit(appStartup.eForceQuit | appStartup.eRestart);
navigator.preference(pId, woc);

(Это были пляски с бубном в районе Session Manager'а. Оно, вроде, работает, и я не трогаю. =))

Делаем кнопку, копируем ее код в буфер. Открываем полученное из адресной строки (кликаем средней кнопкой мыши по фавиконке). И видим:

Кнопка не может быть создана, потому что содержит ошибки!

14-07-2009 23:22:26
Ага, и
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.1pre) Gecko/20090714 Shiretoko/3.5.1pre
о том же вещает (ну, только на буржуйском).

14-07-2009 23:28:42
Хммм, кажись, не в коде кнопки дело, а в некорректном копировании.

14-07-2009 23:38:27
Почему-то на некоторых профилях (на новом всё Ok) у меня копируется вот в таком виде:

Код:

custombutton://&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;custombutton xmlns:cb=&quot;http://xsms.nm.ru/custombuttons/&quot;&gt;
  &lt;name&gt;alert&lt;/name&gt;
  &lt;image&gt;&lt;![CDATA[custombuttons-stdicon-1]]&gt;&lt;/image&gt;
  &lt;mode&gt;0&lt;/mode&gt;
  &lt;initcode&gt;&lt;![CDATA[/*Initialization Code*/]]&gt;&lt;/initcode&gt;
  &lt;code&gt;&lt;![CDATA[alert(0);]]&gt;&lt;/code&gt;
  &lt;accelkey&gt;&lt;![CDATA[]]&gt;&lt;/accelkey&gt;
  &lt;help&gt;&lt;![CDATA[]]&gt;&lt;/help&gt;
  &lt;attributes/&gt;
&lt;/custombutton&gt;

Infocatcher написал:

на некоторых профилях (на новом всё Ok) у меня копируется вот в таком виде:

Так поделись конфигами.

Конфликт с расширением Firediff.

15-07-2009 00:02:27

Anton написал:

Так поделись конфигами.

Пухлые конфиги были. Что для 3.0, что для 3.5.1pre.

15-07-2009 00:07:50
Йомайо...

Код:

function escape(s) {
    var n = s;
    n = n.replace(/&/g, "&amp;");
    n = n.replace(/</g, "&lt;");
    n = n.replace(/>/g, "&gt;");
    n = n.replace(/"/g, "&quot;");

    return n;
}

overlay chrome://firebug/content/firebugOverlay.xul         chrome://firediff/content/firediff.xul
=> firediff@johnjbarton.com\content\firediff\firediff.xul
=> firediff@johnjbarton.com\content\firediff\jsdiff.js

15-07-2009 00:10:06
И

Код:

top.opener.escape

из консоли ошибок это подтверждает.

Ок, завтра буду смотреть. Видимо, придётся escape-ить в сервисе.

Anton написал:

Ок, завтра буду смотреть. Видимо, придётся escape-ить в сервисе.

Нужно стучать по голове автору за кривую подмену стандартной глобальной функции. =/
Потому как js позволяет много чего переназначить.

Антон, возможно слишком сложно, но было бы полезно. Нужна кнопка: при перетаскивании на неё вкладки сама вкладка закрывается, а в кнопке, в выпадающем списке появляется закладка с названием из заголовка. Удаляется закладка правым щелчком мыши. При открытии закладки (как в текущей, так и в новой вкладке) соответствующая закладка удаляется из списка кнопки.

Najlus
В качестве возможной альтернативы можно посмотреть на
Link Pad и Netscape Link Pad

Infocatcher написал:

Najlus В качестве возможной альтернативы можно посмотреть наLink Pad и Netscape Link Pad

Не айс (с).
Во первых: иконка висит в трее, а тянуть вкладку на эту маленькую кнопочку не сказать чтоб удобно (ибо та, которая на тулбар идёт напрочь отказывается добавлять в закладки).
Во вторых: список открывается в боковой панели и без иконок.
А в третьих: добавленная вкладка не закрывается =(

Najlus
Если надо сохранять "закладки" между перезапусками браузера, то я - пас.
Если достаточно хранения в пределах сесси - сделаю.

Ну тогда Taboo или Ридлейтер (Read it Later)

19-07-2009 17:01:54
Anton, Вы разбираетесь... скажите, сложно было бы сделать
-------------
Аддон должен определять, какие темы установлены, и какая сейчас активна.
В зависимости от того, какая тема активна, он должен подключать в userChrome.css указанные стили.
Плюс диалоговые окна Добавить стиль и Включить стили для конкретных тем. По умолчанию все выключены для всех тем.
Что-то типа

Код:

[v] аддон включен
Стили:       Default scrollbars [v]  | Default buttons [v]        | Large statusbar [v] ...
Default      [_]                     | [_]                        | [_]                           [откл. все]
MuraCom      [v]                     | [_]                        | [_]                           [откл. все]
IdioticDark  [_]                     | [_]                        | [_]                           [откл. все]
FourDots     [_]                     | [v]                        | [v]                           [откл. все]
EyesClosed   [v]                     | [v]                        | [v]                           [откл. все]
[+ новый стиль]
[turn searchbar icon on ][V] [+ добавить]

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

Najlus
В раздел "Инициализация":

Код:

var menu =
<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
       onclick="this. parentNode. openTab (event);"/>
menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
this. orient = "horizontal";
this. appendChild (menu);

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
};

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    var label = tab. label;
    var br = getBrowser ();
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
    var menu = this. getElementsByTagName ("menupopup") [0];
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("url", url);
    menu. appendChild (mi);
    this. type = "menu";
};

this. openTab = function (event)
{
    var mi = event. target;
    var url = mi. getAttribute ("url");
    if (event. button < 2)
    {
        if (event. button == 0)
            getBrowser (). loadURI (url, null, null);
        else
            getBrowser (). addTab (url);
        menu. hidePopup ();
    }
    this. deleteMenuitem (mi);
};

this. deleteMenuitem = function (menuitem)
{
    var menu = menuitem. parentNode;
    menu. removeChild (menuitem);
    if (menu. childNodes. length == 0)
    {
        menu. hidePopup ();
        this. type = "";
    }
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");

Al_H

В зависимости от того, какая тема активна, он должен подключать в userChrome.css указанные стили.
Плюс диалоговые окна Добавить стиль и Включить стили для конкретных тем. По умолчанию все выключены для всех тем.

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

Anton написал:

В раздел "Инициализация"...

Спасибо =) то, что надо =)

Если надо сохранять "закладки" между перезапусками браузера, то я - пас.

Жаль =(
Понимаю конечно что слишком много, но вы можете сделать подобную кнопку для расширения etscape Link Pad, чтоб и между сессиями сохранялось (а то малоли там сбой или ещё что)

Anton написал:

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

С удовольствием. Есть аддон Stylish. Он фактически предоставляет интерфейс к двум сервисам - встроенным userChrome.css и userContent.css (которые, как Вы знаете, позволяют модифицировать внешний вид браузера и сайтов, соответственно, причем, начиная с версии 1.5, еще и специфично для URL или домена), плюс службы userstyles, таковые стили распространяющей.
Есть аддоны для модификации конкретных тем, например, Two Dimensions (работает), Whitehart (встроен в саму тему, и работает), Foxdie (отвратительно работает, или не работает вообще).
Есть темы. Темы бывают совместимыми и несовместимыми. Это-то меня и не устраивает. Где-то 4%-6% тем имеют серьезные дефекты в конструкции. Остальные несовместимы только потому, что отдельные их элементы не обновлены под гайдлайны для разработки тем именно 3.5, а не 3.0, либо под разные ОСьки, а не только под Винду или скажем Мак или Линукс. Или же проблемы с поддержкой Locationbar2, Fission, аддонов для панели вкладок. Таковая несовместимость приводит ровно к одним и тем же ошибкам (невидимые полоски прокрутки, неформатные окна, съехавшие поля адреса и поиска, и так далее). Кроме того, некоторые девелоперы лучше нас знают, что нам не нужны значки на панели закладок, значок текущей поисковой системы, и так далее.

Собственно, это была вводная. Многое решается при помощи userChrome.css или Stylish. Например, создаем стиль, и заставляем вернуться назад иконку поисковой машины. Таких стилей в сумме может быть 12-25. Осталось решить две проблемы. 1. использование ресурсов из другой темы, и прежде всего, из дефолтной. Это позволит более полно подменять дефектный код - например, включить полоску прокрутки как в теме по умолчанию, и не мучиться. Вторая проблема - эти хаки необходимы только там, где они необходимы, а повесить в стиль детектор активной темы на данный момент не представляется возможным встроенными средствами. То есть, как только Вы переключили тему (ну, не Вы, а я, Вы их не используете), необходимо слазить за бумажкой, по ней свериться, и отключить ненужные стили, и включить необходимые. Вот для решения двух этих проблем необходим аддон.
Можно, например, в элемент верхнего уровня добавлять параметр currenttheme="Theme_Name_in_Latin_Without_Garbage_Characters". Но тогда придется модифицировать каждый из этих стилей ради каждой темы. В идеале хотелось бы менеджер стилей, позволяющий быстро проставить флажки для тех пар тема-стиль, для которых необходимо, и налету подключающий при запуске браузера только стили, относящиеся к данной теме. Или еще вариант, это может быть надстройка над Stylish, как Stylish-Custom.

Najlus
Так:

Код:

var path = "c:\\tabbookmarks.xml";

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    var label = tab. label;
    var br = getBrowser ();
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
    this. addMenuitem (label, url);
};

this. addMenuitem = function (label, url)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("url", url);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu ();
};

this. deleteMenuitem = function (menuitem)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    menu. removeChild (menuitem);
    if (menu. getElementsByTagName ("menuitem"). length == 0)
    {
        menu. hidePopup ();
        this. type = "";
    }
    this. flushMenu ();
};

this. flushMenu = function ()
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. openTab = function (event)
{
    var mi = event. target;
    var menu = mi. parentNode;
    var url = mi. getAttribute ("url");
    if (event. button < 2)
    {
        if (event. button == 0)
            getBrowser (). loadURI (url, null, null);
        else
            getBrowser (). addTab (url);
        menu. hidePopup ();
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();

пойдёт ?
Код в раздел "Инициализация", в первой строке можно поправить путь к файлу, где будут храниться "закладки".

Al_H
Если сделаю, то не скоро - надо ознакомиться с предметной областью. Попробую разобраться в течение следующей недели.

Спасибо большое заранее!
Если нужно, помогу, чем смогу. Например, могу дать примеры стилей.

Anton написал:

Есть аддон Stylish.....Есть аддоны для модификации конкретных тем....

Al_H, Anton
может будет интересно покопаться ещё в AnyColor и Настройки Классической Компактной темы :)

Anton написал:

Код в раздел "Инициализация", в первой строке можно поправить путь к файлу, где будут храниться "закладки".

На правах развлекательства:

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    var label = tab. label;
    var image = tab. image;
    var br = getBrowser ();
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
    this. addMenuitem (label, url, image);
};

this. addMenuitem = function (label, url, image)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("url", url);
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu ();
};

this. deleteMenuitem = function (menuitem)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    menu. removeChild (menuitem);
    if (menu. getElementsByTagName ("menuitem"). length == 0)
    {
        menu. hidePopup ();
        this. type = "";
    }
    this. flushMenu ();
};

this. flushMenu = function ()
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. openTab = function (event)
{
    var mi = event. target;
    var menu = mi. parentNode;
    var url = mi. getAttribute ("url");
    if (event. button < 2)
    {
        if (event. button == 0)
            getBrowser (). loadURI (url, null, null);
        else
            getBrowser (). loadOneTab(url, null, null, null, false /*load in background*/, false);
        menu. hidePopup ();
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();

+ путь относительно профиля
+ иконки у «закладок»
+ ссылки во всплывающих подсказках
+ переключение на открываемую вкладку (см. /*load in background*/)

Anton написал:

NajlusТак:Код...
пойдёт? Код в раздел "Инициализация", в первой строке можно поправить путь к файлу, где будут храниться "закладки".

Спасибо огромное =)

Infocatcher написал:

На правах развлекательства:Код...
+ путь относительно профиля
+ иконки у «закладок»
+ ссылки во всплывающих подсказках
+ переключение на открываемую вкладку (см. /*load in background*/)

Тоже огромное спасибо =) особенно за иконки =) Правда переключение на открываемую вкладку отключил, но всёравно спасибо =)

Вам памятник ставить нужно =)
Надо будет как нить разобраться и сделать из этой кнопки расширение, думаю многим будет полезно.

Спасибо, Крошка Ру. Пока что не планирую научиться писать расширения. Думаю, копаться интересно в The Extra Dimension https://addons.mozilla.org/en-US/firefox/addon/12296

Хотелось бы посредством Custom Buttons привязать к портабельному фоксу портабельный менеджер загрузки (например Orbit Downloader). Мысль такая: папка PortableOrbitdownloader находится в папке FirefoxPortable, при перетаскивании ссылки на кнопку должен запускаться орбит и начинать закачку, нажатие ЛКМ на кнопку просто запускает орбит. Путь к менеджеру загрузки высчитывается относительно папки с профилем ФФ. Возможно ли реализовать подобное?

Орбит+portable можно качнуть тут: _http://rapidshare.com/files/253833769/OrbitDownloaderSetup.rar

3Jlou

3Jlou написал:

при перетаскивании ссылки на кнопку должен запускаться орбит и начинать закачку

Мне не удалось найти ключа командной строки для Orbit, который бы указывал ему начинать закачку сразу же, без показа диалогового окна. (Да и вообще никаких ключей командной строки не нашел).
Все остальное:
В раздел "Инициализация":

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\orbit\\orbitdm.exe";

this. runOrbit = function (url)
{
    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);
    process. init (file);
    if (!this. pid)
        this. pid = [];
    this. pid. push (process. run (false, url && [url]|| null, url && 1 || 0));
};

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/plain", 0);
    if (!url)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/plain", 0);
    if (url)
        this. runOrbit (url);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");

В раздел "Код":

Код:

this. runOrbit ("");

Anton, огромное спасибо, то что надо, всё работает,но только при передаче ссылки напрямую orbitdm.exe, если же прописать в коде путь к лоадеру, то "лодырь" не передает ссылку орбиту, так что придётся отказаться от портабельной версии Орбита, попробую Download Master, он вроде без кривых лодырей портабится

--------------------------------------------------------

позволю себе запостить ещё 1 просьбу: пользую кнопку, открывающую в нижней панели всякую всячину (дополнения, журнал, загрузки и т.д...), работала на лисе 3.0.10 и Custom Buttons 0.0.3.9, после обновления лиса до 3.5.1 и CB 0.0.4.3, работать перестала - открывает пустую панель, поправьте пожалуйста:

Код:

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%u041D%u0438%u0436%u043D%u044F%u044F%20%u043F%u0430%u043D%u0435%u043B%u044C%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABxUlEQVR4XqWRP2oVURSHvztzXyZg/ENiZ2NjOsUtCHYuQndh4QIs3YCbsLBRwQUIgpViIQQFQdTE5M2bNzPnj+cy7zGFgRT+4OM7d5hzONybbj89enVwrbkngzO0wtBpEF7N9bgOr5SxG5HesF5wWePd0dt0//nP9d3D/ebkBJan0LZwVhwsC2ewCrpgHWdrAQcMaF/2eX83jbf2aE6BdRNcDq5Ctw534dXGhRaGHsyhwvn8IY/58MB5dAfcAcK2MYDPtRmoGmqKidMs4OGTilwDi4o5NefG3RFxzILsNDXkysmYclFKk4iFDdVpSAWohvWCfndH1cIW3g5RrOBGFjF+LwcS6fy1tWBTg3kxGl7UMIqSv/5oefbiGHX+SUrz0Lmciku7Fcetkm9c3+Xxg5uMNk9wKxjmHiZsQVgddwvgyo7x7s1Hcq5gr6mYA5ijmhDV0oSaIhIm8Onb2AcG2efdcWd704EhYrgXl/OMmYNPVME2mG1/sOLtC2ybwrZxYIYDuQ5Nceo6SAZiaA6JYmlaXcxY4NMTVrCTy0sk8uv3v+Tb9z/Sr0ZkEKQfkHEMK1o8FAQVAQdnSl0lPn05keTu/E/+ApLnoYXyGb2zAAAAAElFTkSuQmCC%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.bottomPanel%20%3D%20function%28aURL%29%20%7B%0A%20%20var%20prefBranch%20%3D%20%22custombuttons.bottomPanel.%22%0A%0A%20%20if%28%21aURL%20%26%26%20aURL%20%21%3D%20%22%22%29%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20aURL%20%3D%20gPrefService.getCharPref%28prefBranch%20+%20%22url%22%29%3B%0A%20%20%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20%20%20aURL%20%3D%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20if%28aURL%20%3D%3D%20%22%22%29%20return%3B%0A%0A%20%20if%28aURL%20%3D%3D%20gURLBar.value%20%26%26%20%21aURL.match%28/%5E%5Cw+%3F%5C%3A/%29%29%20aURL%20%3D%20%22http%3A//%22%20+%20aURL%3B%0A%0A%20%20var%20panelID%20%3D%20%22bottom-panel%22%3B%0A%20%20var%20gPanel%20%3D%20document.getElementById%28panelID%29%3B%0A%20%20var%20height%3B%0A%20%20try%20%7B%0A%20%20%20%20height%20%3D%20gPrefService.getIntPref%28prefBranch%20+%20%22height%22%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%20%20height%20%3D%20300%3B%0A%20%20%7D%0A%0A%20%20if%28gPanel%29%20%7B%0A%0A%20%20%20%20var%20src%20%3D%20gPanel.firstChild.nextSibling.getAttribute%28%22src%22%29%3B%0A%20%20%20%20if%28aURL%20%21%3D%20src%29%20%7B%0A%20%20%20%20%20%20gPanel.firstChild.nextSibling.setAttribute%28%22src%22%2C%20aURL%29%3B%0A%20%20%20%20%20%20//gPanel.firstChild.nextSibling.loadURI%28aURL%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20gPrefService.setIntPref%28prefBranch%20+%20%22height%22%2C%20gPanel.height%29%3B%0A%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel.previousSibling%29%3B%0A%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%7D%20else%20%7B%0A%0A%20%20%20%20var%20appContent%20%3D%20document.getElementById%28%22appcontent%22%29%3B%0A%0A%20%20%20%20var%20spl%20%3D%20appContent.appendChild%28document.createElement%28%22splitter%22%29%29%3B%0A%20%20%20%20%20%20%20%20spl.setAttribute%28%22collapse%22%2C%20%22after%22%29%3B%0A%20%20%20%20%20%20%20%20spl.style.border%20%3D%20%22none%22%3B%0A%20%20%20%20%20%20%20%20spl.style.borderTop%20%3D%20%222px%20solid%20threedhighlight%22%3B%0A%20%20%20%20%20%20%20%20spl.setAttribute%28%22onclick%22%2C%20%22this.setAttribute%28%27state%27%2C%20%27%27%29%3B%22%29%3B%0A%0A%20%20%20%20var%20box%20%3D%20appContent.appendChild%28document.createElement%28%22hbox%22%29%29%3B%0A%20%20%20%20%20%20%20%20box.id%20%3D%20panelID%3B%0A%20%20%20%20%20%20%20%20box.height%20%3D%20height%3B%0A%20%20%20%20%20%20%20%20box.orient%20%3D%20%22vertical%22%3B%0A%0A%20%20%20%20var%20tbr%20%3D%20box.appendChild%28document.createElement%28%22toolbar%22%29%29%3B%0A%20%20%20%20%20%20%20%20tbr.setAttribute%28%22fullscreentoolbar%22%2C%20true%29%3B%0A%0A%20%20%20%20var%20spr%20%3D%20tbr.appendChild%28document.createElement%28%22spacer%22%29%29%3B%0A%20%20%20%20%20%20%20%20spr.setAttribute%28%22flex%22%2C%201%29%3B%0A%0A%20%20%20%20var%20btn%20%3D%20tbr.appendChild%28document.createElement%28%22toolbarbutton%22%29%29%3B%0A%20%20%20%20%20%20%20%20btn.style.listStyleImage%20%3D%20%22url%28chrome%3A//global/skin/icons/Minimize.gif%29%22%3B%0A%20%20%20%20%20%20%20%20btn.minimize%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20gPanel%20%3D%20document.getElementById%28%22bottom-panel%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20gPanel.previousSibling.setAttribute%28%22state%22%2C%20%22collapsed%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20btn.setAttribute%28%22oncommand%22%2C%20%22this.minimize%28%29%22%29%3B%0A%0A%20%20%20%20var%20btc%20%3D%20tbr.appendChild%28document.createElement%28%22toolbarbutton%22%29%29%3B%0A%20%20%20%20%20%20%20%20btc.className%20%3D%20%22tabs-closebutton%22%3B%0A%20%20%20%20%20%20%20%20btc.closePanel%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20gPanel%20%3D%20document.getElementById%28%22bottom-panel%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20gPrefService.setIntPref%28prefBranch%20+%20%22height%22%2C%20gPanel.height%29%3B%0A%20%20%20%20%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel.previousSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20gPanel.parentNode.removeChild%28gPanel%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20btc.setAttribute%28%22oncommand%22%2C%20%22this.closePanel%28%29%22%29%3B%0A%0A%20%20%20%20var%20ifr%20%3D%20box.appendChild%28document.createElement%28%22browser%22%29%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22type%22%2C%20%22content%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22flex%22%2C%201%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22src%22%2C%20aURL%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22tooltip%22%2C%20%22aHTMLTooltip%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22onclick%22%2C%20%22return%20contentAreaClick%28event%2C%20true%29%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22autocompletepopup%22%2C%20%22PopupAutoComplete%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22contextmenu%22%2C%20%22contentAreaContextMenu%22%29%3B%0A%20%20%20%20%20%20%20%20ifr.setAttribute%28%22contentcontextmenu%22%2C%20%22contentAreaContextMenu%22%29%3B%0A%20%20%7D%0A%0A%20%20gPrefService.setCharPref%28prefBranch%20+%20%22url%22%2C%20aURL%29%3B%0A%0A%7D%20%20%0A%0A%0Athis.getBookmark%20%3D%20function%28%29%20%7B%0A%20%20var%20appInfo%20%3D%20Components.classes%5B%22@mozilla.org/xre/app-info%3B1%22%5D%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.getService%28Components.interfaces.nsIXULAppInfo%29%3B%0A%20%20var%20isFx2%20%3D%20appInfo.version%20%3D%3D%20%222.0%22%3B%0A%20%20var%20url%20%3D%20%22%22%3B%0A%20%20var%20rv%20%3D%20isFx2%20%3F%20%7B%20urls%3A%20null%2C%20names%3A%20null%20%7D%20%3A%20%7B%20url%3A%20null%20%7D%3B%0A%20%20openDialog%28%22chrome%3A//browser/content/places/places.xul%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%2C%20%22modal%2C%20dialog%3Dno%2C%20minimizable%3Dno%2C%20centerscreen%2C%20resizable%22%2C%20rv%29%3B%0A%0A%20%20if%20%28rv.urls%20%26%26%20rv.names%29%20url%20%3D%20rv.urls%5B0%5D%0A%20%20else%20if%20%28rv.url%29%20%7B%0A%20%20%20%20url%20%3D%20rv.url%3B%0A%20%20%20%20if%20%28url.indexOf%28%22%7C%22%29%20%3E%200%29%0A%20%20%20%20%20%20url%20%3D%20url.split%28%22%7C%22%29%5B0%5D%3B%0A%20%20%7D%0A%20%20return%20url%3B%0A%7D%0A%0A%0Athis.getFile%20%3D%20function%28%29%20%7B%0A%20%20try%20%7B%0A%20%20%20%20const%20nsIFilePicker%20%3D%20Components.interfaces.nsIFilePicker%3B%0A%20%20%20%20var%20fp%20%3D%20Components.classes%5B%27@mozilla.org/filepicker%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28nsIFilePicker%29%3B%0A%20%20%20%20fp.init%28window%2C%20gNavigatorBundle.getString%28%22openFile%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nsIFilePicker.modeOpen%29%3B%0A%20%20%20%20fp.appendFilters%28nsIFilePicker.filterAll%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nsIFilePicker.filterText%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nsIFilePicker.filterImages%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nsIFilePicker.filterXML%20%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nsIFilePicker.filterHTML%29%3B%0A%20%20%20%20if%28fp.show%28%29%20%3D%3D%20nsIFilePicker.returnOK%29%0A%20%20%20%20%20%20return%20fp.fileURL.spec%3B%0A%20%20%20%20else%20return%20%22%22%3B%0A%20%20%7D%20catch%20%28ex%29%20%7B%0A%20%20%7D%0A%7D%0A%0A%0Athis.popupShowing%20%3D%20function%28aNode%29%20%7B%0A%20%20var%20ioService%20%3D%20Components.classes%5B%22@mozilla.org/network/io-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIIOService%29%3B%0A%20%20try%20%7B%0A%20%20%20%20var%20pasteURL%20%3D%20ioService.newURI%28readFromClipboard%28%29%2C%20null%2C%20null%29%3B%0A%20%20%7D%20catch%28ex%29%20%7B%0A%20%20%7D%0A%20%20if%28pasteURL%29%20aNode.lastChild.tooltipText%20%3D%20readFromClipboard%28%29%3B%0A%20%20aNode.lastChild.setAttribute%28%22disabled%22%2C%20%21pasteURL%20%3F%20true%20%3A%20false%29%3B%0A%7D%0A%0A%0Afunction%20addMenuitem%28aLabel%2C%20aURL%2C%20aNode%2C%20aObjString%29%20%7B%0A%20%20var%20mItem%20%3D%20aNode.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20mItem.setAttribute%28%22label%22%2C%20aLabel%29%3B%0A%20%20mItem.setAttribute%28%22oncommand%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aObjString%20+%20%22.bottomPanel%28%27%22%20+%20aURL%20+%20%22%27%29%3B%22%29%3B%0A%7D%0A%0A%0Afunction%20addSeparator%28aNode%2C%20aNum%29%20%7B%0A%20%20var%20separator%20%3D%20aNode.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0A%20%20separator.id%20%3D%20%22bottom-panel-button-separator%22%20+%20aNum%3B%0A%7D%0A%0Avar%20mPopup%20%3D%20document.createElement%28%22menupopup%22%29%3B%0AmPopup.setAttribute%28%22oncommand%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0AmPopup.setAttribute%28%22onpopupshowing%22%2C%20%22this.parentNode.popupShowing%28this%29%22%29%3B%0A%0Avar%20smPopup%20%3D%20document.createElement%28%22menupopup%22%29%3B%0AsmPopup.setAttribute%28%22oncommand%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0Avar%20subMenu%20%3D%20document.createElement%28%22menu%22%29%3B%0AsubMenu.appendChild%28smPopup%29%3B%0AsubMenu.setAttribute%28%22label%22%2C%20%22%u0418%u0437%20%u0431%u043E%u043A%u043E%u0432%u043E%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%22%29%3B%0A%0Avar%20objString%20%3D%20%22this.parentNode.parentNode.parentNode.parentNode%22%3B%0Avar%20viewSidebarMenu%20%3D%20document.getElementById%28%22viewSidebarMenu%22%29%3B%0Avar%20sidebarItems%20%3D%20viewSidebarMenu.childNodes%3B%0Afor%28var%20i%20%3D%200%3B%20i%20%3C%20sidebarItems.length%3B%20i++%29%20%7B%0A%20%20var%20sidebarItem%20%3D%20sidebarItems%5Bi%5D%3B%0A%20%20if%28%28sidebarItem.hasAttributes%28%22sidebarurl%22%29%20%26%26%0A%20%20%20%20%20%20sidebarItem.getAttribute%28%22sidebarurl%22%29%20%21%3D%20%22%22%29%20%26%26%0A%20%20%20%20%20%28sidebarItem.hasAttributes%28%22label%22%29%20%26%26%0A%20%20%20%20%20%20sidebarItem.getAttribute%28%22label%22%29%20%21%3D%20%22%22%29%29%0A%20%20%20%20addMenuitem%28sidebarItem.getAttribute%28%22label%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sidebarItem.getAttribute%28%22sidebarurl%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20smPopup%2C%20objString%29%3B%0A%7D%0A%0AobjString%20%3D%20%22this.parentNode.parentNode%22%3B%0AaddMenuitem%28%22about%3Aconfig%22%2C%20%22about%3Aconfig%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u041A%u043E%u043D%u0441%u043E%u043B%u044C%20%u043E%u0448%u0438%u0431%u043E%u043A%22%2C%20%22chrome%3A//global/content/console.xul%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0430%u043C%u0438%22%2C%20%22chrome%3A//browser/content/places/places.xul%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20Cookies%22%2C%20%22chrome%3A//browser/content/preferences/cookies.xul%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0414%u043E%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u044F%22%2C%20%22chrome%3A//mozapps/content/extensions/extensions.xul%3Ftype%3Dextensions%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0417%u0430%u0433%u0440%u0443%u0437%u043A%u0438%22%2C%20%22chrome%3A//mozapps/content/downloads/downloads.xul%22%2C%20mPopup%2C%20objString%29%3B%0A%0A%0A//DownTHEMall%0Aif%20%28typeof%20DTA_ContextOverlay%20%3D%3D%20%22object%22%29%0A%20%20addMenuitem%28%22DownTHEMall%22%2C%20%22chrome%3A//dta/content/dta/manager.xul%22%2C%20mPopup%2C%20objString%29%3B%0A%0A%0A//Stylish%0Aif%20%28typeof%20stylishCommon%20%3D%3D%20%22object%22%29%20%7B%0A%20%20if%20%28typeof%20stylishCommonOverlay%20%3D%3D%20%22object%22%29%20//if%20Stylish%200.5%0A%20%20%20%20addMenuitem%28%22Stylish%20Manager%22%2C%20%22chrome%3A//stylish/content/manage.xul%22%2C%20mPopup%2C%20objString%29%3B%0A%20%20else%0A%20%20%20%20addMenuitem%28%22Stylish%20Manager%22%2C%20%22chrome%3A//stylish/content/stylish.xul%22%2C%20mPopup%2C%20objString%29%3B%0A%7D%0A%0A%0A//MR%20Tech%20Local%20Install%20-%20My%20Config%0Aif%20%28typeof%20Local_Install%20%3D%3D%20%22object%22%29%0A%20%20addMenuitem%28%22%u041C%u043E%u044F%20%u043A%u043E%u043D%u0444%u0438%u0433%u0443%u0440%u0430%u0446%u0438%u044F%22%2C%20%22chrome%3A//local_install/content/infolister.xul%22%2C%20mPopup%2C%20objString%29%3B%0A%0A%0A//QuickNote%0Aif%20%28typeof%20QuickNote_openQuickNote%20%3D%3D%20%22function%22%29%0A%20%20addMenuitem%28%22QuickNote%22%2C%20%22chrome%3A//quicknote/content/quicknote.xhtml%22%2C%20mPopup%2C%20objString%29%3B%0A%0A%0A//ChromeList%0Aif%20%28typeof%20startChromeEnumerator%20%3D%3D%20%22function%22%29%0A%20%20addMenuitem%28%22%u041F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%20Chrome%22%2C%20%22chrome%3A//chromelist/content/chromelist.xul%22%2C%20mPopup%2C%20objString%29%3B%0A%0A//ChatZilla%0Aif%20%28typeof%20toIRC%20%3D%3D%20%22function%22%29%0A%20%20addMenuitem%28%22ChatZilla%22%2C%20%22chrome%3A//chatzilla/content/chatzilla.xul%22%2C%20mPopup%2C%20objString%29%3B%0A%0A%0AaddSeparator%28mPopup%2C%200%29%3B%0A%0Avar%20homePages%20%3D%20gHomeButton.getHomePage%28%29.split%28%22%7C%22%29%3B%0Avar%20homePage%20%3D%20homePages%5B0%5D%3B%0A%0AaddMenuitem%28%22%u0414%u043E%u043C%u0430%u0448%u043D%u044F%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%22%2C%20homePage%2C%20mPopup%2C%20objString%29%3B%0A%0AaddMenuitem%28%22%u0422%u0435%u043A%u0443%u0449%u0430%u044F%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%22%2C%20%22%27%20+%20content.location.href%20+%20%27%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0418%u0441%u0445%u043E%u0434%u043D%u044B%u0439%20%u043A%u043E%u0434%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%22%2C%20%22view-source%3A%27%20+%20content.location.href%20+%27%22%2C%20mPopup%2C%20objString%29%3B%0A%0AaddSeparator%28mPopup%2C%201%29%3B%0A%0AmPopup.appendChild%28subMenu%29%3B%0AaddMenuitem%28%22%u0418%u0437%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0438%22%2C%20%22%27%20+%20gURLBar.value%20+%20%27%22%2C%20mPopup%2C%20objString%29%3B%0A%0A/*%20addMenuitem%28%22%u0418%u0437%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%22%2C%20%22%27%20+%20this.parentNode.parentNode.getBookmark%28%29%20+%20%27%22%2C%20mPopup%2C%20objString%29%3B%20*/%0AaddMenuitem%28%22%u0418%u0437%20%u0444%u0430%u0439%u043B%u0430%22%2C%20%22%27%20+%20this.parentNode.parentNode.getFile%28%29%20+%20%27%22%2C%20mPopup%2C%20objString%29%3B%0AaddMenuitem%28%22%u0418%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%22%2C%20%22%27%20+%20readFromClipboard%28%29%20+%20%27%22%2C%20mPopup%2C%20objString%29%3B%0A%0Athis.appendChild%28mPopup%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0A%0A%0Athis.style.opacity%20%3D%20%27.65%27%3B%0Athis.setAttribute%28%27onmouseover%27%2C%20%27custombuttons.ButtonBrt%28event%29%3B%27%20%29%3B%0Athis.setAttribute%28%27onmouseout%27%2C%20%27custombuttons.ButtonDim%28event%29%3B%27%20%29%3B%0A%0A%0A//%20this.tooltipText%20+%3D%20%27%27%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.bottomPanel%28%29%3B%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%5Bnull%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E

3Jlou написал:

позволю себе запостить ещё 1 просьбу: пользую кнопку, открывающую в нижней панели всякую всячину (дополнения, журнал, загрузки и т.д...), работала на лисе 3.0.10 и Custom Buttons 0.0.3.9, после обновления лиса до 3.5.1 и CB 0.0.4.3, работать перестала - открывает пустую панель, поправьте пожалуйста:

Firefox 3.5.1, Custom Buttons 0.0.4.3 - из downloads, т. е., тот, который выгружался для общего пользования на amo и mozdev - кнопка работает.

Anton, спасибо, понял, буду искать косяк у себя

P.S. Выяснил причину неработающей кнопки - перестает работать после установки No Script 1.9.5, пытаюсь их "подружить". Может есть какие соображения?

Привет спецы.Вы как то помогли мне,с кнопкой закрытия вкладки.Сейчас очень нужна анлогичная,но для закрытия окна.То есть всплыло окно,которое необходимо закрыть.В частности при выставлении новости,просмотр идет через отдельное окно а не вкладку.Надеюсь что более менее обьяснил суть проблемы :blush:

vv07
Всплывающие окна закрывать не умею, извините.

по поводу кнопки videosafer: вот код

loadURI ("javascript:var%20s=document.createElement('script');s.src='http://videosaver.ru/vs.js?nc='+Math.random();document.body.appendChild(s);void(0);");

Вопрос: а как сделать чтобы вместо этого окношка videosafer'a сразу переправляло на сайт скачки? (ну типо автоматическое нажатие кнопки ОК. а то Вконтакте эта пенлька почемуто ЗА видяху уезжает и так не нажать

Najlus
Попробуй

Код:

var doc = getBrowser (). contentDocument;
var url = 'http://cs.videosaver.ru/get/?url=' + escape (doc. location);
var ps = "x=78&y=89&VideoSaverDoc=" + escape (doc. body. innerHTML);
var ss = Components. classes ["@mozilla.org/io/string-input-stream;1"].
     createInstance (Components. interfaces. nsIStringInputStream);
if ("data" in ss)
    ss. data = ps;
else
    ss. setData (ps, ps. length);

var pd = Components. classes ["@mozilla.org/network/mime-input-stream;1"].
     createInstance (Components. interfaces. nsIMIMEInputStream);
pd. addHeader("Content-Type", "application/x-www-form-urlencoded");
pd. addContentLength = true;
pd. setData (ss);
loadURI (url, makeURI (doc. location. href), pd, false);

Спасибо =) а сделать автоматическую скачку и возврат к странице с видео никак? =))))))

Здоровья всем.
Больше 4 лет пользуюсь ФФ, но только сейчас решил попробовать custom buttons. Из CB и CB2, выбрал первый.
Кодинга, к сожалению, не знаю. Поэтому извиняюсь за массу и глупость вопросов :)

Вопросы по конкретным кодам.
1. Сделал кнопку для "Block Site" https://addons.mozilla.org/en-US/firefox/addon/3145 с вашим кодом (пост #786 http://forum.mozilla-russia.org/viewtop … 88#p305388).
Спасибо, отличная вещь. Но можно ли усовершенствовать код, чтобы плагин блокировал весь сайт, а не только открытую страничку (пока приходится вручную добавлять "*" после доменной зоны нежелательного портала). А еще лучше, если бы, рядом была стрелка с выпадающим меню, где была бы возможность определить до какого уровня блокировать, а нажатие на саму кнопку - блокировало бы весь сайт целиком.

2. Использую расширение "Brief" https://addons.mozilla.org/en-US/firefox/addon/4578, как RSS агрегатор. Хотелось бы чтобы открывающая его кнопка одновременно закрывала боковую панель AiOS (но не блокировала). Просто у Брифа есть собственная боковая панель, которая в AiOS не интегрируется (и ненужно). Восстановление панели после закрытия Брифа тоже не требуется

3. Не получилось сделать работающую кнопку для добавления текущей страницы в проект Offline Explorerа. Родное метапродуктовское расширение позволяет это сделать только из контекстного меню. Самодельная кнопка запускает Оффлайн Эксплорер и создает пустой проект, а url текущей страницы в него не вставляет.
Тупо использовал код, вытащенный MenuManipulator из контекстного:

Код:

MPContext.OEDownload(event);

Как правильно?

25-07-2009 12:03:47
Вопросы по визуальному отображению кнопок.
Почему стандартные Файерфоксовские "вперед-назад" onmouseover "подсвечиваются" строго по форме рисунка кнопки, а все остальные (включая другие стандартные) - прямоугольным боксом?
http://s12.radikal.ru/i185/0907/4f/96df64f78f80.gif
Можно ли это реализовать в CB для других кнопок?
Можно ли как-то регулировать позицию рисунка на кнопке?
Например:
Кнопка «Snap Back»:
http://s14.radikal.ru/i187/0907/0d/5768b53d42ff.png
Я бы хотел ее прижать к основным стрелкам – вот так:
http://i056.radikal.ru/0907/e1/990eb19af99f.png
Как убрать вот это поле справа?
http://i005.radikal.ru/0907/72/9c6c2dff320e.png

25-07-2009 12:04:31
Firefox 3.0.11, Win XP
Заранее благодарен за все разумные ответы ))

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

Najlus

а сделать автоматическую скачку и возврат к странице с видео никак?

никак

А по поводу второго вопроса (пост 927)?

Najlus

А по поводу второго вопроса (пост 927)?

Я сейчас занимаюсь вопросами razoo
Как закончу, займусь твоим.

razoo написал:

2. Использую расширение "Brief" https://addons.mozilla.org/en-US/firefox/addon/4578, как RSS агрегатор. Хотелось бы чтобы открывающая его кнопка одновременно закрывала боковую панель AiOS (но не блокировала). Просто у Брифа есть собственная боковая панель, которая в AiOS не интегрируется (и ненужно). Восстановление панели после закрытия Брифа тоже не требуется

Секция «код»:

Код:

if(this.isBriefOpen())
    gBrowser.removeTab(gBrief.tab);
else {
    try { toggleSidebar(); }
    catch(e) {}
    gBrief.open(gBrief.shouldOpenInNewTab());
}

Секция «инициализация»:

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";
this.type = "checkbox";
this.isBriefOpen = function() {
    return gBrief.tab == gBrowser.selectedTab;
};
this.updState = function() {
    this.checked = this.isBriefOpen();
};

if(gBrief.onTabLoad.toString().indexOf("var ret = _onTabLoad.apply(this, arguments);") != -1)
    return;

var _onTabLoad = gBrief.onTabLoad;
var _onTabSelect = gBrief.onTabSelect;
var _this = this;
gBrief.onTabLoad = function() {
    var ret = _onTabLoad.apply(this, arguments);
    _this.updState();
    return ret;
};
gBrief.onTabSelect = function() {
    var ret = _onTabSelect.apply(this, arguments);
    _this.updState();
    return ret;
};

Если нужно поставить свою картинку, строку

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";

нужно убрать.

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

razoo написал:

Маленький недочет - если закрыть таб с "Брифом" кнопкой закрытия таба, а не той, которую сделали - то отображение нашей (custom) останется нажатой.

Не должно бы. А оригинальная кнопка правильно меняет «нажатость»?

Можно вот так попробовать (вместо предыдущего кода для раздела «инициализация»):

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";
this.type = "checkbox";
this.isBriefOpen = function() {
    return gBrief.tab == gBrowser.selectedTab;
};
this.updState = function() {
    this.checked = this.isBriefOpen();
};
this.updState();

if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1)
    return;

var _cb_onTabLoad = gBrief.onTabLoad;
var _cb_onTabSelect = gBrief.onTabSelect;
var _cb_this = this;
gBrief.onTabLoad = function() {
    var ret = _cb_onTabLoad.apply(this, arguments);
    _cb_this.updState();
    return ret;
};
gBrief.onTabSelect = function() {
    var ret = _cb_onTabSelect.apply(this, arguments);
    _cb_this.updState();
    return ret;
};

+ теперь устанавливается правильное состояние при создании кнопки.

А вот правильно работать, возможно, будет только в новых окнах (или после перезапуска).


Без изменения состояния кнопки (только секция «код»):

Код:

if(gBrief.tab == gBrowser.selectedTab)
    gBrowser.removeTab(gBrief.tab);
else {
    try { toggleSidebar(); }
    catch(e) {}
    gBrief.open(gBrief.shouldOpenInNewTab());
}

razoo

1. Сделал кнопку для "Block Site" https://addons.mozilla.org/en-US/firefox/addon/3145 с вашим кодом (пост #786 http://forum.mozilla-russia.org/viewtop … 88#p305388).
Спасибо, отличная вещь. Но можно ли усовершенствовать код, чтобы плагин блокировал весь сайт, а не только открытую страничку (пока приходится вручную добавлять "*" после доменной зоны нежелательного портала). А еще лучше, если бы, рядом была стрелка с выпадающим меню, где была бы возможность определить до какого уровня блокировать, а нажатие на саму кнопку - блокировало бы весь сайт целиком.

В раздел "Код":

Код:

var url = getBrowser (). contentDocument. location. href;
url = url. match (/^([a-zA-Z]+:\/\/)?([^\/]+)\/([^?]*)?(.*)$/);
var domain = "";
if (url)
    domain = url [1] + url [2] + "/*";
this. blockURL (this. uriToBlock || domain);
this. uriToBlock = "";

В раздел "Инициализация":

Код:

/*Initialization Code*/
this. clickHandler = function (event)
{
    if (event. button == 2)
        return;
    if (event. originalTarget. nodeName == "toolbarbutton")
        return;
    else if (event. originalTarget. nodeName == "menuitem")
        this. uriToBlock = event. originalTarget. getAttribute ("label");
};

this. blockURL = function (url)
{
    var Cc = Components. classes;
    var Ci = Components. interfaces;
        var NSISSI = Ci. nsISupportsString;
    var blockedWebsitesArray;
    var BlockSitePrefBranch = Cc ["@mozilla.org/preferences-service;1"]. getService (Ci. nsIPrefService). getBranch("BlockSite.");
    if (BlockSitePrefBranch. prefHasUserValue ("locations"))
    {
        blockedWebsitesString = BlockSitePrefBranch. getComplexValue ("locations", NSISSI). data;
        blockedWebsitesArray = blockedWebsitesString. split ("|||");
    }
    else
    {
        blockedWebsitesArray = new Array();
    }
    blockedWebsitesArray. push (url);
    var locationNsIString = Cc ["@mozilla.org/supports-string;1"]. createInstance (NSISSI);
    locationNsIString. data = blockedWebsitesArray. join ("|||");
    BlockSitePrefBranch. setComplexValue ("locations", NSISSI, locationNsIString);
    custombuttons. alertSlide ("Blocked: ", url);
};

this. createMenu = function (event)
{
    var url = getBrowser (). contentDocument. location. href;
    if (event && (event. originalTarget. nodeName != "toolbarbutton"))
        return;
    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++)
        {
            curpath = curpath + path [i] + "/";
            levels. push (domain + curpath);
        }
    }
    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 < levels. length; i++)
    {
        menuitem = <menuitem label={levels [i]}/>
        menu.menuitem[i] = menuitem;
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
        this. type = "menu-button";
    this. orient = "horizontal";
};

this. createMenu (null);

this. setAttribute ("onclick", "this.clickHandler(event)");
this. setAttribute ("onmouseover", "this.createMenu(event,getBrowser().contentDocument.location.href)");

2. Использую расширение "Brief" https://addons.mozilla.org/en-US/firefox/addon/4578, как RSS агрегатор. Хотелось бы чтобы открывающая его кнопка одновременно закрывала боковую панель AiOS (но не блокировала). Просто у Брифа есть собственная боковая панель, которая в AiOS не интегрируется (и ненужно). Восстановление панели после закрытия Брифа тоже не требуется

У меня получилось "корявей" чем у Infocatcher'а (и получилось ли как надо - я не пользователь Brief). Кстати, Infocatcher - спасибо.

Какая строчка кода на это работает?

Вторая в разделе "Инициализация", вроде бы как.

3. Не получилось сделать работающую кнопку для добавления текущей страницы в проект Offline Explorerа. Родное метапродуктовское расширение позволяет это сделать только из контекстного меню. Самодельная кнопка запускает Оффлайн Эксплорер и создает пустой проект, а url текущей страницы в него не вставляет.
Тупо использовал код, вытащенный MenuManipulator из контекстного:

Перед строкой "MPContext.OEDownload(event);" надо добавить

Код:

var url = getBrowser (). contentDocument. location. href;
this. setAttribute ("url", url);

Что касается вопросов по визуальному отображению кнопок.

Можно ли это реализовать в CB для других кнопок?

Скорее всего, можно, но я не настолько знаток css, чтобы "слету" придумать, что там надо записать в "Инициализацию", нужны дополнительные исследования.
Короче, идей пока никаких нет, если появятся - сообщу дополнительно.

Infocatcher
Всё теперь работает корректно )
Причем, действительно, "недочет" с новым кодом пропал после рестарта.
Спасибо )

25-07-2009 22:40:28
Anton
Спасибо, всё и работает отлично и выглядит правильно!

P.S. Уникальная у вас тут оперативность. :)
Думаю, что и с визуальными решениями вы тож разберетесь.

Najlus написал:

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

"Прицеплением" дополнительного пункта меню я заморачиваться не стал.
Вместо этого клик по кнопке открывает весь список на вкладках.
Надо взять вариант кода, который предложил Infocatcher, в разделе "Инициализация" найти и заменить строки

Код:

type = "menu";

на

Код:

type = "menu-button";

В раздел "Код" добавить:

Код:

var menu = this. getElementsByTagName ("menupopup") [0];
var mi = menu. getElementsByTagName ("menuitem");
while (mi. length > 0)
{
    getBrowser (). loadOneTab(mi [0]. getAttribute ("url"), null, null, null, false /*load in background*/, false);
    this. deleteMenuitem (mi [0]);
}

По поводу отображения кнопок.
В стилях для стандартных кнопок:

Код:

-moz-appearance: none;
border: none;

+ другие иконки на
:hover и :hover:active

Реализовать это можно примерно вот так (код записывать в «инициализацию»):

Код:

with(this.style) {
    MozAppearance = "none";
    border = "none";
}
this.onmouseover = function() { this.image = "hover"; };
this.onmouseout = function() { this.image = "normal"; };
this.onmousedown = function() { this.image = "active"; };
this.onmouseup = function() { this.image = "hover"; };

Вместо "normal", "hover" и "active" – должны быть соответствующие картинки.
Только нужно следить, чтобы больше нигде не переназначалось this.on<событие>, иначе нужно править уже имеющийся код.

В качестве демонстрации (с изменением прозрачности вместо картинок):

Код:

with(this.style) {
    MozAppearance = "none";
    border = "none";
}
this.onmouseover = function() { this.style.opacity = "0.8"; };
this.onmouseout = function() { this.style.opacity = "1"; };
this.onmousedown = function() { this.style.opacity = "0.5"; };
this.onmouseup = function() { this.style.opacity = "0.8"; };

25-07-2009 23:02:11
P.S. Случаем API для регистрации CSS-правил не предусмотрено? По-моему, не помешало бы пригодилось бы.
Как примерный вариант – функция получает строку CSS-кода, заменяет все вхождения «%button%» на «#buttonId» и «регистрирует» новый стиль.

25-07-2009 23:14:57
Using the Stylesheet Service

Infocatcher
Ок, буду думать.

Anton написал:

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

Или можно открывать весь список при клике средней кнопкой мыши (по-прежнему в раздел «инициализация»):

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";
var loadInBackground = true;

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    var label = tab. label;
    var image = tab. image;
    var br = getBrowser ();
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
    this. addMenuitem (label, url, image);
};

this. addMenuitem = function (label, url, image)
{
    var menu = this. menu;
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("url", url);
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu (menu);
};

this. deleteMenuitem = function (menuitem)
{
    var menu = this. menu;
    menu. removeChild (menuitem);
    this. checkEmpty (menu);
    this. flushMenu (menu);
};

this. checkEmpty = function (menu)
{
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        return;
    menu. hidePopup ();
    this. type = "";
};

this. flushMenu = function (menu)
{
    menu = menu || this. menu;
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. menu;
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. __defineGetter__
(
    "menu",
    function ()
    {
        return this. getElementsByTagName("menupopup") [0];
    }
);

this. openTab = function (event)
{
    var mi = event. target;
    var menu = mi. parentNode;
    var url = mi. getAttribute ("url");
    if (event. button < 2)
    {
        if (event. button == 0)
            getBrowser (). loadURI (url, null, null);
        else
            getBrowser (). loadOneTab(url, null, null, null, loadInBackground, false);
        menu. hidePopup ();
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi);
    this. flushMenu (menu);
};

this. onclick = function (event)
{
    if (event. button != 1 || event. target != this)
        return;
    var menu = this. menu;
    var mis = menu. getElementsByTagName ("menuitem");
    var mi;
    while (mis. length)
    {
        mi = mis[0];
        getBrowser (). loadOneTab(mi. getAttribute ("url"), null, null, null, true /*load in background*/, false);
        menu. removeChild (mi);
    }
    this. checkEmpty (menu);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();

Infocatcher, Anton СПА-СИ-БО! =)
Infocatcher - ваш вариант для меня более удобен =)

Anton
А как насчет реализации деструкторов для кнопок?
Т.е. чтобы можно было определить действие, которое будет выполняться при удалении кнопки (или хотя бы – если сложно реализовать учет перетаскивания кнопки обратно в toolbarpalette – при пересоздании кнопки, если пользователь изменил что-то в коде).
Например, можно было бы сделать вот так (а не так):

Код:

if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1)
    return;

var _cb_onTabLoad = gBrief.onTabLoad;
var _cb_onTabSelect = gBrief.onTabSelect;
var _cb_this = this;
gBrief.onTabLoad = function() {
    var ret = _cb_onTabLoad.apply(this, arguments);
    _cb_this.updState();
    return ret;
};
gBrief.onTabSelect = function() {
    var ret = _cb_onTabSelect.apply(this, arguments);
    _cb_this.updState();
    return ret;
};

this.buttonDestructor = function() {
    gBrief.onTabLoad = _cb_onTabLoad;
    gBrief.onTabSelect = _cb_onTabSelect;
};

Если пойти дальше, может пригодиться и чуть более расширенный вариант, который будет выполняться еще и при событии «unload» окна браузера.

26-07-2009 18:06:10
Во, вроде, работает даже при вызове настройки панелей инструментов:

Код:

var cssStr = "%button%:hover { opacity: 0.7 !important; }";
var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService);
var ios = Components.classes["@mozilla.org/network/io-service;1"]
    .getService(Components.interfaces.nsIIOService);
var data = "data:text/css," + encodeURIComponent(cssStr.replace(/%button%/g, "#" + this.id));
var uri = ios.newURI(data, null, null);
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);


var _this = this;
this.addEventListener(
    "DOMNodeRemoved",
    function(e) {
        _this.removeEventListener("DOMNodeRemoved", arguments.callee, true);
        alert(e.type);
        if(sss.sheetRegistered(uri, sss.USER_SHEET))
            sss.unregisterSheet(uri, sss.USER_SHEET);
    },
    true
);

26-07-2009 18:07:23
Но, по-хорошему, нужно еще повесить обработчик на unload и снимать слушателя DOMNodeRemoved, если он к тому моменту все еще висит.

26-07-2009 18:15:37
Вот как-то так:

Код:

var cssStr = "%button%:hover { opacity: 0.7 !important; }";
var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService);
var ios = Components.classes["@mozilla.org/network/io-service;1"]
    .getService(Components.interfaces.nsIIOService);
var data = "data:text/css," + encodeURIComponent(cssStr.replace(/%button%/g, "#" + this.id));
var uri = ios.newURI(data, null, null);
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);


var _this = this;
var unloadDestroy = false;
function destroy(e) {
    alert(e.type + " => destroy()");
    _this.removeEventListener("DOMNodeRemoved", destroy, true);
    window.removeEventListener("unload", destroy, false);
    if(e.type == "unload" && !unloadDestroy)
        return;
    if(sss.sheetRegistered(uri, sss.USER_SHEET))
        sss.unregisterSheet(uri, sss.USER_SHEET);
}
this.addEventListener("DOMNodeRemoved", destroy, true);
window.addEventListener("unload", destroy, false);

26-07-2009 18:21:02
Пример с кодом для открытия Brief:

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";
this.type = "checkbox";
this.isBriefOpen = function() {
    return gBrief.tab == gBrowser.selectedTab;
};
this.updState = function() {
    this.checked = this.isBriefOpen();
};
this.updState();

if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1)
    return;

var _cb_onTabLoad = gBrief.onTabLoad;
var _cb_onTabSelect = gBrief.onTabSelect;
var _cb_this = this;
gBrief.onTabLoad = function() {
    var ret = _cb_onTabLoad.apply(this, arguments);
    _cb_this.updState();
    return ret;
};
gBrief.onTabSelect = function() {
    var ret = _cb_onTabSelect.apply(this, arguments);
    _cb_this.updState();
    return ret;
};


var _this = this;
var unloadDestroy = false;
function destroy(e) {
    _this.removeEventListener("DOMNodeRemoved", destroy, true);
    window.removeEventListener("unload", destroy, false);
    if(e.type == "unload" && !unloadDestroy)
        return;
    gBrief.onTabLoad = _cb_onTabLoad;
    gBrief.onTabSelect = _cb_onTabSelect;
}
this.addEventListener("DOMNodeRemoved", destroy, true);
window.addEventListener("unload", destroy, false);

Infocatcher
Код стиля кнопок "без бордюров" сработал.

Код:

/*Initialization Code*/
with(this.style) {
    MozAppearance = "none";
    border = "none";
this. mouseover = function (event)
{
    this. oldimage = this. image;
    this. image = "file:///W:/ReloadwoCach2.png";
}
this. mouseout = function (event)
{
    this. image = this. oldimage;
}
this. setAttribute ("onmouseover", "this.mouseover()");
this. setAttribute ("onmouseout", "this.mouseout()");

Было:
http://i020.radikal.ru/0907/e1/e9b2ca7f1969.gif
Стало:
http://i065.radikal.ru/0907/32/b2feb2c834c0.gif

Кому как, а мне вариант "без бордюров" кажется аккуратней.
И какие, при этом, дает возможности для редизайна.
Спасибо.

P.S. Я, как Эдвард Нортон в Fight Club думал, "...что вопрос с диванам решён окончательно", а теперь, видимо, надо переделывать весь тулбар ))
Может быть, и вопрос со смещением кнопок удастся решить?
Как-нибудь при инициализации задавать им координаты?
Возможно, это покажется мелочью, но лично мне кажется логичней и эргономичней группировать вплотную друг к другу родственные кнопки типа "Reload" и "Reload without cache", или Скрапбуковские "Capture" и "Capture as..." Как это сделано со стандартными "Go Back"-"Go Forward".
Потому что пока, чтобы достичь визуального порядка, приходится использовать пустой "Space" из стандартной палитры настройки, чтобы раздвинуть и так не близко стоящие кнопки.

razoo написал:

Код стиля кнопок "без бордюров" сработал.

На отсутствие закрывающей фигурной скобки у
with(this.style) { ... }
не ругается?

Кстати, если написать
this. onmouseover = function (event) { ... }
, можно убрать часть кода с
this. setAttribute ( ... )

razoo написал:

Может быть, и вопрос со смещением кнопок удастся решить?

Примерно так:

Код:

function isVisible(node) {
    if(!node)
        return false;
    var win = node.ownerDocument.defaultView;
    return win.getComputedStyle(node, "").display != "none"
        && win.getComputedStyle(node, "").visibility != "collapse"
}
// Отступ слева:
if(isVisible(this.previousSibling))
    this.style.marginLeft = "10px";
// Отступ справа:
if(isVisible(this.nextSibling))
    this.style.marginRight = "10px";

Или вообще без проверок:

Код:

this.style.marginLeft = "10px";
this.style.marginRight = "10px";

Infocatcher
ДА! Тотально-то-что-надо.
Если использовать отрицательное значение, например:

Код:

this.style.marginLeft = "-5px";

кнопки можно ставить вплотную. Именно, как хотелось!

Infocatcher написал:

На отсутствие закрывающей фигурной скобки у
with(this.style) { ... }
не ругается?

Нет. Все равно исправить?

Infocatcher написал:

Кстати, если написать
this. onmouseover = function (event) { ... }
, можно убрать часть кода с
this. setAttribute ( ... )

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

razoo написал:

Нет. Все равно исправить?

Да, лучше исправить.

У меня этот код вообще себя странно ведет. Из «инициализации» не работает (кнопка становится полупрозрачной), но в консоли ошибок ничего нету (что странно). А из «кода» уже ругается:

Код:

Ошибка: missing } in compound statement
Источник: custombutton://buttons/Firefox/code/custombuttons-button11
Строка: 14

Более того, можно заменить код в инициализации на

Код:

try {
new Function(
'with(this.style) {\n\
    MozAppearance = "none";\n\
    border = "none";\n\
this. mouseover = function (event)\n\
{\n\
    this. oldimage = this. image;\n\
    this. image = "file:///W:/ReloadwoCach2.png";\n\
}\n\
this. mouseout = function (event)\n\
{\n\
    this. image = this. oldimage;\n\
}\n\
this. setAttribute ("onmouseover", "this.mouseover()");\n\
this. setAttribute ("onmouseout", "this.mouseout()");'
).call(this);
} catch(e) { alert(e); }

, и будет сообщение:

SyntaxError: missing } in compound statement

А можете сделать кнопку для менеджера сессий навроде той для закладок? =)
При щелчке на кнопку происходит сохранение сессии. Сессии в списке (только собственноручно сохранённые). удаляются также ПКМ =)
Мне только это надо реализвать, чтобы избавиться от главного меню =)

Najlus
А кнопка от Session Manager'а не устроит?
И мало исходных данных. Предполагается, что в наличии только встроенная сохранялка сессий?

Infocatcher написал:

А кнопка от Session Manager'а не устроит?

Сори, переработал :(

Infocatcher

А как насчет реализации деструкторов для кнопок?

Они были в 0.0.3.0-0.0.3.5 на this. destroy = ...
При переделке binding'а в 0.0.3.6 я его как-то потерял, заметил только недавно.
Правда, работал он только по закрытию окна, из деструктора xbl.
Буду иметь в виду твои предложения.

razoo

Infocatcher
ДА! Тотально-то-что-надо.

Кажется, вопросы по визуальному оформлению разрешились ?
Я ещё даже не успел заняться "дополнительными исследованиями".

Al_H
Сделал кнопку для CustomButtons "по мотивам" ТЗ из № 906
Для работы требуется FF 3.5, Stylish 1.0.5, Custom Buttons 0.0.4.3 - проверял на этом.
Для сохранения настроек кнопка создает файл themes.js в корневом каталоге профиля.
Диалоговое окно "Добавить стиль" я реализовывать не стал, так как это может делать Stylish.

Раздел "Код": http://pastebin.mozilla-russia.org/100398
Раздел "Инициализация": http://pastebin.mozilla-russia.org/100399

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

Anton написал:

Они были в 0.0.3.0-0.0.3.5 на this. destroy = ...
При переделке binding'а в 0.0.3.6 я его как-то потерял, заметил только недавно.
Правда, работал он только по закрытию окна, из деструктора xbl.
Буду иметь в виду твои предложения.

Все же от деструктора при (пере)создании кнопки пользы больше. И настраивать кнопки при этом проще (а рестарты – это не айс).

Так что поставлю вопрос иначе: отлавливает ли код с DOMNodeRemoved все удаления кнопки? А то я не особо вникал в механизм toolbarpalette.

Кстати, я там забыл про проверку (забавно, делал не так давно в своих целях – там не забыл =)) на
event.originalTarget === button
А с ней как раз и проблемы – можно же удалить не саму кнопку, а ее родителя (хотя, вроде бы, такого в нормальных условиях не происходит).
Так что пока вот так (если снова чего-нибуть не упустил):

Код:

var _this = this;
var unloadDestroy = false;
function destroy(e) {
    (e.type == "DOMNodeRemoved" && e.originalTarget !== _this)
        return;
    _this.removeEventListener("DOMNodeRemoved", destroy, true);
    window.removeEventListener("unload", destroy, false);
    if(e.type == "unload" && !unloadDestroy)
        return;
    // Some code
}
this.addEventListener("DOMNodeRemoved", destroy, true);
window.addEventListener("unload", destroy, false);

Infocatcher написал:

А кнопка от Session Manager'а не устроит?

...поставил Session Manager, но быстро удалил.
Плагин замечательный, но я пользуюсь менеджером сессий, встроенным в “Tab Mix Plus” и он меня устраивает.
Всем, кроме кнопки. ))
Во-первых, родная кнопка Tab Mix Plus ущербная. Практически, это просто выпадающее меню. Отдельного действия у кнопки почему-то нет, хотя логичней было бы, чтобы нажатие на кнопу загружало последнюю сохраненную сессию. Причем в выпадающем меню last session у них действительно выделена, будто это действие по умолчанию.
Во-вторых, в связи открывшимися крутыми возможностями по визуализации просто хочется сделать эту кнопку с помощью CB. :)
Итого :) неплохо бы было получить кнопку, которая по нажатию загружает последнюю сессию, сохраненную “Tab Mix Plus”, а рядом стрелка с выпадающим меню, в котором всё то же, что в меню и сейчас.

И новая серия вопросов:
Я честно просмотрел все 38 страниц темы форума, но не нашел, как делать отработчик(?) shift+click или ctrl+click.
Т.е. я делаю кнопку для плагина Screengrab!
Хотел, чтобы при нажатии он делал скриншот всей страницы,
при ctrl+click видимую часть,
при shift+click предлагал выделить нужную часть. Коды, соответственно:

Код:

sg.Grab(new sg.VisibleTarget(), sg.CaptureViewPort, new sg.SaveAction());

Код:

sg.Grab(new sg.FrameTarget(), sg.CaptureViewPort, new sg.SaveAction());

Код:

sg.Grab(new sg.SelectionTarget(), sg.CaptureViewPort, new sg.SaveAction());

По отдельности все работают правильно, но зачем делать 3 кнопки, если можно объединить это в одной.
Ещё :)
Как кнопке задавать условия, при которой кнопка будет неактивной (выглядеть неактивной)?
Например: кноп, которая перематывает к первой страничке на табе

Код:

getWebNavigation().gotoIndex(0);

Как сделать, чтобы, вернувшись к самой первой - кнопка становилась (выглядела) неактивной как и стандартные лисовские стрелки, показывая что дальше «мотать некуда»?
Еще хотел избавиться от плагина Uppity, заменив его кастом-кнопкой с простеньким кодом upOneFolder();
Но хотелось бы чтобы кнопка становилась неактивной «когда выше подняться некуда» и было выпадающее меню с доступными уровнями, подобно тому, которое Anton сделал для плагина “Block Site”.
Кстати, Anton.
Твою кнопку для “Block Site” можно ещё усовершенствовать. Мог бы ты сделать так, чтобы нижней строкой в выпадающем меню можно было вызвать окно настроек самого плагина (там блэк лист)?

P.S. Я подозреваю, что в теме CB это может быть оффтопом, но как принудительно открывать в табах те окна, которые запускаются различными плагинами?
Например,  окно infolisterа, или менеджер закладок (родной лисовский) или (О!) менеджер скрапбука. Может быть, делая кнопу, можно прописать в коде куда именно завернуть окно?

razoo написал:

Я честно просмотрел все 38 страниц темы форума, но не нашел, как делать отработчик(?) shift+click или ctrl+click.

В инициализацию:

Код:

this.onclick = function(e) {
    if(e.button == 0 && e.shiftKey) { ... }
};

В наличии свойства:
button = 0, 1 или 2 – кнопки мыши (левая, средняя или правая)
ctrlKey, shiftKey, altKey (ну, и metaKey, которая, вроде бы, на Маках) – модификаторы


Как кнопке задавать условия, при которой кнопка будет неактивной (выглядеть неактивной)?

Код:

this.disabled = true;

Только стилевого оформления почему-то нету.

как и стандартные лисовские стрелки, показывая что дальше «мотать некуда»?

Применительно к стрелкам – нужен обработчик изменения адреса в адресной строке, вроде бы достаточно добавить атрибут command, потому как это «встроенная команда».
Кнопка «назад», инициализация:

Код:

this. setAttribute ("command", "Browser:BackOrBackDuplicate");
this. setAttribute ("oncommand", "BrowserBack(event)");
this. setAttribute ("onclick", "checkForMiddleClick(this,event)");

(но это все копировалось из Firefox 3.5)

К слову, визуализацией еще userChrome.css заправляет.

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

Если только сделать «обертку» для оригинальной функции открытия. И то потом может выясниться, что нужно еще и код в самом окне как-то корректировать.

28-07-2009 00:16:48
P.S. Итого: кнопкам навигации есть смысл добавить атрибут command (и вообще скопировать все как есть – command, oncommand и onclick), а также добавить стилизацию отключенного состояния (хотя с этим и не совсем ясно).

добавить стилизацию отключенного состояния (хотя с этим и не совсем ясно).

В том плане, что хотелось бы, чтобы все CB-кнопки визуализировали [disabled="true"] через стили.
Но для начала сойдут и дополнительные картинки, конечно.

Кстати, автор Firediff одумался. =)

Код:

var JsDiff = (function() {
  // ...
  function escapeHTML(s) {
    var n = s;
    n = n.replace(/&/g, "&amp;");
    n = n.replace(/</g, "&lt;");
    n = n.replace(/>/g, "&gt;");
    n = n.replace(/"/g, "&quot;");

    return n;
  }

Примерно через 5 дней, однако. При этом я ему не писал.

28-07-2009 06:15:24
P.S. Впрочем, «var n = s;» мне видится довольно странным присваиванием в данном случае. =)

А можно как нить через CSS скрыть в кнопке менеджера дополнений пункты: "Загрузить сессию", "Восстановить сессию", "переименовать сессию", "группировать сессию(ии)", "открыть папку сессий" и "Настройки менеджера сессий" =)

Anton написал:

Al_H
Сделал кнопку для CustomButtons "по мотивам" ТЗ из № 906

Спасибо!

Пока что посмотрел на окошки. Сразу не хватает двух вещей. Кнопка добавляет в список сразу все стили, имеющиеся в Stylish. Это противоестественно, их может быть много, и даже к хрому относятся не все, не говоря уж конкретно о темах, а не об аддонах. Я бы предложил по умолчанию включить в список стили с определенным комментарием где-то или с частью заголовка, например, themeheal- или themecustomize-. Далее, при прокрутке таблички, сразу скрывается ее заголовок (названия стилей). Хочется сделать его непрокручиваемым, что-то вроде position: fixed;
Если у имен стилей будет префикс, в таблице его не надо отображать. Сокращение ширины столбца будет полезным. При добавлении нового стиля с таким названием из встроенных в тело комментариев можно узнавать список тем, для которых предлагается его активировать по умолчанию, имея в виду, что для всех остальных он выключен. Но это перспективы.
И еще замечания. Не может быть кнопки Disable All. Может быть флажок. Он фактически не снимает все другие флажки строки, он только блокирует их применение более сильным состоянием off. И полностью аналогичен отключению стиля в Stylish - это для столбцов, то есть стилей. Для стилей этого ещё не сделано. Для тем тоже должен быть флажок, а не кнопка. Флажки и строк, и столбцов, относящиеся, соответственно, к запрещению данного стиля или всех стилей для данной темы, никаких других флажков не снимают, все запоминается, но в состоянии disable all (помеченном) имеют приоритет перед, соответственно, флажками внутри строки и столбца. Естественно, все вышесказанное относится только к стилям-модификтором тем. Все остальные стили не должны показываться в таблице и на них не должно быть влияния ни одной настройки кнопки.
Сверху и снизу хотелось бы по флажку [_] temporary disable all theme modifications
Ну в общем вот так.

Najlus написал:

А можно как нить через CSS скрыть в кнопке менеджера дополнений пункты: "Загрузить сессию", "Восстановить сессию", "переименовать сессию", "группировать сессию(ии)", "открыть папку сессий" и "Настройки менеджера сессий" =)

В общем случае вот так:

Код:

menuitem[label="Загрузить сессию..."],
menu[label="Восстановить сессию"],
menuitem[label="Переименовать сессию"],
menuitem[label="Группировать сессию(ии)"],
menuitem[label="Открыть папку сессий"],
menuitem[label="Настройки Менеджера сессий"] {
    display: none !important;
}

Чтобы скрыть разделители, можно заменить
display: none !important;
на
opacity: 0.2 !important;
и добавить (в зависимости от расположения разделителей)

Код:

menuitem[label="Загрузить сессию..."],
menu[label="Восстановить сессию"],
menu[label="Восстановить сессию"] + menuseparator,
menuitem[label="Переименовать сессию"],
menuitem[label="Группировать сессию(ии)"],
menuitem[label="Открыть папку сессий"],
menuitem[label="Открыть папку сессий"] + menuseparator,
menuitem[label="Настройки Менеджера сессий"] {
    display: none !important;
}

А вообще, лучше смотреть в DOM Inspector'е (а то в меню Инструменты тоже скроет, ну, и лучше, когда без привязки к локали):

Код:

#sessionmanager-toolbar [oncommand="gSessionManager.load();"],
#sessionmanager-toolbar [_id="backup-separator"],
#sessionmanager-toolbar [_id="backup-menu"],
#sessionmanager-toolbar [oncommand="gSessionManager.rename();"],
#sessionmanager-toolbar [oncommand="gSessionManager.group();"],
#sessionmanager-toolbar [oncommand="gSessionManager.openFolder();"],
#sessionmanager-toolbar [_id="options-separator"],
#sessionmanager-toolbar [oncommand="gSessionManager.openOptions();"] {
    display: none !important;
}

СПАСИБО!!! =)

Infocatcher написал:

А вообще, лучше смотреть в DOM Inspector'е (а то в меню Инструменты тоже скроет, ну, и лучше, когда без привязки к локали):

Меню я вообще убрал, так что ничего страшного =)

Anton
P.S. Вот и первые глюки. Каким-то образом задублировались стили, большая часть, причем они шли парами включенный-отключенный, в итоге включились часть стилей, которые я не предполагал. При переключении тем и перезагрузке, самопроизвольно включались стили, которые я отключал через Stylish. Вообще очень странно оно себя вело. Дублирующие удалил, и Custom Buttons временно отключил.

razoo

неплохо бы было получить кнопку, которая по нажатию загружает последнюю сессию, сохраненную “Tab Mix Plus”, а рядом стрелка с выпадающим меню, в котором всё то же, что в меню и сейчас.

Не получилось. Если делать меню, как оно прописано в оверлее TMP, то почему-то не отображается список сессий в основном меню и в меню "Rename", отображается в меню "Delete".
Кажется, надо "разгребать" много кода, чтобы выяснить почему это так.
В общем, браться я за это не буду.

для плагина Screengrab!
Хотел, чтобы при нажатии он делал скриншот всей страницы,
при ctrl+click видимую часть,
при shift+click предлагал выделить нужную часть.

Примерно так:

this. onclick = function (event)
{
    if (event. button > 0)
        return;
    if (event. ctrlKey)
        sg.Grab(new sg.FrameTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    else if (event. shiftKey)
        sg.Grab(new sg.SelectionTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    else
        sg.Grab(new sg.VisibleTarget(), sg.CaptureViewPort, new sg.SaveAction());
};

Еще хотел избавиться от плагина Uppity, заменив его кастом-кнопкой с простеньким кодом upOneFolder();

Не понял. В FF, кажется, нет функции upOneFolder.

razoo написал:

кнопку для “Block Site” можно ещё усовершенствовать. Мог бы ты сделать так, чтобы нижней строкой в выпадающем меню можно было вызвать окно настроек самого плагина (там блэк лист)?

В коде той кнопки, что уже есть, перед строкой

Код:

menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;

надо добавить строки

Код:

menu. appendChild (<menuseparator/>);
menu. appendChild (<menuitem label="Black List" oncommand="event.stopPropagation();window.open('chrome://blocksite/content/BlockSitePrefs.xul', '', 'chrome,centerscreen');"/>);

Infocatcher

Итого: кнопкам навигации есть смысл добавить атрибут command (и вообще скопировать все как есть – command, oncommand и onclick)

Ок, посмотрю.

Al_H

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

Не могу воспроизвести. На какой минимальной конфигурации это происходит и после выполнения каких действий ?

Будем считать, Stylish+Stylish Custom. Мне тоже не удалось воспроизвести. У Вас самопроизвольно стили не включаются?
А что по моим просьбам насчет интерфейса?

Anton, приспособил написанную тобой кнопку под Download Master Portable, папку которого кинул в папку с профилем лисы:

Код:

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%3EDownload%20Master%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20profileDir%20%3D%20Components.classes%5B%22@mozilla.org/file/directory_service%3B1%22%5D%0A%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%0A%20%20%20%20.get%28%22ProfD%22%2C%20Components.interfaces.nsILocalFile%29%0A%20%20%20%20.path%3B%0Avar%20path%20%3D%20profileDir%20+%20%22%5C%5CDmaster%5C%5Cdmaster.exe%22%3B%0A%0Athis.%20runDM%20%3D%20function%20%28url%29%0A%7B%0A%20%20%20%20var%20file%20%3D%20Components.%20classes%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20var%20process%20%3D%20Components.%20classes%20%5B%22@mozilla.org/process/util%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.%20interfaces.%20nsIProcess%29%3B%0A%20%20%20%20file.%20initWithPath%20%28path%29%3B%0A%20%20%20%20process.%20init%20%28file%29%3B%0A%20%20%20%20if%20%28%21this.%20pid%29%0A%20%20%20%20%20%20%20%20this.%20pid%20%3D%20%5B%5D%3B%0A%20%20%20%20this.%20pid.%20push%20%28process.%20run%20%28false%2C%20url%20%26%26%20%5Burl%5D%7C%7C%20null%2C%20url%20%26%26%201%20%7C%7C%200%29%29%3B%0A%7D%3B%0A%0Athis.%20handleDragOver%20%3D%20function%20%28event%29%0A%7B%0A%20%20%20%20var%20dt%20%3D%20event.%20dataTransfer%3B%0A%20%20%20%20var%20url%20%3D%20dt.%20mozGetDataAt%20%28%22text/plain%22%2C%200%29%3B%0A%20%20%20%20if%20%28%21url%29%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20event.%20preventDefault%20%28%29%3B%0A%20%20%20%20event.%20stopPropagation%20%28%29%3B%0A%20%20%20%20return%20dt.%20effectAllowed%20%3D%20dt.%20dropEffect%20%3D%20%22link%22%3B%0A%7D%0A%0Athis.%20handleDrop%20%3D%20function%20%28event%29%0A%7B%0A%20%20%20%20var%20dt%20%3D%20event.%20dataTransfer%3B%0A%20%20%20%20var%20url%20%3D%20dt.%20mozGetDataAt%20%28%22text/plain%22%2C%200%29%3B%0A%20%20%20%20if%20%28url%29%0A%20%20%20%20%20%20%20%20this.%20runDM%20%28url%29%3B%0A%7D%3B%0A%0Athis.%20setAttribute%20%28%22ondragdrop%22%2C%20%22return%20this.%20handleDrop%20%28event%29%3B%22%29%3B%0Athis.%20setAttribute%20%28%22ondragover%22%2C%20%22return%20this.%20handleDragOver%20%28event%29%3B%22%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.%20runDM%20%28%22%22%29%3B%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

Напомню: при нажатии на кнопку ЛКМ запускается DMaster, при перетаскивании ссылки на кнопку - ссылка передается для закачки DMaster`у.

Прошу "прикрутить" к этой кнопке ещё 1 функцию - передача DMaster'у ссылки из буфера обмена по нажатию средней кнопки мыши (либо по нажатию левой кнопки, отменив тем самым назначенный на эту кнопку запуск приложения)

Пытался сделать кнопку для открытия\закрытия тулбара дополнения TextFormattingToolbar.
Но кнопка не работает. вот код:

var a = document.getElementById("Text Formatting toolbar");
a.collapsed = !a.collapsed;

Al_H написал:

У Вас самопроизвольно стили не включаются?

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

Al_H написал:

А что по моим просьбам насчет интерфейса?

Al_H написал:

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

Al_H написал:

Если у имен стилей будет префикс, в таблице его не надо отображать.

Не понятно: надо отображать стили с определённым префиксом или не отображать стили с определённым префиксом ?

Al_H написал:

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

Фильтрацию по коду стиля делать не буду.

Al_H написал:

Он фактически не снимает все другие флажки строки, он только блокирует их применение более сильным состоянием off. И полностью аналогичен отключению стиля в Stylish - это для столбцов, то есть стилей. Для стилей этого ещё не сделано. Для тем тоже должен быть флажок, а не кнопка. Флажки и строк, и столбцов, относящиеся, соответственно, к запрещению данного стиля или всех стилей для данной темы, никаких других флажков не снимают, все запоминается, но в состоянии disable all (помеченном) имеют приоритет перед, соответственно, флажками внутри строки и столбца.

Попробую.

Естественно, все вышесказанное относится только к стилям-модификтором тем. Все остальные стили не должны показываться в таблице и на них не должно быть влияния ни одной настройки кнопки.
Сверху и снизу хотелось бы по флажку [_] temporary disable all theme modifications

Здесь не понятно.
1. Что есть "стили-модификаторы"
2. Какие всё-таки стили должны отображаться в таблице.
3. Назначение "temporary disable all theme modifications"

29-07-2009 17:02:22
3Jlou

3Jlou написал:

Прошу "прикрутить" к этой кнопке ещё 1 функцию - передача DMaster'у ссылки из буфера обмена по нажатию средней кнопки мыши (либо по нажатию левой кнопки, отменив тем самым назначенный на эту кнопку запуск приложения)

Если по средней кнопке - надо добавить в раздел "Инициализация"

Код:

this. handleClick = function (event)
{
    if (event. button == 1)
        this. runDM (custombuttonsUtils. gClipboard. read ());
};

this. setAttribute ("onclick", "this. handleClick (event);");

Если по левой кнопке - в раздел "Код" поместить строку

Код:

this. runDM (custombuttonsUtils. gClipboard. read ());

29-07-2009 17:04:23
Najlus

Код:

getElementById("Text Formatting toolbar");

Таких id вроде бы не бывает. Сможешь выяснить с помощью DOM Inspector'а её (панели инструментов) id ?

Anton написал:

Сможешь выяснить с помощью DOM Inspector'а её (панели инструментов) id

Если с ним поразбираться, то наверное

Najlus написал:

Пытался сделать кнопку для открытия\закрытия тулбара дополнения TextFormattingToolbar.
Но кнопка не работает. вот код:

     var a = document.getElementById("Text Formatting toolbar");
     a.collapsed = !a.collapsed;

Так работает:

Код:

var a = document.getElementById("toolbar-format");
a.collapsed = !a.collapsed;

29-07-2009 17:47:26
Anton, сердечно благодарю, работает как хотелось :cool:

3Jlou спасибо =)

Anton написал:

Таких id вроде бы не бывает.

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

Код:

var clone = this.cloneNode(true);
var id = "Кириллица, однако!";
clone.id = id;
this.parentNode.insertBefore(clone, this.nextSibling);
alert(document.getElementById(id).id);

Al_H

При переключении тем и перезагрузке, самопроизвольно включались стили, которые я отключал через Stylish.

При переключении тем удалось "поймать" самопроизвольное включение. Попробую исправить.

Anton написал:

Не понятно: надо отображать стили с определённым префиксом или не отображать стили с определённым префиксом ?

Я предложил скрыть часть стилей из таблицы, оставив только те, что относятся к темам. Как это сделать? Либо с помощью части имени стиля themecustomization- (themecustomization-defaultscrollbars, themecustomization-outlinedscrollbars, themecustomization-searchfavicon), либо уже делать отдельное окошко с перечнем стилей и флажком [_]Показать в таблице. В любом случае, так как сейчас – неразумно. Большая часть стилей в Stylish у меня не для тем, а для сайтов. И в них даже задано, что они относятся не к хрому. Как минимум, их можно сразу не выводить. И из остальных много лишних, только таблицу забивают.
Что я имел в виду. Если Вы выберете вариант с префиксом, то в таблице из названия стиля нужно префикс удалять, а точнее, скрывать. То есть, стили themecustomization-defaultscrollbars, themecustomization-outlinedscrollbars, themecustomization-searchfavicon будут в таблице высвечиваться как defaultscrollbars, outlinedscrollbars, searchfavicon.

Anton написал:

Фильтрацию по коду стиля делать не буду.

ок

Anton написал:

Других самопроизвольных включений пока не замечал.

Допустим, у Вас включен стиль при добавлении этой кнопки. Значит, он будет включен для всех тем. Логично? Теперь Вы открываете Stylish-Custom, и там его отключаете. Затем выбираете другую тему или ставите новую. Что произойдет?

Anton написал:

Здесь не понятно.
1. Что есть "стили-модификаторы"
2. Какие всё-таки стили должны отображаться в таблице.
3. Назначение "temporary disable all theme modifications"

1. Стили, относящиеся именно к исправлению ошибок тем, то есть, те, которые нас с Вами интересуют. В отличие от тех, которые перекрашивают Яндекс в зеленый цвет, или увеличивают в 4 раза кнопку с плюсиком на сайте, посвященном физике тотализаторов.
2. См. выше. Не все.
3. Мы с Вами говорили про флажок отключения стиля для всех тем скопом. А этот будет отключать вообще все стили, упомянутые в таблице.
То и другое осуществляется без сброса других флажков, которые корректно запоминаются.

Al_H

Если Вы выберете вариант с префиксом, то в таблице из названия стиля нужно префикс удалять, а точнее, скрывать.

этот будет отключать вообще все стили, упомянутые в таблице.

Понятно.

Допустим, у Вас включен стиль при добавлении этой кнопки. Значит, он будет включен для всех тем. Логично? Теперь Вы открываете Stylish-Custom, и там его отключаете. Затем выбираете другую тему или ставите новую. Что произойдет?

Самопроизвольное включение я уже видел. Предполагаю, что код кнопки срабатывает раньше кода Stylish.
Но на всякий случай, вдруг я что-то не понял: если стиль будет отключен только для строки активной темы, он отключится сразу, а при переключении на другую тему он должен включиться.
При установке новой темы без переключения на неё, состояние стиля для этой новой темы будет определяться текущим состоянием стиля. Если стиль сейчас включен - в таблице он будет для новой темы, если он сейчас выключен - будет считаться отключенным. А после того, как диалоговое окно будет закрыто, то состояние стиля для новой темы, которое было в таблице, должно сохраниться.

1. Стили, относящиеся именно к исправлению ошибок тем, то есть, те, которые нас с Вами интересуют.

Понятно, т. е., стили с заданными префиксами.

Anton написал:

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

    1. Стили, относящиеся именно к исправлению ошибок тем, то есть, те, которые нас с Вами интересуют.

Понятно, т. е., стили с заданными префиксами.

Тут путаница. При установке новой темы как раз происходит переключение на нее.
Далее, про дефолтные настройки.
По идее, эти стили - костыли. То есть, если у нас есть тема iPox, адаптированная под Фокс 3.5, то к ней вообще не должны коррекции применяться. Это значит, что, в общем виде, все эти стили для всех должны быть выключены. Мне может понадобиться включить какой-нибудь из них для какой-нибудь темы в том и только в том случае, если я обнаружу явно, что у этой темы в этом месте проблема. Пример: полоски прокрутки. Только темы, сделанные на основе определенных виндовых, в том числе дефолтной, без кроссплатформенного кода, теряют полоски прокрутки под Мак, и к ним нужно применять мой стиль обводки полосок прокрутки, для всех остальных он вреден.
То есть, при активации кнопки, все темы, про которые она ничего не знает, а в начале это вообще все темы, должны по умолчанию иметь целую строку снятых флажков. Даже если соответствующие стили включены.

Al_H
Ок. Пока разобрался только с природой самопроизвольного включения, здесь исправленный код в раздел "Код": http://pastebin.mozilla-russia.org/100445.

Антон.
1. Спасибо за “Block Site”. Кнопка получилась очень прикладистой.

2.

Anton написал:

Не понял. В FF, кажется, нет функции upOneFolder.

Точно. Это была команда одной из кнопок расширения “Toolbar Buttons”. Самодельная кнопка работала, но после того как расширение было удалено – перестала. Как, кстати, и Рестарт Лисы. Какой код теперь нужно ставить в кнопку для перезагрузки? Или только с расширением?

3. Предложенный тобой код отработки модификаторов

Код:

this. onclick = function (event)
{
    if (event. button > 0)
        return;
    if (event. ctrlKey)
        sg.Grab(new sg.FrameTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    else if (event. shiftKey)
        sg.Grab(new sg.SelectionTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    else
        sg.Grab(new sg.VisibleTarget(), sg.CaptureViewPort, new sg.SaveAction());
};

не работает
Вот такой:

Код:

{
if (e.button > 0)
        return;
    if(e.button == 0)
    sg.Grab(new sg.VisibleTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    if(e.button == 0 && e.ctrlKey)
    sg.Grab(new sg.FrameTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    if(e.button == 0 && e.shiftKey)
    sg.Grab(new sg.SelectionTarget(), sg.CaptureViewPort, new sg.SaveAction());   
};

работает, но косо: если щелкнуть ctrl – клик или shift – клик, предлагает сначала сохранить как на просто клик, а только потом то, что прописано на ctrl или shift, соответственно.
Что я там накосячил? Я совершенно не знаю ни скриптов, ни зула :(

4. Еще :)
Возможно ли сделать так, чтобы картинка кнопки на onmouseover менялась в зависимости от того какой модификатор в это время нажат? Т.е. ctrl + onmouseover – одна картинка, просто onmouseover – другая. Это было бы наглядней, если все-таки получится применить варианты нажатий с модификаторами

5. Переделал кнопки All-in-One Sidebar - Page Info и Multipanel. Они работают. Но как и задумано в AiOS – открываются в боковой панели. У родных кнопок AiOS есть возможность открывать в новом табе – но только на ctrl +click. Как сделать, чтобы они открывались в табе по умолчанию?

6.

Infocatcher написал:

Если только сделать «обертку» для оригинальной функции открытия

можно узнать, что значит "обертка"? )
Вообще, кто-нибудь когданибудь открывал в табе менеджер скрапбука?

ДА, всегда - спасибо за науку.

razoo, есть кнопки рестарта:

1. С диалогом подтверждения (Alt + Left click - без подтверждения):

Код:

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%3ERestart%20%28with%20confirmation%29%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAA5xJREFUOE9Vk3tMW1Ucx09ZfMznFMTAH8rciNlGtomSGZOpy0xo0JXpomS/y+2ljw1oqdCxDRQ6oERhTKakQHSsgKUrfRAJpmPLVoogYwErQ8iUR2+5XSc0Osk2jWwp9OdpiW7e5JN7cnK+n3N+v5MjIvd/2e51RBSTFpfwWNYTInxbRDB+KRQOL4VRuB1C98pfoQ4SxkmyRnSbrGAS/X91Lw7uhCcLhtvEp2b+yLQJKP02gEpnALMcc5jeMYsvN/+C6yvHFohi8EvC9L/ysOZyz5oDQ6FVAbgTE4pGe7Wu35YP9l7H9+0+3Gvl8d37eM/G414Ljy8ZrobW5g1dy+ycW97ysQcJ2d8X+5TmsqW47/fwwbPXUUIXRcL7bD6UdPJRIuPIXHSeyt8yzeJnnkVM1Y1RgWwg/Z1W7y3NxSCKO7yYYfbSI3sxqeYnTCwZjbKxbgLFVJxBBRlUtoeWpR9ZxO26H5HEFw059zsX8E0zjztaZ3GHcQYfLRq8RTJaW8jmbDHZxIhFEkv32uLhUErLDKaZfPiazY+FlxZxS8kIkiz1AEqcwdUwJbIzeaPRQDsTR4khu4wvkD12J8kdXCYl9MiVE/hMkxclF2/gBs139wRJzdP4fNM0Pn5kGElyQUq0ua+3P0h2n7lAmPMhcojudpQ2rYwe+9g4JrfNYTzbi0RW4cEDLUGEWh+CfhpBPbAEinOJUUHaFx+Q1Dor2faJmWylbK42k036VV6sMpPtx22EKxy4I2+mgmoeQXcVQTOEwDnzo7cL8AgllvI0MPUpoDKmQqExBTSNyZB3Yj2wZc8RNtc5KjX4kdFTQekkQjlFcf4aQDfHQle8FOxxdLyT+9BVUNwh5Hx0RsiscPh3ag1XtkGOJZGwYMxXVI/dVRmEVYHuZ1rK1Apoh2+CyjWerXJ9L9eNXKBhk87qr6nqErSVdh5Ux1y7OWiIJVI4voGRdfVVWgJhZV2kjCmET/kVqOP/hJP8gqLZN6H9OuAutwesVQ7/Sb1DKD3U4MkBpu3VHKh6iNbJxMigfpdc2TNZ2u4P5zcKyJzgw1Av3GEM/htqY2C6rGv+UnX3/DdU0HS46UqFVGbK4qBk3X8PiTbpARnUpnNye39hjeeusoHHvJZfl1XtwZtHOoO8zjH/w+FTU+fUuv7T2VJTLgdHn6UZ0f9eckTCQvlWFhpKOWWPR65xLVH+pgQV6rPjrNz6OQe1YhbKEujamH/D/wBqNRb8pCuFJAAAAABJRU5ErkJggg%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//%20*****%20VARS%20*****%20//%0A%0Avar%20prompts%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/prompt-service%3B1%22%5D%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.getService%28Components.interfaces.nsIPromptService%29%3B%0A%0A%0A%0A%0A//%20*****%20FUNCTIONS%20*****%20//%0A%0Afunction%20createBrandingBundle%28%29%20%7B%0A%20%20%20%20var%20myBrandingPath%20%3D%20null%3B%0A%20%20%20%20var%20myStringBundleService%20%3D%20Components.classes%5B%22@mozilla.org/intl/stringbundle%3B1%22%5D%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.getService%28Components.interfaces.nsIStringBundleService%29%3B%0A%20%20%20%20%0A%20%20%20%20myBrandingPath%20%3D%20%22chrome%3A//branding/locale/brand.properties%22%0A%20%20%20%20return%20myStringBundleService.createBundle%28myBrandingPath%29%3B%0A%7D%0A%0A%0Afunction%20getWindowType%28%29%20%7B%0A%20%20%20%20//%20Relies%20on%20Branding%20Code%20so%20can%20not%20be%20run%20on%20startup%0A%20%20%20%20var%20myBrandStrings%20%3D%20createBrandingBundle%28%29%3B%0A%20%20%20%20var%20thisBrandShortName%20%3D%20myBrandStrings.GetStringFromName%28%22brandShortName%22%29%0A%20%20%20%20switch%20%28thisBrandShortName%29%20%7B%0A%20%20%20%20%20%20case%20%22Mozilla%20Thunderbird%22%3A%0A%20%20%20%20%20%20case%20%22Shredder%22%3A%0A%20%20%20%20%20%20case%20%22Thunderbird%22%3A%0A%20%20%20%20%20%20%20%20return%20%22mail%3A3pane%22%3B%0A%20%20%20%20%20%20case%20%22Nvu%22%3A%0A%20%20%20%20%20%20%20%20return%20%22composer%3Ahtml%22%3B%0A%20%20%20%20%20%20case%20%22Calendar%22%3A%0A%20%20%20%20%20%20case%20%22Sunbird%22%3A%0A%20%20%20%20%20%20%20%20return%20%22calendarMainWindow%22%3B%0A%20%20%20%20%20%20case%20%22eMusic%20Download%20Manager%22%3A%0A%20%20%20%20%20%20case%20%22eMusic%20Remote%22%3A%0A%20%20%20%20%20%20%20%20return%20%22emusic%3Awindow%22%3B%0A%20%20%20%20%20%20case%20%22Songbird%22%3A%0A%20%20%20%20%20%20%20%20return%20%22Songbird%3AMain%22%3B%0A%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20return%20%22navigator%3Abrowser%22%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%0Afunction%20Restart%28%29%0A%7B%0A%20%20%20%20//%20Notify%20all%20windows%20that%20an%20application%20quit%20has%20been%20requested.%0A%20%20%20%20var%20os%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%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%20%20%20%20var%20cancelQuit%20%3D%20Components.classes%5B%22@mozilla.org/supports-PRBool%3B1%22%5D%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.createInstance%28Components.interfaces.nsISupportsPRBool%29%3B%0A%20%20%20%20os.notifyObservers%28cancelQuit%2C%20%22quit-application-requested%22%2C%20%22restart%22%29%3B%0A%0A%20%20%20%20//%20Something%20aborted%20the%20quit%20process.%0A%20%20%20%20if%20%28cancelQuit.data%29%0A%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20var%20wm%20%3D%20Components.classes%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowMediator%29%3B%0A%20%20%20%20var%20windows%20%3D%20wm.getEnumerator%28%22%22%29%3B%0A%0A%20%20%20%20var%20windowType%20%3D%20getWindowType%28%29%3B%0A%0A%20%20%20%20while%20%28windows.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20%20%20var%20myConfigWindow%20%3D%20windows.getNext%28%29.QueryInterface%28Components.interfaces.nsIDOMWindowInternal%29%3B%0A%20%20%20%20%20%20if%20%28myConfigWindow.document.documentElement.getAttribute%28%22windowtype%22%29%20%21%3D%20windowType%29%20%7B%0A%20%20%20%20%20%20%20%20%20myConfigWindow.close%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28%22@zeniko/crashrecoveryservice%3B1%22%20in%20Components.classes%29%20%7B%0A%20%20%20%20%20%20nsPreferences.setBoolPref%28%22extensions.crashrecovery.resume_session_once%22%2C%20true%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20appStartup%20%3D%20Components.interfaces.nsIAppStartup%3B%0A%20%20%20%20Components.classes%5B%22@mozilla.org/toolkit/app-startup%3B1%22%5D%0A%20%20%20%20%20%20.getService%28appStartup%29.quit%28appStartup.eRestart%20%7C%20appStartup.eAttemptQuit%29%3B%0A%0A%20%20%20%20return%20true%3B%0A%7D%0A%0A%0A%0A%0A//%20*****%20MOUSE%20HANDLING%20*****%20//%0A%0Athis.leftclick%20%3D%20function%28evt%29%20%7B%0A%20%20var%20RestartProceed%20%3D%20prompts.confirm%28null%2C%20%22Restart%20Firefox%22%2C%20%22Restart%20now%3F%22%29%3B%0A%20%20if%20%28RestartProceed%29%20%7B%0A%20%20%20%20Restart%28%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.aleftclick%20%3D%20function%28evt%29%20%7B%0A%20%20Restart%28%29%3B%0A%7D%0A%0A%0A%0A%0A//%20*****%20INITIALISATION%20*****%20//%0A%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%0A%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%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%0A%0A%20%20Left%20%20%20%20%20%3D%20Restart%20application%20with%20confirmation%20dialogue%0A%20%20Alt+Left%20%3D%20Restart%20application%0A%0A%20%20Rawny%20%5E%5E%0A%0A*/%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

2. Restart Tabbed:

Код:

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%3ERestart%20Tabbed%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACwUlEQVQ4y42T20tUURTGv7PPPuds5+ZcdDyOY44z4yUsGbuZSHQxCqOCiiJ6iqAXX3vqLwiKDIkeo3+geg4KEoMQLwhSXiqyJphxjmPizDijc87ZuwctyQu4X9ZefHy/xVqLJWMv7zZz4KCsYNI2t0pkL/6qisCZkEvvww0326rRnQx19+rCsWA87mXekMQlBFjgfFei4+bQxGjXdO3co7GBoeHdAXeg97Sdfry/JXaIs6IfAlCJxiw9rR71Ri4qYI6xs1+u4918YRug+X5z6/GmzoH64+5zGfMbaImVISRQiZJfC8twWwEqy6oflmAAtgMa/Y0JV7Uz8TWVRKVRPVVYLL0ggloOSTkZb2m/+Hl6bmT2S/IBBjPZHVvIZ1f0/M9SQbWqspPfvz6Zmp95s0otIyRi2Q8jk8WFpexT3acXIle6mrWCSM2+HS7If829vRcSh8Idd91lF2FFVuKWtU9UkFOeomvmAGJtbf7Y/mBDzdWeE523PMR7Sc3Z9U0N0ffSuvmyo6kp/qi//2FfqVzCy9GXWJINmBlSHp+YeB12hU/VhHTdjPyGO25i4ZUPuTkDs5+nGygAKAojmsZo2Srj/dQg0vIPpDwz8GkhNeR3XuV8maboEkhVEcrPFmSSBjxEBiGqSgGgstIfrKurbycSgUpUrOYtZMwcqBWAuUpUCAIqNOjz7SimyjgSD0MIAY878JwCgNPpIdFolChUQXdrN9KLBtYMICCC0Ct1uCs8kISEQMiHqg4vmKIBEBgeHndQAGDMCUoVAABTNNzovoZPc9N4N/4Rx1oPo9rjA+ccnHPYtg3btgEIyLKCvzOALG9uVCYEbZEW1Ppq4NAqdr0RQuR1gKY5sLZmW+l0tiwE/6/aaiEHzu2NnP/7CyFgmsKiG6RsMmk8W1lZ04UQ4BwAODgXEEIAWI/r2maez5eMP+y1LNBcwVPrAAAAAElFTkSuQmCC%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%20%20%0A%0A%0A//this.style.opacity%20%3D%20%27.65%27%3B%0A//this.setAttribute%28%22onmouseover%22%2C%20%22if%20%28custombuttons%29%20custombuttons.ButtonBrt%28event%29%3B%22%20%29%3B%0A//this.setAttribute%28%22onmouseout%22%2C%20%22if%20%28custombuttons%29%20custombuttons.ButtonDim%28event%29%3B%22%20%29%3B%0A%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%0A%0A//%20Code%20from%20codefisher.org%20button%0Avar%20restart_tabbed_g%20%3D%20function%20%28%29%20%7B%0A%20%20var%20Cc%20%3D%20Components.classes%3B%0A%20%20var%20Ci%20%3D%20Components.interfaces%3B%0A%20%20var%20wm%20%3D%20Cc%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D.getService%28Ci.nsIWindowMediator%29%3B%0A%20%20var%20prefs%20%3D%20Cc%5B%22@mozilla.org/preferences-service%3B1%22%5D.getService%28Ci.nsIPrefBranch%29%3B%0A%20%20var%20startup%20%3D%20Ci.nsIAppStartup%3B%0A%20%20var%20home%20%3D%20%22browser.startup.homepage%22%3B%0A%20%20var%20old_home%20%3D%20%22extension_buttons.old_home%22%3B%0A%20%20var%20others%20%3D%20%22extension_buttons.others%22%3B%0A%20%20var%20lock%20%3D%20%22extension_buttons.lock%22%3B%0A%20%20var%20browser_window%20%3D%20%22navigator%3Abrowser%22%3B%0A%20%20var%20do_quit%20%3D%20function%20%28flag%29%20%7B%0A%20%20%20%20prefs.setBoolPref%28lock%2C%20false%29%3B%0A%20%20%20%20Cc%5B%22@mozilla.org/toolkit/app-startup%3B1%22%5D.getService%28startup%29%0A%20%20%20%20%20%20%20.quit%28startup.eAttemptQuit%20%7C%20%28flag%20%3F%20startup.eRestart%20%3A%200%29%29%3B%0A%20%20%7D%3B%0A%20%20var%20do_restart%20%3D%20function%20%28%29%20%7B%0A%20%20%20%20do_quit%28true%29%3B%0A%20%20%7D%3B%0A%20%20var%20do_exit%20%3D%20function%20%28%29%20%7B%0A%20%20%20%20do_quit%28false%29%3B%0A%20%20%7D%3B%0A%20%20var%20collect_urls%20%3D%20function%20%28win%29%20%7B%0A%20%20%20%20var%20url%20%3D%20%22%22%3B%0A%20%20%20%20var%20ntabs%20%3D%20win.gBrowser.mPanelContainer.childNodes.length%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ntabs%3B%20++i%29%20%7B%0A%20%20%20%20%20%20var%20b%20%3D%20win.gBrowser.getBrowserAtIndex%28i%29%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20url%20+%3D%20b.currentURI.spec%20+%20%22%7C%22%3B%0A%20%20%20%20%20%20%7D%20catch%20%28e%29%20%7B%0A%20%20%20%20%20%20//%20ignore%20e%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20url%20%3D%20url.replace%28/%5C%7C%24/%2C%20%22%22%29%3B%0A%20%20%20%20return%20url%3B%0A%20%20%7D%3B%0A%20%20var%20collect_other_windows%20%3D%20function%20%28%29%20%7B%0A%20%20%20%20var%20enumvar%20%3D%20wm.getEnumerator%28browser_window%29%3B%0A%20%20%20%20var%20out%20%3D%20%5B%5D%3B%0A%20%20%20%20while%20%28enumvar.hasMoreElements%28%29%29%20%7B%0A%20%20%20%20%20%20var%20win%20%3D%20enumvar.getNext%28%29%3B%0A%20%20%20%20%20%20if%20%28win%20%21%3D%20window%29%20%7B%0A%20%20%20%20%20%20%20%20out.push%28win%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20out%3B%0A%20%20%7D%3B%0A%20%20var%20x_escape%20%3D%20function%20%28s%29%20%7B%0A%20%20%20%20return%20s.replace%28/%5B%3E%5C%5C%5D/g%2C%20function%20%28x%29%20%7B%20return%20%22%5C%5C%22%20+%20%28x%20%3D%3D%20%22%3E%22%20%3F%20%22%7E%22%20%3A%20x%29%3B%20%7D%29%3B%0A%20%20%7D%3B%0A%20%20var%20x_unescape%20%3D%20function%20%28s%29%20%7B%0A%20%20%20%20return%20s.replace%28/%5C%5C%28.%29/g%2C%20function%20%28_%2C%20x%29%20%7B%20return%20x%20%3D%3D%20%22%7E%22%20%3F%20%22%3E%22%20%3A%20x%3B%20%7D%29%3B%0A%20%20%7D%3B%0A%20%20var%20save_state%20%3D%20function%20%28%29%20%7B%0A%20%20%20%20prefs.setBoolPref%28%27extension.tbutton.restart.do.load%27%2Ctrue%29%3B%0A%20%20%20%20prefs.setCharPref%28others%2C%20collect_other_windows%28%29.map%28%0A%20%20%20%20%20%20function%20%28w%29%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%3E%22%20+%20x_escape%28collect_urls%28w%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%29.join%28%22%22%29%29%3B%0A%20%20%20%20var%20prev%20%3D%20prefs.getCharPref%28home%29%3B%0A%20%20%20%20var%20cur%20%3D%20collect_urls%28window%29%3B%0A%20%20%20%20prefs.setCharPref%28home%2C%20cur%20%3D%3D%20%22%22%20%3F%20%22about%3Ablank%22%20%3A%20cur%29%3B%0A%20%20%20%20prefs.setCharPref%28old_home%2C%20prev%29%3B%0A%20%20%7D%3B%0A%20%20return%20%7B%0A%20%20%20%20exec%3A%20function%20%28%29%20%7B%0A%20%20%20%20%20%20save_state%28%29%3B%0A%20%20%20%20%20%20%20%20do_restart%28%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20exit%3A%20function%20%28%29%20%7B%0A%20%20%20%20%20%20save_state%28%29%3B%0A%20%20%20%20%20%20do_exit%28%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20restore_state%3A%20function%20%28%29%20%7B%0A%20%20%20%20%20%20prefs.setBoolPref%28%27extension.tbutton.restart.do.load%27%2Cfalse%29%3B%0A%20%20%20%20%20%20try%20%7B%20%0A%20%20%20%20%20%20%20%20prefs.getBoolPref%28lock%29%3B%0A%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20prefs.setBoolPref%28lock%2C%20true%29%3B%0A%20%20%20%20%20%20var%20orig%20%3D%20prefs.getCharPref%28old_home%29%3B%0A%20%20%20%20%20%20if%20%28orig%20%21%3D%20%27%27%29%20%7B%0A%20%20%20%20%20%20%20%20prefs.setCharPref%28home%2C%20orig%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20prefs.setCharPref%28old_home%2C%20%22%22%29%3B%0A%20%20%20%20%20%20var%20saved%20%3D%20prefs.getCharPref%28others%29%3B%0A%20%20%20%20%20%20var%20chunks%20%3D%20saved.match%28/%3E%5B%5E%3E%5D*/g%29%3B%0A%20%20%20%20%20%20if%20%28chunks%20%26%26%20chunks%20%21%3D%20%27%27%20%26%26%20chunks.length%20%21%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20var%20wins%20%3D%20chunks.map%28%0A%20%20%20%20%20%20%20%20function%20%28p%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20return%20x_unescape%28p.substr%281%29%29.split%28%22%7C%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20wins.forEach%28%0A%20%20%20%20%20%20%20%20function%20%28w%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20window.open%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28w.lenth%20%21%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20tb%20%3D%20wm.getMostRecentWindow%28browser_window%29.getBrowser%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20first%20%3D%20w.shift%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20tb.loadURI%28first%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20w.forEach%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20function%20%28url%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tb.addTab%28url%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20prefs.setCharPref%28others%2C%20%22%22%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%7D%28%29%3B%0A%0Avar%20prefs%20%3D%20Components.classes%5B%22@mozilla.org/preferences-service%3B1%22%5D%0A%20%20%20%20%20%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Aif%20%28prefs.getBoolPref%28%27extension.tbutton.restart.do.load%27%29%20%3D%3D%20true%29%20%7B%0A%20%20%20%20addEventListener%28%22load%22%2C%20restart_tabbed_g.restore_state%2C%20false%29%3B%0A%7D%0A%0Arestart_tabbed_g.exec%28%29%3B%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




P.S. Предлагаю потестить свою сборку Firefox Portable 3.5.1, которая существует благодаря данной теме.

razoo

3. Предложенный тобой код отработки модификаторов

Код:

this. onclick = function (event)
{
    if (event. button > 0)
        return;
    if (event. ctrlKey)
        sg.Grab(new sg.FrameTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    else if (event. shiftKey)
        sg.Grab(new sg.SelectionTarget(), sg.CaptureViewPort, new sg.SaveAction());;
    else
        sg.Grab(new sg.VisibleTarget(), sg.CaptureViewPort, new sg.SaveAction());
};

не работает

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

01-08-2009 14:30:45
razoo

2.

Anton написал:

Не понял. В FF, кажется, нет функции upOneFolder.

Точно. Это была команда одной из кнопок расширения “Toolbar Buttons”. Самодельная кнопка работала, но после того как расширение было удалено – перестала. Как, кстати, и Рестарт Лисы. Какой код теперь нужно ставить в кнопку для перезагрузки? Или только с расширением?

Код:

var href = window.content.document.location.href;
if (href.indexOf("index") != -1) {
    href = href.substring(0, href.indexOf("index"));
}
href = href.substring(0, href.substring(0, href.length - 1).lastIndexOf("/") + 1);
if (!href.match(/:\/\/$/)) {
    window.content.document.location = href;
}

Что касается неактивности кнопки «когда выше подняться некуда» - сделать можно, но неактивное состояние кнопки при переключении на вкладку где «есть куда подняться» так и останется неактивным.

upd.:Прошу прощения, выше был вопрос о кнопке для перезагрузки, а я поместил код для upOneFolder
Кнопка для рестарта - в сообщении 3Jlou (1-й код): http://forum.mozilla-russia.org/viewtop … 54#p359754

razoo

4. Еще :)
Возможно ли сделать так, чтобы картинка кнопки на onmouseover менялась в зависимости от того какой модификатор в это время нажат? Т.е. ctrl + onmouseover – одна картинка, просто onmouseover – другая. Это было бы наглядней, если все-таки получится применить варианты нажатий с модификаторами

Можно, код в раздел "Инициализация":

Код:

this. oldimage = this. image;
this. onmouseover = function (event)
{
    if (event. ctrlKey)
        this. image = "file:///m:/redicon.png";
    else if (event. shiftKey)
        this. image = "file:///m:/greenicon.png";
    else
        this. image = this. oldimage;
};
this. onmouseout = function (event)
{
    this. image = this. oldimage;
};

Соответственно, поправить this. image = "file:///... нужными адресами.
Правда, картинка не будет меняться если модификатор нажимается когда курсор уже находится над кнопкой.

razoo

5. Переделал кнопки All-in-One Sidebar - Page Info и Multipanel. Они работают. Но как и задумано в AiOS – открываются в боковой панели. У родных кнопок AiOS есть возможность открывать в новом табе – но только на ctrl +click. Как сделать, чтобы они открывались в табе по умолчанию?

Page Info:

Код:

aios_addTab ("chrome://browser/content/pageinfo/pageInfo.xul");

Multipanel:

Код:

aios_addTab ("chrome://browser/content/web-panels.xul");

AiOS должен быть установлен.

01-08-2009 15:37:39
razoo

6.

Infocatcher написал:

Если только сделать «обертку» для оригинальной функции открытия

можно узнать, что значит "обертка"? )

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

Вообще, кто-нибудь когданибудь открывал в табе менеджер скрапбука?

Так:

Код:

getBrowser (). addTab ("chrome://scrapbook/content/scrapbook.xul");

?

Al_H

В раздел "Код": http://pastebin.mozilla-russia.org/100508
В раздел "Инициализация": http://pastebin.mozilla-russia.org/100509 - баг, не работают чекбоксы для строк тем
Исправлено: http://pastebin.mozilla-russia.org/100576

Желательно удалить из корневого каталога профиля файл themes.js

Темы фильтруются по префиксам "themecustomize-", "themecustomization-", "themeheal-".

С прокруткой таблицы не справился.

Классный аддончик, как раз для меня, мне только дай чегонить поскриптить =) Только такой вопрос появился: как получить доступ к JS-переменным, использующимся на конкретной странице? То есть, к примеру, где-то в скриптах страницы есть строчка

Код:

var aaa='bbb';

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

Код:

alert(aaa);

и мне выведет текст переменной?

Dreyk написал:

Только такой вопрос появился: как получить доступ к JS-переменным, использующимся на конкретной странице?

В общем случае это небезопасно, вроде как.

Код:

content.location.href = "javascript: var aaa='bbb'; void 0";
alert(content.wrappedJSObject.aaa);

А content.location.href = "javascript: ... " выполняет код без chrome-привилегий.

Или как-то так:

Код:

function bookmarklet() {
    window.aaa='bbb';
    alert(aaa);
}
content.location.href = "javascript: (" + uneval(bookmarklet) + ")();";

нене, через window  я сам знаю) дело в том, что страницу-то не я пишу)

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

Вот к примеру в консоли firebug'a можно написать любую команду, и все переменные видны... тут что-то не так?

Dreyk

...То есть, к примеру, где-то в скриптах страницы есть строчка...

Если "где-то в скриптах страницы" есть переменная x, то

Код:

alert (content. wrappedJSObject. x)

отобразит её значение.
Например, где-то в скриптах этой страницы есть переменная xajax.

Код:

alert (content. wrappedJSObject. xajax)

выдаёт её значение.

...к переменным, которые не прописаны в window...

Какие переменные тебя интересуют ?

Anton написал:

Код:alert (content. wrappedJSObject. x)

Во. То, что надо, спасибо. Просто не знал как достучаться до тех переменных.

Есть какой-то API? Где почитать можно?

Dreyk написал:

Есть какой-то API? Где почитать можно?

На http://developer.mozilla.org/
Там полно всяких API

О, еще, как к функциям получить доступ, тем которые в страничке объявлены?

Dreyk написал:

как к функциям получить доступ, тем которые в страничке объявлены?

Так же, как и к переменным.

кто бы мог поудмать >.< вроде пробовал, не получалось... знач руки искривились =)

Только функции со странички лучше не вызывать...
А использовать для этого, например, javascript-протокол:

Код:

content.location.href = "javascript: someFuncFromPage(); void 0;";

Например, где-то в скриптах этой страницы есть переменная xajax.

Пример на тему:

Код:

function bookmarklet() {
    alert(xajax);
}
content.location.href = "javascript: (" + uneval(bookmarklet) + ")();";

Или изучать матчасть про Components.utils.evalInSandbox.

Infocatcher написал:

Только функции со странички лучше не вызывать...

Вообще говоря, лучше не трогать и переменные - к некоторым может быть привязана функция (getter).

Но:
html: http://pastebin.mozilla-russia.org/100525
chrome: http://pastebin.mozilla-russia.org/100526

Скорее всего, я плохо искал, но на приведенном примере разницы между песочницей и прямым вызовом, по крайней мере в 3.5 не видно.

Anton написал:

Скорее всего, я плохо искал, но на приведенном примере разницы между песочницей и прямым вызовом, по крайней мере в 3.5 не видно.

Видимо, враппер там уже не один:
https://developer.mozilla.org/en/XPConnect_wrappers

Anton написал:

Вообще говоря, лучше не трогать и переменные - к некоторым может быть привязана функция (getter).

Да, забыл про них... :sick:

По идее, достаточно проверить
obj.__lookupGetter__(property)

Anton написал:

Скорее всего, я плохо искал, но на приведенном примере разницы между песочницей и прямым вызовом, по крайней мере в 3.5 не видно.

Я тоже поигрался – только через eval() и прочие new Function() удалось вызвать код со страницы с повышенными привилегиями.

Та нет там вроде геттеров)
Это я себе кнопку писал, чтобы на файлообменниках по 30-60 секунд не ждать =) Собстна функций вызывать и не надо даже, без этого обошелся

Как выложить готовую кнопку?

Anton написал:

Код:

getBrowser (). addTab ("chrome://scrapbook/content/scrapbook.xul");

Anton, спасибо, работает.
Я только заменил на
chrome://scrapbook/content/manage.xul
Иначе он открывает в табе не менеджер а боковую панель скрапбука.
В отличии от Скрапбука открыть в табе Менеджер Закладок таким триксом не удалось.
Может, предложите еще вариант?

Кнопки All-in-One Sidebar также заработали как хотелось. Все отлично. С модификаторами тоже помогли разобраться – спасибо Antonу и Infocatcherу.
Теперь возник вопрос, можно ли как-нибудь обрабатывать двойные клики?

Что касается замены плагина Uppity на кастомбатоновскую кнопку – то, порыскав, я нашел GoUp, кнопка практически делает то же самое. Но она для CB2, может быть, поэтому работает некорректно? На какой бы пункт в меню дропмаркера я не щелкал – она поднимает только на один уровень.
Я не прошу возиться с чужим кодом :)), я пока хотел только узнать может ли этот глюк быть из-за «заточки» кнопки под разные Custom Buttons?

Еще хотел спросить, какой должен быть код кнопки для папки из закладок. Или где его поискать DOMi Т.е., если поместить папку на панель закладок она ведь ведет себя как выпадающее меню. Вот, собственно у меня на панели закладок 20 таких папок и все закладки раскиданы в них по темам и подкаталогам. Эти 20 и хотелось заменить кнопками (раздилить визуально по темам, а то, они все одинаковые). Но только те папки, что на панели (т.е головные темы закладок), все что ниже чтобы оставалось родным букмарочным.

Dreyk

Как выложить готовую кнопку?

В тегах [code] или на pastebin, я думаю.

razoo

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

Код:

getBrowser (). addTab ("chrome://browser/content/places/places.xul");

?

razoo написал:

Теперь возник вопрос, можно ли как-нибудь обрабатывать двойные клики?

Так же, как и обычные клики:

Код:

this. ondblclick = function (event)
{
    ...
};

razoo написал:

я пока хотел только узнать может ли этот глюк быть из-за «заточки» кнопки под разные Custom Buttons?

Для этой конкретной кнопки - нет. Я проверил на CB2 3.0.1 - она работает точно так же. Наверное, так задумано.
На замену переделанная из кнопки для Block Site новая:
В раздел "Код":

Код:

var url = getBrowser (). contentDocument. location. href;
url = url. match (/^([a-zA-Z]+:\/\/\/?)?([^\/]+)\/([^?]*)?(.*)$/);
var domain = "";
if (url)
    domain = url [1] + url [2] + "/"
loadURI (this. uriToLoad || domain);
this. uriToLoad = "";

В раздел "Инициализация":

Код:

var THIS = this;
var enabledImg = "";
var disabledImg = "";

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;
    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;
    }
    return levels || [];
};

this. createMenu = function (event)
{
    if (event && (event. originalTarget. nodeName != "toolbarbutton"))
        return;
    var levels = 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 < levels. length; i++)
    {
        menuitem = <menuitem label={levels [i]} tooltiptext={levels [i]}/>
        menu.menuitem[i] = menuitem;
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
        this. type = "menu-button";
    this. orient = "horizontal";
};

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)");

razoo написал:

Еще хотел спросить, какой должен быть код кнопки для папки из закладок.

Вот это не просите. Я пару раз честно за это брался, оба раза не справился, и браться больше не хочу.

razoo написал:

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

у меня подобное реализовано через userChrome.css:

/* Скрыть "text" или "icon" папки в Панели закладок */
#personal-bookmarks .toolbarbutton-text {display : none !important;}

/* Назначить иконку папке в Панели закладок */
.bookmark-item[container="true"][label="тут название папки в Панели закладок"] {
list-style-image: url( 'тут код иконки в base64') !important;
-moz-image-region: rect(0px 16px 16px 0px) !important;
}

Правда не всплывают подсказки при наведении на иконку папки

Anton написал:

В тегах [сode] или на pastebin, я думаю.

Я имею в виду через собственный протокол custombuttons:// как это сделано тут

Dreyk

Я имею в виду через собственный протокол custombuttons://

В контекстном меню кнопки есть пункт "Копировать код в буфер". Он копирует в буфер обмена ссылку вида custombutton://...

3Jlou написал:

/* Скрыть "text" или "icon" папки в Панели закладок */
    #personal-bookmarks .toolbarbutton-text {display : none !important;}

    /* Назначить иконку папке в Панели закладок */
    .bookmark-item[container="true"][label="тут название папки в Панели закладок"] {
    list-style-image: url( 'тут код иконки в base64') !important;
    -moz-image-region: rect(0px 16px 16px 0px) !important;
    }

Отлично, спасибо.

3Jlou написал:

Правда не всплывают подсказки при наведении на иконку папки

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

Anton написал:

Код:

getBrowser (). addTab ("chrome://browser/content/places/places.xul");

Работает. Я и не знал, что places - это букмарки ((
Кстати, все табы в каторые принудительно запихали окна имеют в заголовке:
http://i082.radikal.ru/0908/3e/2ddce5aeeb4a.gif
И полоска Fission показывает, будто таб что-то не может догрузить.
мне это не мешает, даже прикольно, но может им "витаминов" нехватает :)
Т.е. вопрос: это оттого, что таб не знает, что ему в фавикон назначить, или он действительно "недогружает" чего-то? Повторюсь, на полноценности работы в таком табе это никак пока не сказывалось.

Anton написал:

На замену переделанная из кнопки для Block Site новая:

Везде работает, но сайты с результатами поискового запроса почему-то не обрабатывает.
В принципе, несущественно, это, просто, при тестировании кнопы попались )
Спасибо, пригодиться.

razoo написал:

И полоска Fission показывает, будто таб что-то не может догрузить.
мне это не мешает, даже прикольно, но может им "витаминов" нехватает :)
Т.е. вопрос: это оттого, что таб не знает, что ему в фавикон назначить, или он действительно "недогружает" чего-то?

Я посмотрел на тестовом профиле 3.5 и FirefoxPortable 3.0.6 + Fission 1.0.9 - "недогруза" не увидел.
Фавиконка в places.xul вряд ли явно прописана, так что у таба она должна быть по умолчанию, и недозагрузка не из-за этого.
Не знаю, может быть из-за того, что какой-нибудь из скриптов "падает" на ошибке.

razoo написал:

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

Могу попробовать доделать, только нужен адрес, сам не найду.

Anton написал:

Могу попробовать доделать, только нужен адрес, сам не найду.

Любой Google-Яндекс.
Только тут скорее мой косяк: кнопка обрабатывает правильно и если нажать на саму кнопку то GoUp будет, но поскольку вариант для «вверх» у него только один – он не указывает его в меню дропмаркера. А я клацал по меню - видел, что оно пусто - и переходил на другой таб. Причем, маленький пустой квадратик, который бывает когда нет пунктов в меню - малозаметен, но пока он не закроется – я не могу перескочить на другой таб – при «скоростном кликаньи бывалого серфера» возникает «ложный эффект легкого подвисания». ))

Кстати, в Uppity есть еще така фича: пока таб не закрыт – в меню остается список возможных мест «вверх» и «вниз» до места с которого начал, а настоящее место нахождения – отмечено черным маркером.
http://i046.radikal.ru/0908/a2/9e07a6a146d1.png
Т.е. это, фактически хистори таба, только не реальные переходы, а возможные, и не «вперед-назад», а «вверх-вниз» :)
Но, что у них реально не по уму сделано: что чем выше GoUp – тем ниже он в меню )

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 написал:

не удобней ли использовать Locationbar² для перехода по уровням?

:)
Да, я сразу подумал, что кто-нибудь мне обязательно посоветует. Ты выиграл. :)
Если серьезно, я его тоже использую (на кусочке скрина сверху даже видно уголок адресной строки, она у меня под табами).
Но Locationbar не дает «дополнительной плоскости навигации» в пределах таба, а кнопка с дропмаркером - дает.
К тому же, удобство - это иногда еще и слабость к собственным привычкам.
А я привык жамкать по кнопке.

В любом случае, спасибо

Есть расширение https://lastpass.com/
Создал кнопку

Код:

toggleSidebar('viewSidebar');

Открывает сайты в LastPass в сайдбаре , но проблема в том что все treeitem-ы этого сайдбара имеют аттрибут "true" *(то есть открытые , растянутые ) а нужно "false", как сделать ?

http://pic.co.ua/thumbs/1249473573d3fda515254816b59bce0aac3da6d446.jpg

Нужно так :
http://pic.co.ua/thumbs/1249473676f470a6fd8e16aa92627854bfab39ceb5.jpg

Подскажите как сделать часы другого цвета?

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 есть еще така фича:

Попробовал сделать
"Код":

Код:

this. loadURL ();

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

Код:

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",

надо прописать нужные цвета, например

Код:

    displayColor: "red",
    displayBackground: "rgb(153,153,255)",

И рад бы помочь, но не могу.

Где хоть копать ?

vurdalak
Если и штатными средствами сайдбар открывается с развёрнутыми элементами дерева, то лучше, я думаю, совсем не "копать".

А так - не знаю, у меня сайдбар этот вообще не открывается. Открывается и тут же сам закрывается.

Если и штатными средствами сайдбар открывается с развёрнутыми элементами дерева, то лучше, я думаю, совсем не "копать".

Штатными средствами, если речь идет об обычных сайдбарах (хистори или букмаркс), то там запоминаются настройки.

А так - не знаю, у меня сайдбар этот вообще не открывается. Открывается и тут же сам закрывается.

http://pic.co.ua/thumbs/124948652261f57d6b17eee745ef6f7aab7d7a93dd.jpg
Нужно в настройках включить "Показать сайты на боковой панели"

Я думаю, можна как нибудь сделать java "коллапс " итемов сайдбара или назначение нового свойства элемента (ну не знаю, любое решение хотелось бы попробовать) после выполнения команды "toggleSidebar('viewSidebar');"

vurdalak написал:

Штатными средствами, если речь идет об обычных сайдбарах (хистори или букмаркс), то там запоминаются настройки.

А если речь идет о сайдбаре 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
);

Anton написал:

3Jlou
Кнопка № 2, раздел "Инициализация" (целиком):

Очередное спасибо с + :beer:

Как-то так:

Ну вот и супер :lol::beer:

vurdalak написал:

Ну вот и супер :lol::beer:

Кровопийца : )

Кровопийца : )

Да ладно , если серьезно то большое спасибо, очень помогаешь и плюсики зарабатываешь :)

P.S. Как вообще расширение то ?

vurdalak написал:

Да ладно , если серьезно

В шутку я, в шутку.

P.S. Как вообще расширение то ?

Last Pass ? Не могу сказать ничего определённого, потому как постигнуть не в состоянии.

vurdalak, я давно обратил на Lastpass внимание - удобно... но сливать свои пароли на сервак как то не решился, поэтому приходится обходиться без удобств :)

Anton, существенный недочет. Кнопка не обрабатывает субдомены.
Т.е ., например, если я нахожусь в галерее каконить художника по имени blablablart на Девианте, которая имеет адрес типа:
http://blablablart.DEVIANTART.com/gallery/#_featured--5 ,
то кнопка поднимет до уровня
http://blablablart.DEVIANTART.com/ ,
но не до http://DEVIANTART.com/

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

А так отличная кнопка получилась – полная замена экстеншена.
Это же здорово, когда кнопкой можно заменить целое расширение.

Вот еще какой вопрос возник.
Что нужно добавить в код кнопки, открывающей определенный url, чтобы в случае, если такой таб уже открыт, она не открывала его повторно, а просто переходила к открытому?
(И к кнопкам, которые открывают в табах менеджеры закладок и скрапбука это тоже было бы логично применить.)

razoo написал:

Вот еще какой вопрос возник.Что нужно добавить в код кнопки, открывающей определенный 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, кнопка полезная, спасибо. Тут же возникла мысль использовать кнопки открытия 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

Dreyk написал:

только начал разбираться, так что буду рад, если гуру сего дела укажут на возможные ошибки/неточности =)

Не знаю как старожилы оценят, но у меня твой код работает так как хотелось.
Первое Спасибо, запакованное в плюс :)

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

3Jlou написал:

Dreyk, кнопка полезная, спасибо. Тут же возникла мысль использовать кнопки открытия url'ов на всплывающих барах с помощью спец. кнопки, но в совокупности они не работают - вместо открытия (или перехода на открытую вкладу) выпадает меню кнопки.
Вот эта кнопка Popup Toolbar:

Код:

custombutton://...

Что она должна делать ?

По поводу кнопки открытия папки: можно ли сделать так, чтобы адрес она брала из того места, куда 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 ("Путь сохранения", "");

Anton написал:

Насчёт "существенности" не уверен, но допустим.

:) Поправка:  для меня - "существенный".
Вобщем, новый код отличный, аддон в архив, кнопку - на замену.
Antonу снова - Спасибо.

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, "");

Anton написал:

NajlusПримерно так:

Не работает =(
Пишет Windows не удалось найти E:\Document ans Settings\*набор странных символов*\*набор странных символов
Притом что папка сохранения находится на диске D, а не на E =(

Najlus
Вот так попробуй:

Код:

function startProcess (path, args)
{
    ....
}
var dir = custombuttonsUtils. getPrefs ("browser.download.downloadDir");
if (!dir)
    dir = custombuttonsUtils. getPrefs ("browser.download.dir");
if (!dir)
    dir = custombuttonsUtils. getPrefs ("browser.download.lastDir");
if (!dir)
    dir = custombuttonsUtils. getPrefs ("browser.download.defaultFolder");
if (!dir)
    dir = Components. classes ["@mozilla.org/file/directory_service;1"].
          getService (Components. interfaces. nsIProperties).
          get ("DfltDwnld", Components. interfaces. nsILocalFile).
          path;
startProcess (dir, "");

Уже лучше, но всёравно =( он вместо имени папки какойто набор непонятных символов вставляет

Najlus написал:

вместо имени папки какойто набор непонятных символов вставляет

А вот так если:

Код:

function startProcess (path, args)
{
    ....
}
var dir = custombuttonsUtils. getPrefs ("browser.download.downloadDir");
if (!dir)
    dir = custombuttonsUtils. getPrefs ("browser.download.dir");
if (!dir)
    dir = custombuttonsUtils. getPrefs ("browser.download.lastDir");
if (!dir)
    dir = custombuttonsUtils. getPrefs ("browser.download.defaultFolder");
if (!dir)
    dir = Components. classes ["@mozilla.org/file/directory_service;1"].
          getService (Components. interfaces. nsIProperties).
          get ("DfltDwnld", Components. interfaces. nsILocalFile).
          path;
var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
      createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
suc. charset = "UTF-8";
dir = suc. ConvertToUnicode (dir);
startProcess (dir, "");

?

ссылка на пост с кнопкой

Anton написал:

Что она должна делать ?

Кнопка "поглощает" любой тулбар (кроме панелей навигации и закладок) и отображает расположенные на нём кнопки во всплывающей панели.

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

07-08-2009 15:15:30

Anton написал:

Najlus написал:
вместо имени папки какойто набор непонятных символов вставляет

А вот так если: .... ?

Работает. Продублирую кнопку целиком:

Код:

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%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-3%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*/%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bfunction%20startProcess%20%28path%2C%20args%29%0A%7B%0A%20%20%20%20var%20file%20%3D%20Components.%20classes%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20var%20process%20%3D%20Components.%20classes%20%5B%22@mozilla.org/process/util%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.%20interfaces.%20nsIProcess%29%3B%0A%20%20%20%20file.%20initWithPath%20%28path%29%3B%0A%20%20%20%20if%20%28args%20%3D%3D%20%22%22%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20file.%20launch%20%28%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20process.%20init%20%28file%29%3B%0A%20%20%20%20if%20%28%21this.%20pid%29%0A%20%20%20%20%20%20%20%20this.%20pid%20%3D%20%5B%5D%3B%0A%20%20%20%20this.%20pid.%20push%20%28process.%20run%20%28false%2C%20%5Bargs%5D%2C%201%29%29%3B%20%0A%7D%0Avar%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.downloadDir%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.dir%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.lastDir%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.defaultFolder%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20Components.%20classes%20%5B%22@mozilla.org/file/directory_service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20getService%20%28Components.%20interfaces.%20nsIProperties%29.%0A%20%20%20%20%20%20%20%20%20%20get%20%28%22DfltDwnld%22%2C%20Components.%20interfaces.%20nsILocalFile%29.%0A%20%20%20%20%20%20%20%20%20%20path%3B%0Avar%20suc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.%0A%20%20%20%20%20%20createInstance%20%28Components.%20interfaces.%20nsIScriptableUnicodeConverter%29%3B%0Asuc.%20charset%20%3D%20%22UTF-8%22%3B%0Adir%20%3D%20suc.%20ConvertToUnicode%20%28dir%29%3B%0AstartProcess%20%28dir%2C%20%22%22%29%3B%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

Anton написал:

Najlus Вот так попробуй

ТАДАМ!!! РАБОТАЕТ!!!!
СПА-СИ-БО

3Jlou

Так вот, если расположить на "поглощаемой" панели эту кнопку, то она отказывается работать.

Ну, стало быть, gQuote.mHandler CB и CB2 не полностью совместимы.
Что если заменить в конце кода "Popup Toolbar"

Код:

//this.setAttribute('onclick', 'if (event.target == event.currentTarget) gQuot(event, this);');
//изменить задержку для отдельной кнопки
this. gQuot = {};
this. gQuot. __proto__ = custombuttons. gQuot;
this. gQuot. dcDelay = 0;
this. setAttribute ('onclick', 'this.gQuot.mHandler(event, this)');

на

Код:

this.setAttribute('onclick', 'if (event.target == event.currentTarget) this.gQuot.mHandler(event, this);');
//изменить задержку для отдельной кнопки
this. gQuot = {};
this. gQuot. __proto__ = custombuttons. gQuot;
this. gQuot. dcDelay = 0;
//this. setAttribute ('onclick', 'this.gQuot.mHandler(event, this)');

?

Najlus

ТАДАМ!!! РАБОТАЕТ!!!!

Кажется, вот так:

Код:

function startProcess (path, args)
{
    ...
}
function getPref (pName)
{
    var prefs = Components. classes ["@mozilla.org/preferences-service;1"].
            getService (Components. interfaces. nsIPrefBranch);
    var res = "";
    try
    {
        res = prefs. getComplexValue ("browser.download." + pName, Components. interfaces. nsILocalFile);
    } catch (e) {};
    return res;
}
var folderList = custombuttonsUtils. getPrefs ("browser.download.folderList");
var fileLoc = Components. classes ["@mozilla.org/file/directory_service;1"].
          getService (Components. interfaces. nsIProperties);
var desk = fileLoc. get ("Desk", Components. interfaces. nsILocalFile);
var dnldMgr = Components. classes["@mozilla.org/download-manager;1"].
          getService(Components.interfaces.nsIDownloadManager);
var ddd = dnldMgr. defaultDownloadsDirectory;
var dir = "";
if (folderList == 0) // desktop
    dir = desk. path;
else if (folderList == 1) // default downloads directory
    dir = ddd. path;
else
{
    dir = getPref ("dir") || getPref ("downloadDir") || getPref ("lastDir") || getPref ("defaultFolder") || "";
    if (!dir)
        dir = fileLoc. get ("DfltDwnld", Components. interfaces. nsILocalFile);
    dir = dir. path;
}
startProcess (dir, "");

будет надежнее.

Anton написал:

Ну, стало быть, gQuote.mHandler CB и CB2 не полностью совместимы.
Что если заменить в конце кода "Popup Toolbar"...

Попробовал - не работает эта кнопка, хотя недавно я как то ей пользовался без проблем, да вот уже не помню, может действительно CB2 ставил.

3Jlou написал:

Попробовал - не работает эта кнопка

У меня эта кнопка работает.

Anton, всё, понял - работает, но не со всеми кнопками - в частности отказывают ранее упомянутые:
кнопка для открытия url'a

Код:

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%3Eya.ru%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-4%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%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20urlToOpen%20%3D%20%27http%3A//ya.ru/%27%3B%0Afunction%20openURI%28url%29%0A%7B%0A%20%20%20%20var%20tabs%20%3D%20gBrowser.tabContainer.childNodes%3B%0A%20%20%20%20for%20%28i%3D0%3B%20i%3Ctabs.length%3B%20i++%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var%20tab%20%3D%20gBrowser.%20getBrowserForTab%28tabs%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20var%20location%20%3D%20tab.contentDocument.location.href%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20if%20%28location%20%3D%3D%20url%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20tabs%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28url%29%3B%0A%20%20%20%20return%20true%3B%0A%7D%0AopenURI%28urlToOpen%29%3B%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

кнопка для открытия папки загрузок:

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-3%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bfunction%20startProcess%20%28path%2C%20args%29%0A%7B%0A%20%20%20%20var%20file%20%3D%20Components.%20classes%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20var%20process%20%3D%20Components.%20classes%20%5B%22@mozilla.org/process/util%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.%20interfaces.%20nsIProcess%29%3B%0A%20%20%20%20file.%20initWithPath%20%28path%29%3B%0A%20%20%20%20if%20%28args%20%3D%3D%20%22%22%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20file.%20launch%20%28%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20process.%20init%20%28file%29%3B%0A%20%20%20%20if%20%28%21this.%20pid%29%0A%20%20%20%20%20%20%20%20this.%20pid%20%3D%20%5B%5D%3B%0A%20%20%20%20this.%20pid.%20push%20%28process.%20run%20%28false%2C%20%5Bargs%5D%2C%201%29%29%3B%20%0A%7D%0Afunction%20getPref%20%28pName%29%0A%7B%0A%20%20%20%20var%20prefs%20%3D%20Components.%20classes%20%5B%22@mozilla.org/preferences-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20getService%20%28Components.%20interfaces.%20nsIPrefBranch%29%3B%0A%20%20%20%20var%20res%20%3D%20%22%22%3B%0A%20%20%20%20try%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20res%20%3D%20prefs.%20getComplexValue%20%28%22browser.download.%22%20+%20pName%2C%20Components.%20interfaces.%20nsILocalFile%29%3B%0A%20%20%20%20%7D%20catch%20%28e%29%20%7B%7D%3B%0A%20%20%20%20return%20res%3B%0A%7D%0Avar%20folderList%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.folderList%22%29%3B%0Avar%20fileLoc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/file/directory_service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20getService%20%28Components.%20interfaces.%20nsIProperties%29%3B%0Avar%20desk%20%3D%20fileLoc.%20get%20%28%22Desk%22%2C%20Components.%20interfaces.%20nsILocalFile%29%3B%0Avar%20dnldMgr%20%3D%20Components.%20classes%5B%22@mozilla.org/download-manager%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20getService%28Components.interfaces.nsIDownloadManager%29%3B%0Avar%20ddd%20%3D%20dnldMgr.%20defaultDownloadsDirectory%3B%0Avar%20dir%20%3D%20%22%22%3B%0Aif%20%28folderList%20%3D%3D%200%29%20//%20desktop%0A%20%20%20%20dir%20%3D%20desk.%20path%3B%0Aelse%20if%20%28folderList%20%3D%3D%201%29%20//%20default%20downloads%20directory%0A%20%20%20%20dir%20%3D%20ddd.%20path%3B%0Aelse%0A%7B%0A%20%20%20%20dir%20%3D%20getPref%20%28%22dir%22%29%20%7C%7C%20getPref%20%28%22downloadDir%22%29%20%7C%7C%20getPref%20%28%22lastDir%22%29%20%7C%7C%20getPref%20%28%22defaultFolder%22%29%20%7C%7C%20%22%22%3B%0A%20%20%20%20if%20%28%21dir%29%0A%20%20%20%20%20%20%20%20dir%20%3D%20fileLoc.%20get%20%28%22DfltDwnld%22%2C%20Components.%20interfaces.%20nsILocalFile%29%3B%0A%20%20%20%20dir%20%3D%20dir.%20path%3B%0A%7D%0AstartProcess%20%28dir%2C%20%22%22%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

3Jlou
Нет, там другая какая-то причина.
Если принять изменения, которые я указал в сообщении № 1032, то проблемы с контекстным меню не будет, а указанные кнопки будут работать.
Другое дело, что и в CB2 эта кнопка бывает что перестает работать.

Кажется, вот так будет надежнее.

Да вам надо памятник из метеоритной платины ставить =)

Anton,
ты не мог бы подсказать, как правильно добавить в твой код onmouseover и onmousedown?
Я пытался приткнуть:

Код:

this.onmouseover = function() { this.image = "file:///W:/GoUp2.png"; };
this.onmouseout = function() { this.image = "file:///W:/GoUp.png"; };
this.onmousedown = function() { this.image = "file:///W:/GoUp3.png"; };
this.onmouseup = function() { this.image = "file:///W:/GoUp2.png"; };

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

Кстати, в последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба. Вот этого в предыдущем варианте кода нет.
Может быть, избавиться от фичи с topLevelImg?
Как бы, эксперимент дал положительный результат и это можно будет в чем-нибудь более полезном прикольно использовать (особенно, когда гифчик соответствующий поставил - очень эффектно смотрелось), но в данной кнопке, пожалуй, это излишество :).
Да и от disabledImg тоже может избавиться для простоты и функциональности?

razoo написал:

как правильно добавить в твой код onmouseover и onmousedown?

Или найти, где в коде добавляются такие же обработчики, и подправить там, или примерно вот так (добавлять в самый низ):

Код:

var _this = this;
this.addHandler = function _ah(onEvt, func) {
    _ah[onEvt] = this[onEvt];
    _ah[onEvt + "+"] = func;
    this[onEvt] = function(e) {
        var et = "on" + e.type;
        var h = _ah[et];
        h && h.call(_this, e);
        _ah[et + "+"].call(_this, e);
    };
};
this.addHandler("onmouseover", function() { this.style.opacity = "0.8"; });
this.addHandler("onmouseout", function() { this.style.opacity = "1"; });
this.addHandler("onmousedown", function() { this.style.opacity = "0.4"; });
this.addHandler("onmouseup", function() { this.style.opacity = "1"; });

Infocatcher написал:

Или найти, где в коде добавляются такие же обработчики, и подправить там, или примерно вот так (добавлять в самый низ)

Я и обработчики менял и внизу добавлял, просто, наверно, мой кодец был кривой :)
С твоим кодом - глюк исчез. Спасибо.

Anton, можно еще сделать так, чтобы по нажатию на саму кнопку - поднимал только на один уровень вверх, а на сtrl-клик открывал целевой url в новом табе (из меню тоже)?

И микроглючик: если запустить Customize, когда открыт таб с каким-нибудь chrome://speeddial/content/speeddial.xul или chrome://browser/content/places/places.xul, кнопка становится полупрозрачной (но рабочей), а вот вернуть нормальный вид помогает только «Edit Button... > Applay». Может, это связано с

последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба.

Твой предыдущий код, хавает адреса с chrome:// как обычные.
:)

3Jlou написал:

Anton, всё, понял - работает, но не со всеми кнопками - в частности отказывают ранее упомянутые:

Попробовал соорудить аналог:

Код:

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%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%5Bthis.%20onPopupShowing%20%3D%20function%20%28event%2C%20menupopup%29%0A%7B%0A%09if%20%28event.%20target%20%21%3D%20menupopup%29%0A%09%09return%3B%0A%09menupopup.%20parentNode.%20buildMenu%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20buildMenu%20%3D%20function%20%28menupopup%29%0A%7B%0A%09this.%20setCheckboxState%20%28menupopup%29%3B%0A%09this.%20createToolbarsList%20%28menupopup%29%3B%0A%09this.%20appendToolbar%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20setCheckboxState%20%3D%20function%20%28menupopup%29%0A%7B%0A%09var%20scwt%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%29%3B%0A%09var%20checkbox%20%3D%20menupopup.%20getElementsByTagName%20%28%22menuitem%22%29%20%5B0%5D%3B%0A%09checkbox.%20setAttribute%20%28%22checked%22%2C%20scwt%29%3B%0A%09checkbox.%20setAttribute%20%28%22hidden%22%2C%20this.%20cbMainMenu%29%3B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20toolbar%20%3D%20document.%20getElementById%20%28toolbarId%29%3B%0A%09var%20isToolbar%20%3D%20toolbar%3F%20true%3A%20false%3B%0A%09var%20menuseparator%20%3D%20menupopup.%20getElementsByTagName%20%28%22menuseparator%22%29%20%5B0%5D%3B%0A%09menuseparator.%20setAttribute%20%28%22hidden%22%2C%20%28this.%20cbMainMenu%20%26%26%20%21%28isToolbar%20%26%26%20scwt%29%29%29%3B%0A%7D%3B%0A%0Athis.%20createToolbarsList%20%3D%20function%20%28menupopup%29%0A%7B%0A%09var%20scwt%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%29%3B%0A%09if%20%28%21scwt%20%26%26%20this.%20cbMainMenu%29%0A%09%09return%3B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20ctid%20%3D%20this.%20parentNode.%20getAttribute%20%28%22id%22%29%3B%0A%09var%20navbox%20%3D%20document.%20getElementById%20%28%22navigator-toolbox%22%29%3B%0A%09var%20toolbars%20%3D%20navbox.%20getElementsByTagName%20%28%22toolbar%22%29%3B%0A%09var%20groupname%20%3D%20this.%20id%20+%20%22-radiogroup%22%3B%0A%09var%20tid%3B%0A%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%20toolbars.%20length%3B%20i++%29%0A%09%7B%0A%09%09if%20%28%21toolbars%20%5Bi%5D.%20hasAttribute%20%28%22customindex%22%29%29%0A%09%09%09continue%3B%0A%09%09tid%20%3D%20toolbars%20%5Bi%5D.%20getAttribute%20%28%22id%22%29%3B%0A%09%09mi%20%3D%20document.%20createElement%20%28%22menuitem%22%29%3B%0A%09%09mi.%20setAttribute%20%28%22label%22%2C%20toolbars%20%5Bi%5D.%20getAttribute%20%28%22toolbarname%22%29%29%3B%0A%09%09mi.%20setAttribute%20%28%22type%22%2C%20%22radio%22%29%3B%0A%09%09mi.%20setAttribute%20%28%22name%22%2C%20groupname%29%3B%0A%09%09mi.%20setAttribute%20%28%22disabled%22%2C%20ctid%20%3D%3D%20tid%29%3B%0A%09%09mi.%20setAttribute%20%28%22checked%22%2C%20toolbarId%20%3D%3D%20tid%29%3B%0A%09%09mi.%20setAttribute%20%28%22value%22%2C%20tid%29%3B%0A%09%09mi.%20setAttribute%20%28%22oncommand%22%2C%20%22document.popupNode.setToolbar%28this.value%29%22%29%3B%0A%09%09menupopup.%20appendChild%20%28mi%29%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20appendToolbar%20%3D%20function%20%28menupopup%29%0A%7B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20toolbar%20%3D%20document.%20getElementById%20%28toolbarId%29%3B%0A%09if%20%28toolbar%29%0A%09%7B%0A%09%09toolbar.%20collapsed%20%3D%20%21this.%20cbMainMenu%3B%0A%09%09menupopup.%20insertBefore%20%28toolbar%2C%20menupopup.%20firstChild%29%3B%0A%09%09toolbar.%20currentSet%20%3D%20toolbar.%20getAttribute%20%28%22currentset%22%29%3B%0A%09%09document.%20persist%20%28toolbar.%20id%2C%20%22currentset%22%29%3B%0A%09%09this.%20label%20%3D%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%3B%0A%09%09this.%20setAttribute%20%28%22tooltiptext%22%2C%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%29%3B%0A%09%09if%20%28toolbar.%20firstChild%20%26%26%20toolbar.%20firstChild.%20image%29%0A%09%09%09this.%20image%20%3D%20toolbar.%20firstChild.%20image%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20setToolbar%20%3D%20function%20%28toolbarId%29%0A%7B%0A%09this.%20restoreToolbar%20%28true%29%3B%0A%09custombuttons.%20setPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%2C%20toolbarId%29%3B%0A%09var%20menupopup%20%3D%20this.%20firstChild%3B%0A%09this.%20appendToolbar%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20restoreToolbar%20%3D%20function%20%28showToolbar%29%0A%7B%0A%09var%20mp%20%3D%20this.%20firstChild%3B%0A%09var%20ct%20%3D%20mp.%20firstChild%3B%0A%09if%20%28ct.%20nodeName%20%3D%3D%20%22toolbar%22%29%0A%09%7B%0A%09%09var%20navbox%20%3D%20document.%20getElementById%20%28%22navigator-toolbox%22%29%3B%0A%09%09var%20next%20%3D%20navbox.%20firstChild%3B%0A%09%09while%20%28next%20%26%26%20%28next.%20nodeName%20%21%3D%20%22toolbarset%22%29%29%0A%09%09%7B%0A%09%09%09if%20%28Number%20%28next.%20getAttribute%20%28%22customindex%22%29%29%20%3E%20Number%20%28ct.%20getAttribute%20%28%22customindex%22%29%29%29%0A%09%09%09%09break%3B%0A%09%09%09next%20%3D%20next.%20nextSibling%3B%0A%09%09%7D%0A%09%09ct.%20collapsed%20%3D%20%21showToolbar%3B%0A%09%09navbox.%20insertBefore%20%28ct%2C%20next%29%3B%0A%09%09ct.%20firstPermanentChild%20%3D%20null%3B%0A%09%09ct.%20lastPermanentChild%20%3D%20null%3B%0A%09%09ct.%20currentSet%20%3D%20ct.%20getAttribute%20%28%22currentset%22%29%3B%0A%09%09document.%20persist%20%28toolbar.%20id%2C%20%22currentset%22%29%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20onPopupHidden%20%3D%20function%20%28event%2C%20menupopup%29%0A%7B%0A%09if%20%28event.%20target%20%21%3D%20menupopup%29%0A%09%09return%3B%0A%09menupopup.%20parentNode.%20destroyMenu%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20destroyMenu%20%3D%20function%20%28menupopup%29%0A%7B%0A%09this.%20restoreToolbar%20%28false%29%3B%0A%09var%20mi%20%3D%20menupopup.%20lastChild%3B%0A%09while%20%28menupopup.%20lastChild.%20nodeName%20%3D%3D%20%22menuitem%22%29%0A%09%09menupopup.%20removeChild%20%28menupopup.%20lastChild%29%3B%0A%7D%3B%0A%0Athis.%20setSCWTState%20%3D%20function%20%28checkbox%29%0A%7B%0A%09custombuttons.%20setPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%2C%20checkbox.%20getAttribute%20%28%22checked%22%29%20%3D%3D%20%22true%22%29%3B%0A%7D%3B%0A%0Athis.%20showMenu%20%3D%20function%20%28%29%0A%7B%0A%09this.%20cbMainMenu%20%3D%20true%3B%0A%09document.%20popupNode%20%3D%20this%3B%0A%09var%20mp%20%3D%20this.%20firstChild%3B%0A%09mp.%20openPopup%20%28this%2C%20%22after_start%22%2C%200%2C%200%2C%20false%2C%20false%29%3B%0A%7D%3B%0A%0Athis.%20showContextMenu%20%3D%20function%20%28contextId%29%0A%7B%0A%09this.%20cbMainMenu%20%3D%20false%3B%0A%09this.%20setAttribute%20%28%22context%22%2C%20contextId%29%3B%0A%7D%3B%0A%0Athis.%20onclick%20%3D%20function%20%28event%29%0A%7B%0A%09var%20mp%20%3D%20this.%20firstChild%3B%0A%09if%20%28event.%20originalTarget%20%21%3D%20this%29%0A%09%7B%0A%09%09if%20%28event.%20target%20%21%3D%20this%29%0A%09%09%09mp.%20hidePopup%20%28%29%3B%0A%09%09return%3B%0A%09%7D%0A%09if%20%28event.%20button%20%3D%3D%200%29%0A%09%09this.%20showMenu%20%28%29%3B%0A%09else%20if%20%28event.%20button%20%3D%3D%202%29%0A%09%09this.%20showContextMenu%20%28event.%20shiftKey%3F%20%22custombuttons-contextpopup%22%3A%20%22_child%22%29%3B%0A%7D%3B%0A%0Athis.%20hideSelectedToolbar%20%3D%20function%20%28%29%0A%7B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20toolbar%20%3D%20document.%20getElementById%20%28toolbarId%29%3B%0A%09if%20%28toolbar%29%0A%09%7B%0A%09%09toolbar.%20setAttribute%20%28%22collapsed%22%2C%20true%29%3B%0A%09%09this.%20label%20%3D%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%3B%0A%09%09this.%20setAttribute%20%28%22tooltiptext%22%2C%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%29%3B%0A%09%7D%0A%7D%3B%0A%0Avar%20scwt%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%29%3B%0Aif%20%28scwt%20%3D%3D%20null%29%0A%09custombuttons.%20setPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%2C%20true%29%3B%0Avar%20popup%20%3D%0A%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%20%20%20oncommand%3D%22this.hidePopup%28%29%22%20onclick%3D%22event.stopPropagation%28%29%22%20style%3D%22border%3A%20none%20%21important%3Boverflow%3Avisible%20%21important%3B%22%20flex%3D%221%22%0A%09%20%20%20onpopupshowing%3D%22this.parentNode.onPopupShowing%28event%2Cthis%29%22%20onpopuphidden%3D%22this.parentNode.onPopupHidden%28event%2Cthis%29%22%3E%0A%09%3Cmenuitem%20type%3D%22checkbox%22%20label%3D%22Show%20Context%20Menu%20With%20Toolbar%22%20oncommand%3D%22document.popupNode.setSCWTState%28this%29%22/%3E%0A%09%3Cmenuseparator/%3E%0A%3C/menupopup%3E%3B%0Apopup%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28popup.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Athis.%20appendChild%20%28popup%29%3B%0Athis.%20hideSelectedToolbar%20%28%29%3B%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

Вроде работает

Ещё одна просьба по поводу кнопки QickBookmarks. Вот код:

Код:

/*Initialization Code*/
var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";
var loadInBackground = true;

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    var label = tab. label;
    var image = tab. image;
    var br = getBrowser ();
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
    this. addMenuitem (label, url, image);
};

this. addMenuitem = function (label, url, image)
{
    var menu = this. menu;
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("url", url);
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu (menu);
};

this. deleteMenuitem = function (menuitem)
{
    var menu = this. menu;
    menu. removeChild (menuitem);
    this. checkEmpty (menu);
    this. flushMenu (menu);
};

this. checkEmpty = function (menu)
{
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        return;
    menu. hidePopup ();
    this. type = "";
};

this. flushMenu = function (menu)
{
    menu = menu || this. menu;
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. menu;
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. __defineGetter__
(
    "menu",
    function ()
    {
        return this. getElementsByTagName("menupopup") [0];
    }
);

this. openTab = function (event)
{
    var mi = event. target;
    var menu = mi. parentNode;
    var url = mi. getAttribute ("url");
    if (event. button < 2)
    {
        if (event. button == 0)
            getBrowser (). loadURI (url, null, null);
        else
            getBrowser (). loadOneTab(url, null, null, null, loadInBackground, false);
        menu. hidePopup ();
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi);
    this. flushMenu (menu);
};

this. onclick = function (event)
{
    if (event. button != 1 || event. target != this)
        return;
    var menu = this. menu;
    var mis = menu. getElementsByTagName ("menuitem");
    var mi;
    while (mis. length)
    {
        mi = mis[0];
        getBrowser (). loadOneTab(mi. getAttribute ("url"), null, null, null, true /*load in background*/, false);
        menu. removeChild (mi);
    }
    this. checkEmpty (menu);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();

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

Господа разработчики расширения, вопрос "косметического" характера: почему бы не сделать в диалоге редактирования кнопки 2 поля: "Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?
Изначально активно поле "Картинка", после заполнения этого поля активируется поле "Картинка маленькая", которое можно не заполнять, тогда для обоих вариантов настройки панели инструментов используется иконка из 1-го поля.

Сомневаюсь что такое возможно. Во всяком случае надо обращаться к разработчику =(

Najlus, дык я к ним и обращаюсь :)



Набросал кнопку для перехода в режим приватного просмотра:

Код:

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%u0412%u043E%u0439%u0442%u0438%20%u0432%20%u0440%u0435%u0436%u0438%u043C%20%u043F%u0440%u0438%u0432%u0430%u0442%u043D%u043E%u0433%u043E%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACzklEQVR4nL2TTUhUURTHz33v3vdmdHRmdHRs1HRm/Ao/UjOECRMkK5FWMYsooUAaoU0tyq3iLiqKVhIEbfpQKVtIHxIMBJZSpBZpWn7k55g6TjNvxnnv3Xd7CoK7XEQHDvd/FueeP4ffAfhX4fV28bvrNm+XsJc+bkc4RTFvR7d6u8wxMGZc9fZlbNVXvF0pu5uunXteuKNR69neUlnm1zFPXcCxsKooPzHGpRxoqxpDJSql/YSQPKTgZYqVTIJFTZXlVdAESQVJ5o8XWy/EOVdIt1LOMTiIsFiEGV9LEZtGHGniePSZMVbGY+bRGASAQhNDEK71DLqra7h7qNNX/Bjz9typoPe7DA6qT07UjZkYoH7901QKzKQ7XUQAJo6FsNu5Uu+pITHX4UbPxvrGCiZoJcdhXat2266XRWihpDLzWCCcm8hAayBEnnM4EovtTrclsyDbLIqmVAMVeCaYQTClwvLIxx9YUTVxapmfMRtiGfmOcZs1Sag55PwKxiQLWLOrAJX5AGgconMD0NfrDwZDmxvnm5udVInCxMS4H6saW0tJ0tIWgzbP8FDklM2sNFTsD1fnuwhKScqByXfdse5nr3r6h+bfp9ssr9t9dU8QEZ0Lk6PhX1ryQ6wo3ADPqceKHOEHBVnGpxyIdyWVOg36YgDxMD3y9pbbEOotaczeV1JefD/LnVnJGAejI8MDq6vyGLp9Jt1utdLBjBSSk2ZJgEQDhrG5ANRWHACTvQxmp+chLT1dX34CMKKnYIGZSLL0YUE40tLSMsK//CJJdUX2TzxBlQqV7EvrITAQkY6vuTpwZKFKpKoQjcgQleKwqedSiKmjAUPHxUuXe7ZA2sb3xejGbH3tiUc0LlNEjBFmcN453f7mxsmj1ePROK2MSbLxt4LlRZoa/LaZ07YQjN30+/1sm8S/sd7Z2Uk0TcvU6UT6G/D5fNG93Mj/iz9oYC5kMgYmNwAAAABJRU5ErkJggg%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*/%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BgPrivateBrowsingUI.toggleMode%28%29%3B%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

в принципе там только одна строчка:

gPrivateBrowsingUI.toggleMode();

Как должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?

3Jlou написал:

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

Пока что можно, например, так:

Код:

var sId = "__custombuttonsStyle__" + this.id; // Unique style "id"
var cssStr = 'toolbar %button% { list-style-image: url("http://forum.mozilla-russia.org/img/smilies/smile.png") !important; }\n'
    + 'toolbar[iconsize="small"] %button% { list-style-image: url("http://forum.mozilla-russia.org/img/smilies/neutral.png") !important; }';
cssStr = cssStr.replace(/%button%/g, "#" + this.id);
function sheet(cssStr, removeFlag) {
    var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
        .getService(Components.interfaces.nsIStyleSheetService);
    var ios = Components.classes["@mozilla.org/network/io-service;1"]
        .getService(Components.interfaces.nsIIOService);
    var data = "data:text/css," + encodeURIComponent(cssStr);
    var uri = ios.newURI(data, null, null);
    if(sss.sheetRegistered(uri, sss.USER_SHEET))
        sss.unregisterSheet(uri, sss.USER_SHEET);
    if(removeFlag)
        return;
    sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
    window[sId] = cssStr;
}
if(!(sId in window))
    sheet(cssStr);
else if(window[sId] != cssStr) {
    sheet(window[sId], true);
    sheet(cssStr);
}

(в инициализацию)

09-08-2009 23:08:51
Вообще, можно и отдельное поле для ввода CSS-стиля сделать (в редакторе). Другое дело – насколько часто это бывает нужно.

3Jlou написал:

Как должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?

Код:

gPrivateBrowsingUI.toggleMode();
this.checked = !this.checked;

Единственное, у меня кнопка выделяется как буд-то она очень большая по вертикали, на весь тулбар. Я еще подумаю как бы ее сделать получше

А можно и я парочку заказов оставлю.
1. Нужна кнопка "Поиск выделенного в гугле/яндексе по этому сайту". Т.е. на странице http://forum.mozilla-russia.org/viewtopic.php?pid=362834 выделены слова "Custom Buttons". Тогда в гугл идет запрос в виде http://www.google.com/search?as_q=Custom%20Buttons&as_sitesearch=forum.mozilla-russia.org, а на Яндекс - http://yandex.ru/yandsearch?rpt=rad&text=Custom%20Buttons&serverurl=forum.mozilla-russia.org. Если есть возможность, то лучше зделать так: если выделения на странице нет, то работает только ПКМ - Настройки кнопки. Если выделение есть, то ЛКМ - поиск в гугле, ПКМ - в яндексе.
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%3EPaste%20and%20Go%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAB+g5B4AAUOhwAAAAAAAAAAAPvyeYJ9cIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////AMabF/L17eoN2wFgAO8DPABgWkoA8fHwANXW2ADa3+4AEf3EACX/oAALExbzO2bqEv////wAAAAAAAAAAAH///8Au4gB/wk9vwC6w94AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARj0gAPfDQwBGeQAZAAAA7P////wAAAATBAAAAAAAAAAAMzI3ABgVwwDx8fcA+vr8AAEBAQAAAAAA/wAAAAAAAAApKlIAy8MAAAAAAAgAAAABAAAAAAAAAE4EAAAAAAAAAAAJCQkAIyIRANrb+wCKrjsADgkGAPL16gDw9OUA9/jxAAAAiwAICIgAYoIb3/7/DQABAQEG////nwQAAAAAAAAAAAAAAAAA/f0AAwAAAAQDBABPQAUAlburAO4c3gAID/0A9/37AOXt/AAd9yoAAvI6ABMTEyIBAQHeBAAAAAAAAAAAAAAAAAD8+wD++fsA7/XZAHyuqgAoQ/4ACQkGAAETBAD9BwAAEfb1AO3k0wDcpeIABTAFOCrnKuUEAAAAAAAAAAAAAAAAAPb5AOvu9QDV7q0APlgCAP0WBAD3yBsAAvsCANYSyQAAD/0ADhUGABRW6ADhpPlkNSs11gIAAAAAAAAAAAAAAAAA+/sA5u/3AAMd4gASIw0A6P3zACsaKwChX6EAYxBwAAveFwDYzuoA/hMBAPsl9ij/Cf8vAgAAAAAAAAAAAAAAAAD6/QD4+wUAGRgMAPkJ/QD4+fsAAP8AAAgFCABrP2sAnkyiAE4HVADm5PIADBUFERUOFSICAAAAAAAAAAAAAAAAAP37AAUFCAD6APoA8fj2APPz9wAA/QAAAAAAAAAAAAACAQIAAQABAPr8/QD5//0BEQ8RDAQAAAAAAAAAAAAAAAAA/P0ADwkDAOne+AAX9PQA9vf5AAD/AAD4+/gAn8afAJ/WnQDU/tMACSsDAPnaAfQJHAnuBAAAAAAAAAAAAPTYAAEniwApDuAAF8bWAOri2AAJBwMA1dzVAF+eXwDDAr0A9w/3AAkXAwD27PkALvY06SwcLNcB////AMeWE/D08u4PAAAAAAIGEADBCI4Aw+yjAO801gDzAvcA/AUAAP0HAAD6/fsA9Oz5ACfFNQBYM1GRIQUhiAH///8AAAAAAAEBARsAAAAFDw8PA2VwmdwNGfcAxuqvANIJyQD+C/UA+v/8AAPyDAAz+joAOxdRAAPt5kbExMTCAf///wAAAAAAAQEBAwAAAAIAAAAAJycnCEBAQCI7SjtK8f/xMgsGCx8AAAAA9fr14Q8BD869rr26sbGx7PDw8OaiWEPH7uRLhgAAAABJRU5ErkJggg%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%5Bthis.pasteURL%20%3D%20function%28aEvent%2C%20go%29%20%7B%0A%20%20var%20paste%20%3D%20readFromClipboard%28%29%3B%0A%20%20if%28%21paste%29%20return%3B%0A%20%20if%28%21go%29%20%7B%0A%20%20%20%20gURLBar.value%20%3D%20paste%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20openUILink%28paste%2C%20aEvent%2C%20false%2C%20true%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.copyURLBar%20%3D%20function%28%29%20%7B%0A%20%20var%20clipb%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboardhelper%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIClipboardHelper%29%3B%0A%20%20clipb.copyString%28gURLBar.value%29%3B%0A%7D%0A%0Athis.clearURLBar%20%3D%20function%28%29%20%7B%0A%20%20gURLBar.value%20%3D%20%22%22%3B%0A%20%20gURLBar.focus%28%29%3B%0A%7D%0A%0Athis.resetURLBar%20%3D%20function%28%29%20%7B%0A%20%20gURLBar.value%20%3D%20gBrowser.currentURI.spec%3B%0A%7D%0A%0Athis.checkForMiddleClick%20%3D%20function%28aNode%2C%20aEvent%29%20%7B%0A%20%20if%20%28aEvent.button%20%3D%3D%201%29%20%7B%0A%20%20%20%20var%20fn%20%3D%20new%20Function%28%22event%22%2C%20aNode.getAttribute%28%22cb-oncommand%22%29%29%3B%0A%20%20%20%20fn.call%28aNode%2C%20aEvent%29%3B%0A%20%20%20%20closeMenus%28aEvent.target%29%3B%0A%20%20%7D%0A%7D%0Afunction%20cloneCBMenuitem%20%28id%29%0A%7B%0A%09var%20cbMenuitemId%20%3D%20%22custombuttons-contextpopup-%22%20+%20id%3B%0A%09var%20menuitem%20%3D%20document.%20getElementById%20%28cbMenuitemId%29%3B%0A%09var%20menuitem2%20%3D%20menuitem.%20cloneNode%20%28true%29%3B%0A%09menuitem2.%20setAttribute%20%28%22id%22%2C%20menuitem.%20id%20+%20this.%20id%29%3B%0A%09return%20menuitem2%3B%0A%7D%0Afunction%20createMenuitem%20%28label%2C%20command%29%0A%7B%0A%09var%20menuitem%20%3D%20document.%20createElement%20%28%22menuitem%22%29%3B%0A%09menuitem.%20setAttribute%20%28%22label%22%2C%20label%29%3B%0A%09menuitem.%20setAttribute%20%28%22oncommand%22%2C%20%22document.popupNode.%22%20+%20command%29%3B%0A%09return%20menuitem%3B%0A%7D%0A%0Avar%20submenu%20%3D%20document.%20createElement%20%28%22menupopup%22%29%3B%0Avar%20ids%20%3D%20%5B%22edit%22%2C%20%22remove%22%2C%20%22clone%22%2C%20%22copyURI%22%2C%20%22separator2%22%2C%20%22updateButton%22%2C%0A%09%09%20%20%20%22bookmarkButton%22%2C%20%22buttonHelp%22%2C%20%22separator3%22%2C%20%22customize%22%5D%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20ids.%20length%3B%20i++%29%0A%7B%0A%09try%0A%09%7B%0A%09%09submenu.%20appendChild%20%28cloneCBMenuitem%20%28ids%20%5Bi%5D%29%29%3B%0A%09%7D%0A%09catch%20%28e%29%20%7B%7D%0A%7D%0Avar%20menu%20%3D%20document.%20createElement%20%28%22menupopup%22%29%3B%0Amenu.%20setAttribute%20%28%22id%22%2C%20%22cbContext-pgnButton%22%29%3B%0Amenu.%20setAttribute%20%28%22oncommand%22%2C%20%22event.%20stopPropagation%20%28%29%3B%22%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Paste%22%2C%20%22pasteURL%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Copy%22%2C%20%22copyURLBar%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Cut%22%2C%20%22copyURLBar%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Clear%22%2C%20%22clearURLBar%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Reset%22%2C%20%22resetURLBar%28%29%22%29%29%3B%0Avar%20menunode%20%3D%20document.%20createElement%20%28%22menu%22%29%3B%0Amenunode.%20setAttribute%20%28%22label%22%2C%20%22Custom%20Button%22%29%3B%0Amenunode.%20appendChild%20%28submenu%29%3B%0Amenu.%20appendChild%20%28menunode%29%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20setAttribute%20%28%22context%22%2C%20menu.%20id%29%3B%0A%0Athis.setAttribute%28%22onclick%22%2C%20%22this.checkForMiddleClick%28this%2C%20event%29%22%29%3B%0Athis.setAttribute%28%22onmouseover%22%2C%20%22this.tooltipText%20%3D%20readFromClipboard%28%29%20%3F%20readFromClipboard%28%29%20%3A%20this.label%3B%22%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%20---------------------------------------------------------------------------%0A%20%20%20%20%20Paste%20and%20Go%20button%0A%20%20%20%20%20by%20Anton%0A%20%20%20%20%20Original%20code%20is%20LouCypher%20%28aka%20Zoolcar9%29%20%22Paste%20and%20Go%22%0A%20%20%20%20%20%28http%3A//loucypher.wordpress.com/projects/extensions/%23paste-and-go-button%29%0A%0A%20%20%20%20%20Lets%20you%20paste%20an%20URL%20from%20the%20clipboard%20and%20directly%20load%20it%0A%20%20%20---------------------------------------------------------------------------%20*/%0Atry%20%7B%0A%20%20this.pasteURL%28event%2C%20true%29%3B%0A%7D%20catch%28ex%29%20%7B%0A%20%20this.pasteURL%28null%2C%20true%29%3B%0A%7D%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

как бы ее изменить, чтобы по ЛКМ ссылка из буфера вставлялась в новой фоновой вкладке (т.е. текущая вкладка продолжала быть активной), а по средней - вставить и открыть адрес в текущей вкладке?

razoo

Кстати, в последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба. Вот этого в предыдущем варианте кода нет.
Может быть, избавиться от фичи с topLevelImg?
Как бы, эксперимент дал положительный результат и это можно будет в чем-нибудь более полезном прикольно использовать (особенно, когда гифчик соответствующий поставил - очень эффектно смотрелось), но в данной кнопке, пожалуй, это излишество :).
Да и от disabledImg тоже может избавиться для простоты и функциональности?

В "Код" по-прежнему

Код:

this. loadURL ();

В "Инициализацию":

Код:

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
    {
        var uri = makeURI (url);
        if (uri. schemeIs ("chrome") ||
            uri. schemeIs ("file"))
            url = losslessDecodeURI (makeURI (url, null, makeURI (url)));
        else
            url = losslessDecodeURI (makeURI (url));
    }
    catch (e) {}
    return url;
};

this. makePathsList = function (path, prefix)
{
    var res = [];
    var paths = path. split ("/");
    if (!paths. pop ())
        paths. pop ();
    var url = prefix;
    for (var i = 0; i < paths. length; i++)
    {
        if (!paths [i])
            continue;
        url += paths [i] + "/";
        url = this. decodeURL (url);
        res. push (url);
    }
    return res;
};

this. getJARPaths = function (uri)
{
    uri = uri. QueryInterface (Components. interfaces. nsINestedURI);
    uri = uri. QueryInterface (Components. interfaces. nsIURL);
    var filePaths = this. getPaths (uri. innerURI);
    var jarPaths = this. makePathsList (uri. filePath, "jar:" + uri. innerURI. spec + "!/");
    var res = filePaths. concat (jarPaths);
    res. push (this. decodeURL (uri. spec));
    return res;
};

this. getDomain = function (uri, level)
{
    if (uri. schemeIs ("about"))
        return "";
    if (uri. schemeIs ("jar"))
    {
        uri = uri. QueryInterface (Components. interfaces. nsINestedURI);
        uri = uri. innerURI;
    }
    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)
    {
        try
        {
            domain = uri. asciiHost;
        }
        catch (e)
        {
            domain = uri. host;
        }
    }
    return domain;
};

this. getDomains = function (host)
{
    var domains = [];
    var dLevel = 0;
    var tld = "";
    while (tld != this. getDomain (host, dLevel))
    {
        tld = this. getDomain (host, dLevel++);
        if (host. spec == (host. scheme + "://" + tld + "/"))
            continue;
        domains. push (this. decodeURL (host. scheme + "://" + tld +"/"));
    }
    return domains;
};

this. getPaths = function (uri)
{
    var paths = [];
    if (uri. schemeIs ("about"))
        return paths;
    if (uri. schemeIs ("jar"))
        return this. getJARPaths (uri);
    var initialURL = uri. spec;
    paths = this. makePathsList (uri. path, uri. prePath + "/");
    paths. push (this. decodeURL (initialURL));
    paths = this. getDomains (uri). concat (paths);
    return paths;
};

this. getCBObject = function ()
{
    var cbobj = getBrowser (). mCurrentTab [id];
    if (typeof (cbobj) != "object")
        getBrowser (). mCurrentTab [id] = {};
    return getBrowser (). mCurrentTab [id];
};

this. handleMouseOver = function (event)
{
    if (event && (event. originalTarget. nodeName != "toolbarbutton"))
        return;
    this. updateButton (event);
};

this. updateButton = function (event)
{
    var uri = makeURI (getBrowser (). contentDocument. location. href);
    var cbObject = THIS. getCBObject ();
    var uri2 = makeURI (cbObject. uri || uri. spec);
    if ((THIS. getDomain (uri, 0) == THIS. getDomain (uri2, 0)) &&
        (uri. spec. length < uri2. spec. length))
        uri = uri2;
    var f1 = (THIS. getDomain (uri, 0) == THIS. getDomain (uri2, 0));
    var f2 = (uri. spec. length < uri2. spec. length);
    cbObject. uri = uri. spec;
    var paths = THIS. getPaths (uri);
    var 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] || uri. spec;
    if (paths. length > 1)
        THIS. type = "menu-button";
    else
        THIS. type = "";
    var menu = THIS. getElementsByTagName ("menupopup") [0];
    if (menu)
        THIS. removeChild (menu);
    menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
    var menuitem;
    var curl = THIS. decodeURL (getBrowser (). contentDocument. location. href);
    for (var i = 0; i < paths. length; i++)
    {
        menuitem = <menuitem label={paths [i]} tooltiptext={paths [i]}/>
        if ((paths [i] == curl) ||
            (paths [i] == (curl + "/")))
        {
            menuitem.@checked = "true";
            menuitem.@type = "radio";
        }
        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;
    loadURI (this. uriToLoad || this. host);
    this. uriToLoad = "";
};

this. onUnload = function (event)
{
    window. removeEventListener ("focus", THIS. updateButton, true);
    window. removeEventListener ("unload", THIS. onUnload, false);
};

this. destroy = function ()
{
    this. onUnload (null);
};

window. addEventListener ("focus", this. updateButton, true);
window. addEventListener ("unload", this. updateButton, false);

this. updateButton (null);

this. setAttribute ("onclick", "this.clickHandler(event)");
this. setAttribute ("onmouseover", "this.handleMouseOver(event)");
this. orient = "horizontal";

Najlus написал:

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

Пока есть идея воспользоваться
nsISessionStore + getTabState() + результат в JSON и так строку возвращает.
Обратно – setTabState().
Но есть сомнения в разумности такого подхода. Впрочем, вроде, это самое простое.

10-08-2009 21:52:44
Во, кажется, работает:

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";
this. loadInBackground = true;

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    this. addMenuitem (tab, url);
};

this. __defineGetter__
(
    "ss",
    function ()
    {
        delete this.ss;
        return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
            .getService(Components.interfaces.nsISessionStore);
    }
);

this. addMenuitem = function (tab, url)
{
    var label = tab. label;
    var image = tab. image;

    var menu = this. menu;
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("tab_data", this.ss.getTabState(tab));
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu (menu);

    var br = gBrowser;
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
};

this. deleteMenuitem = function (menuitem, dontFlush)
{
    var menu = this. menu;
    menu. removeChild (menuitem);
    this. checkEmpty (menu);
    !dontFlush && this. flushMenu (menu);
};

this. checkEmpty = function (menu)
{
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        return;
    menu. hidePopup ();
    this. type = "";
};

this. flushMenu = function (menu)
{
    menu = menu || this. menu;
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. menu;
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. __defineGetter__
(
    "menu",
    function ()
    {
        return this. getElementsByTagName("menupopup") [0] || null;
    }
);

this. openTab = function (event, mi)
{
    mi = mi || event. target;
    var bg = event ? this. loadInBackground : true;
    var menu = mi. parentNode;
    if (!event || event. button < 2)
    {
        var tab;
        if (event && event. button == 0)
            tab = gBrowser. mCurrentTab;
        else
            tab = gBrowser. loadOneTab("about:blank", null, null, null, bg, false);
        menu. hidePopup ();
        var tabData = mi. getAttribute ("tab_data");
        this.ss.setTabState(tab, tabData);
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi, !event);
};

this. onclick = function (event)
{
    if (event. button != 1 || event. target != this)
        return;
    var menu = this. menu;
    var mis = menu. getElementsByTagName ("menuitem");
    while (mis. length)
        this. openTab (null, mis[0]);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();

10-08-2009 21:53:11
P.S. Firefox 3.0+.

3Jlou написал:

Господа разработчики расширения, вопрос "косметического" характера: почему бы не сделать в диалоге редактирования кнопки 2 поля: "Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?
Изначально активно поле "Картинка", после заполнения этого поля активируется поле "Картинка маленькая", которое можно не заполнять, тогда для обоих вариантов настройки панели инструментов используется иконка из 1-го поля.

Ок, буду иметь в виду. Но без обещаний.

10-08-2009 23:08:20

Dreyk написал:

3Jlou написал:

Как должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?

Код:

gPrivateBrowsingUI.toggleMode();
this.checked = !this.checked;

...

Можно добавить в раздел "Инициализация"

Код:

var THIS = this;
this. cbObserver =
{
    button: THIS,
    win: window,
    
    observe: function (subject, topic, data)
    {
        if (topic != "private-browsing")
            return;
        if (data == "enter")
            this. button. checked = true;
        else if (data == "exit")
            this. button. checked = false;
    }
};
var os = Components. classes ["@mozilla.org/observer-service;1"].
     getService (Components. interfaces. nsIObserverService);
os. addObserver (this. cbObserver, "private-browsing", false);

this. destroy = function ()
{
    var os = Components. classes ["@mozilla.org/observer-service;1"].
         getService (Components. interfaces. nsIObserverService);
    os. removeObserver (this, "private-browsing");
};

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

Anton написал:

Правда, деструкторы кнопок пока не реализованы, поэтому observer сниматься не будет. (но это мало кто заметит)

Исследовать лениво, но если открыть два окна, а потом одно из них закрыть, observer будет оповещать уже несуществующий объект. Так что, опять же по идее, утечек памяти может и не случиться.
Или можно просто пересоздать кнопку (изменить код и сохранить).
(Я такое наблюдал в одном расширении, которое не снимало наблюдателя с компоненты встроенного загрузчика.)

Jarichek написал:

1. Нужна кнопка "Поиск выделенного в гугле/яндексе по этому сайту". Т.е. на странице http://forum.mozilla-russia.org/viewtopic.php?pid=362834 выделены слова "Custom Buttons". Тогда в гугл идет запрос в виде http://www.google.com/search?as_q=Custom%20Buttons&as_sitesearch=forum.mozilla-russia.org, а на Яндекс - http://yandex.ru/yandsearch?rpt=rad&text=Custom%20Buttons&serverurl=forum.mozilla-russia.org. Если есть возможность, то лучше зделать так: если выделения на странице нет, то работает только ПКМ - Настройки кнопки. Если выделение есть, то ЛКМ - поиск в гугле, ПКМ - в яндексе.

В раздел "Инициализация":

Код:

this. onclick = function (event)
{
    var focusedWindow = document. commandDispatcher. focusedWindow;
    var text = focusedWindow. getSelection (). toString ();
    if (!text || event. shiftKey)
        return;
    var doc = getBrowser (). contentDocument;
    var url = doc. location. hostname;
    var charset = doc. characterSet;
    try
    {
        charset = PlacesUtils. history. getCharsetForURI (makeURI (doc. location. href));
    } catch (e) {}
    if (charset)
    {
        text = escape (convertFromUnicode (charset, text));
        url = escape (convertFromUnicode (charset, url));
    }
    else
    {
        text = encodeURIComponent (text);
        url = encodeURIComponent (url);
    }
    var searchURL = "";
    if (event. button == 2)
    {
        event. preventDefault ();
        event. stopPropagation ();
        searchUrl = "http://yandex.ru/yandsearch?rpt=rad&text=" + text + "&serverurl=" + url;
    }
    else if (event. button == 0)
        searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
    getBrowser (). addTab (searchUrl);
};

Если надо, чтобы результаты поиска загружались в текущей вкладке, надо заменить строку

Код:

getBrowser (). addTab (searchUrl);

на

Код:

loadURI (searchUrl);

2. Нашел вот такую кнопку "Вставить и перейти":

Код:

custombutton://...

как бы ее изменить, чтобы по ЛКМ ссылка из буфера вставлялась в новой фоновой вкладке (т.е. текущая вкладка продолжала быть активной), а по средней - вставить и открыть адрес в текущей вкладке?

В разделе "Инициализация" этой кнопки заменить строку

Код:

openUILink(paste, aEvent, false, true);

на

Код:

openUILinkIn(paste, (aEvent. button == 1)? "current": "tabshifted");

Таки не удержался. :D
Наблюдатели навешиваются, исключения не сыплются. Неужели, они уже сами снимаются?

Infocatcher
Всё равно - неприятно.
this. destroy работает только при удалении кнопки.

Anton написал:

this. destroy работает только при удалении кнопки.

Так все же, что там касательно DOMNodeRemoved?
Хотя лучше бы мозилловцы сделали нормальные деструкторы, конечно.

Infocatcher написал:

Во, кажется, работает:

При открытии закладки она не удаляется из списка =(
И при удалении закладк исчезает, но при открытии списка появляется вновь =(

Anton
спасибо! Если не затруднит, что нужно добавить в кнопке "Вставить и перейти" в исправленном варианте, чтобы по ЛКМ ссылка открывалась в текущей вкладке, если она пустая?
А как можно к обычным кнопкам "Обновить" и "Остановить" прикрутить по правому клику "Обновить все" и "Остановить все". Сам разобрался.
Есть еще желание улучшить кнопку "Поиск по сайту". Можно еще обработать комбинации Ctrl+ЛКМ и Ctrl+ПКМ (соответственно как и одиночные клики - для гугл и яндекс). При нажатии в комбинации с Ctrl появится маленькое окошко, в котором 2 текстовых поля, скажем первое - "Искать текст" и по-умолчанию оно не заполнено, и второе текстовое поле - "Сайт", куда по умолчанию вписан адрес сайта текущей вкладки. И кнопки "ОК" и "Отмена". После нажатия "ОК" будет произведен поиск введенного вручную текста в поле "Искать текст" по сайту из поля "Сайт". URL из поля сайт соответственно при желании можно ввести руками другой. Буду признателен, если поможешь :)

Можно мне объяснить как делать кнопки? Поэтапно... ну или просто напишите код кнопки чтобы при нажатии она кидала на такой url: firstpeaceсайтскоторогонажатакнопкаsecondpeace сам разберусь...

Najlus написал:

При открытии закладки она не удаляется из списка =(
И при удалении закладк исчезает, но при открытии списка появляется вновь =(

Было такое, исправил.
Это все оптимизация от излишне частой записи на диск, переусердствовал. =)

this. openTab = function (event, mi)
{
    ...
    this. deleteMenuitem (mi, !event);
};

Infocatcher написал:

Было такое, исправил.

Кажись пока стабильно =)
Правда поубивал стандартные... но с помощью второй кнопки уже перенёс, так что ничего страшного =)
О_О но при загрузке страницы не обновляются а загружаются старые =( можно как нить исправить?

Кто хорошо разбирается в JavaScript!! нужна помощь, очень. в ПМ.

Infocatcher

Так все же, что там касательно DOMNodeRemoved?

Некогда.

Пока придумался план короткого пути: восстановить деструктор в xbl и вызывать destroy () из деструктора и при обновлении / удалении кнопки.
Но надо тестировать, понятное дело.

Anton написал:

Некогда.

Понятно.
Это лучше, чем если бы не работало или плохо работало.

Anton написал:

Пока придумался план короткого пути: восстановить деструктор в xbl и вызывать destroy () из деструктора и при обновлении / удалении кнопки.

Я правильно понимаю, что это не спасет при перемещении кнопки в toolbarpalette?

Jarichek

что нужно добавить в кнопке "Вставить и перейти" в исправленном варианте, чтобы по ЛКМ ссылка открывалась в текущей вкладке, если она пустая?

Перед

Код:

openUILinkIn(paste, (aEvent. button == 1)? "current": "tabshifted");

надо добавить

Код:

    if (getBrowser (). contentDocument. location. href == "about:blank")
        loadURI (paste);
    else

Есть еще желание улучшить кнопку "Поиск по сайту". Можно еще обработать комбинации Ctrl+ЛКМ и Ctrl+ПКМ (соответственно как и одиночные клики - для гугл и яндекс). При нажатии в комбинации с Ctrl появится маленькое окошко, в котором 2 текстовых поля, скажем первое - "Искать текст" и по-умолчанию оно не заполнено, и второе текстовое поле - "Сайт", куда по умолчанию вписан адрес сайта текущей вкладки. И кнопки "ОК" и "Отмена". После нажатия "ОК" будет произведен поиск введенного вручную текста в поле "Искать текст" по сайту из поля "Сайт". 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);
};

this. searchYandex = function (text, url, encode)
{
    if (encode)
    {
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
    }
    var searchUrl = "http://yandex.ru/yandsearch?rpt=rad&text=" + text + "&serverurl=" + url;
    getBrowser (). addTab (searchUrl);
};

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="Custom Buttons"
                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="Сайт"/>
                            <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. onclick = function (event)
{
    var focusedWindow = document. commandDispatcher. focusedWindow;
    var text = focusedWindow. getSelection (). toString ();
    var doc = getBrowser (). contentDocument;
    var url = doc. location. hostname;
    if (event. ctrlKey)
    {
        if (event. button == 0)
            this. showSearchDialog (this. searchGoogle, url);
        else if (event. button == 2)
        {
            event. preventDefault ();
            event. stopPropagation ();
            this. showSearchDialog (this. searchYandex, url);
        }
        return;
    }
    if (!text || event. shiftKey)
        return;
    var charset = doc. characterSet;
    try
    {
        charset = PlacesUtils. history. getCharsetForURI (makeURI (doc. location. href));
    } catch (e) {}
    if (charset)
    {
        text = escape (convertFromUnicode (charset, text));
        url = escape (convertFromUnicode (charset, url));
    }
    else
    {
        text = encodeURIComponent (text);
        url = encodeURIComponent (url);
    }
    var searchURL = "";
    if (event. button == 2)
    {
        event. preventDefault ();
        event. stopPropagation ();
        this. searchYandex (text, url, false);
    }
    else if (event. button == 0)
        this. searchGoogle (text, url, false);
};

Kemerover

... ну или просто напишите код кнопки чтобы при нажатии она кидала на такой url: firstpeaceсайтскоторогонажатакнопкаsecondpeace сам разберусь...

Код:

loadURL ("firstpeaceсайтскоторогонажатакнопкаsecondpeace");

?

Infocatcher

Я правильно понимаю, что это не спасет при перемещении кнопки в toolbarpalette?

Не знаю.

Код:

    if (getBrowser (). contentDocument. location. href == "about:blank")
        loadURI (paste);
    else

Еще есть что-то там про busy-флаг.

11-08-2009 21:39:13
P.S. Я тут недавно наткнулся на

Код:

/* DEPRECATED */
function getBrowser() gBrowser;
function getNavToolbox() gNavToolbox;

в chrome://browser/content/browser.js

11-08-2009 21:40:45
Из Brief:

Код:

    shouldOpenInNewTab: function gBrief_shouldOpenInNewTab() {
        var openInNewTab = this.prefs.getBoolPref('openInNewTab');
        var isLoading = gBrowser.webProgress.isLoadingDocument;
        var isBlank = (gBrowser.currentURI.spec == 'about:blank');
        return openInNewTab && (!isBlank || isLoading);
    },

11-08-2009 21:42:21
Так что, полагаю, лучше как-то так:

Код:

    if (gBrowser.currentURI.spec == "about:blank" && !gBrowser.webProgress.isLoadingDocument)
        loadURI (paste);
    else

Najlus

при загрузке страницы не обновляются а загружаются старые

Попробуй

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    var label = tab. label;
    var image = tab. image;
    var sss = Components. classes ["@mozilla.org/browser/sessionstore;1"].
              getService (Components. interfaces. nsISessionStore);
    var ts = JSON. parse (sss. getTabState (tab));
    var entry = ts. entries [ts. entries. length - 1];
    var scroll = entry && entry. scroll || "0,0";
    var br = getBrowser ();
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
    this. addMenuitem (label, url, image, scroll);
};

this. addMenuitem = function (label, url, image, scroll)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("url", url);
    mi. setAttribute ("tooltiptext", url);
    mi. setAttribute ("tabscroll", scroll);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu ();
};

this. deleteMenuitem = function (menuitem)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    menu. removeChild (menuitem);
    if (menu. getElementsByTagName ("menuitem"). length == 0)
    {
        menu. hidePopup ();
        this. type = "";
    }
    this. flushMenu ();
};

this. flushMenu = function ()
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. getElementsByTagName ("menupopup") [0];
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. openTab = function (event)
{
    var mi = event. target;
    var menu = mi. parentNode;
    var url = mi. getAttribute ("url");
    var scroll = mi. getAttribute ("tabscroll"). split (",");
    var scrollLeft = scroll [0];
    var scrollTop = scroll [1];
    var tab = getBrowser (). mCurrentTab;
    if (event. button < 2)
    {
        if (event. button == 0)
            getBrowser (). loadURI (url, null, null);
        else
            tab = getBrowser (). loadOneTab(url, null, null, null, false /*load in background*/, false);
        menu. hidePopup ();
    }
    else
        event. stopPropagation ();
    gBrowser. addEventListener
    (
        "DOMContentLoaded",
        function (event)
        {
            gBrowser. removeEventListener ("DOMContentLoaded", arguments. callee, true);
            var tab = event. target;
            var br = gBrowser. getBrowserForDocument (tab);
            br. contentDocument. documentElement. scrollTop = scrollTop;
            br. contentDocument. documentElement. scrollLeft = scrollLeft;
        },
        true
    );
    this. deleteMenuitem (mi);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();

Anton, Infocatcher Спабибо!
Infocatcher спасибо за поправку, работает отлично :)

Najlus написал:

но при загрузке страницы не обновляются а загружаются старые =(

Поковырял Session Manager, там сделано через

Код:

// If tab reloading enabled and not offline
if (gSessionManager.mPref_reload && !gSessionManager.mIOService.offline) {

    // Restore tabs that are marked restore.
    var sessionStore = gSessionManager.mSessionStore;
    var allowReload = sessionStore.getTabValue(aEvent.originalTarget, "session_manager_reload");
    if (allowReload == "true")
    {
        var nsIWebNavigation = Components.interfaces.nsIWebNavigation;
        var browser = this.getBrowserForTab(aEvent.originalTarget);
        browser.reloadWithFlags(nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE);

По идее, должно работать:

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";
this. loadInBackground = true;
this. reload = true;

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    this. addMenuitem (tab, url);
};

this. __defineGetter__
(
    "ss",
    function ()
    {
        delete this.ss;
        return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
            .getService(Components.interfaces.nsISessionStore);
    }
);

this. __defineGetter__
(
    "ios",
    function ()
    {
        delete this.ios;
        return this.ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService);
    }
);

this. addMenuitem = function (tab, url)
{
    var label = tab. label;
    var image = tab. image;

    var menu = this. menu;
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("tab_data", this.ss.getTabState(tab));
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu (menu);

    var br = gBrowser;
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
};

this. deleteMenuitem = function (menuitem, dontFlush)
{
    var menu = this. menu;
    menu. removeChild (menuitem);
    this. checkEmpty (menu);
    !dontFlush && this. flushMenu (menu);
};

this. checkEmpty = function (menu)
{
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        return;
    menu. hidePopup ();
    this. type = "";
};

this. flushMenu = function (menu)
{
    menu = menu || this. menu;
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. menu;
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. __defineGetter__
(
    "menu",
    function ()
    {
        return this. getElementsByTagName("menupopup") [0] || null;
    }
);

this. openTab = function (event, mi)
{
    mi = mi || event. target;
    var bg = event ? this. loadInBackground : true;
    var menu = mi. parentNode;
    if (!event || event. button < 2)
    {
        var tab;
        if (event && event. button == 0)
            tab = gBrowser. mCurrentTab;
        else
            tab = gBrowser. loadOneTab("about:blank", null, null, null, bg, false);
        menu. hidePopup ();
        var tabData = mi. getAttribute ("tab_data");
        this.ss.setTabState(tab, tabData);
        if(this.reload && !this.ios.offline)
        {
            var wn = Components.interfaces.nsIWebNavigation;
            gBrowser.getBrowserForTab(tab).reloadWithFlags(wn.LOAD_FLAGS_BYPASS_PROXY | wn.LOAD_FLAGS_BYPASS_CACHE);
        }
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi, !event);
};

this. onclick = function (event)
{
    if (event. button != 1 || event. target != this)
        return;
    var menu = this. menu;
    var mis = menu. getElementsByTagName ("menuitem");
    while (mis. length)
        this. openTab (null, mis[0]);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();

Кстати, а как задать например кнопке "Остановить" стандартную иконку из текущей темы, что бы при смене темы она подхватывалась из нее?

Jarichek

Кстати, а как задать например кнопке "Остановить" стандартную иконку из текущей темы, что бы при смене темы она подхватывалась из нее?

Никак.

Скажите пожалуйста , почему ранее выложенная кнопка

Код:

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%3EprofilesMenu%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-1%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E1%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20apps%3Dnew%20Array%3B%0A//------menu%20items--------%0Aapps.push%28%5B%27Notepad%27%2C%27c%3A/windows/notepad.exe%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27IE%27%2C%27c%3A/Program%20files/Internet%20Explorer/IEXPLORE.EXE%27%5D%29%3B%0A//------/menu%20items-------%0A%0Avar%20nMItem%3Dfunction%28label%2Cpath%2Cargs%2Cobj%29%7B%0A%20%20var%20m%3Ddocument.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%3Dobj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%29%27%29%3B%0A%20%20return%20m%3B%0A%7D%0Athis.startProcess%3Dfunction%28path%2Cargs%29%7B%0Avar%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0Avar%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20.getService%28Components.interfaces.nsIProcess%29%3B%0A%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%20%0A//%20file.launch%28%29%3B%0A%20process.init%28file%29%3B%0A%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%3Ddocument.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3Bi%3Capps.length%3Bi++%29%7B%0A%20if%20%28apps%5Bi%5D%20%3D%3D%27separator%27%29%7B%0A%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%7Delse%7B%0A%20%20if%20%28%21apps%5Bi%5D%20%5B2%5D%29%20apps%5Bi%5D%20%5B2%5D%3D%27%27%3B%0A%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2Capps%5Bi%5D%20%5B1%5D%2Capps%5Bi%5D%20%5B2%5D%2Cthis%29%29%3B%0A%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.orient%20%3D%20%22horizontal%22%3B%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

работает на моем :::: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) только единожды ?

На новом профиле пробовал , аналогично

vurdalak
Надо заменить в коде кнопки

Код:

.getService(Components.interfaces.nsIProcess);

на

Код:

.createInstance(Components.interfaces.nsIProcess);

Anton
Премного благодарен

Посмею еще задать один вопрос.
Возможно ли сделать так:
К примеру вот код кнопки:

Код:

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%3EFavorite%20Applications%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-4%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20login%20%3D%20%22Administrator%22%3B%20%20%20%20%20%20%20%20%20%20//%20Here%20put%20your%20login%20name%21%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%20%20//%20So%20you%20can%20use%20%22Show%20Desktop%22%20command%21%0A%0A/*%0AIf%20you%20deleted%20%22Show%20Desktop%22%20from%20your%20Quick%20Launch%20toolbar%2C%20just%20enter%20this%20URI%0Ain%20your%20Firefox%20and%20save%20the%20file%20as%20%22Show%20Desktop.scf%22.%20Then%20you%20can%20put%20it%20in%20you%20Quick%20Launch%21%21%0AShowDesktop%3D%22data%3Aapplication/x-unknown-content-type%3Bbase64%2CW1NoZWxsXQ0KQ29tbWFuZD0yDQpJY29uRmlsZT1leHBsb3Jlci5leGUsMw0KW1Rhc2tiYXJdDQpDb21tYW5kPVRvZ2dsZURlc2t0b3ANCg%3D%3D%22%3B%0A*/%0A%0Avar%20apps%20%3D%20new%20Array%3B%0ADefault%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%27%3B%0AShowDesk%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAioFc/4lLHf9dPCL/Sj8u/zZMRv86Ukv/O1RN/0VhWf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZbEv+tSQT/p0wR/8F4MP/BeDD/wXgw/8F4MP9FOCj/OUc+/ztTTf8+Vk//RmNb/1p+dP8AAAAAAAAAAAAAAAC2WxL/tlsS/7/WzP++8vv/t/D7/7fw+/+37vv/wXgw/8F4MP/BeDD/wXgw/1M3H/8+Qjf/TGpi/wAAAAAAAAAAtlsS/8fQvf/F8/z/xfP8/8x6O//Mejv/zHo7/7fu+/+37vv/t+77//DOpv+1UAH/tVAB/ztUTf8AAAAAAAAAANiBJ//L0bz/yvX7/8r1+//3ozD//+PH///lzP/Mejv/zHo7/8x6O//Q9vz/8M6m/8xnAf87VE3/AAAAAAAAAADYgSf/z9K9/9D2/P/Q9vz/96Mw///lzP//5cz//+XM///lzP/Mejv/0Pb8/9D2/P/MZwH/PldQ/wAAAAAAAAAA2IEn/9Tt7P/U9vz/1Pb8//ejMP//8+f/AQ4U/wEOFP/Zhzf/2Yc3/9mHN//U9vz/zGcB/zZMRv8AAAAAAAAAANiBJ//c+P3/3Pj9/9z4/f/3ozD///Pn///y5f9hhJL//+TJ//XDkP/Zhzf/2Yc3/8xnAf8pOTX/Ql1V/2eShv/YgSf/4fn9/+H5/f/h+f3/96Mw///8+f//8uX///Pn/9mHN///5Mn//+XM//zRpv/Zhzf/ETG5/y9CPf9UeG7/2IEn/+Xi0P/o+v7/6Pr+//ejMP////////r1///y5f//7dz/2Yc3/9mHN///5cz/H1zV/y6G8v8RMbn/bJiL/9iBJ//YgSf/7Pv+/+z7/v/3ozD/+7JB//uyQf//+vX///Ll/8x6O//s+/7/2Yc3/9mHN/8eJJb/AAAAAAAAAADYgSf//+26/9iBJ//0/P7/9Pz+//T8/v/w2L//+7JB//uyQf/Mejv/9Pz+//T8/v/Zhzf/O1RN/wAAAAAAAAAA2IEn/++mRv/vpkb/2IEn//DOpv/w2L///P7///z+///8/v///P7///z+///vpkb/2Yc3/ztUTf8AAAAAAAAAAAAAAACOn4b/oLac/6ilhf/vpkb/76ZG/++mRv/vpkb/8tKf//LRo//vpkb//L12/9mHN/9Sc2n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+mRv/vpkb/76ZG/++mRv/vpkb/AAAAAAAAAAAAAAAA//9zQQD/c0EAB3NBAANzQQADc0EAA3NBAANzQQADc0EAAHNBAABzQQAAc0EAA3NBAANzQQADc0GAA3NB/wdzQQ%3D%3D%27%3B%0AIExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%3D%27%3B%0AWExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%3D%3D%27%3B%0ACtrlPanel%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAEG0lEQVR42mJkTDzG8P/ffwYpEU6Gzz/+8H//9Y+dh4s1+cOn3+zMbMwWf/8wWAAVMOi/nLtX8uet4L+MrAz/GBgYmIHY/ft3BoAAYgHSOYyMjCIfv/2x+Pnnv8WfH/+YPnz4zMsAVMbC+p9BQYCV4dNfNoYvf9j4vn37wvCXkZ3hF9BADyFhBtVv3xgAAoiF4e/fif+//Wb6+ukvAzvrPwYtUVYGSyM+Bl15HgYTLSkGRUkOhty5txkOXP//F+TSv/9+MrCxsjBICggw/H73jgEggFgYvn37HGXEx+9lJMpgqCrEoCTJw8DBycoAAh++vGP4y8TO8O8/IwMj0FaGf38Y2ISUGZgktBlYGR4x/P//nwEggFj+//jBkO2py2BlIAnW9Auo7uMvBoYfP38zvD2aycBr1MPAxsLO8PsvM8PPb58ZhByDGb4x8TAwPL0HNJiJASCAmFhYWRkevvoG1vz9NwPDN5Dm/wwMX57sZPjLrcnAwCfLwMXJzPDr19//X8XNGX5JWzP8/flVjOnLq5lC7G+XAwQQCwsLE8PHL7/BBvwG2v7zL9AVQAO+3V/E8E86juEvkP3/90+GbyzCzJ90wsRUuDhmGqgKO6v/4ufl/HiCASCAWJgYGRlefQBay/Cf4fsfRoZfjEDNTw4x/P5wiYHVyInh/hsGhhc//jEEhwU4OFmo3/vOxMN98Yo8w+p/ir8EX0uvBggAQQC+/wQBAAAA8fkCAPf25ADuzJEABC2AAPnkrgD/FUcA6ujpAMTU2gBKOz4ADgkHBcfU4wXNzbvV8efcyCAD8ZMlFRvSAgBBAL7/BAYFAwDz9vgA+AcnAP8IHAD0vkgAAAUPAPkplQCyqrAAEQDYAKTmJQDhz8HdGv3XbBUE9L8QAQT5BgIBAAP+/QACiAUc8n/+Mvz8DYw6pVyGf68OAWML6CUuBQYG23yGHwxfGMwefmK4/fj2dQbu5zsYhIFpjJmNAehZcLgBBBALIxMTw2dgIH79AQo8YGjrLWb4/fEWw+8/DAyaAowMh9/zMnAy/2L4w8TP+uLjK4a33xkZ+Pn/M8gKAh3K+I8BIIBY/gDN+gNMYT+AGn4AI+M3IzfDT35DsOninAwM8m9+Mxy5+Yrhz5+/zIzAhPPr1x+Gly+/MHz78p/h5x8hBoAAYvnz9x/DT6BrmNiAOoCGfAUmiRcf/jLcuPmU4eS5+wy3rt1g+Pfuyk8VtkefeNk+gxMPCAC9z/CekZkBIIBY/v/5wvL8LQfDtGW3GO49eMXwCpjCvjy7+Ov/99cf2P5/mKvO/eseA/v7E0wsbPc5OHmByfcfAzIACCAW9t9v3t6/+vzP0wub//D+f3pGkPnZaQHmP2t4eTjvMTKzfmZj4wAmbXagRiag7f+BNIp+BoAAAwDAMqTgcw5bNAAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSNotepad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAoJJREFUOE+lk/tL01EUwO0fy1ely6IUMoi0AoM0Sy1TMDMitZyvfLDNdM5HPle6RNt0mlvz0ebmYzoVN5vO4cQ5yxQFAz/NbxTo9Kcu3Hu4h3s/fM6BcwYI+q91CBBXdGDtjaG88LUQywoK/9yLJEKseaulRnzX/5Sg41tIiKsWaauX0mdxolUr6Btz0NpWh9Ls4ZNugHbbDpklMvKkTQEQAVD4YQmN+yeGzX00qzvUu9aodKwhc25TurhLtnWbuNb10wF5ygUqnD4UTg8Sxwa5Nhc5026eTnpIG18lYWSdBO3B6QCF2krutI838z7ypzdJNS+RZHJz3/idWyNeLvd7iFEfkKYwnFxCl95Mnm2FdPMGj81bxA25uKZfJla3wZXPm4R0exC93yGtdysAIvRAPWSm1rlEvP4H8UM+ogZcRPS5idKsc6HHQ7BymUj5Kum6A15KWo5YCIAeg5ku7xTXtV5itD7CuhcIVzm41LlChNLO2Xoboko7qV1bpFQNHLEQAB/9JUzsWUkaXOVih4tz7dOENU8gejeLqMFGsMyCqGCSpFoHyU32QIBKb8G6byR/fJmLTQ5C60Y5LzchqrYQKflKcNEXIrMNJBaP8ah1jVdVzf/KEAxUOgsLv6ZodM5xtWGe0LIBQkq0RBSPEF48TIjYRLTYRkqd3W+wyL2c0qOADp2ZyT0jet8Md1Quf8OMxCqnSO63kzVuJ2d2huhMKS8KyykqrQ5sYrfBb8AExt1hVOtzlLkHkXtHaVxxIJuZJ7trnhsJz0+fhXqNlc5lO3LTN3I7p3hQMcjNrBZuP6wkOb2EfLH0xM/CJB8eGc+kJGbIeJJTISge1zxpCv/mfgPvVs+ANDa5fgAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSWordpad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAD5ElEQVR42gBBAL7/Af///wDgz3tx+e7eSe7mDMcTHwhq3d3+lhQQ9Tfb4fDGGxEsa+z105z+AkJFDP3M9PEQRo8qKSyz1d3qAFlVRwACiBFkwPKlJz9+e7WVT1hYgOHZGy4GKcHHDM8/mzIoi55kePEzhEGQcRUDi0gSA9OHVQwfGdUYWCXkTa89en+mOsGTASCAWBiAgJFdgkHbyJ5B21Cb4em9lwwS0h4MHz6zMkiIGDJ8+yPM8O9vAQMXDx8D458Yhv5FhxgOv/s9lf/fvyag1q0AAQQxgPMDg7y9IcP7n38ZBLSkGX4xMDFw8P1mePmHgeEX4zOGv6wMDFyMnxhefWdiWPNZkeH9dwmzIL73y4Ba+QECCGzAH6A33v98z/Dz2y8GZkYGBlZGJgZuFi4GFqBBXKxCDMwsPxnOPvrJMO8gK8Ozj2IMfI/3Mbzn+wjU6ccAEEBgA5gYmRlYmTkZ2Ni5GH78+crw+98vhtc/3gK1/2cQ5eZheHLjP8OWQ78YTj1jY+D/eZNB8dcdBk4uoRcgvQABBDbg59/vQL9+ZWD/z8XAAbSZnYmf4c/fnwzsLL8ZDt78yrBk+x8Gpk//GEwYfzJ8//aUQYCf9a20lKgPSC9AAIENYGPmYmADavzx+ycDw78/DD8ZWRiEONkYdlz8x9C7hZXh0Yd/DOrCnAzm0swMHz69ZbA3MXomLCJ8G6QXIIDABvz+/4vhF9DZTEysDH+B4fGb8TvD8Qd/GCbv/M3w4O1vBj0ZDgYPPUEGA4VvDNc+izAY6GkyCAoKgLQyAAQQE4j4C7L132+g5n8M3Bw8DKz/BBiWbPzEcPflLwYjOW4GGxURBluNvwyWSowMjEzMDMxMTAwsoNAGAoAAArsAFIAg20Hh8OfXV4Yv11kZOF/+YHDTlmLQV+Zg0JT9yCAm8Jfhww9ggIOCFuhKIAIDgAACG/D3/1+giZwMLOwcDO8ufWfYsOk5g5ieGIO2Fj+Drsx/BmHebwzffv1i+Pz7L8N/uMMhLgAIIKgBvxk+/3rPwPqXjeEt628GeRceBlmVPwzS/M8YuNnYGf4BY4edGRg+fz8B2f8YkAFAAIENYGbkYmBl4WX48fMzg7DiPwZpNV4GblYOYIz8Yvj+5zvDX6bvDHzs3Ay87OLgNPMf6g4QAAggsAH/WX4w/GcVZBDgE2FgBdrw48d3hj9ffjNw/AI68xcnw9vX7xgefnjG8PPzD2A6YWXg4+F+x8bKCjYAIIDABiiKcq97e/lN2KfHr7/9+AAMxK/fGH7++Al0wC+wk7m4OBl4eLgZ+Hi52a0tjG5xc3NEMUNjASDAAGRtWmcAXa/AAAAAAElFTkSuQmCC%27%3B%0ATimenDate%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqBJREFUOE+Fk2tIk1EAho9F2J8uFF0gol92g6j+WEFGTGrQBYYynGnrYllOwbIx2aJWUEiJoZiFIYSaoJFdSEFrXcwaUZFz4Vrq5mWX+lz25UQpop62SaOLowPn1+F5znvOeU8cIGKN7FcbIosJc3cK24cvQozPF9/erxDXM5PjokxYMNk8+HI9xe5cmkbrqQtcJK9DwdKGvUw55UNdawkhE1xMWNW2nKLegzR+rqM52MQxu5mVjcXEnStHnJrNsfKrEcmkgk1VPlbfSCacwuRI4aSzkNwOWHCtH1EqEEbB4kOpmEymf+OLomHmmxzMuHCGNXcWktSyhM2tXpbU/0CUeBFnQ4Kjgpm7M2ILpu9rR+R3Ma9Ex5zLK5hWqSIsFqfVCIMg/vAsFqnzSU9PR9hbS/l7Omr34yrdDucToWg9WWdXhWIrEAcsTM3IIyF7G2tTDBOCkeeVcD0NKhSgX8ZY8Q6C5XuQm0oYtbfyfegt2Zf2InYdQSgbiVdUosi6wDplDoWFhQh32x1s927x7FEb7a5hbN4RXIExPIHPBIY/IffZOFF1l+kba5inqGdD+iMSd5xDo9FM3MHN1qdYB0Z5EoLtLi+DVguyvZ2gz4Xs6kAe6KTmtoct+5+TpH3A2q1G1Gp1BI48Y1jQ0j3O6/4A3X2DSD1vkD3d+Ls7kboe43c85M07H2k5FSiVSnQ6XRSOCpq7RpAkiaDdyteAB39/D/6BHiRHC0FZYrCvl/x8I2azOdrAP5p494Ubr8/HR3sbX9/eJzj8gUG3E1mWsTo/UXC8InLjv2L/Xv1IE8PHkIYCkRRhyO+XsFieUVZ2hbTduWRmZk4KR6scFjidbqqrGygoMJKaqonsqNfrY4L/fCatVotKpcJgMPwX+v0IPwEurq5/p1hhrwAAAABJRU5ErkJggg%3D%3D%27%3B%0AAddRemove%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAs9JREFUOE+Vk91L02EUx+2q/yII6iJIxRoRRlHdiRBGF0KglFIkpRWKdKEpJlqEkQRR1txsbqY1dM40Naf5sqm/+ba20sxyc75szqHzNTf36fdb2Bh104EvPJznnA/PeXn2COZJov7DZEcP7IkIlwBPhTUemfxUmYPUDoNOVPsomKygrR9g8quHYBCMRiMGgwHRonYVJQGMY+M8GQrwsG8Hee8Wyg4fqhYP6oZ5uno9uN3g9QZJTk4mMTExEiCRJMj73nFyCt9ReE9PWVk7iso+6moERs0TbK24cTkdZGbeiEiWckNP+fLZxo/ZJUyjMywvuHC5PNhnXUw45miyzlPYaueWbpq0q7f/Deju/BAq47YJigQ/d3q3udYZIKlhk5TnNp41O3hrmKe8vIX8fPnfJTyo6+d+ywy53ZDaCte6RDUHKK224HYusuGDqUkYFpvbLPrz8hr/QEIlZNZYOP/Gh8YCLwY2UHVPUakR8LqWpECWl8EiQJMeXqlAoQiQnl4UgoQAjTod+q8b1FvWWddexv80np6qGnzr4PeLEavwzeBD+LhDpQL0Iqi0pIPs7Ozf85QAbrcX/bdV3k2nMKg5xnu1kaER+D4FP2xOKlRtmIUlBLFHg8I2avUQ8fHxYYDD6cFgX+X63AUO6/Yh1/ZjHoBBUWOmOeobTDinV1hb38K3toVa00VsbGwYYHcsMDC7wtmeOPYqo8iRK+hoAWUVtOlgtD3ApljKrl25kodMJgsDRkasfFpc5qB2P/vrDpFe8ZJqcWJKJbzVQoe4wdJGStbTYyUu7kS4B69f12C1fcG3A599DuyrP5F/9FJQYuRN7ab4B2BiAjyeoJhs49Spc8TExISnIDWyuLgYVbWGu3kFpKSkcvrMWY7KjpOQcImMjPvk5Dzm4sWbHDlykujo6Mg92P1ZaWlpJCUlhZ4madcvnXNzc8nKyorwS/e/AIz06Svr2XfUAAAAAElFTkSuQmCC%27%3B%0ACmdPrompt%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAQ1JREFUOE9j/P//PwNFAGQAJZiB17Xrv17m9v+G2bv/G2TtwonN8vf+N83b+9+8YN9/6+wN/yU8W4H2Al0vXHbzv3jPh//iXW9xYrHOt/+jN//677/29//4zT/+T+tb/N8yZuH/4uLi/wwupQv+G0YV/DeOLcOLLePL/lsAMYh2jMv5rxXQAjHAwSsOFIokYxHNQIgBtp7xYM0eHh4gP4EBiI1sKMSzqJYIa0ANsHKNBkvCNMIMgokhyyEbgtUAXF5BNhSmBm4AzAv4XIDNFRgG4AsD5DDC6QJSYwLuAkfvRJKjEGSZqGYQJBqN/ev/K5iG/le2iCIaq1hE/Je3K4EYAIpiEINcTFFOBFkOAK4+5J3cVDxkAAAAAElFTkSuQmCC%27%3B%0AComputers%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZRJREFUOE+NUz1Lw1AUtT/Hn9BVcDDgYDe7iTiFTsFJXCRjcAod5FmhkA6FdCikW7oE4lCIg5AMhdehwxscInTI4HC898XU2tqPwOF93XPeffee1AAcbfueX7K1w08den1Vry05LFBBdFJodBO43RTBMIbox3CHCcRE6vHk1EbzzCJKyVuSecFE5ynQweJVISyAhA7iL8BfAK7CHgG6TWQFnBkgPkpSQODRozXvGxfO7gzEpMBdVgYLurGCM4fev77xdwhQBuFYwnwHLAq2p79gsvlGuE+2C3Ad/H6CRkQ3TX4ITCLw2qD9ZlvuFnDbJDDIYYyhhSrw2hgdIGB3Yy1QHwB1IjDMqNBtNVvl+7e2seqt1ZM4HlLRohx+n2rSimGcBxvkDR9UAs5jgmAk4dGtPOfWrRvoXyNVm5xusSig5oqEUmqdpzOwH8osVt37x4najWRlJud5DjmTiCPOIkTj0j1QgOyslIKcKqSZJF+k8Hoh1cHTQnsz4CysWwF/ENPPlOhRdFhAHF5EFqnatT6uvp/n35Q1zXl/mKThAAAAAElFTkSuQmCC%27%3B%0AMagnifier%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqxJREFUOE+Vkt1L01EYx48vFQRFdwVdVFQ3URFBd0HQjf9AhXWnBGLRMtdUiLLCt8RGbxZoQvaiglhRai03Z9Za5dbUueb2U/emNXx3upkv26ffFrndlRdfznkOz/dznuecJwkQmwsdpK7bIEJLEZEkksUyEbEmOVlEksJiYTFZLIbDYtP6tSKSkiI2igWxR/jF1lS3qFYdSxJRwJZzWnYrdexS6dmp1MfWv/tovCNXx4FCA3sLP3Hospbs6/VsO14kWxExQKXBD0sOAn4rgdE+ZmUFZS3O2CEowZyDcECS4wHmAwNRI+l59+MAdccoBGz4nF2MDJrxeyyM+yyYDB08b3iJtllLt6GT0JiN5ZlB2bhMeu7dOKBM5ycy3kv/dyOSowunzYjmTQfvPlh5YRumsX+KZwYfD6pbcNs/xio4kXM7DijV/iQy3ceA04zXbUHfYaTzq0QoMI7GPUGtbYI3E3PUmMZQ36yVjUFO5dxKALT9gKlehpxf8di/0KjrQTf8g0bzEA02FxqXG63HR1ckzLXqNiSrgQxVQgulOhkwaWHQYaTP9J6mD/08+SbxyGhHM+Dgs9uJZdiFNTRFTXs3LU31nFYltFCmjwJMDNoNOLr11L/tkW/2USdDDJ4hHB4XIyNeRiO/uNfUTuvzx2TlqeMt1PTOysEIhIdZCHnRtJl42jXJx/kg5tlpXLOT8jfPsSBnqfKLCAftZBfciQOOKppJO9/K0TOv6dFUYGytovi2jrfyeIzH3hwWZV26+pjtBzPIqbSyPy0/YQ7UatSymisz4dU+zCVZnEzPpKL8LorcEi4WlJN5OjeWk6iVSYxu8NaB/jDSDQXKs/djibHzf+hPgiSPZfMRrMU5KM/X/Ld5pYKWKiXSrXwuKh6uyrwCiJaruHBl1eYo4DduhgDBD20V8AAAAABJRU5ErkJggg%3D%3D%27%3B%0AOnScrKeyb%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJVJREFUOE9j/P//PwNFAGQAJRismSHz/H9SMLKFDAxtb/6Tg0tLS4HmgLwPNCD62H+SsELPhf8YBvz9+/f/zDNf///79w+FBlkDEgfJb7gPsQirAaS4AqcLGs78///r19//6DTIBTBx2rkAZDLIZpA/Qf4FARANshnkAmQvUj8MQCaSiuHRCEoMIA45GJyQKMkHg8MAACArvHlXxbSqAAAAAElFTkSuQmCC%27%3B%0AWinTskMngr%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJ5JREFUOE+VU9EOgCAIxPXQY7/sp/lnxpFMTEpkYzST4+AwEVFir+yUc5YYMb6LvG5ILqUsvbK1Qr0YDqKGu58AYNDacSP+xwGqzMX40+IaAImabCN/xwCGqgaMogwEAHLOHmKwkvI1g0MWQQ+jEcO1Uv5K58k6sNhZIl02F8Dr3as+DVIZyBY2rT0w+1YMg/0BmuSTGV76HHcHiWSxG7luAcTplZKTAAAAAElFTkSuQmCC%27%3B%0ASystProps%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAiRJREFUOE99kj9o21AQxl82jx67Crpo9FZDlxoyWNDBKhki8BCMBmMyBOGhuF2MmyFoKsKD0VRQh4A8GORNWQLyUFAGgzy4KEOGN3Tw0MGFDl/vnSu5TkgFH/p397vv7t0RAPHc9en7B/4pf2kckizeidSuHh3EK8BjjdYDKPnSgzv34axMGDcaxGWE2mRD4fscTo7mGQ40ixBeJwinKYIvSQmo0rPo5wQyS0gJSBYUfJMiWuasWG753b3bwFtk5CBDZexDXNUghgJG12NICXCXW7IMhOQw/g1E5MJ/70J9d6YS+gw7wGWFXJDsBqy2tetF2VeBo3swxP9BOu3AW20wWAPWZ7I9ocCPLjkQEBekJwCy6izBCQwiwGAFdO6A+jDjASrrnNytQLctGE1j78BfkNVxCKdPU1d3krUAzNu/gH4Kcd6BONOh2QZqzR4ax+b+ODxqozEHA9yXNRoaWKp/NTBxEkO8jVBpuqjbDvQTD2brH4CagzYFy7nOMJpTS/2ErYr2AOI4hHgVQGsFqJ8GXL0cYjnIb3R0MwlvnKF3nqBDUpWqb0K8IIDeitFo07fXFnrd3uEx5g8bJLc58rXkpRoNI3IQ8yIZZ8kukWBF5WIby2Pc/txCSUpJoIw30b2KCJBSNbdMLCo/AeT3OeSDhLpHc7XCIbUSw58k3OvjxAOAenEuHEoIEHyNubp6Lio/l1yuckFTEBWsjkctyf8qFzl/ABIpmnDaTkSAAAAAAElFTkSuQmCC%27%3B%0ACalculator%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAmhJREFUOE91k99PklEYx18vyrXVRbeuu278T7zK1kWtrVbO8qLwoiybM12aLEdz5mqaqUPE3JJUwAQhfwBq4i/wxwSFyECSgZZaJpaSnw5stlq+Z3v3PO+z8/2e7/d5zkkDpIM15VvjaPoRaXPrpxTf/SXF99OkldiGdOp0hnT8xDHpZEa65O1blK5kZab9ASUJkl/PgF8ECO7Bkoifkvk+hEX0/4De2S1GgjDqjye3pTCpww+SDvM8YYEaEYgyTZCrj0Ncrlwmu2SJ86WLnFHGOVsaoK3XdziBxe4nHIFO1zbZynUu1MGl55DXDPltUNAu4otNjIMppf8rsNp9+IXErsk4ReooNTZQdSd4oA1RrvmAShej0fadoemonIIFZgS5/SM0277yrCtEi2019e9cFfXpeUbcXszjXw4nMA94GJ8XzVoAs3uTFmsAy1wCozNAo2OHmO4aa9qiVE22iY4peCtUNOu9uNZBWTuKeU5Y6dhg9mYm1sIs3CkHMlOwjkF/ABRl/SgeTmAUii4qXmL0QJ3pPZpZmPJtyxMYHQlMwoLOEUHnDKOzbxHahYaeEAZnnPo3EQYnYvIEBtse3eIUtcGPTTTvVoUFVesala1Bbj8ao6h2ieGZz/IEr6y7WEUP8pVDXC8epm8Zcu5o6F2E9qFltLYYAxNr8gRa0w76GehwRDG6olRrvQgHKJvm0JhWKW+O4HDJjDF5lZv031IWnrZ5UA9CRYOHnHt91BgS3K1eILfMi2NyRV6BWty8fvGSCp+4KajyU9W5R16JhRvFr/8BHTrGZPFcbj0Fqnco7utlAX+Dk/lvcXcJCTRwbTMAAAAASUVORK5CYII%3D%27%3B%0ANetConnect%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAtxJREFUOE91k2tI01EYh8/SDxVaGpQVVAYV+CEQchRppandEMEP2WXa1Uq7MUShIk2taGWIdr86M0vn0ka1NishHTMj3RKMxtBIa00zoxxUhPH0/09mSnXghXP58Zzf+573KADhG87v3+j80Sxs/QOi5cNYERroFCF+iSL450SxKyJYMSwcOZEBclS6zZR0H+D2p7NoezTkOpJJagxj2vVjBBZ+5NKLz5JsSDsyvIsiZyl77Mu46Mqh/ruZewO1FHcdZb11PlPLNYh8N4qCZHKrn/wF8QLCayLY/HwBxzu2UtpzhcuufCo+NrHB+ppJ2gYUp7MRBQL/LBUWi2UURKj0bgJOGVj+aDZbJMheezTqtvVkt38gygT+F1skiwKRI1DsCyJibfZoQNgJB2MO2gmtnEnE/eksNc9iibmZ+QaYd+0ra27ZyHxgQK2rZsq+MOYlZYxyIeYcsiEy7IzJfcC48ykElYUwvlTJjOI+7tp60bX2Y+gc5NZLD1ctXagOXUKr1Q67EMo8CbCuHrGrFZHpkHLdjygULC5OJ++2g6qWT5idA7R+AWsf1L37xdHz+j+AvLpeRLwekWRCqBoQ22sQBwQxmiwvoOSRi6o2D/cdHkpM7ym4001S6n70+iGIkAHTUk0oosoRcdWIVbWMSw/GLzkFZcoNih52U946QL6uE31LH82ub+zIPDJcB+8zypAZqfWExOqYvOIyczdmERB1gwmRpShVRoqMbvL1XewuuInWbONZzyB36p4POfB1lQxZuLWM8J3NxO18TKJUk8gtTSiTDShX7iE2fjXR0dFoNBqqrG+50uDGZJLSHtmWMkQWhK/aRnjcJhbFJJKwNo1N6dlUGF/wtL0fa6eHe85BTta0k5CQ8Hdv+4B11lfUtn3B+AZ0dg+VNimk/3DG2EHeGZ3XUVpa2v8BZZZezjV6SD98wWvdF/KtarXa63RUDf7102SxL+9/nct7vwFQw5ZrKBhJFQAAAABJRU5ErkJggg%3D%3D%27%3B%0APowOptions%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAetJREFUOE+lk99rklEYx9e/0VU3QfdB/0JMyEaoF17JZNlg8cqsi8naClSaiBk2jOY71BbOC3/UunBBGkHEgkZu5KiGroiRWxJa6rrp03sOOHS+FNGBL5zDc57PeZ7vwzkGDP3XEoBexdQIR3X0Tu9ZN7m2W+Pzq2eUc3HUxA6j9qtaTv9D3fMAoLWdo7G/xutHyyRv3OH+1GPsdh+BQEAXIgFLiTjpdEaW3infhY9uWr6TPDkxROSUmUvjQSZdk/qARTVK6FYQj8cjAV+rT+GTn4b/NPkzx4nZgsQSL5jzRw/V54HT6SQyP4/b7ZaA2n6dTusbb9deknnwnMzDLyjKLAaDgYmJywMQ2YKAdFWv12m3D3izWSGd3SSb29U8mNLkIJFIkUplJURRFNlSn4kCsre3R6fTplR6Ty5XIhwWKrCxUWVrq0E+v8PY2Aw226g+oNlsaoFflMtVVlbe4fUWKRYrVCo/WV//QaHQYnX1Ow7H9UGAKEl4cWjYXFxzP43PG+d2KEkoVCKqftBUZXo6Kdvua6HrrghYrVZMJjMXRi7KsbqUa8zMbsv9orqkVRDDYrHoA3rHpC5EZNJy2MTw8Ljc37vp4pzxCmaz+e8AARPJQmKUC76zWEbOYzSa9D3408fRi+l68C+Q35MrucWVT9wHAAAAAElFTkSuQmCC%27%3B%0AMSPaint%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZZJREFUOE+NkjFowkAUhnVzdMxYoYubdhM6uTWbgQ7tJodDkQwiTuIimUJwEHEKHYRkKMShoFtcCnYoOGY8x4zt1m5/711MjEZbDw6O4973vvfe5QHkaG21G/xcfclzecTz8nDJIgBt3qjCuysi6JTAWkxcRffpbZh+5j55sNAZ7EoR9m11D/jIwerVkiACsJZzADnI0O9N0NYtqPfd6FEKQMHWLABr2OcBk7kPzQwSwKfLEgMC+FM7U96BAQEexxxqx5NZ/FFhX0JTkeV5D/uS5ADSTXLcANpgA2MsNIW+NyrDWoUIXQuo5CSAdjomY1A3F5HmDtCdcYS6hvBaAHoWqE9nAcbrGvWXMpRmAYEbTYB6QiMmCDX4X4D97oDNGPiyhoVQ91ZrcFPF91ycXR/d4R8GpEYW6lQTHS9hLUCBCISuINxupMHx58r+th3AGRbRf27L7KRPEzrOnpmCNHA30sB4UqQBBiXZPAq+CEAQ6oFm1iOA0D9Ve1xKpgRpsTRAvfDfuPx9VPup7CdLiMmx8jn1+N0vr+ulS/dQUwwAAAAASUVORK5CYII%3D%27%3B%0A%0A%0Avar%20directoryService%20%3D%20Components.classes%5B%27@mozilla.org/file/directory_service%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%3B%0Avar%20profileFolder%20%3D%20directoryService.get%28%27ProfD%27%2C%20Components.interfaces.nsIFile%29%3B%0Avar%20profilePath%20%3D%20profileFolder.QueryInterface%28Components.interfaces.nsILocalFile%29.path%3B%0A%20%20%20%20profilePath%20%3D%20profilePath.replace%28/%5C%5C/g%2C%27/%27%29%3B%0A%0A%0A//%20------%20Menu%20Items%20------%0Aapps.push%28%5B%27Show%20Desktop%27%2C%20%20%20%20%20%20%20%20ShowDesk%2C%20%20%27C%3A/Documents%20and%20Settings/%27+login+%27/Application%20Data/Microsoft/Internet%20Explorer/Quick%20Launch/Show%20Desktop.scf%27%5D%29%3B%0Aapps.push%28%5B%27Open%20My%20Computer%27%2C%20%20%20%20Computers%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27%3A%3A%7B20D04FE0-3AEA-1069-A2D8-08002B30309D%7D%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Open%20Drive%20C%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27C%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20D%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27D%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Profile%20Folder%27%2C%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20profilePath%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Internet%20Explorer%27%2C%20%20%20IExplorer%2C%20%27C%3A/Program%20Files/Internet%20Explorer/IEXPLORE.EXE%27%2C%20getBrowser%20%28%29.%20contentDocument.%20location.%20href%5D%29%3B%0Aapps.push%28%5B%27Notepad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSNotepad%2C%20%27C%3A/WINDOWS/notepad.exe%27%5D%29%3B%0Aapps.push%28%5B%27WordPad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSWordpad%2C%20%27C%3A/Program%20Files/Windows%20NT/Accessories/wordpad.exe%27%2C%20%27c%3A%5Creadme.txt%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Control%20Panel%27%2C%20%20%20%20%20%20%20CtrlPanel%2C%20%27C%3A/WINDOWS/system32/control.exe%27%5D%29%3B%0Aapps.push%28%5B%27Add/Remove%20Programs%27%2C%20AddRemove%2C%20%27C%3A/WINDOWS/system32/control.exe%27%2C%20%27C%3A/WINDOWS/system32/Appwiz.cpl%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Magnifier%27%2C%20%20%20%20%20%20%20%20%20%20%20Magnifier%2C%20%27C%3A/WINDOWS/system32/magnify.exe%27%5D%29%3B%0Aapps.push%28%5B%27On-Screen%20Keyboard%27%2C%20%20OnScrKeyb%2C%20%27C%3A/WINDOWS/system32/osk.exe%27%5D%29%3B%0Aapps.push%28%5B%27Task%20Manager%27%2C%20%20%20%20%20%20%20%20WinTskMngr%2C%27C%3A/WINDOWS/system32/taskmgr.exe%27%5D%29%3B%0Aapps.push%28%5B%27Calculator%27%2C%20%20%20%20%20%20%20%20%20%20Calculator%2C%27C%3A/WINDOWS/system32/calc.exe%27%5D%29%3B%0Aapps.push%28%5B%27Paint%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MSPaint%2C%20%20%20%27C%3A/WINDOWS/system32/mspaint.exe%27%5D%29%0Aapps.push%28%5B%27Command%20Prompt%27%2C%20%20%20%20%20%20CmdPrompt%2C%20%27C%3A/WINDOWS/system32/cmd.exe%27%5D%29%3B%0A//%20------------------------%0A%0A%0Avar%20nMItem%20%3D%20function%28label%2Cimg%2Cpath%2Cargs%2Cobj%29%20%7B%0A%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%20%3D%20obj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%29%27%29%3B%0A%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20if%20%28%21img%29%20img%20%3D%20Default%3B%0A%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20m.tooltipText%20%3D%20label%3B%0A%20%20return%20m%3B%0A%7D%0A%0Athis.startProcess%20%3D%20function%28path%2Cargs%29%20%7B%0A%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20var%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIProcess%29%3B%0A%20%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%0A%20%20args%20%3D%20args.replace%28/%5C//g%2C%27%5C%5C%27%29%3B%0A%20%20if%20%28args%3D%3D%27%27%29%20%7B%20file.launch%28%29%3B%20return%3B%20%7D%20%0A%20%20process.init%28file%29%3B%0A%20%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%20%3D%20document.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3B%20i%3Capps.length%3B%20i++%29%20%7B%0A%20%20if%20%28apps%5Bi%5D%20%3D%3D%20%27separator%27%29%20%7B%0A%20%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%20%28%21apps%5Bi%5D%20%5B3%5D%29%20apps%5Bi%5D%20%5B3%5D%3D%27%27%3B%0A%20%20%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2C%20apps%5Bi%5D%20%5B1%5D%2C%20apps%5Bi%5D%20%5B2%5D%2C%20apps%5Bi%5D%20%5B3%5D%2C%20this%29%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0Athis.orient%20%3D%20%22horizontal%22%3B%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

В коде я прописал, чтобы кнопка была типа: this.type = "menu-button";
Меню работает, все замечательно, но ...
Если нажимаешь на саму кнопку, то ничего не происходит, поэтому хотелось бы чтобы картинка на кнопке была такая же , как в первом элементе меню и при первоначальном нажатии на кнопку выполнялся бы код, находящийся в первом элементе массива (или пункта меню..), далее, если ,к примеру, потом вызываешь 3-й или 6-й, любой элемент меню, то кнопка бы визуально приобретала вид последнего нажимаемого меню (меняла картинку и т.д.) и пре следующем нажатии на уже кнопку выполняла код, соответствующий последнему выполняемому коду из пункта меню.

Надеюсь понятно расписал...

vurdalak

Код:

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%3EFavorite%20Applications%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAioFc/4lLHf9dPCL/Sj8u/zZMRv86Ukv/O1RN/0VhWf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZbEv+tSQT/p0wR/8F4MP/BeDD/wXgw/8F4MP9FOCj/OUc+/ztTTf8+Vk//RmNb/1p+dP8AAAAAAAAAAAAAAAC2WxL/tlsS/7/WzP++8vv/t/D7/7fw+/+37vv/wXgw/8F4MP/BeDD/wXgw/1M3H/8+Qjf/TGpi/wAAAAAAAAAAtlsS/8fQvf/F8/z/xfP8/8x6O//Mejv/zHo7/7fu+/+37vv/t+77//DOpv+1UAH/tVAB/ztUTf8AAAAAAAAAANiBJ//L0bz/yvX7/8r1+//3ozD//+PH///lzP/Mejv/zHo7/8x6O//Q9vz/8M6m/8xnAf87VE3/AAAAAAAAAADYgSf/z9K9/9D2/P/Q9vz/96Mw///lzP//5cz//+XM///lzP/Mejv/0Pb8/9D2/P/MZwH/PldQ/wAAAAAAAAAA2IEn/9Tt7P/U9vz/1Pb8//ejMP//8+f/AQ4U/wEOFP/Zhzf/2Yc3/9mHN//U9vz/zGcB/zZMRv8AAAAAAAAAANiBJ//c+P3/3Pj9/9z4/f/3ozD///Pn///y5f9hhJL//+TJ//XDkP/Zhzf/2Yc3/8xnAf8pOTX/Ql1V/2eShv/YgSf/4fn9/+H5/f/h+f3/96Mw///8+f//8uX///Pn/9mHN///5Mn//+XM//zRpv/Zhzf/ETG5/y9CPf9UeG7/2IEn/+Xi0P/o+v7/6Pr+//ejMP////////r1///y5f//7dz/2Yc3/9mHN///5cz/H1zV/y6G8v8RMbn/bJiL/9iBJ//YgSf/7Pv+/+z7/v/3ozD/+7JB//uyQf//+vX///Ll/8x6O//s+/7/2Yc3/9mHN/8eJJb/AAAAAAAAAADYgSf//+26/9iBJ//0/P7/9Pz+//T8/v/w2L//+7JB//uyQf/Mejv/9Pz+//T8/v/Zhzf/O1RN/wAAAAAAAAAA2IEn/++mRv/vpkb/2IEn//DOpv/w2L///P7///z+///8/v///P7///z+///vpkb/2Yc3/ztUTf8AAAAAAAAAAAAAAACOn4b/oLac/6ilhf/vpkb/76ZG/++mRv/vpkb/8tKf//LRo//vpkb//L12/9mHN/9Sc2n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+mRv/vpkb/76ZG/++mRv/vpkb/AAAAAAAAAAAAAAAA//9zQQD/c0EAB3NBAANzQQADc0EAA3NBAANzQQADc0EAAHNBAABzQQAAc0EAA3NBAANzQQADc0GAA3NB/wdzQQ%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%5Bvar%20login%20%3D%20%22Administrator%22%3B%20%20%20%20%20%20%20%20%20%20//%20Here%20put%20your%20login%20name%21%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%20%20//%20So%20you%20can%20use%20%22Show%20Desktop%22%20command%21%0A%0A/*%0AIf%20you%20deleted%20%22Show%20Desktop%22%20from%20your%20Quick%20Launch%20toolbar%2C%20just%20enter%20this%20URI%0Ain%20your%20Firefox%20and%20save%20the%20file%20as%20%22Show%20Desktop.scf%22.%20Then%20you%20can%20put%20it%20in%20you%20Quick%20Launch%21%21%0AShowDesktop%3D%22data%3Aapplication/x-unknown-content-type%3Bbase64%2CW1NoZWxsXQ0KQ29tbWFuZD0yDQpJY29uRmlsZT1leHBsb3Jlci5leGUsMw0KW1Rhc2tiYXJdDQpDb21tYW5kPVRvZ2dsZURlc2t0b3ANCg%3D%3D%22%3B%0A*/%0A%0Avar%20apps%20%3D%20new%20Array%3B%0ADefault%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%27%3B%0AShowDesk%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAioFc/4lLHf9dPCL/Sj8u/zZMRv86Ukv/O1RN/0VhWf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZbEv+tSQT/p0wR/8F4MP/BeDD/wXgw/8F4MP9FOCj/OUc+/ztTTf8+Vk//RmNb/1p+dP8AAAAAAAAAAAAAAAC2WxL/tlsS/7/WzP++8vv/t/D7/7fw+/+37vv/wXgw/8F4MP/BeDD/wXgw/1M3H/8+Qjf/TGpi/wAAAAAAAAAAtlsS/8fQvf/F8/z/xfP8/8x6O//Mejv/zHo7/7fu+/+37vv/t+77//DOpv+1UAH/tVAB/ztUTf8AAAAAAAAAANiBJ//L0bz/yvX7/8r1+//3ozD//+PH///lzP/Mejv/zHo7/8x6O//Q9vz/8M6m/8xnAf87VE3/AAAAAAAAAADYgSf/z9K9/9D2/P/Q9vz/96Mw///lzP//5cz//+XM///lzP/Mejv/0Pb8/9D2/P/MZwH/PldQ/wAAAAAAAAAA2IEn/9Tt7P/U9vz/1Pb8//ejMP//8+f/AQ4U/wEOFP/Zhzf/2Yc3/9mHN//U9vz/zGcB/zZMRv8AAAAAAAAAANiBJ//c+P3/3Pj9/9z4/f/3ozD///Pn///y5f9hhJL//+TJ//XDkP/Zhzf/2Yc3/8xnAf8pOTX/Ql1V/2eShv/YgSf/4fn9/+H5/f/h+f3/96Mw///8+f//8uX///Pn/9mHN///5Mn//+XM//zRpv/Zhzf/ETG5/y9CPf9UeG7/2IEn/+Xi0P/o+v7/6Pr+//ejMP////////r1///y5f//7dz/2Yc3/9mHN///5cz/H1zV/y6G8v8RMbn/bJiL/9iBJ//YgSf/7Pv+/+z7/v/3ozD/+7JB//uyQf//+vX///Ll/8x6O//s+/7/2Yc3/9mHN/8eJJb/AAAAAAAAAADYgSf//+26/9iBJ//0/P7/9Pz+//T8/v/w2L//+7JB//uyQf/Mejv/9Pz+//T8/v/Zhzf/O1RN/wAAAAAAAAAA2IEn/++mRv/vpkb/2IEn//DOpv/w2L///P7///z+///8/v///P7///z+///vpkb/2Yc3/ztUTf8AAAAAAAAAAAAAAACOn4b/oLac/6ilhf/vpkb/76ZG/++mRv/vpkb/8tKf//LRo//vpkb//L12/9mHN/9Sc2n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+mRv/vpkb/76ZG/++mRv/vpkb/AAAAAAAAAAAAAAAA//9zQQD/c0EAB3NBAANzQQADc0EAA3NBAANzQQADc0EAAHNBAABzQQAAc0EAA3NBAANzQQADc0GAA3NB/wdzQQ%3D%3D%27%3B%0AIExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%3D%27%3B%0AWExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%3D%3D%27%3B%0ACtrlPanel%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAEG0lEQVR42mJkTDzG8P/ffwYpEU6Gzz/+8H//9Y+dh4s1+cOn3+zMbMwWf/8wWAAVMOi/nLtX8uet4L+MrAz/GBgYmIHY/ft3BoAAYgHSOYyMjCIfv/2x+Pnnv8WfH/+YPnz4zMsAVMbC+p9BQYCV4dNfNoYvf9j4vn37wvCXkZ3hF9BADyFhBtVv3xgAAoiF4e/fif+//Wb6+ukvAzvrPwYtUVYGSyM+Bl15HgYTLSkGRUkOhty5txkOXP//F+TSv/9+MrCxsjBICggw/H73jgEggFgYvn37HGXEx+9lJMpgqCrEoCTJw8DBycoAAh++vGP4y8TO8O8/IwMj0FaGf38Y2ISUGZgktBlYGR4x/P//nwEggFj+//jBkO2py2BlIAnW9Auo7uMvBoYfP38zvD2aycBr1MPAxsLO8PsvM8PPb58ZhByDGb4x8TAwPL0HNJiJASCAmFhYWRkevvoG1vz9NwPDN5Dm/wwMX57sZPjLrcnAwCfLwMXJzPDr19//X8XNGX5JWzP8/flVjOnLq5lC7G+XAwQQCwsLE8PHL7/BBvwG2v7zL9AVQAO+3V/E8E86juEvkP3/90+GbyzCzJ90wsRUuDhmGqgKO6v/4ufl/HiCASCAWJgYGRlefQBay/Cf4fsfRoZfjEDNTw4x/P5wiYHVyInh/hsGhhc//jEEhwU4OFmo3/vOxMN98Yo8w+p/ir8EX0uvBggAQQC+/wQBAAAA8fkCAPf25ADuzJEABC2AAPnkrgD/FUcA6ujpAMTU2gBKOz4ADgkHBcfU4wXNzbvV8efcyCAD8ZMlFRvSAgBBAL7/BAYFAwDz9vgA+AcnAP8IHAD0vkgAAAUPAPkplQCyqrAAEQDYAKTmJQDhz8HdGv3XbBUE9L8QAQT5BgIBAAP+/QACiAUc8n/+Mvz8DYw6pVyGf68OAWML6CUuBQYG23yGHwxfGMwefmK4/fj2dQbu5zsYhIFpjJmNAehZcLgBBBALIxMTw2dgIH79AQo8YGjrLWb4/fEWw+8/DAyaAowMh9/zMnAy/2L4w8TP+uLjK4a33xkZ+Pn/M8gKAh3K+I8BIIBY/gDN+gNMYT+AGn4AI+M3IzfDT35DsOninAwM8m9+Mxy5+Yrhz5+/zIzAhPPr1x+Gly+/MHz78p/h5x8hBoAAYvnz9x/DT6BrmNiAOoCGfAUmiRcf/jLcuPmU4eS5+wy3rt1g+Pfuyk8VtkefeNk+gxMPCAC9z/CekZkBIIBY/v/5wvL8LQfDtGW3GO49eMXwCpjCvjy7+Ov/99cf2P5/mKvO/eseA/v7E0wsbPc5OHmByfcfAzIACCAW9t9v3t6/+vzP0wub//D+f3pGkPnZaQHmP2t4eTjvMTKzfmZj4wAmbXagRiag7f+BNIp+BoAAAwDAMqTgcw5bNAAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSNotepad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAoJJREFUOE+lk/tL01EUwO0fy1ely6IUMoi0AoM0Sy1TMDMitZyvfLDNdM5HPle6RNt0mlvz0ebmYzoVN5vO4cQ5yxQFAz/NbxTo9Kcu3Hu4h3s/fM6BcwYI+q91CBBXdGDtjaG88LUQywoK/9yLJEKseaulRnzX/5Sg41tIiKsWaauX0mdxolUr6Btz0NpWh9Ls4ZNugHbbDpklMvKkTQEQAVD4YQmN+yeGzX00qzvUu9aodKwhc25TurhLtnWbuNb10wF5ygUqnD4UTg8Sxwa5Nhc5026eTnpIG18lYWSdBO3B6QCF2krutI838z7ypzdJNS+RZHJz3/idWyNeLvd7iFEfkKYwnFxCl95Mnm2FdPMGj81bxA25uKZfJla3wZXPm4R0exC93yGtdysAIvRAPWSm1rlEvP4H8UM+ogZcRPS5idKsc6HHQ7BymUj5Kum6A15KWo5YCIAeg5ku7xTXtV5itD7CuhcIVzm41LlChNLO2Xoboko7qV1bpFQNHLEQAB/9JUzsWUkaXOVih4tz7dOENU8gejeLqMFGsMyCqGCSpFoHyU32QIBKb8G6byR/fJmLTQ5C60Y5LzchqrYQKflKcNEXIrMNJBaP8ah1jVdVzf/KEAxUOgsLv6ZodM5xtWGe0LIBQkq0RBSPEF48TIjYRLTYRkqd3W+wyL2c0qOADp2ZyT0jet8Md1Quf8OMxCqnSO63kzVuJ2d2huhMKS8KyykqrQ5sYrfBb8AExt1hVOtzlLkHkXtHaVxxIJuZJ7trnhsJz0+fhXqNlc5lO3LTN3I7p3hQMcjNrBZuP6wkOb2EfLH0xM/CJB8eGc+kJGbIeJJTISge1zxpCv/mfgPvVs+ANDa5fgAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSWordpad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAD5ElEQVR42gBBAL7/Af///wDgz3tx+e7eSe7mDMcTHwhq3d3+lhQQ9Tfb4fDGGxEsa+z105z+AkJFDP3M9PEQRo8qKSyz1d3qAFlVRwACiBFkwPKlJz9+e7WVT1hYgOHZGy4GKcHHDM8/mzIoi55kePEzhEGQcRUDi0gSA9OHVQwfGdUYWCXkTa89en+mOsGTASCAWBiAgJFdgkHbyJ5B21Cb4em9lwwS0h4MHz6zMkiIGDJ8+yPM8O9vAQMXDx8D458Yhv5FhxgOv/s9lf/fvyag1q0AAQQxgPMDg7y9IcP7n38ZBLSkGX4xMDFw8P1mePmHgeEX4zOGv6wMDFyMnxhefWdiWPNZkeH9dwmzIL73y4Ba+QECCGzAH6A33v98z/Dz2y8GZkYGBlZGJgZuFi4GFqBBXKxCDMwsPxnOPvrJMO8gK8Ozj2IMfI/3Mbzn+wjU6ccAEEBgA5gYmRlYmTkZ2Ni5GH78+crw+98vhtc/3gK1/2cQ5eZheHLjP8OWQ78YTj1jY+D/eZNB8dcdBk4uoRcgvQABBDbg59/vQL9+ZWD/z8XAAbSZnYmf4c/fnwzsLL8ZDt78yrBk+x8Gpk//GEwYfzJ8//aUQYCf9a20lKgPSC9AAIENYGPmYmADavzx+ycDw78/DD8ZWRiEONkYdlz8x9C7hZXh0Yd/DOrCnAzm0swMHz69ZbA3MXomLCJ8G6QXIIDABvz+/4vhF9DZTEysDH+B4fGb8TvD8Qd/GCbv/M3w4O1vBj0ZDgYPPUEGA4VvDNc+izAY6GkyCAoKgLQyAAQQE4j4C7L132+g5n8M3Bw8DKz/BBiWbPzEcPflLwYjOW4GGxURBluNvwyWSowMjEzMDMxMTAwsoNAGAoAAArsAFIAg20Hh8OfXV4Yv11kZOF/+YHDTlmLQV+Zg0JT9yCAm8Jfhww9ggIOCFuhKIAIDgAACG/D3/1+giZwMLOwcDO8ufWfYsOk5g5ieGIO2Fj+Drsx/BmHebwzffv1i+Pz7L8N/uMMhLgAIIKgBvxk+/3rPwPqXjeEt628GeRceBlmVPwzS/M8YuNnYGf4BY4edGRg+fz8B2f8YkAFAAIENYGbkYmBl4WX48fMzg7DiPwZpNV4GblYOYIz8Yvj+5zvDX6bvDHzs3Ay87OLgNPMf6g4QAAggsAH/WX4w/GcVZBDgE2FgBdrw48d3hj9ffjNw/AI68xcnw9vX7xgefnjG8PPzD2A6YWXg4+F+x8bKCjYAIIDABiiKcq97e/lN2KfHr7/9+AAMxK/fGH7++Al0wC+wk7m4OBl4eLgZ+Hi52a0tjG5xc3NEMUNjASDAAGRtWmcAXa/AAAAAAElFTkSuQmCC%27%3B%0ATimenDate%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqBJREFUOE+Fk2tIk1EAho9F2J8uFF0gol92g6j+WEFGTGrQBYYynGnrYllOwbIx2aJWUEiJoZiFIYSaoJFdSEFrXcwaUZFz4Vrq5mWX+lz25UQpop62SaOLowPn1+F5znvOeU8cIGKN7FcbIosJc3cK24cvQozPF9/erxDXM5PjokxYMNk8+HI9xe5cmkbrqQtcJK9DwdKGvUw55UNdawkhE1xMWNW2nKLegzR+rqM52MQxu5mVjcXEnStHnJrNsfKrEcmkgk1VPlbfSCacwuRI4aSzkNwOWHCtH1EqEEbB4kOpmEymf+OLomHmmxzMuHCGNXcWktSyhM2tXpbU/0CUeBFnQ4Kjgpm7M2ILpu9rR+R3Ma9Ex5zLK5hWqSIsFqfVCIMg/vAsFqnzSU9PR9hbS/l7Omr34yrdDucToWg9WWdXhWIrEAcsTM3IIyF7G2tTDBOCkeeVcD0NKhSgX8ZY8Q6C5XuQm0oYtbfyfegt2Zf2InYdQSgbiVdUosi6wDplDoWFhQh32x1s927x7FEb7a5hbN4RXIExPIHPBIY/IffZOFF1l+kba5inqGdD+iMSd5xDo9FM3MHN1qdYB0Z5EoLtLi+DVguyvZ2gz4Xs6kAe6KTmtoct+5+TpH3A2q1G1Gp1BI48Y1jQ0j3O6/4A3X2DSD1vkD3d+Ls7kboe43c85M07H2k5FSiVSnQ6XRSOCpq7RpAkiaDdyteAB39/D/6BHiRHC0FZYrCvl/x8I2azOdrAP5p494Ubr8/HR3sbX9/eJzj8gUG3E1mWsTo/UXC8InLjv2L/Xv1IE8PHkIYCkRRhyO+XsFieUVZ2hbTduWRmZk4KR6scFjidbqqrGygoMJKaqonsqNfrY4L/fCatVotKpcJgMPwX+v0IPwEurq5/p1hhrwAAAABJRU5ErkJggg%3D%3D%27%3B%0AAddRemove%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAs9JREFUOE+Vk91L02EUx+2q/yII6iJIxRoRRlHdiRBGF0KglFIkpRWKdKEpJlqEkQRR1txsbqY1dM40Naf5sqm/+ba20sxyc75szqHzNTf36fdb2Bh104EvPJznnA/PeXn2COZJov7DZEcP7IkIlwBPhTUemfxUmYPUDoNOVPsomKygrR9g8quHYBCMRiMGgwHRonYVJQGMY+M8GQrwsG8Hee8Wyg4fqhYP6oZ5uno9uN3g9QZJTk4mMTExEiCRJMj73nFyCt9ReE9PWVk7iso+6moERs0TbK24cTkdZGbeiEiWckNP+fLZxo/ZJUyjMywvuHC5PNhnXUw45miyzlPYaueWbpq0q7f/Deju/BAq47YJigQ/d3q3udYZIKlhk5TnNp41O3hrmKe8vIX8fPnfJTyo6+d+ywy53ZDaCte6RDUHKK224HYusuGDqUkYFpvbLPrz8hr/QEIlZNZYOP/Gh8YCLwY2UHVPUakR8LqWpECWl8EiQJMeXqlAoQiQnl4UgoQAjTod+q8b1FvWWddexv80np6qGnzr4PeLEavwzeBD+LhDpQL0Iqi0pIPs7Ozf85QAbrcX/bdV3k2nMKg5xnu1kaER+D4FP2xOKlRtmIUlBLFHg8I2avUQ8fHxYYDD6cFgX+X63AUO6/Yh1/ZjHoBBUWOmOeobTDinV1hb38K3toVa00VsbGwYYHcsMDC7wtmeOPYqo8iRK+hoAWUVtOlgtD3ApljKrl25kodMJgsDRkasfFpc5qB2P/vrDpFe8ZJqcWJKJbzVQoe4wdJGStbTYyUu7kS4B69f12C1fcG3A599DuyrP5F/9FJQYuRN7ab4B2BiAjyeoJhs49Spc8TExISnIDWyuLgYVbWGu3kFpKSkcvrMWY7KjpOQcImMjPvk5Dzm4sWbHDlykujo6Mg92P1ZaWlpJCUlhZ4madcvnXNzc8nKyorwS/e/AIz06Svr2XfUAAAAAElFTkSuQmCC%27%3B%0ACmdPrompt%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAQ1JREFUOE9j/P//PwNFAGQAJZiB17Xrv17m9v+G2bv/G2TtwonN8vf+N83b+9+8YN9/6+wN/yU8W4H2Al0vXHbzv3jPh//iXW9xYrHOt/+jN//677/29//4zT/+T+tb/N8yZuH/4uLi/wwupQv+G0YV/DeOLcOLLePL/lsAMYh2jMv5rxXQAjHAwSsOFIokYxHNQIgBtp7xYM0eHh4gP4EBiI1sKMSzqJYIa0ANsHKNBkvCNMIMgokhyyEbgtUAXF5BNhSmBm4AzAv4XIDNFRgG4AsD5DDC6QJSYwLuAkfvRJKjEGSZqGYQJBqN/ev/K5iG/le2iCIaq1hE/Je3K4EYAIpiEINcTFFOBFkOAK4+5J3cVDxkAAAAAElFTkSuQmCC%27%3B%0AComputers%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZRJREFUOE+NUz1Lw1AUtT/Hn9BVcDDgYDe7iTiFTsFJXCRjcAod5FmhkA6FdCikW7oE4lCIg5AMhdehwxscInTI4HC898XU2tqPwOF93XPeffee1AAcbfueX7K1w08den1Vry05LFBBdFJodBO43RTBMIbox3CHCcRE6vHk1EbzzCJKyVuSecFE5ynQweJVISyAhA7iL8BfAK7CHgG6TWQFnBkgPkpSQODRozXvGxfO7gzEpMBdVgYLurGCM4fev77xdwhQBuFYwnwHLAq2p79gsvlGuE+2C3Ad/H6CRkQ3TX4ITCLw2qD9ZlvuFnDbJDDIYYyhhSrw2hgdIGB3Yy1QHwB1IjDMqNBtNVvl+7e2seqt1ZM4HlLRohx+n2rSimGcBxvkDR9UAs5jgmAk4dGtPOfWrRvoXyNVm5xusSig5oqEUmqdpzOwH8osVt37x4najWRlJud5DjmTiCPOIkTj0j1QgOyslIKcKqSZJF+k8Hoh1cHTQnsz4CysWwF/ENPPlOhRdFhAHF5EFqnatT6uvp/n35Q1zXl/mKThAAAAAElFTkSuQmCC%27%3B%0AMagnifier%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqxJREFUOE+Vkt1L01EYx48vFQRFdwVdVFQ3URFBd0HQjf9AhXWnBGLRMtdUiLLCt8RGbxZoQvaiglhRai03Z9Za5dbUueb2U/emNXx3upkv26ffFrndlRdfznkOz/dznuecJwkQmwsdpK7bIEJLEZEkksUyEbEmOVlEksJiYTFZLIbDYtP6tSKSkiI2igWxR/jF1lS3qFYdSxJRwJZzWnYrdexS6dmp1MfWv/tovCNXx4FCA3sLP3Hospbs6/VsO14kWxExQKXBD0sOAn4rgdE+ZmUFZS3O2CEowZyDcECS4wHmAwNRI+l59+MAdccoBGz4nF2MDJrxeyyM+yyYDB08b3iJtllLt6GT0JiN5ZlB2bhMeu7dOKBM5ycy3kv/dyOSowunzYjmTQfvPlh5YRumsX+KZwYfD6pbcNs/xio4kXM7DijV/iQy3ceA04zXbUHfYaTzq0QoMI7GPUGtbYI3E3PUmMZQ36yVjUFO5dxKALT9gKlehpxf8di/0KjrQTf8g0bzEA02FxqXG63HR1ckzLXqNiSrgQxVQgulOhkwaWHQYaTP9J6mD/08+SbxyGhHM+Dgs9uJZdiFNTRFTXs3LU31nFYltFCmjwJMDNoNOLr11L/tkW/2USdDDJ4hHB4XIyNeRiO/uNfUTuvzx2TlqeMt1PTOysEIhIdZCHnRtJl42jXJx/kg5tlpXLOT8jfPsSBnqfKLCAftZBfciQOOKppJO9/K0TOv6dFUYGytovi2jrfyeIzH3hwWZV26+pjtBzPIqbSyPy0/YQ7UatSymisz4dU+zCVZnEzPpKL8LorcEi4WlJN5OjeWk6iVSYxu8NaB/jDSDQXKs/djibHzf+hPgiSPZfMRrMU5KM/X/Ld5pYKWKiXSrXwuKh6uyrwCiJaruHBl1eYo4DduhgDBD20V8AAAAABJRU5ErkJggg%3D%3D%27%3B%0AOnScrKeyb%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJVJREFUOE9j/P//PwNFAGQAJRismSHz/H9SMLKFDAxtb/6Tg0tLS4HmgLwPNCD62H+SsELPhf8YBvz9+/f/zDNf///79w+FBlkDEgfJb7gPsQirAaS4AqcLGs78///r19//6DTIBTBx2rkAZDLIZpA/Qf4FARANshnkAmQvUj8MQCaSiuHRCEoMIA45GJyQKMkHg8MAACArvHlXxbSqAAAAAElFTkSuQmCC%27%3B%0AWinTskMngr%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJ5JREFUOE+VU9EOgCAIxPXQY7/sp/lnxpFMTEpkYzST4+AwEVFir+yUc5YYMb6LvG5ILqUsvbK1Qr0YDqKGu58AYNDacSP+xwGqzMX40+IaAImabCN/xwCGqgaMogwEAHLOHmKwkvI1g0MWQQ+jEcO1Uv5K58k6sNhZIl02F8Dr3as+DVIZyBY2rT0w+1YMg/0BmuSTGV76HHcHiWSxG7luAcTplZKTAAAAAElFTkSuQmCC%27%3B%0ASystProps%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAiRJREFUOE99kj9o21AQxl82jx67Crpo9FZDlxoyWNDBKhki8BCMBmMyBOGhuF2MmyFoKsKD0VRQh4A8GORNWQLyUFAGgzy4KEOGN3Tw0MGFDl/vnSu5TkgFH/p397vv7t0RAPHc9en7B/4pf2kckizeidSuHh3EK8BjjdYDKPnSgzv34axMGDcaxGWE2mRD4fscTo7mGQ40ixBeJwinKYIvSQmo0rPo5wQyS0gJSBYUfJMiWuasWG753b3bwFtk5CBDZexDXNUghgJG12NICXCXW7IMhOQw/g1E5MJ/70J9d6YS+gw7wGWFXJDsBqy2tetF2VeBo3swxP9BOu3AW20wWAPWZ7I9ocCPLjkQEBekJwCy6izBCQwiwGAFdO6A+jDjASrrnNytQLctGE1j78BfkNVxCKdPU1d3krUAzNu/gH4Kcd6BONOh2QZqzR4ax+b+ODxqozEHA9yXNRoaWKp/NTBxEkO8jVBpuqjbDvQTD2brH4CagzYFy7nOMJpTS/2ErYr2AOI4hHgVQGsFqJ8GXL0cYjnIb3R0MwlvnKF3nqBDUpWqb0K8IIDeitFo07fXFnrd3uEx5g8bJLc58rXkpRoNI3IQ8yIZZ8kukWBF5WIby2Pc/txCSUpJoIw30b2KCJBSNbdMLCo/AeT3OeSDhLpHc7XCIbUSw58k3OvjxAOAenEuHEoIEHyNubp6Lio/l1yuckFTEBWsjkctyf8qFzl/ABIpmnDaTkSAAAAAAElFTkSuQmCC%27%3B%0ACalculator%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAmhJREFUOE91k99PklEYx18vyrXVRbeuu278T7zK1kWtrVbO8qLwoiybM12aLEdz5mqaqUPE3JJUwAQhfwBq4i/wxwSFyECSgZZaJpaSnw5stlq+Z3v3PO+z8/2e7/d5zkkDpIM15VvjaPoRaXPrpxTf/SXF99OkldiGdOp0hnT8xDHpZEa65O1blK5kZab9ASUJkl/PgF8ECO7Bkoifkvk+hEX0/4De2S1GgjDqjye3pTCpww+SDvM8YYEaEYgyTZCrj0Ncrlwmu2SJ86WLnFHGOVsaoK3XdziBxe4nHIFO1zbZynUu1MGl55DXDPltUNAu4otNjIMppf8rsNp9+IXErsk4ReooNTZQdSd4oA1RrvmAShej0fadoemonIIFZgS5/SM0277yrCtEi2019e9cFfXpeUbcXszjXw4nMA94GJ8XzVoAs3uTFmsAy1wCozNAo2OHmO4aa9qiVE22iY4peCtUNOu9uNZBWTuKeU5Y6dhg9mYm1sIs3CkHMlOwjkF/ABRl/SgeTmAUii4qXmL0QJ3pPZpZmPJtyxMYHQlMwoLOEUHnDKOzbxHahYaeEAZnnPo3EQYnYvIEBtse3eIUtcGPTTTvVoUFVesala1Bbj8ao6h2ieGZz/IEr6y7WEUP8pVDXC8epm8Zcu5o6F2E9qFltLYYAxNr8gRa0w76GehwRDG6olRrvQgHKJvm0JhWKW+O4HDJjDF5lZv031IWnrZ5UA9CRYOHnHt91BgS3K1eILfMi2NyRV6BWty8fvGSCp+4KajyU9W5R16JhRvFr/8BHTrGZPFcbj0Fqnco7utlAX+Dk/lvcXcJCTRwbTMAAAAASUVORK5CYII%3D%27%3B%0ANetConnect%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAtxJREFUOE91k2tI01EYh8/SDxVaGpQVVAYV+CEQchRppandEMEP2WXa1Uq7MUShIk2taGWIdr86M0vn0ka1NishHTMj3RKMxtBIa00zoxxUhPH0/09mSnXghXP58Zzf+573KADhG87v3+j80Sxs/QOi5cNYERroFCF+iSL450SxKyJYMSwcOZEBclS6zZR0H+D2p7NoezTkOpJJagxj2vVjBBZ+5NKLz5JsSDsyvIsiZyl77Mu46Mqh/ruZewO1FHcdZb11PlPLNYh8N4qCZHKrn/wF8QLCayLY/HwBxzu2UtpzhcuufCo+NrHB+ppJ2gYUp7MRBQL/LBUWi2UURKj0bgJOGVj+aDZbJMheezTqtvVkt38gygT+F1skiwKRI1DsCyJibfZoQNgJB2MO2gmtnEnE/eksNc9iibmZ+QaYd+0ra27ZyHxgQK2rZsq+MOYlZYxyIeYcsiEy7IzJfcC48ykElYUwvlTJjOI+7tp60bX2Y+gc5NZLD1ctXagOXUKr1Q67EMo8CbCuHrGrFZHpkHLdjygULC5OJ++2g6qWT5idA7R+AWsf1L37xdHz+j+AvLpeRLwekWRCqBoQ22sQBwQxmiwvoOSRi6o2D/cdHkpM7ym4001S6n70+iGIkAHTUk0oosoRcdWIVbWMSw/GLzkFZcoNih52U946QL6uE31LH82ub+zIPDJcB+8zypAZqfWExOqYvOIyczdmERB1gwmRpShVRoqMbvL1XewuuInWbONZzyB36p4POfB1lQxZuLWM8J3NxO18TKJUk8gtTSiTDShX7iE2fjXR0dFoNBqqrG+50uDGZJLSHtmWMkQWhK/aRnjcJhbFJJKwNo1N6dlUGF/wtL0fa6eHe85BTta0k5CQ8Hdv+4B11lfUtn3B+AZ0dg+VNimk/3DG2EHeGZ3XUVpa2v8BZZZezjV6SD98wWvdF/KtarXa63RUDf7102SxL+9/nct7vwFQw5ZrKBhJFQAAAABJRU5ErkJggg%3D%3D%27%3B%0APowOptions%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAetJREFUOE+lk99rklEYx9e/0VU3QfdB/0JMyEaoF17JZNlg8cqsi8naClSaiBk2jOY71BbOC3/UunBBGkHEgkZu5KiGroiRWxJa6rrp03sOOHS+FNGBL5zDc57PeZ7vwzkGDP3XEoBexdQIR3X0Tu9ZN7m2W+Pzq2eUc3HUxA6j9qtaTv9D3fMAoLWdo7G/xutHyyRv3OH+1GPsdh+BQEAXIgFLiTjpdEaW3infhY9uWr6TPDkxROSUmUvjQSZdk/qARTVK6FYQj8cjAV+rT+GTn4b/NPkzx4nZgsQSL5jzRw/V54HT6SQyP4/b7ZaA2n6dTusbb9deknnwnMzDLyjKLAaDgYmJywMQ2YKAdFWv12m3D3izWSGd3SSb29U8mNLkIJFIkUplJURRFNlSn4kCsre3R6fTplR6Ty5XIhwWKrCxUWVrq0E+v8PY2Aw226g+oNlsaoFflMtVVlbe4fUWKRYrVCo/WV//QaHQYnX1Ow7H9UGAKEl4cWjYXFxzP43PG+d2KEkoVCKqftBUZXo6Kdvua6HrrghYrVZMJjMXRi7KsbqUa8zMbsv9orqkVRDDYrHoA3rHpC5EZNJy2MTw8Ljc37vp4pzxCmaz+e8AARPJQmKUC76zWEbOYzSa9D3408fRi+l68C+Q35MrucWVT9wHAAAAAElFTkSuQmCC%27%3B%0AMSPaint%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZZJREFUOE+NkjFowkAUhnVzdMxYoYubdhM6uTWbgQ7tJodDkQwiTuIimUJwEHEKHYRkKMShoFtcCnYoOGY8x4zt1m5/711MjEZbDw6O4973vvfe5QHkaG21G/xcfclzecTz8nDJIgBt3qjCuysi6JTAWkxcRffpbZh+5j55sNAZ7EoR9m11D/jIwerVkiACsJZzADnI0O9N0NYtqPfd6FEKQMHWLABr2OcBk7kPzQwSwKfLEgMC+FM7U96BAQEexxxqx5NZ/FFhX0JTkeV5D/uS5ADSTXLcANpgA2MsNIW+NyrDWoUIXQuo5CSAdjomY1A3F5HmDtCdcYS6hvBaAHoWqE9nAcbrGvWXMpRmAYEbTYB6QiMmCDX4X4D97oDNGPiyhoVQ91ZrcFPF91ycXR/d4R8GpEYW6lQTHS9hLUCBCISuINxupMHx58r+th3AGRbRf27L7KRPEzrOnpmCNHA30sB4UqQBBiXZPAq+CEAQ6oFm1iOA0D9Ve1xKpgRpsTRAvfDfuPx9VPup7CdLiMmx8jn1+N0vr+ulS/dQUwwAAAAASUVORK5CYII%3D%27%3B%0A%0A%0Avar%20directoryService%20%3D%20Components.classes%5B%27@mozilla.org/file/directory_service%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%3B%0Avar%20profileFolder%20%3D%20directoryService.get%28%27ProfD%27%2C%20Components.interfaces.nsIFile%29%3B%0Avar%20profilePath%20%3D%20profileFolder.QueryInterface%28Components.interfaces.nsILocalFile%29.path%3B%0A%20%20%20%20profilePath%20%3D%20profilePath.replace%28/%5C%5C/g%2C%27/%27%29%3B%0A%0A%0A//%20------%20Menu%20Items%20------%0Aapps.push%28%5B%27Show%20Desktop%27%2C%20%20%20%20%20%20%20%20ShowDesk%2C%20%20%27C%3A/Documents%20and%20Settings/%27+login+%27/Application%20Data/Microsoft/Internet%20Explorer/Quick%20Launch/Show%20Desktop.scf%27%5D%29%3B%0Aapps.push%28%5B%27Open%20My%20Computer%27%2C%20%20%20%20Computers%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27%3A%3A%7B20D04FE0-3AEA-1069-A2D8-08002B30309D%7D%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Open%20Drive%20C%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27C%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20D%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27D%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Profile%20Folder%27%2C%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20profilePath%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Internet%20Explorer%27%2C%20%20%20IExplorer%2C%20%27C%3A/Program%20Files/Internet%20Explorer/IEXPLORE.EXE%27%2C%20getBrowser%20%28%29.%20contentDocument.%20location.%20href%5D%29%3B%0Aapps.push%28%5B%27Notepad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSNotepad%2C%20%27C%3A/WINDOWS/notepad.exe%27%5D%29%3B%0Aapps.push%28%5B%27WordPad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSWordpad%2C%20%27C%3A/Program%20Files/Windows%20NT/Accessories/wordpad.exe%27%2C%20%27c%3A%5Creadme.txt%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Control%20Panel%27%2C%20%20%20%20%20%20%20CtrlPanel%2C%20%27C%3A/WINDOWS/system32/control.exe%27%5D%29%3B%0Aapps.push%28%5B%27Add/Remove%20Programs%27%2C%20AddRemove%2C%20%27C%3A/WINDOWS/system32/control.exe%27%2C%20%27C%3A/WINDOWS/system32/Appwiz.cpl%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Magnifier%27%2C%20%20%20%20%20%20%20%20%20%20%20Magnifier%2C%20%27C%3A/WINDOWS/system32/magnify.exe%27%5D%29%3B%0Aapps.push%28%5B%27On-Screen%20Keyboard%27%2C%20%20OnScrKeyb%2C%20%27C%3A/WINDOWS/system32/osk.exe%27%5D%29%3B%0Aapps.push%28%5B%27Task%20Manager%27%2C%20%20%20%20%20%20%20%20WinTskMngr%2C%27C%3A/WINDOWS/system32/taskmgr.exe%27%5D%29%3B%0Aapps.push%28%5B%27Calculator%27%2C%20%20%20%20%20%20%20%20%20%20Calculator%2C%27C%3A/WINDOWS/system32/calc.exe%27%5D%29%3B%0Aapps.push%28%5B%27Paint%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MSPaint%2C%20%20%20%27C%3A/WINDOWS/system32/mspaint.exe%27%5D%29%0Aapps.push%28%5B%27Command%20Prompt%27%2C%20%20%20%20%20%20CmdPrompt%2C%20%27C%3A/WINDOWS/system32/cmd.exe%27%5D%29%3B%0A//%20------------------------%0A%0A%0Avar%20nMItem%20%3D%20function%28label%2Cimg%2Cpath%2Cargs%2Cobj%29%20%7B%0A%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%20%3D%20obj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27event.stopPropagation%28%29%3Bthis.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%2Cthis%29%27%29%3B%0A%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20if%20%28%21img%29%20img%20%3D%20Default%3B%0A%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20m.tooltipText%20%3D%20label%3B%0A%20%20return%20m%3B%0A%7D%0A%0Athis.startProcess%20%3D%20function%28path%2Cargs%2Cmi%29%20%7B%0A%20%20this.currentCommand%3Dmi%3B%0A%20%20this.image%3Dmi.getAttribute%28%22image%22%29%3B%0A%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20var%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIProcess%29%3B%0A%20%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%0A%20%20args%20%3D%20args.replace%28/%5C//g%2C%27%5C%5C%27%29%3B%0A%20%20if%20%28args%3D%3D%27%27%29%20%7B%20file.launch%28%29%3B%20return%3B%20%7D%20%0A%20%20process.init%28file%29%3B%0A%20%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%20%3D%20document.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3B%20i%3Capps.length%3B%20i++%29%20%7B%0A%20%20if%20%28apps%5Bi%5D%20%3D%3D%20%27separator%27%29%20%7B%0A%20%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%20%28%21apps%5Bi%5D%20%5B3%5D%29%20apps%5Bi%5D%20%5B3%5D%3D%27%27%3B%0A%20%20%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2C%20apps%5Bi%5D%20%5B1%5D%2C%20apps%5Bi%5D%20%5B2%5D%2C%20apps%5Bi%5D%20%5B3%5D%2C%20this%29%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0Athis.orient%20%3D%20%22horizontal%22%3B%0Athis.image%3DmP.firstChild.getAttribute%20%28%22image%22%29%3B%0Athis.currentCommand%3DmP.firstChild%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Athis.currentCommand.doCommand%28%29%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

Есть еще один момент :blush:
Я немного поменял код кнопки

Код:

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%3EFavorite%20Applications%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%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%5Bvar%20login%20%3D%20%22Administrator%22%3B%20%20%20%20%20%20%20%20%20%20//%20Here%20put%20your%20login%20name%21%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%20%20//%20So%20you%20can%20use%20%22Show%20Desktop%22%20command%21%0A%0A/*%0AIf%20you%20deleted%20%22Show%20Desktop%22%20from%20your%20Quick%20Launch%20toolbar%2C%20just%20enter%20this%20URI%0Ain%20your%20Firefox%20and%20save%20the%20file%20as%20%22Show%20Desktop.scf%22.%20Then%20you%20can%20put%20it%20in%20you%20Quick%20Launch%21%21%0AShowDesktop%3D%22data%3Aapplication/x-unknown-content-type%3Bbase64%2CW1NoZWxsXQ0KQ29tbWFuZD0yDQpJY29uRmlsZT1leHBsb3Jlci5leGUsMw0KW1Rhc2tiYXJdDQpDb21tYW5kPVRvZ2dsZURlc2t0b3ANCg%3D%3D%22%3B%0A*/%0A%0Avar%20apps%20%3D%20new%20Array%3B%0ADefault%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%27%3B%0AGchrome%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAAA5AAAARgAAAEEAAAA4AAAAJAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAU8dLhSTS2YrwmGEU9U8hoPMCXCHwAg/SqMCEBNtAAAALQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGRUeD3dShTXYerNF/3nFov844ff/E9///xLY//8Vz/X/G6jG8RBIVqoAAABAAAAABQAAAAAAAAAAAAAAChsoEndjpzvzY6sr/3q7nf835f//Etz//xDZ//8P1vz/EdL3/yDJ7f8jwOP/D2d7wwECAjUAAAAAAAAAAAcNBD5enDjpUq4e/0CPFf91n5z/ZeP5/zbm//8h3f//Edn//w/X/f8U0PX/H8Hl/yC94f8NUWGhAAAADQAAAAY5WSWYYLYw/0CiHv9LskP/V6BZ/3iUkf973O7/XfD//zjl//8O2f//Ddf9/xLP9P8iweT/HKbF8wMSFTwOFAooZJxD11CuLf9MsEX/Vr1t/23Tm/+Zyqn/fYGB/4ajr/+Qzdv/bOv//xLb//8O1fr/Fsjt/yK94f8LS1l5KDYeTWyxTO5Lrz7/Vrxq/2jOmP+m2bz/ZHpc/01JMP9aQCD/TD8y/3iQmv9e5fz/Ctf+/xLQ9f8hxOn/GXOIoSk7IFNntVL0ULdX/13GiP+S4L7/epN2/2VWJP/Hghv/340n/7l7Iv9TRzT/ZbLI/yTi//8J1f3/H9H2/x17kak1Qi86d8Bv6la+bv9q0KH/ot69/2JuTf+8fiz/759M//K6g//yo1L/mXs+/1ubp/887///I9Tt/0Covf8fc4mRHyocC3u6fMpiyYn/c9Sq/6Tfwf9wcWH/wYg4//WtYv/2yJH/96te/7KNTP9ff5P/Voel/0NQkf9KWbL/Hl9xUwAAAABTelpzgd6q/5Hfu/+ZwKn/hYS//3RjY//Hk1//0o9Z/7J5Of+WhI3/UE/U/w8I3f8JA+7/P2Dz3RQnJhEAAAAAFyEaDKTiw8244sL/jY+5/zQy9/9kZdT/a2me/2dilf9naK//YmPt/xEQ8/8AAOr/EhL0/ytPj1IAAAAAAAAAAAAAAAA5SUMqpcip2nJ0sP8WFeb/AwPh/yor5f81NuX/ISHk/wAA2f8AANb/CAje/w0Nj3kAAAAAAAAAAAAAAAAAAAAAAAAAAB8kHRZAQ4OKXFzf7iUlzP8TE8v/EhLK/xoay/8tLc/+NTXD0h8fe1YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2cD98fOOadnbc03d33Nh/f+TAa2u9bx4eNBcAAAAAAAAAAAAAAAAAAAAA+A8AAOAHAADAAwAAgAEAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAEAAMADAADgBwAA+A8AAA%3D%3D%27%3B%0AIExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%3D%27%3B%0AWExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%3D%3D%27%3B%0ACtrlPanel%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAEG0lEQVR42mJkTDzG8P/ffwYpEU6Gzz/+8H//9Y+dh4s1+cOn3+zMbMwWf/8wWAAVMOi/nLtX8uet4L+MrAz/GBgYmIHY/ft3BoAAYgHSOYyMjCIfv/2x+Pnnv8WfH/+YPnz4zMsAVMbC+p9BQYCV4dNfNoYvf9j4vn37wvCXkZ3hF9BADyFhBtVv3xgAAoiF4e/fif+//Wb6+ukvAzvrPwYtUVYGSyM+Bl15HgYTLSkGRUkOhty5txkOXP//F+TSv/9+MrCxsjBICggw/H73jgEggFgYvn37HGXEx+9lJMpgqCrEoCTJw8DBycoAAh++vGP4y8TO8O8/IwMj0FaGf38Y2ISUGZgktBlYGR4x/P//nwEggFj+//jBkO2py2BlIAnW9Auo7uMvBoYfP38zvD2aycBr1MPAxsLO8PsvM8PPb58ZhByDGb4x8TAwPL0HNJiJASCAmFhYWRkevvoG1vz9NwPDN5Dm/wwMX57sZPjLrcnAwCfLwMXJzPDr19//X8XNGX5JWzP8/flVjOnLq5lC7G+XAwQQCwsLE8PHL7/BBvwG2v7zL9AVQAO+3V/E8E86juEvkP3/90+GbyzCzJ90wsRUuDhmGqgKO6v/4ufl/HiCASCAWJgYGRlefQBay/Cf4fsfRoZfjEDNTw4x/P5wiYHVyInh/hsGhhc//jEEhwU4OFmo3/vOxMN98Yo8w+p/ir8EX0uvBggAQQC+/wQBAAAA8fkCAPf25ADuzJEABC2AAPnkrgD/FUcA6ujpAMTU2gBKOz4ADgkHBcfU4wXNzbvV8efcyCAD8ZMlFRvSAgBBAL7/BAYFAwDz9vgA+AcnAP8IHAD0vkgAAAUPAPkplQCyqrAAEQDYAKTmJQDhz8HdGv3XbBUE9L8QAQT5BgIBAAP+/QACiAUc8n/+Mvz8DYw6pVyGf68OAWML6CUuBQYG23yGHwxfGMwefmK4/fj2dQbu5zsYhIFpjJmNAehZcLgBBBALIxMTw2dgIH79AQo8YGjrLWb4/fEWw+8/DAyaAowMh9/zMnAy/2L4w8TP+uLjK4a33xkZ+Pn/M8gKAh3K+I8BIIBY/gDN+gNMYT+AGn4AI+M3IzfDT35DsOninAwM8m9+Mxy5+Yrhz5+/zIzAhPPr1x+Gly+/MHz78p/h5x8hBoAAYvnz9x/DT6BrmNiAOoCGfAUmiRcf/jLcuPmU4eS5+wy3rt1g+Pfuyk8VtkefeNk+gxMPCAC9z/CekZkBIIBY/v/5wvL8LQfDtGW3GO49eMXwCpjCvjy7+Ov/99cf2P5/mKvO/eseA/v7E0wsbPc5OHmByfcfAzIACCAW9t9v3t6/+vzP0wub//D+f3pGkPnZaQHmP2t4eTjvMTKzfmZj4wAmbXagRiag7f+BNIp+BoAAAwDAMqTgcw5bNAAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSNotepad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAoJJREFUOE+lk/tL01EUwO0fy1ely6IUMoi0AoM0Sy1TMDMitZyvfLDNdM5HPle6RNt0mlvz0ebmYzoVN5vO4cQ5yxQFAz/NbxTo9Kcu3Hu4h3s/fM6BcwYI+q91CBBXdGDtjaG88LUQywoK/9yLJEKseaulRnzX/5Sg41tIiKsWaauX0mdxolUr6Btz0NpWh9Ls4ZNugHbbDpklMvKkTQEQAVD4YQmN+yeGzX00qzvUu9aodKwhc25TurhLtnWbuNb10wF5ygUqnD4UTg8Sxwa5Nhc5026eTnpIG18lYWSdBO3B6QCF2krutI838z7ypzdJNS+RZHJz3/idWyNeLvd7iFEfkKYwnFxCl95Mnm2FdPMGj81bxA25uKZfJla3wZXPm4R0exC93yGtdysAIvRAPWSm1rlEvP4H8UM+ogZcRPS5idKsc6HHQ7BymUj5Kum6A15KWo5YCIAeg5ku7xTXtV5itD7CuhcIVzm41LlChNLO2Xoboko7qV1bpFQNHLEQAB/9JUzsWUkaXOVih4tz7dOENU8gejeLqMFGsMyCqGCSpFoHyU32QIBKb8G6byR/fJmLTQ5C60Y5LzchqrYQKflKcNEXIrMNJBaP8ah1jVdVzf/KEAxUOgsLv6ZodM5xtWGe0LIBQkq0RBSPEF48TIjYRLTYRkqd3W+wyL2c0qOADp2ZyT0jet8Md1Quf8OMxCqnSO63kzVuJ2d2huhMKS8KyykqrQ5sYrfBb8AExt1hVOtzlLkHkXtHaVxxIJuZJ7trnhsJz0+fhXqNlc5lO3LTN3I7p3hQMcjNrBZuP6wkOb2EfLH0xM/CJB8eGc+kJGbIeJJTISge1zxpCv/mfgPvVs+ANDa5fgAAAABJRU5ErkJggg%3D%3D%27%3B%0ANotepadPP%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAD//P8A//zwAP/3/wD/9/AA8P//APD98ADw9/8A8PTwAPD34ADw5+AA7///AO/08ADg8P8A4PDwAO//7wDv8O8A4PTvAO/o/wDg5/AA7+3vAO/n4ADg6O8A4OjgAODi4ADg3+AA4NzfAODY0ADf7+8A3+DgANDg7wDP+P8AwPD/ANDg0ADf3+AA393fAN/Y0ADQ2tAA0NDfANDU0ADQ0M8A0M/QAN/HwADP3N8Az9DfAM/Q0ADP1M8AwNDPAM/M0ADAyNAAz87PAM/HzwDPxcAAwM/PAMDEwADAx78A0LfQAM+3wADAv8AAsMjQAL/HwACwyMAAoMDAAJ/A4ACQx98Av8C/ALDAsACfr8AAn6DAAI+YwAC/v78Av7e/ALC4sACwt78AsLCwAL+orwC/r6AAv6egAK+/vwCvv7AAr7ewAK+vrwCvr6AAoKigAKCkoACgn7AAn6i/AJCosACfop8AkKCfAJ+foACPh68An5yfAJCYkACQl5AAj5CQAICQnwCPj48AgIeAAH/P3wBf3/AAT8jgAEDI3wB/sN8Af7/AAG+3wABgt8AAYKiwAH+QkABfoK8AT6+/AECgvwBAkK8AQICgAECAnwAw2OAAMNDvADDI7wAg0O8AIMjvACDH4AAvwNAAEMDgAC+43wAvl68AcGiPAHB4cABwd3AAb2xvAEBPXwAAAAAAf5CfAH+PkABwgJAAf4SPAHCAgABfmL8AUIe/AE+HvwA/zPAAP8fwADDP/wAwwvAAP8jvAC/A8AAwvPAAL77wAC+18AAguPAAH6//ABCH0AAfiM8AEIfPAA+A0AAgh78AH4i/AB+PsAAQgL8Af2/wAG93wABgWN8AYF/AAHB/gABveIAAYHeAAEB4vwBAf7AAQHigAEBwrwBfeJ8AUE+/AE9PrwBfUI8AT1+PABB/0AAQf88AD3/QAA9/zwA/YJAAP2CPADBojwA/X48AL1yPAC9YgAAvV4AAIF+PACBcgAAQfL8AEHiwABB3sAAPfL8AD3ewAABwsAB/fX8AcHh/AHB1cABgcH8Ab29wAG9qbwBgaG8AYGdvAGBiYABQZ3AAX2dvAF9gYABAYH8AUFhgAF9bXwBAT1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AYGF/f35hW0H+/v7+/v7+/lAHAAcTIjVQW2BhfX1+XP5TABMMAwgOBQAHAQADBS3+UwAWBwoACRkVAAAAAwBP/lsHJCAZgEIYBwQTAwcAYP5TAAsFAitobB0DEAsHB13+WwcxLyYzanJ7EQULBDEx/lcAMS8tGj14dW8wKhBd/v5TADUhNSYlPnpzcE0bXf7+WwtSNSY0ODdmd3lrKkj+/lcHJiImJCYzOmlldXES/v5bByIXFxABAgYfYnNkZ/7+WwdFRk8uNSlKWVZuY208/lwXRzlFTkFLTAMoQj8eXzJdFhcUIyRBNVEm/v7+VEN8UyYmMzE1QVhX/v7+/v5EWgD///8AAf//AAH//wAB//8AAf//AAH//wAB//8AA///AAP//wAD//8AA///AAP//wAB//8AAP//ADj//wB8//8%3D%27%3B%0ATimenDate%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqBJREFUOE+Fk2tIk1EAho9F2J8uFF0gol92g6j+WEFGTGrQBYYynGnrYllOwbIx2aJWUEiJoZiFIYSaoJFdSEFrXcwaUZFz4Vrq5mWX+lz25UQpop62SaOLowPn1+F5znvOeU8cIGKN7FcbIosJc3cK24cvQozPF9/erxDXM5PjokxYMNk8+HI9xe5cmkbrqQtcJK9DwdKGvUw55UNdawkhE1xMWNW2nKLegzR+rqM52MQxu5mVjcXEnStHnJrNsfKrEcmkgk1VPlbfSCacwuRI4aSzkNwOWHCtH1EqEEbB4kOpmEymf+OLomHmmxzMuHCGNXcWktSyhM2tXpbU/0CUeBFnQ4Kjgpm7M2ILpu9rR+R3Ma9Ex5zLK5hWqSIsFqfVCIMg/vAsFqnzSU9PR9hbS/l7Omr34yrdDucToWg9WWdXhWIrEAcsTM3IIyF7G2tTDBOCkeeVcD0NKhSgX8ZY8Q6C5XuQm0oYtbfyfegt2Zf2InYdQSgbiVdUosi6wDplDoWFhQh32x1s927x7FEb7a5hbN4RXIExPIHPBIY/IffZOFF1l+kba5inqGdD+iMSd5xDo9FM3MHN1qdYB0Z5EoLtLi+DVguyvZ2gz4Xs6kAe6KTmtoct+5+TpH3A2q1G1Gp1BI48Y1jQ0j3O6/4A3X2DSD1vkD3d+Ls7kboe43c85M07H2k5FSiVSnQ6XRSOCpq7RpAkiaDdyteAB39/D/6BHiRHC0FZYrCvl/x8I2azOdrAP5p494Ubr8/HR3sbX9/eJzj8gUG3E1mWsTo/UXC8InLjv2L/Xv1IE8PHkIYCkRRhyO+XsFieUVZ2hbTduWRmZk4KR6scFjidbqqrGygoMJKaqonsqNfrY4L/fCatVotKpcJgMPwX+v0IPwEurq5/p1hhrwAAAABJRU5ErkJggg%3D%3D%27%3B%0AAddRemove%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAs9JREFUOE+Vk91L02EUx+2q/yII6iJIxRoRRlHdiRBGF0KglFIkpRWKdKEpJlqEkQRR1txsbqY1dM40Naf5sqm/+ba20sxyc75szqHzNTf36fdb2Bh104EvPJznnA/PeXn2COZJov7DZEcP7IkIlwBPhTUemfxUmYPUDoNOVPsomKygrR9g8quHYBCMRiMGgwHRonYVJQGMY+M8GQrwsG8Hee8Wyg4fqhYP6oZ5uno9uN3g9QZJTk4mMTExEiCRJMj73nFyCt9ReE9PWVk7iso+6moERs0TbK24cTkdZGbeiEiWckNP+fLZxo/ZJUyjMywvuHC5PNhnXUw45miyzlPYaueWbpq0q7f/Deju/BAq47YJigQ/d3q3udYZIKlhk5TnNp41O3hrmKe8vIX8fPnfJTyo6+d+ywy53ZDaCte6RDUHKK224HYusuGDqUkYFpvbLPrz8hr/QEIlZNZYOP/Gh8YCLwY2UHVPUakR8LqWpECWl8EiQJMeXqlAoQiQnl4UgoQAjTod+q8b1FvWWddexv80np6qGnzr4PeLEavwzeBD+LhDpQL0Iqi0pIPs7Ozf85QAbrcX/bdV3k2nMKg5xnu1kaER+D4FP2xOKlRtmIUlBLFHg8I2avUQ8fHxYYDD6cFgX+X63AUO6/Yh1/ZjHoBBUWOmOeobTDinV1hb38K3toVa00VsbGwYYHcsMDC7wtmeOPYqo8iRK+hoAWUVtOlgtD3ApljKrl25kodMJgsDRkasfFpc5qB2P/vrDpFe8ZJqcWJKJbzVQoe4wdJGStbTYyUu7kS4B69f12C1fcG3A599DuyrP5F/9FJQYuRN7ab4B2BiAjyeoJhs49Spc8TExISnIDWyuLgYVbWGu3kFpKSkcvrMWY7KjpOQcImMjPvk5Dzm4sWbHDlykujo6Mg92P1ZaWlpJCUlhZ4madcvnXNzc8nKyorwS/e/AIz06Svr2XfUAAAAAElFTkSuQmCC%27%3B%0ACmdPrompt%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAQ1JREFUOE9j/P//PwNFAGQAJZiB17Xrv17m9v+G2bv/G2TtwonN8vf+N83b+9+8YN9/6+wN/yU8W4H2Al0vXHbzv3jPh//iXW9xYrHOt/+jN//677/29//4zT/+T+tb/N8yZuH/4uLi/wwupQv+G0YV/DeOLcOLLePL/lsAMYh2jMv5rxXQAjHAwSsOFIokYxHNQIgBtp7xYM0eHh4gP4EBiI1sKMSzqJYIa0ANsHKNBkvCNMIMgokhyyEbgtUAXF5BNhSmBm4AzAv4XIDNFRgG4AsD5DDC6QJSYwLuAkfvRJKjEGSZqGYQJBqN/ev/K5iG/le2iCIaq1hE/Je3K4EYAIpiEINcTFFOBFkOAK4+5J3cVDxkAAAAAElFTkSuQmCC%27%3B%0AMagnifier%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqxJREFUOE+Vkt1L01EYx48vFQRFdwVdVFQ3URFBd0HQjf9AhXWnBGLRMtdUiLLCt8RGbxZoQvaiglhRai03Z9Za5dbUueb2U/emNXx3upkv26ffFrndlRdfznkOz/dznuecJwkQmwsdpK7bIEJLEZEkksUyEbEmOVlEksJiYTFZLIbDYtP6tSKSkiI2igWxR/jF1lS3qFYdSxJRwJZzWnYrdexS6dmp1MfWv/tovCNXx4FCA3sLP3Hospbs6/VsO14kWxExQKXBD0sOAn4rgdE+ZmUFZS3O2CEowZyDcECS4wHmAwNRI+l59+MAdccoBGz4nF2MDJrxeyyM+yyYDB08b3iJtllLt6GT0JiN5ZlB2bhMeu7dOKBM5ycy3kv/dyOSowunzYjmTQfvPlh5YRumsX+KZwYfD6pbcNs/xio4kXM7DijV/iQy3ceA04zXbUHfYaTzq0QoMI7GPUGtbYI3E3PUmMZQ36yVjUFO5dxKALT9gKlehpxf8di/0KjrQTf8g0bzEA02FxqXG63HR1ckzLXqNiSrgQxVQgulOhkwaWHQYaTP9J6mD/08+SbxyGhHM+Dgs9uJZdiFNTRFTXs3LU31nFYltFCmjwJMDNoNOLr11L/tkW/2USdDDJ4hHB4XIyNeRiO/uNfUTuvzx2TlqeMt1PTOysEIhIdZCHnRtJl42jXJx/kg5tlpXLOT8jfPsSBnqfKLCAftZBfciQOOKppJO9/K0TOv6dFUYGytovi2jrfyeIzH3hwWZV26+pjtBzPIqbSyPy0/YQ7UatSymisz4dU+zCVZnEzPpKL8LorcEi4WlJN5OjeWk6iVSYxu8NaB/jDSDQXKs/djibHzf+hPgiSPZfMRrMU5KM/X/Ld5pYKWKiXSrXwuKh6uyrwCiJaruHBl1eYo4DduhgDBD20V8AAAAABJRU5ErkJggg%3D%3D%27%3B%0AOnScrKeyb%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJVJREFUOE9j/P//PwNFAGQAJRismSHz/H9SMLKFDAxtb/6Tg0tLS4HmgLwPNCD62H+SsELPhf8YBvz9+/f/zDNf///79w+FBlkDEgfJb7gPsQirAaS4AqcLGs78///r19//6DTIBTBx2rkAZDLIZpA/Qf4FARANshnkAmQvUj8MQCaSiuHRCEoMIA45GJyQKMkHg8MAACArvHlXxbSqAAAAAElFTkSuQmCC%27%3B%0AWinTskMngr%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJ5JREFUOE+VU9EOgCAIxPXQY7/sp/lnxpFMTEpkYzST4+AwEVFir+yUc5YYMb6LvG5ILqUsvbK1Qr0YDqKGu58AYNDacSP+xwGqzMX40+IaAImabCN/xwCGqgaMogwEAHLOHmKwkvI1g0MWQQ+jEcO1Uv5K58k6sNhZIl02F8Dr3as+DVIZyBY2rT0w+1YMg/0BmuSTGV76HHcHiWSxG7luAcTplZKTAAAAAElFTkSuQmCC%27%3B%0ASystProps%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAiRJREFUOE99kj9o21AQxl82jx67Crpo9FZDlxoyWNDBKhki8BCMBmMyBOGhuF2MmyFoKsKD0VRQh4A8GORNWQLyUFAGgzy4KEOGN3Tw0MGFDl/vnSu5TkgFH/p397vv7t0RAPHc9en7B/4pf2kckizeidSuHh3EK8BjjdYDKPnSgzv34axMGDcaxGWE2mRD4fscTo7mGQ40ixBeJwinKYIvSQmo0rPo5wQyS0gJSBYUfJMiWuasWG753b3bwFtk5CBDZexDXNUghgJG12NICXCXW7IMhOQw/g1E5MJ/70J9d6YS+gw7wGWFXJDsBqy2tetF2VeBo3swxP9BOu3AW20wWAPWZ7I9ocCPLjkQEBekJwCy6izBCQwiwGAFdO6A+jDjASrrnNytQLctGE1j78BfkNVxCKdPU1d3krUAzNu/gH4Kcd6BONOh2QZqzR4ax+b+ODxqozEHA9yXNRoaWKp/NTBxEkO8jVBpuqjbDvQTD2brH4CagzYFy7nOMJpTS/2ErYr2AOI4hHgVQGsFqJ8GXL0cYjnIb3R0MwlvnKF3nqBDUpWqb0K8IIDeitFo07fXFnrd3uEx5g8bJLc58rXkpRoNI3IQ8yIZZ8kukWBF5WIby2Pc/txCSUpJoIw30b2KCJBSNbdMLCo/AeT3OeSDhLpHc7XCIbUSw58k3OvjxAOAenEuHEoIEHyNubp6Lio/l1yuckFTEBWsjkctyf8qFzl/ABIpmnDaTkSAAAAAAElFTkSuQmCC%27%3B%0ACalculator%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAmhJREFUOE91k99PklEYx18vyrXVRbeuu278T7zK1kWtrVbO8qLwoiybM12aLEdz5mqaqUPE3JJUwAQhfwBq4i/wxwSFyECSgZZaJpaSnw5stlq+Z3v3PO+z8/2e7/d5zkkDpIM15VvjaPoRaXPrpxTf/SXF99OkldiGdOp0hnT8xDHpZEa65O1blK5kZab9ASUJkl/PgF8ECO7Bkoifkvk+hEX0/4De2S1GgjDqjye3pTCpww+SDvM8YYEaEYgyTZCrj0Ncrlwmu2SJ86WLnFHGOVsaoK3XdziBxe4nHIFO1zbZynUu1MGl55DXDPltUNAu4otNjIMppf8rsNp9+IXErsk4ReooNTZQdSd4oA1RrvmAShej0fadoemonIIFZgS5/SM0277yrCtEi2019e9cFfXpeUbcXszjXw4nMA94GJ8XzVoAs3uTFmsAy1wCozNAo2OHmO4aa9qiVE22iY4peCtUNOu9uNZBWTuKeU5Y6dhg9mYm1sIs3CkHMlOwjkF/ABRl/SgeTmAUii4qXmL0QJ3pPZpZmPJtyxMYHQlMwoLOEUHnDKOzbxHahYaeEAZnnPo3EQYnYvIEBtse3eIUtcGPTTTvVoUFVesala1Bbj8ao6h2ieGZz/IEr6y7WEUP8pVDXC8epm8Zcu5o6F2E9qFltLYYAxNr8gRa0w76GehwRDG6olRrvQgHKJvm0JhWKW+O4HDJjDF5lZv031IWnrZ5UA9CRYOHnHt91BgS3K1eILfMi2NyRV6BWty8fvGSCp+4KajyU9W5R16JhRvFr/8BHTrGZPFcbj0Fqnco7utlAX+Dk/lvcXcJCTRwbTMAAAAASUVORK5CYII%3D%27%3B%0ANetConnect%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAtxJREFUOE91k2tI01EYh8/SDxVaGpQVVAYV+CEQchRppandEMEP2WXa1Uq7MUShIk2taGWIdr86M0vn0ka1NishHTMj3RKMxtBIa00zoxxUhPH0/09mSnXghXP58Zzf+573KADhG87v3+j80Sxs/QOi5cNYERroFCF+iSL450SxKyJYMSwcOZEBclS6zZR0H+D2p7NoezTkOpJJagxj2vVjBBZ+5NKLz5JsSDsyvIsiZyl77Mu46Mqh/ruZewO1FHcdZb11PlPLNYh8N4qCZHKrn/wF8QLCayLY/HwBxzu2UtpzhcuufCo+NrHB+ppJ2gYUp7MRBQL/LBUWi2UURKj0bgJOGVj+aDZbJMheezTqtvVkt38gygT+F1skiwKRI1DsCyJibfZoQNgJB2MO2gmtnEnE/eksNc9iibmZ+QaYd+0ra27ZyHxgQK2rZsq+MOYlZYxyIeYcsiEy7IzJfcC48ykElYUwvlTJjOI+7tp60bX2Y+gc5NZLD1ctXagOXUKr1Q67EMo8CbCuHrGrFZHpkHLdjygULC5OJ++2g6qWT5idA7R+AWsf1L37xdHz+j+AvLpeRLwekWRCqBoQ22sQBwQxmiwvoOSRi6o2D/cdHkpM7ym4001S6n70+iGIkAHTUk0oosoRcdWIVbWMSw/GLzkFZcoNih52U946QL6uE31LH82ub+zIPDJcB+8zypAZqfWExOqYvOIyczdmERB1gwmRpShVRoqMbvL1XewuuInWbONZzyB36p4POfB1lQxZuLWM8J3NxO18TKJUk8gtTSiTDShX7iE2fjXR0dFoNBqqrG+50uDGZJLSHtmWMkQWhK/aRnjcJhbFJJKwNo1N6dlUGF/wtL0fa6eHe85BTta0k5CQ8Hdv+4B11lfUtn3B+AZ0dg+VNimk/3DG2EHeGZ3XUVpa2v8BZZZezjV6SD98wWvdF/KtarXa63RUDf7102SxL+9/nct7vwFQw5ZrKBhJFQAAAABJRU5ErkJggg%3D%3D%27%3B%0APowOptions%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAetJREFUOE+lk99rklEYx9e/0VU3QfdB/0JMyEaoF17JZNlg8cqsi8naClSaiBk2jOY71BbOC3/UunBBGkHEgkZu5KiGroiRWxJa6rrp03sOOHS+FNGBL5zDc57PeZ7vwzkGDP3XEoBexdQIR3X0Tu9ZN7m2W+Pzq2eUc3HUxA6j9qtaTv9D3fMAoLWdo7G/xutHyyRv3OH+1GPsdh+BQEAXIgFLiTjpdEaW3infhY9uWr6TPDkxROSUmUvjQSZdk/qARTVK6FYQj8cjAV+rT+GTn4b/NPkzx4nZgsQSL5jzRw/V54HT6SQyP4/b7ZaA2n6dTusbb9deknnwnMzDLyjKLAaDgYmJywMQ2YKAdFWv12m3D3izWSGd3SSb29U8mNLkIJFIkUplJURRFNlSn4kCsre3R6fTplR6Ty5XIhwWKrCxUWVrq0E+v8PY2Aw226g+oNlsaoFflMtVVlbe4fUWKRYrVCo/WV//QaHQYnX1Ow7H9UGAKEl4cWjYXFxzP43PG+d2KEkoVCKqftBUZXo6Kdvua6HrrghYrVZMJjMXRi7KsbqUa8zMbsv9orqkVRDDYrHoA3rHpC5EZNJy2MTw8Ljc37vp4pzxCmaz+e8AARPJQmKUC76zWEbOYzSa9D3408fRi+l68C+Q35MrucWVT9wHAAAAAElFTkSuQmCC%27%3B%0AMSPaint%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZZJREFUOE+NkjFowkAUhnVzdMxYoYubdhM6uTWbgQ7tJodDkQwiTuIimUJwEHEKHYRkKMShoFtcCnYoOGY8x4zt1m5/711MjEZbDw6O4973vvfe5QHkaG21G/xcfclzecTz8nDJIgBt3qjCuysi6JTAWkxcRffpbZh+5j55sNAZ7EoR9m11D/jIwerVkiACsJZzADnI0O9N0NYtqPfd6FEKQMHWLABr2OcBk7kPzQwSwKfLEgMC+FM7U96BAQEexxxqx5NZ/FFhX0JTkeV5D/uS5ADSTXLcANpgA2MsNIW+NyrDWoUIXQuo5CSAdjomY1A3F5HmDtCdcYS6hvBaAHoWqE9nAcbrGvWXMpRmAYEbTYB6QiMmCDX4X4D97oDNGPiyhoVQ91ZrcFPF91ycXR/d4R8GpEYW6lQTHS9hLUCBCISuINxupMHx58r+th3AGRbRf27L7KRPEzrOnpmCNHA30sB4UqQBBiXZPAq+CEAQ6oFm1iOA0D9Ve1xKpgRpsTRAvfDfuPx9VPup7CdLiMmx8jn1+N0vr+ulS/dQUwwAAAAASUVORK5CYII%3D%27%3B%0A%0A%0Avar%20directoryService%20%3D%20Components.classes%5B%27@mozilla.org/file/directory_service%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%3B%0Avar%20profileFolder%20%3D%20directoryService.get%28%27ProfD%27%2C%20Components.interfaces.nsIFile%29%3B%0Avar%20profilePath%20%3D%20profileFolder.QueryInterface%28Components.interfaces.nsILocalFile%29.path%3B%0A%20%20%20%20profilePath%20%3D%20profilePath.replace%28/%5C%5C/g%2C%27/%27%29%3B%0A%20%20%20%20CurrentPage%20%3D%20getBrowser%20%28%29.%20contentDocument.%20location.%20href%3B%0A%0A//%20------%20Menu%20Items%20------%0Aapps.push%28%5B%27Run%20in%20IE%27%2C%20%20%20IExplorer%2C%20%27C%3A/Program%20Files/Internet%20Explorer/IEXPLORE.EXE%27%2C%20CurrentPage%5D%29%3B%0Aapps.push%28%5B%27Run%20in%20Google%20Chrome%27%2C%20%20%20%20%20%20%20%20Gchrome%2C%20%20%27C%3A/Documents%20and%20Settings/Admin/Local%20Settings/Application%20Data/Google/Chrome/Application/chrome.exe%27%2C%20CurrentPage%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27Open%20Drive%20C%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27C%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20D%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27D%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Profile%20Folder%27%2C%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20profilePath%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27Notepad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSNotepad%2C%20%27C%3A/WINDOWS/notepad.exe%27%5D%29%3B%0Aapps.push%28%5B%27Notepad++%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20NotepadPP%2C%20%27F%3A/Run/Textutils/notepad++/notepad++.exe%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Control%20Panel%27%2C%20%20%20%20%20%20%20CtrlPanel%2C%20%27C%3A/WINDOWS/system32/control.exe%27%5D%29%3B%0Aapps.push%28%5B%27Add/Remove%20Programs%27%2C%20AddRemove%2C%20%27C%3A/WINDOWS/system32/control.exe%27%2C%20%27C%3A/WINDOWS/system32/Appwiz.cpl%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Magnifier%27%2C%20%20%20%20%20%20%20%20%20%20%20Magnifier%2C%20%27C%3A/WINDOWS/system32/magnify.exe%27%5D%29%3B%0Aapps.push%28%5B%27On-Screen%20Keyboard%27%2C%20%20OnScrKeyb%2C%20%27C%3A/WINDOWS/system32/osk.exe%27%5D%29%3B%0Aapps.push%28%5B%27Task%20Manager%27%2C%20%20%20%20%20%20%20%20WinTskMngr%2C%27C%3A/WINDOWS/system32/taskmgr.exe%27%5D%29%3B%0Aapps.push%28%5B%27Calculator%27%2C%20%20%20%20%20%20%20%20%20%20Calculator%2C%27C%3A/WINDOWS/system32/calc.exe%27%5D%29%3B%0Aapps.push%28%5B%27Paint%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MSPaint%2C%20%20%20%27C%3A/WINDOWS/system32/mspaint.exe%27%5D%29%0Aapps.push%28%5B%27Command%20Prompt%27%2C%20%20%20%20%20%20CmdPrompt%2C%20%27C%3A/WINDOWS/system32/cmd.exe%27%5D%29%3B%0A//%20------------------------%0A%0A%0Avar%20nMItem%20%3D%20function%28label%2Cimg%2Cpath%2Cargs%2Cobj%29%20%7B%0A%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%20%3D%20obj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27event.stopPropagation%28%29%3Bthis.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%2Cthis%29%27%29%3B%0A%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20if%20%28%21img%29%20img%20%3D%20Default%3B%0A%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20m.tooltipText%20%3D%20label%3B%0A%20%20return%20m%3B%0A%7D%0A%0Athis.startProcess%20%3D%20function%28path%2Cargs%2Cmi%29%20%7B%0A%20%20this.currentCommand%3Dmi%3B%0A%20%20this.image%3Dmi.getAttribute%28%22image%22%29%3B%0A%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20var%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIProcess%29%3B%0A%20%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%0A%20%20args%20%3D%20args.replace%28/%5C//g%2C%27%5C%5C%27%29%3B%0A%20%20if%20%28args%3D%3D%27%27%29%20%7B%20file.launch%28%29%3B%20return%3B%20%7D%20%0A%20%20process.init%28file%29%3B%0A%20%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%20%3D%20document.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3B%20i%3Capps.length%3B%20i++%29%20%7B%0A%20%20if%20%28apps%5Bi%5D%20%3D%3D%20%27separator%27%29%20%7B%0A%20%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%20%28%21apps%5Bi%5D%20%5B3%5D%29%20apps%5Bi%5D%20%5B3%5D%3D%27%27%3B%0A%20%20%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2C%20apps%5Bi%5D%20%5B1%5D%2C%20apps%5Bi%5D%20%5B2%5D%2C%20apps%5Bi%5D%20%5B3%5D%2C%20this%29%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0Athis.orient%20%3D%20%22horizontal%22%3B%0Athis.image%3DmP.firstChild.getAttribute%20%28%22image%22%29%3B%0Athis.currentCommand%3DmP.firstChild%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Athis.currentCommand.doCommand%28%29%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

То-есть назначил на первые пункты меню, в коде инициализации, запуск браузеров [ie7] и [chrome] с страницей, открытой в текущей вкладке .
Проблема в том, что в коде инициализации кнопки, свойство getBrowser (). contentDocument. location. href; инициализируется один лишь раз, в итоге , если перейдешь на другую страницу (или откроешь другую вкладку) браузеры открывают страницу, ту которая проинициализировалась вначале, а никак не текущую..

Своими методами тыка пока ничего не добился, подскажите , плиз, че , где дописать :dumb:

Помогите вылечить кнопку, лепил код из нескольких кнопок (контекстное меню брал от кнопки под Custom Buttons 2), в принципе кнопка рабочая (ЛКМ открывает дополнения в боковухе, СКМ открывает/закрывает вкладку с дополнениями, ПКМ выкидывает меню со списком дополнений), но иконка выглядит неактивной и консоль ошибок отображает ошибку в строке:

Код:

subMenu.setAttribute("image", Cb.defaultImg());

Закомментировал эту строку, кнопка стала конфликтовать с расширением MR Tech Toolkit: ЛКМ не работает, СКМ не закрывает вкладку при повторном нажатии, а на ПКМ вообще выпадает меню MR Tech Toolkit :o

Отключил MR Tech Toolkit - кнопка работает как надо, включил - конфликтует. Где собака зарыта?

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

Код:

this.url2xul= 'chrome://mozapps/content/extensions/extensions.xul';
this.onClick= function(e)
{
    switch (e.button)
    {
        case 0: 
            openWebPanel(this.tooltipText, this.url2xul); 
            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;
    };
};
this.setAttribute('onclick','this.onClick(event);');




const Cb = custombuttons;
const EXTENSION = Ci.nsIUpdateItem.TYPE_EXTENSION;

function prop( aElement, aString ) {
  var emRDF = "http://www.mozilla.org/2004/em-rdf#";
  var arc = RDFService.GetResource(emRDF+ aString);
  var target = extensionDS.GetTarget(aElement, arc, true);
  if(target instanceof Ci.nsIRDFLiteral) return target.Value;
  if(target instanceof Ci.nsIRDFInt) return target.Value;
  return null;
}


var cloneCBcontext = {
  cloneItems: function(aNode, aID, aSeparate) {
    var menupopup = document.getElementById(aID).cloneNode(true);
    var menuitems = menupopup.childNodes.length;
    for(var i = 0; i < menuitems; i++)
      aNode.appendChild(menupopup.firstChild);
    if(aSeparate)
      aNode.appendChild(document.createElement("menuseparator"));
  },
  makeMenu: function(aNode) {
    var m = aNode.appendChild(document.createElement("menu"));
    m.setAttribute("label", "Custom Button");
    m.setAttribute("oncommand", "event.stopPropagation()");
    var mp = m.appendChild(document.createElement("menupopup"));
    cloneCBcontext.cloneItems(mp, "custombuttons-contextpopup");
    aNode.insertBefore(document.createElement("menuseparator"), m);
  }
}




const popupID = "cbContext-extensionsButton";

var test = document.getElementById(popupID);
if(test) test.parentNode.removeChild(test);

var main = document.getElementById("mainPopupSet");
var cPopup = main.appendChild(document.createElement("popup"));
cPopup.id = popupID;
cPopup.setAttribute("oncommand",
  "event.stopPropagation(); document.popupNode.openPrefs(event);")



var RDFService  = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
var Container   = Cc["@mozilla.org/rdf/container;1"].getService(Ci.nsIRDFContainer);
var extensionDS = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager).datasource;

var root;
try {
  root = RDFService.GetResource("urn:mozilla:item:root");
} catch(err) {
  root = RDFService.GetResource("urn:mozilla:extension:root");
}

Container.Init(extensionDS,root);

var elements = Container.GetElements();
var extensionArray = [];
var i = -1;
while(elements.hasMoreElements()) {
  i++;
  var element=elements.getNext();
  element.QueryInterface(Components.interfaces.nsIRDFResource);
  var prop_OptionsURL = prop(element, "optionsURL");
  if(prop(element, "type") == EXTENSION &&  prop_OptionsURL) {
    var prop_name = prop(element, "name");
    extensionArray[i] = [];
    extensionArray[i] [0] = prop_name.charAt(0).toUpperCase() + prop_name.substr(1);
    extensionArray[i] [1] = prop_OptionsURL;
    extensionArray[i] [2] = prop(element, "userDisabled");
    extensionArray[i] [3] = prop(element, "version");
    extensionArray[i] [4] = prop(element, "iconURL");
    if(!extensionArray[i] [4])
      extensionArray[i] [4] = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";
  }
}

extensionArray.sort();

var features = "chrome, dialog = 0, resizable, titlebar, toolbar, centerscreen";

var extCommand = "window.openDialog('ZZZ', '', '" + features + "');";

for(var i = 0; i < extensionArray.length; i++) {
  var extArray = extensionArray[i];
  try {
    var mItem = document.createElement("menuitem");
    mItem.setAttribute("label", extArray[0] + " " + extArray[3]);
    if(extArray[4]) {
      mItem.setAttribute("class", "menuitem-iconic bookmark-item");
      mItem.setAttribute("image", extArray[4]);
    }
    if(extArray[1])
      mItem.setAttribute("oncommand", extCommand.replace("ZZZ", extArray[1]));
    if(extArray[2]) mItem.setAttribute("disabled", true);
    cPopup.appendChild(mItem);
  } catch(e) {
  }
}

cloneCBcontext.makeMenu(cPopup);
this.setAttribute("context", popupID);

if(typeof Local_Install != "object") return;

var test = document.getElementById("cbContext-extensions");
if(test) test.parentNode.removeChild(test);

var cbPopup = document.getElementById("custombuttons-contextpopup-subCall").cloneNode(true); // Cb context

// var subPopup = document.createElement("menupopup");

// subPopup.appendChild(cbPopup);
// subPopup.appendChild(cbPopup.lastChild);

var subMenu = document.createElement("menu");
subMenu.setAttribute("label", "Custom Button");
subMenu.setAttribute("image", Cb.defaultImg());
subMenu.appendChild(cbPopup.lastChild);

var extensionsPopup = document.getElementById("emb-context");
var popup = extensionsPopup.cloneNode(true);
popup.id = "cbContext-extensions";
popup.appendChild(document.createElement("menuseparator"));
popup.appendChild(subMenu);
// popup.appendChild(subPopup);

extensionsPopup.parentNode.appendChild(popup);

this.setAttribute("context", popup.id);
this.onclick = function(aEvent) {
  if(aEvent.button === 1) gBrowser.selectedTab = gBrowser.addTab('chrome://mozapps/content/extensions/extensions.xul?type=extensions');
}

Anton
У меня в консоли ошибок появляется вот такое:

Код:

Ошибка: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMLocation.hostname]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: chrome://custombuttons/content/cbbutton.js :: anonymous :: line 356"  data: no]

при нажатии на кнопку "Поиск по сайту" (ту, что ты выше помог сделать) при зажатом Ctrl на пустой вкладке. Может быть нужно исправить, чтобы на пустой вкладке выскакивало это окно без заполненного поля "Сайт"?

vurdalak написал:

Проблема в том, что в коде инициализации кнопки, свойство getBrowser (). contentDocument. location. href; инициализируется один лишь раз, в итоге , если перейдешь на другую страницу (или откроешь другую вкладку) браузеры открывают страницу, ту которая проинициализировалась вначале, а никак не текущую..

Своими методами тыка пока ничего не добился, подскажите , плиз, че , где дописать

Код кнопки не предназначен передавать в качестве аргументов url.
Дописывать надо многое. Можно попросить автора кнопки.

Jarichek написал:

У меня в консоли ошибок появляется вот такое:

Код:

Ошибка: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMLocation.hostname]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: chrome://custombuttons/content/cbbutton.js :: anonymous :: line 356"  data: no]

Найти все обращения к location.hostname и завернуть в try/catch.

Было:

var url = doc. location. hostname;

Стало:

Код:

try { var url = doc. location. hostname; }
catch(e) { var url = ""; }

14-08-2009 17:51:41

Anton написал:

Дописывать надо многое. Можно попросить автора кнопки.

Скорее даже не «до», а «пере». =)

Дописывать надо многое. Можно попросить автора кнопки.

Скорее даже не «до», а «пере». =)

Ничего себе, не ожидал :/

Автор кнопки Yan ?

Черт, не могу успокоится :whistle:, а может можно при нажатии на кнопку или меню , чтобы всегда выполнялся код "инициализация" кнопки хотябы ?:whistle:

ЛКМ не работает, СКМ не закрывает вкладку при повторном нажатии,

Это потому что в конце кода устанавливается ещё один обработчик onclick:

Код:

;
this.onclick = function(aEvent) {
  if(aEvent.button === 1) gBrowser.selectedTab = gBrowser.addTab('chrome://mozapps/content/extensions/extensions.xul?type=extensions');
}

Его надо убрать, тогда будут работать ЛКМ, СКМ.

3Jlou написал:

а на ПКМ вообще выпадает меню MR Tech Toolkit

Это как раз случается, если упомянутая строка

Код:

subMenu.setAttribute("image", Cb.defaultImg());

не закомментирована.

vurdalak написал:

Автор кнопки Yan ?

Я не знаю. Если честно, я и свои не все помню (но эту точно не писал).

vurdalak написал:

при нажатии на кнопку или меню , чтобы всегда выполнялся код "инициализация" кнопки хотябы ?

Ну, вообще-то мысль. Будет работать. Допиши в конец

Код:

this. onmouseover = function (event)
{
    this. removeAttribute ("initialized");
    this. init ();
};

Эх-йолы палы
Когда нажимаю на меню кнопка перенициализируется и меню ускользаааает (поиграйся с вкладками):cry:
Может всесто this. onmouseover onclick какой нибудь ?

Да и в принципе этот подход нивелирует задачу, изложенную в посте http://forum.mozilla-russia.org/viewtop … 68#p364268

Надо как то при this. onmouseover назначать переменной свойство getBrowser (). contentDocument. location. href и повторно ее инициализировать

vurdalak
Вот так попробуй:

Код:

this. onmouseover = function (event)
{
    if (event. originalTarget != this)
        return;
    this. removeAttribute ("initialized");
    this. init ();
};

ps. Но от "фишки" с сохранением иконки придётся отказаться.

ps. Но от "фишки" с сохранением иконки придётся отказаться.

Вот это я и написал выше, пока не видел твое сообщение .....

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

А вообще как передавать значение переменные из кода инициализации в код и наоборот ?
Эх знать бы синтаксис , сам бы че-то мутил, а то уже наверное надоел немного ;)

vurdalak
Ладно, тогда вместо "this. onmouseover...." в конце добавляем

Код:

mP. firstChild. setAttribute ("oncommand", 'event.stopPropagation();this.f(this.getAttribute("path"),getBrowser().contentDocument.location.href,this);');
mP. firstChild. nextSibling. setAttribute ("oncommand", 'event.stopPropagation();this.f(this.getAttribute("path"),getBrowser().contentDocument.location.href,this);');

а после

Код:

var m = document.createElement('menuitem');

добавляем

Код:

m.setAttribute('path',path);

УРА - :D Родили наконец
Ни единого сбоя теперь ...
Спасибо...

Выложу код, может кому пригодиться

Код:

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%3EFavorite%20Applications%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAAA5AAAARgAAAEEAAAA4AAAAJAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAU8dLhSTS2YrwmGEU9U8hoPMCXCHwAg/SqMCEBNtAAAALQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGRUeD3dShTXYerNF/3nFov844ff/E9///xLY//8Vz/X/G6jG8RBIVqoAAABAAAAABQAAAAAAAAAAAAAAChsoEndjpzvzY6sr/3q7nf835f//Etz//xDZ//8P1vz/EdL3/yDJ7f8jwOP/D2d7wwECAjUAAAAAAAAAAAcNBD5enDjpUq4e/0CPFf91n5z/ZeP5/zbm//8h3f//Edn//w/X/f8U0PX/H8Hl/yC94f8NUWGhAAAADQAAAAY5WSWYYLYw/0CiHv9LskP/V6BZ/3iUkf973O7/XfD//zjl//8O2f//Ddf9/xLP9P8iweT/HKbF8wMSFTwOFAooZJxD11CuLf9MsEX/Vr1t/23Tm/+Zyqn/fYGB/4ajr/+Qzdv/bOv//xLb//8O1fr/Fsjt/yK94f8LS1l5KDYeTWyxTO5Lrz7/Vrxq/2jOmP+m2bz/ZHpc/01JMP9aQCD/TD8y/3iQmv9e5fz/Ctf+/xLQ9f8hxOn/GXOIoSk7IFNntVL0ULdX/13GiP+S4L7/epN2/2VWJP/Hghv/340n/7l7Iv9TRzT/ZbLI/yTi//8J1f3/H9H2/x17kak1Qi86d8Bv6la+bv9q0KH/ot69/2JuTf+8fiz/759M//K6g//yo1L/mXs+/1ubp/887///I9Tt/0Covf8fc4mRHyocC3u6fMpiyYn/c9Sq/6Tfwf9wcWH/wYg4//WtYv/2yJH/96te/7KNTP9ff5P/Voel/0NQkf9KWbL/Hl9xUwAAAABTelpzgd6q/5Hfu/+ZwKn/hYS//3RjY//Hk1//0o9Z/7J5Of+WhI3/UE/U/w8I3f8JA+7/P2Dz3RQnJhEAAAAAFyEaDKTiw8244sL/jY+5/zQy9/9kZdT/a2me/2dilf9naK//YmPt/xEQ8/8AAOr/EhL0/ytPj1IAAAAAAAAAAAAAAAA5SUMqpcip2nJ0sP8WFeb/AwPh/yor5f81NuX/ISHk/wAA2f8AANb/CAje/w0Nj3kAAAAAAAAAAAAAAAAAAAAAAAAAAB8kHRZAQ4OKXFzf7iUlzP8TE8v/EhLK/xoay/8tLc/+NTXD0h8fe1YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2cD98fOOadnbc03d33Nh/f+TAa2u9bx4eNBcAAAAAAAAAAAAAAAAAAAAA+A8AAOAHAADAAwAAgAEAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAEAAMADAADgBwAA+A8AAA%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%5Bvar%20login%20%3D%20%22Administrator%22%3B%20%20%20%20%20%20%20%20%20%20//%20Here%20put%20your%20login%20name%21%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%20%20//%20So%20you%20can%20use%20%22Show%20Desktop%22%20command%21%0A%0A/*%0AIf%20you%20deleted%20%22Show%20Desktop%22%20from%20your%20Quick%20Launch%20toolbar%2C%20just%20enter%20this%20URI%0Ain%20your%20Firefox%20and%20save%20the%20file%20as%20%22Show%20Desktop.scf%22.%20Then%20you%20can%20put%20it%20in%20you%20Quick%20Launch%21%21%0AShowDesktop%3D%22data%3Aapplication/x-unknown-content-type%3Bbase64%2CW1NoZWxsXQ0KQ29tbWFuZD0yDQpJY29uRmlsZT1leHBsb3Jlci5leGUsMw0KW1Rhc2tiYXJdDQpDb21tYW5kPVRvZ2dsZURlc2t0b3ANCg%3D%3D%22%3B%0A*/%0A%0Avar%20apps%20%3D%20new%20Array%3B%0ADefault%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%27%3B%0AGchrome%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAAA5AAAARgAAAEEAAAA4AAAAJAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAU8dLhSTS2YrwmGEU9U8hoPMCXCHwAg/SqMCEBNtAAAALQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGRUeD3dShTXYerNF/3nFov844ff/E9///xLY//8Vz/X/G6jG8RBIVqoAAABAAAAABQAAAAAAAAAAAAAAChsoEndjpzvzY6sr/3q7nf835f//Etz//xDZ//8P1vz/EdL3/yDJ7f8jwOP/D2d7wwECAjUAAAAAAAAAAAcNBD5enDjpUq4e/0CPFf91n5z/ZeP5/zbm//8h3f//Edn//w/X/f8U0PX/H8Hl/yC94f8NUWGhAAAADQAAAAY5WSWYYLYw/0CiHv9LskP/V6BZ/3iUkf973O7/XfD//zjl//8O2f//Ddf9/xLP9P8iweT/HKbF8wMSFTwOFAooZJxD11CuLf9MsEX/Vr1t/23Tm/+Zyqn/fYGB/4ajr/+Qzdv/bOv//xLb//8O1fr/Fsjt/yK94f8LS1l5KDYeTWyxTO5Lrz7/Vrxq/2jOmP+m2bz/ZHpc/01JMP9aQCD/TD8y/3iQmv9e5fz/Ctf+/xLQ9f8hxOn/GXOIoSk7IFNntVL0ULdX/13GiP+S4L7/epN2/2VWJP/Hghv/340n/7l7Iv9TRzT/ZbLI/yTi//8J1f3/H9H2/x17kak1Qi86d8Bv6la+bv9q0KH/ot69/2JuTf+8fiz/759M//K6g//yo1L/mXs+/1ubp/887///I9Tt/0Covf8fc4mRHyocC3u6fMpiyYn/c9Sq/6Tfwf9wcWH/wYg4//WtYv/2yJH/96te/7KNTP9ff5P/Voel/0NQkf9KWbL/Hl9xUwAAAABTelpzgd6q/5Hfu/+ZwKn/hYS//3RjY//Hk1//0o9Z/7J5Of+WhI3/UE/U/w8I3f8JA+7/P2Dz3RQnJhEAAAAAFyEaDKTiw8244sL/jY+5/zQy9/9kZdT/a2me/2dilf9naK//YmPt/xEQ8/8AAOr/EhL0/ytPj1IAAAAAAAAAAAAAAAA5SUMqpcip2nJ0sP8WFeb/AwPh/yor5f81NuX/ISHk/wAA2f8AANb/CAje/w0Nj3kAAAAAAAAAAAAAAAAAAAAAAAAAAB8kHRZAQ4OKXFzf7iUlzP8TE8v/EhLK/xoay/8tLc/+NTXD0h8fe1YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2cD98fOOadnbc03d33Nh/f+TAa2u9bx4eNBcAAAAAAAAAAAAAAAAAAAAA+A8AAOAHAADAAwAAgAEAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAEAAMADAADgBwAA+A8AAA%3D%3D%27%3B%0AIExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%3D%27%3B%0AWExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%3D%3D%27%3B%0ACtrlPanel%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAEG0lEQVR42mJkTDzG8P/ffwYpEU6Gzz/+8H//9Y+dh4s1+cOn3+zMbMwWf/8wWAAVMOi/nLtX8uet4L+MrAz/GBgYmIHY/ft3BoAAYgHSOYyMjCIfv/2x+Pnnv8WfH/+YPnz4zMsAVMbC+p9BQYCV4dNfNoYvf9j4vn37wvCXkZ3hF9BADyFhBtVv3xgAAoiF4e/fif+//Wb6+ukvAzvrPwYtUVYGSyM+Bl15HgYTLSkGRUkOhty5txkOXP//F+TSv/9+MrCxsjBICggw/H73jgEggFgYvn37HGXEx+9lJMpgqCrEoCTJw8DBycoAAh++vGP4y8TO8O8/IwMj0FaGf38Y2ISUGZgktBlYGR4x/P//nwEggFj+//jBkO2py2BlIAnW9Auo7uMvBoYfP38zvD2aycBr1MPAxsLO8PsvM8PPb58ZhByDGb4x8TAwPL0HNJiJASCAmFhYWRkevvoG1vz9NwPDN5Dm/wwMX57sZPjLrcnAwCfLwMXJzPDr19//X8XNGX5JWzP8/flVjOnLq5lC7G+XAwQQCwsLE8PHL7/BBvwG2v7zL9AVQAO+3V/E8E86juEvkP3/90+GbyzCzJ90wsRUuDhmGqgKO6v/4ufl/HiCASCAWJgYGRlefQBay/Cf4fsfRoZfjEDNTw4x/P5wiYHVyInh/hsGhhc//jEEhwU4OFmo3/vOxMN98Yo8w+p/ir8EX0uvBggAQQC+/wQBAAAA8fkCAPf25ADuzJEABC2AAPnkrgD/FUcA6ujpAMTU2gBKOz4ADgkHBcfU4wXNzbvV8efcyCAD8ZMlFRvSAgBBAL7/BAYFAwDz9vgA+AcnAP8IHAD0vkgAAAUPAPkplQCyqrAAEQDYAKTmJQDhz8HdGv3XbBUE9L8QAQT5BgIBAAP+/QACiAUc8n/+Mvz8DYw6pVyGf68OAWML6CUuBQYG23yGHwxfGMwefmK4/fj2dQbu5zsYhIFpjJmNAehZcLgBBBALIxMTw2dgIH79AQo8YGjrLWb4/fEWw+8/DAyaAowMh9/zMnAy/2L4w8TP+uLjK4a33xkZ+Pn/M8gKAh3K+I8BIIBY/gDN+gNMYT+AGn4AI+M3IzfDT35DsOninAwM8m9+Mxy5+Yrhz5+/zIzAhPPr1x+Gly+/MHz78p/h5x8hBoAAYvnz9x/DT6BrmNiAOoCGfAUmiRcf/jLcuPmU4eS5+wy3rt1g+Pfuyk8VtkefeNk+gxMPCAC9z/CekZkBIIBY/v/5wvL8LQfDtGW3GO49eMXwCpjCvjy7+Ov/99cf2P5/mKvO/eseA/v7E0wsbPc5OHmByfcfAzIACCAW9t9v3t6/+vzP0wub//D+f3pGkPnZaQHmP2t4eTjvMTKzfmZj4wAmbXagRiag7f+BNIp+BoAAAwDAMqTgcw5bNAAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSNotepad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAoJJREFUOE+lk/tL01EUwO0fy1ely6IUMoi0AoM0Sy1TMDMitZyvfLDNdM5HPle6RNt0mlvz0ebmYzoVN5vO4cQ5yxQFAz/NbxTo9Kcu3Hu4h3s/fM6BcwYI+q91CBBXdGDtjaG88LUQywoK/9yLJEKseaulRnzX/5Sg41tIiKsWaauX0mdxolUr6Btz0NpWh9Ls4ZNugHbbDpklMvKkTQEQAVD4YQmN+yeGzX00qzvUu9aodKwhc25TurhLtnWbuNb10wF5ygUqnD4UTg8Sxwa5Nhc5026eTnpIG18lYWSdBO3B6QCF2krutI838z7ypzdJNS+RZHJz3/idWyNeLvd7iFEfkKYwnFxCl95Mnm2FdPMGj81bxA25uKZfJla3wZXPm4R0exC93yGtdysAIvRAPWSm1rlEvP4H8UM+ogZcRPS5idKsc6HHQ7BymUj5Kum6A15KWo5YCIAeg5ku7xTXtV5itD7CuhcIVzm41LlChNLO2Xoboko7qV1bpFQNHLEQAB/9JUzsWUkaXOVih4tz7dOENU8gejeLqMFGsMyCqGCSpFoHyU32QIBKb8G6byR/fJmLTQ5C60Y5LzchqrYQKflKcNEXIrMNJBaP8ah1jVdVzf/KEAxUOgsLv6ZodM5xtWGe0LIBQkq0RBSPEF48TIjYRLTYRkqd3W+wyL2c0qOADp2ZyT0jet8Md1Quf8OMxCqnSO63kzVuJ2d2huhMKS8KyykqrQ5sYrfBb8AExt1hVOtzlLkHkXtHaVxxIJuZJ7trnhsJz0+fhXqNlc5lO3LTN3I7p3hQMcjNrBZuP6wkOb2EfLH0xM/CJB8eGc+kJGbIeJJTISge1zxpCv/mfgPvVs+ANDa5fgAAAABJRU5ErkJggg%3D%3D%27%3B%0ANotepadPP%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAD//P8A//zwAP/3/wD/9/AA8P//APD98ADw9/8A8PTwAPD34ADw5+AA7///AO/08ADg8P8A4PDwAO//7wDv8O8A4PTvAO/o/wDg5/AA7+3vAO/n4ADg6O8A4OjgAODi4ADg3+AA4NzfAODY0ADf7+8A3+DgANDg7wDP+P8AwPD/ANDg0ADf3+AA393fAN/Y0ADQ2tAA0NDfANDU0ADQ0M8A0M/QAN/HwADP3N8Az9DfAM/Q0ADP1M8AwNDPAM/M0ADAyNAAz87PAM/HzwDPxcAAwM/PAMDEwADAx78A0LfQAM+3wADAv8AAsMjQAL/HwACwyMAAoMDAAJ/A4ACQx98Av8C/ALDAsACfr8AAn6DAAI+YwAC/v78Av7e/ALC4sACwt78AsLCwAL+orwC/r6AAv6egAK+/vwCvv7AAr7ewAK+vrwCvr6AAoKigAKCkoACgn7AAn6i/AJCosACfop8AkKCfAJ+foACPh68An5yfAJCYkACQl5AAj5CQAICQnwCPj48AgIeAAH/P3wBf3/AAT8jgAEDI3wB/sN8Af7/AAG+3wABgt8AAYKiwAH+QkABfoK8AT6+/AECgvwBAkK8AQICgAECAnwAw2OAAMNDvADDI7wAg0O8AIMjvACDH4AAvwNAAEMDgAC+43wAvl68AcGiPAHB4cABwd3AAb2xvAEBPXwAAAAAAf5CfAH+PkABwgJAAf4SPAHCAgABfmL8AUIe/AE+HvwA/zPAAP8fwADDP/wAwwvAAP8jvAC/A8AAwvPAAL77wAC+18AAguPAAH6//ABCH0AAfiM8AEIfPAA+A0AAgh78AH4i/AB+PsAAQgL8Af2/wAG93wABgWN8AYF/AAHB/gABveIAAYHeAAEB4vwBAf7AAQHigAEBwrwBfeJ8AUE+/AE9PrwBfUI8AT1+PABB/0AAQf88AD3/QAA9/zwA/YJAAP2CPADBojwA/X48AL1yPAC9YgAAvV4AAIF+PACBcgAAQfL8AEHiwABB3sAAPfL8AD3ewAABwsAB/fX8AcHh/AHB1cABgcH8Ab29wAG9qbwBgaG8AYGdvAGBiYABQZ3AAX2dvAF9gYABAYH8AUFhgAF9bXwBAT1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AYGF/f35hW0H+/v7+/v7+/lAHAAcTIjVQW2BhfX1+XP5TABMMAwgOBQAHAQADBS3+UwAWBwoACRkVAAAAAwBP/lsHJCAZgEIYBwQTAwcAYP5TAAsFAitobB0DEAsHB13+WwcxLyYzanJ7EQULBDEx/lcAMS8tGj14dW8wKhBd/v5TADUhNSYlPnpzcE0bXf7+WwtSNSY0ODdmd3lrKkj+/lcHJiImJCYzOmlldXES/v5bByIXFxABAgYfYnNkZ/7+WwdFRk8uNSlKWVZuY208/lwXRzlFTkFLTAMoQj8eXzJdFhcUIyRBNVEm/v7+VEN8UyYmMzE1QVhX/v7+/v5EWgD///8AAf//AAH//wAB//8AAf//AAH//wAB//8AA///AAP//wAD//8AA///AAP//wAB//8AAP//ADj//wB8//8%3D%27%3B%0ATimenDate%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqBJREFUOE+Fk2tIk1EAho9F2J8uFF0gol92g6j+WEFGTGrQBYYynGnrYllOwbIx2aJWUEiJoZiFIYSaoJFdSEFrXcwaUZFz4Vrq5mWX+lz25UQpop62SaOLowPn1+F5znvOeU8cIGKN7FcbIosJc3cK24cvQozPF9/erxDXM5PjokxYMNk8+HI9xe5cmkbrqQtcJK9DwdKGvUw55UNdawkhE1xMWNW2nKLegzR+rqM52MQxu5mVjcXEnStHnJrNsfKrEcmkgk1VPlbfSCacwuRI4aSzkNwOWHCtH1EqEEbB4kOpmEymf+OLomHmmxzMuHCGNXcWktSyhM2tXpbU/0CUeBFnQ4Kjgpm7M2ILpu9rR+R3Ma9Ex5zLK5hWqSIsFqfVCIMg/vAsFqnzSU9PR9hbS/l7Omr34yrdDucToWg9WWdXhWIrEAcsTM3IIyF7G2tTDBOCkeeVcD0NKhSgX8ZY8Q6C5XuQm0oYtbfyfegt2Zf2InYdQSgbiVdUosi6wDplDoWFhQh32x1s927x7FEb7a5hbN4RXIExPIHPBIY/IffZOFF1l+kba5inqGdD+iMSd5xDo9FM3MHN1qdYB0Z5EoLtLi+DVguyvZ2gz4Xs6kAe6KTmtoct+5+TpH3A2q1G1Gp1BI48Y1jQ0j3O6/4A3X2DSD1vkD3d+Ls7kboe43c85M07H2k5FSiVSnQ6XRSOCpq7RpAkiaDdyteAB39/D/6BHiRHC0FZYrCvl/x8I2azOdrAP5p494Ubr8/HR3sbX9/eJzj8gUG3E1mWsTo/UXC8InLjv2L/Xv1IE8PHkIYCkRRhyO+XsFieUVZ2hbTduWRmZk4KR6scFjidbqqrGygoMJKaqonsqNfrY4L/fCatVotKpcJgMPwX+v0IPwEurq5/p1hhrwAAAABJRU5ErkJggg%3D%3D%27%3B%0AAddRemove%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAs9JREFUOE+Vk91L02EUx+2q/yII6iJIxRoRRlHdiRBGF0KglFIkpRWKdKEpJlqEkQRR1txsbqY1dM40Naf5sqm/+ba20sxyc75szqHzNTf36fdb2Bh104EvPJznnA/PeXn2COZJov7DZEcP7IkIlwBPhTUemfxUmYPUDoNOVPsomKygrR9g8quHYBCMRiMGgwHRonYVJQGMY+M8GQrwsG8Hee8Wyg4fqhYP6oZ5uno9uN3g9QZJTk4mMTExEiCRJMj73nFyCt9ReE9PWVk7iso+6moERs0TbK24cTkdZGbeiEiWckNP+fLZxo/ZJUyjMywvuHC5PNhnXUw45miyzlPYaueWbpq0q7f/Deju/BAq47YJigQ/d3q3udYZIKlhk5TnNp41O3hrmKe8vIX8fPnfJTyo6+d+ywy53ZDaCte6RDUHKK224HYusuGDqUkYFpvbLPrz8hr/QEIlZNZYOP/Gh8YCLwY2UHVPUakR8LqWpECWl8EiQJMeXqlAoQiQnl4UgoQAjTod+q8b1FvWWddexv80np6qGnzr4PeLEavwzeBD+LhDpQL0Iqi0pIPs7Ozf85QAbrcX/bdV3k2nMKg5xnu1kaER+D4FP2xOKlRtmIUlBLFHg8I2avUQ8fHxYYDD6cFgX+X63AUO6/Yh1/ZjHoBBUWOmOeobTDinV1hb38K3toVa00VsbGwYYHcsMDC7wtmeOPYqo8iRK+hoAWUVtOlgtD3ApljKrl25kodMJgsDRkasfFpc5qB2P/vrDpFe8ZJqcWJKJbzVQoe4wdJGStbTYyUu7kS4B69f12C1fcG3A599DuyrP5F/9FJQYuRN7ab4B2BiAjyeoJhs49Spc8TExISnIDWyuLgYVbWGu3kFpKSkcvrMWY7KjpOQcImMjPvk5Dzm4sWbHDlykujo6Mg92P1ZaWlpJCUlhZ4madcvnXNzc8nKyorwS/e/AIz06Svr2XfUAAAAAElFTkSuQmCC%27%3B%0ACmdPrompt%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAQ1JREFUOE9j/P//PwNFAGQAJZiB17Xrv17m9v+G2bv/G2TtwonN8vf+N83b+9+8YN9/6+wN/yU8W4H2Al0vXHbzv3jPh//iXW9xYrHOt/+jN//677/29//4zT/+T+tb/N8yZuH/4uLi/wwupQv+G0YV/DeOLcOLLePL/lsAMYh2jMv5rxXQAjHAwSsOFIokYxHNQIgBtp7xYM0eHh4gP4EBiI1sKMSzqJYIa0ANsHKNBkvCNMIMgokhyyEbgtUAXF5BNhSmBm4AzAv4XIDNFRgG4AsD5DDC6QJSYwLuAkfvRJKjEGSZqGYQJBqN/ev/K5iG/le2iCIaq1hE/Je3K4EYAIpiEINcTFFOBFkOAK4+5J3cVDxkAAAAAElFTkSuQmCC%27%3B%0AMagnifier%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqxJREFUOE+Vkt1L01EYx48vFQRFdwVdVFQ3URFBd0HQjf9AhXWnBGLRMtdUiLLCt8RGbxZoQvaiglhRai03Z9Za5dbUueb2U/emNXx3upkv26ffFrndlRdfznkOz/dznuecJwkQmwsdpK7bIEJLEZEkksUyEbEmOVlEksJiYTFZLIbDYtP6tSKSkiI2igWxR/jF1lS3qFYdSxJRwJZzWnYrdexS6dmp1MfWv/tovCNXx4FCA3sLP3Hospbs6/VsO14kWxExQKXBD0sOAn4rgdE+ZmUFZS3O2CEowZyDcECS4wHmAwNRI+l59+MAdccoBGz4nF2MDJrxeyyM+yyYDB08b3iJtllLt6GT0JiN5ZlB2bhMeu7dOKBM5ycy3kv/dyOSowunzYjmTQfvPlh5YRumsX+KZwYfD6pbcNs/xio4kXM7DijV/iQy3ceA04zXbUHfYaTzq0QoMI7GPUGtbYI3E3PUmMZQ36yVjUFO5dxKALT9gKlehpxf8di/0KjrQTf8g0bzEA02FxqXG63HR1ckzLXqNiSrgQxVQgulOhkwaWHQYaTP9J6mD/08+SbxyGhHM+Dgs9uJZdiFNTRFTXs3LU31nFYltFCmjwJMDNoNOLr11L/tkW/2USdDDJ4hHB4XIyNeRiO/uNfUTuvzx2TlqeMt1PTOysEIhIdZCHnRtJl42jXJx/kg5tlpXLOT8jfPsSBnqfKLCAftZBfciQOOKppJO9/K0TOv6dFUYGytovi2jrfyeIzH3hwWZV26+pjtBzPIqbSyPy0/YQ7UatSymisz4dU+zCVZnEzPpKL8LorcEi4WlJN5OjeWk6iVSYxu8NaB/jDSDQXKs/djibHzf+hPgiSPZfMRrMU5KM/X/Ld5pYKWKiXSrXwuKh6uyrwCiJaruHBl1eYo4DduhgDBD20V8AAAAABJRU5ErkJggg%3D%3D%27%3B%0AOnScrKeyb%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJVJREFUOE9j/P//PwNFAGQAJRismSHz/H9SMLKFDAxtb/6Tg0tLS4HmgLwPNCD62H+SsELPhf8YBvz9+/f/zDNf///79w+FBlkDEgfJb7gPsQirAaS4AqcLGs78///r19//6DTIBTBx2rkAZDLIZpA/Qf4FARANshnkAmQvUj8MQCaSiuHRCEoMIA45GJyQKMkHg8MAACArvHlXxbSqAAAAAElFTkSuQmCC%27%3B%0AWinTskMngr%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJ5JREFUOE+VU9EOgCAIxPXQY7/sp/lnxpFMTEpkYzST4+AwEVFir+yUc5YYMb6LvG5ILqUsvbK1Qr0YDqKGu58AYNDacSP+xwGqzMX40+IaAImabCN/xwCGqgaMogwEAHLOHmKwkvI1g0MWQQ+jEcO1Uv5K58k6sNhZIl02F8Dr3as+DVIZyBY2rT0w+1YMg/0BmuSTGV76HHcHiWSxG7luAcTplZKTAAAAAElFTkSuQmCC%27%3B%0ASystProps%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAiRJREFUOE99kj9o21AQxl82jx67Crpo9FZDlxoyWNDBKhki8BCMBmMyBOGhuF2MmyFoKsKD0VRQh4A8GORNWQLyUFAGgzy4KEOGN3Tw0MGFDl/vnSu5TkgFH/p397vv7t0RAPHc9en7B/4pf2kckizeidSuHh3EK8BjjdYDKPnSgzv34axMGDcaxGWE2mRD4fscTo7mGQ40ixBeJwinKYIvSQmo0rPo5wQyS0gJSBYUfJMiWuasWG753b3bwFtk5CBDZexDXNUghgJG12NICXCXW7IMhOQw/g1E5MJ/70J9d6YS+gw7wGWFXJDsBqy2tetF2VeBo3swxP9BOu3AW20wWAPWZ7I9ocCPLjkQEBekJwCy6izBCQwiwGAFdO6A+jDjASrrnNytQLctGE1j78BfkNVxCKdPU1d3krUAzNu/gH4Kcd6BONOh2QZqzR4ax+b+ODxqozEHA9yXNRoaWKp/NTBxEkO8jVBpuqjbDvQTD2brH4CagzYFy7nOMJpTS/2ErYr2AOI4hHgVQGsFqJ8GXL0cYjnIb3R0MwlvnKF3nqBDUpWqb0K8IIDeitFo07fXFnrd3uEx5g8bJLc58rXkpRoNI3IQ8yIZZ8kukWBF5WIby2Pc/txCSUpJoIw30b2KCJBSNbdMLCo/AeT3OeSDhLpHc7XCIbUSw58k3OvjxAOAenEuHEoIEHyNubp6Lio/l1yuckFTEBWsjkctyf8qFzl/ABIpmnDaTkSAAAAAAElFTkSuQmCC%27%3B%0ACalculator%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAmhJREFUOE91k99PklEYx18vyrXVRbeuu278T7zK1kWtrVbO8qLwoiybM12aLEdz5mqaqUPE3JJUwAQhfwBq4i/wxwSFyECSgZZaJpaSnw5stlq+Z3v3PO+z8/2e7/d5zkkDpIM15VvjaPoRaXPrpxTf/SXF99OkldiGdOp0hnT8xDHpZEa65O1blK5kZab9ASUJkl/PgF8ECO7Bkoifkvk+hEX0/4De2S1GgjDqjye3pTCpww+SDvM8YYEaEYgyTZCrj0Ncrlwmu2SJ86WLnFHGOVsaoK3XdziBxe4nHIFO1zbZynUu1MGl55DXDPltUNAu4otNjIMppf8rsNp9+IXErsk4ReooNTZQdSd4oA1RrvmAShej0fadoemonIIFZgS5/SM0277yrCtEi2019e9cFfXpeUbcXszjXw4nMA94GJ8XzVoAs3uTFmsAy1wCozNAo2OHmO4aa9qiVE22iY4peCtUNOu9uNZBWTuKeU5Y6dhg9mYm1sIs3CkHMlOwjkF/ABRl/SgeTmAUii4qXmL0QJ3pPZpZmPJtyxMYHQlMwoLOEUHnDKOzbxHahYaeEAZnnPo3EQYnYvIEBtse3eIUtcGPTTTvVoUFVesala1Bbj8ao6h2ieGZz/IEr6y7WEUP8pVDXC8epm8Zcu5o6F2E9qFltLYYAxNr8gRa0w76GehwRDG6olRrvQgHKJvm0JhWKW+O4HDJjDF5lZv031IWnrZ5UA9CRYOHnHt91BgS3K1eILfMi2NyRV6BWty8fvGSCp+4KajyU9W5R16JhRvFr/8BHTrGZPFcbj0Fqnco7utlAX+Dk/lvcXcJCTRwbTMAAAAASUVORK5CYII%3D%27%3B%0ANetConnect%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAtxJREFUOE91k2tI01EYh8/SDxVaGpQVVAYV+CEQchRppandEMEP2WXa1Uq7MUShIk2taGWIdr86M0vn0ka1NishHTMj3RKMxtBIa00zoxxUhPH0/09mSnXghXP58Zzf+573KADhG87v3+j80Sxs/QOi5cNYERroFCF+iSL450SxKyJYMSwcOZEBclS6zZR0H+D2p7NoezTkOpJJagxj2vVjBBZ+5NKLz5JsSDsyvIsiZyl77Mu46Mqh/ruZewO1FHcdZb11PlPLNYh8N4qCZHKrn/wF8QLCayLY/HwBxzu2UtpzhcuufCo+NrHB+ppJ2gYUp7MRBQL/LBUWi2UURKj0bgJOGVj+aDZbJMheezTqtvVkt38gygT+F1skiwKRI1DsCyJibfZoQNgJB2MO2gmtnEnE/eksNc9iibmZ+QaYd+0ra27ZyHxgQK2rZsq+MOYlZYxyIeYcsiEy7IzJfcC48ykElYUwvlTJjOI+7tp60bX2Y+gc5NZLD1ctXagOXUKr1Q67EMo8CbCuHrGrFZHpkHLdjygULC5OJ++2g6qWT5idA7R+AWsf1L37xdHz+j+AvLpeRLwekWRCqBoQ22sQBwQxmiwvoOSRi6o2D/cdHkpM7ym4001S6n70+iGIkAHTUk0oosoRcdWIVbWMSw/GLzkFZcoNih52U946QL6uE31LH82ub+zIPDJcB+8zypAZqfWExOqYvOIyczdmERB1gwmRpShVRoqMbvL1XewuuInWbONZzyB36p4POfB1lQxZuLWM8J3NxO18TKJUk8gtTSiTDShX7iE2fjXR0dFoNBqqrG+50uDGZJLSHtmWMkQWhK/aRnjcJhbFJJKwNo1N6dlUGF/wtL0fa6eHe85BTta0k5CQ8Hdv+4B11lfUtn3B+AZ0dg+VNimk/3DG2EHeGZ3XUVpa2v8BZZZezjV6SD98wWvdF/KtarXa63RUDf7102SxL+9/nct7vwFQw5ZrKBhJFQAAAABJRU5ErkJggg%3D%3D%27%3B%0APowOptions%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAetJREFUOE+lk99rklEYx9e/0VU3QfdB/0JMyEaoF17JZNlg8cqsi8naClSaiBk2jOY71BbOC3/UunBBGkHEgkZu5KiGroiRWxJa6rrp03sOOHS+FNGBL5zDc57PeZ7vwzkGDP3XEoBexdQIR3X0Tu9ZN7m2W+Pzq2eUc3HUxA6j9qtaTv9D3fMAoLWdo7G/xutHyyRv3OH+1GPsdh+BQEAXIgFLiTjpdEaW3infhY9uWr6TPDkxROSUmUvjQSZdk/qARTVK6FYQj8cjAV+rT+GTn4b/NPkzx4nZgsQSL5jzRw/V54HT6SQyP4/b7ZaA2n6dTusbb9deknnwnMzDLyjKLAaDgYmJywMQ2YKAdFWv12m3D3izWSGd3SSb29U8mNLkIJFIkUplJURRFNlSn4kCsre3R6fTplR6Ty5XIhwWKrCxUWVrq0E+v8PY2Aw226g+oNlsaoFflMtVVlbe4fUWKRYrVCo/WV//QaHQYnX1Ow7H9UGAKEl4cWjYXFxzP43PG+d2KEkoVCKqftBUZXo6Kdvua6HrrghYrVZMJjMXRi7KsbqUa8zMbsv9orqkVRDDYrHoA3rHpC5EZNJy2MTw8Ljc37vp4pzxCmaz+e8AARPJQmKUC76zWEbOYzSa9D3408fRi+l68C+Q35MrucWVT9wHAAAAAElFTkSuQmCC%27%3B%0AMSPaint%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZZJREFUOE+NkjFowkAUhnVzdMxYoYubdhM6uTWbgQ7tJodDkQwiTuIimUJwEHEKHYRkKMShoFtcCnYoOGY8x4zt1m5/711MjEZbDw6O4973vvfe5QHkaG21G/xcfclzecTz8nDJIgBt3qjCuysi6JTAWkxcRffpbZh+5j55sNAZ7EoR9m11D/jIwerVkiACsJZzADnI0O9N0NYtqPfd6FEKQMHWLABr2OcBk7kPzQwSwKfLEgMC+FM7U96BAQEexxxqx5NZ/FFhX0JTkeV5D/uS5ADSTXLcANpgA2MsNIW+NyrDWoUIXQuo5CSAdjomY1A3F5HmDtCdcYS6hvBaAHoWqE9nAcbrGvWXMpRmAYEbTYB6QiMmCDX4X4D97oDNGPiyhoVQ91ZrcFPF91ycXR/d4R8GpEYW6lQTHS9hLUCBCISuINxupMHx58r+th3AGRbRf27L7KRPEzrOnpmCNHA30sB4UqQBBiXZPAq+CEAQ6oFm1iOA0D9Ve1xKpgRpsTRAvfDfuPx9VPup7CdLiMmx8jn1+N0vr+ulS/dQUwwAAAAASUVORK5CYII%3D%27%3B%0A%0A%0Avar%20directoryService%20%3D%20Components.classes%5B%27@mozilla.org/file/directory_service%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%3B%0Avar%20profileFolder%20%3D%20directoryService.get%28%27ProfD%27%2C%20Components.interfaces.nsIFile%29%3B%0Avar%20profilePath%20%3D%20profileFolder.QueryInterface%28Components.interfaces.nsILocalFile%29.path%3B%0A%20%20%20%20profilePath%20%3D%20profilePath.replace%28/%5C%5C/g%2C%27/%27%29%3B%0A%20%20%20%20CurrentPage%20%3D%20getBrowser%20%28%29.%20contentDocument.%20location.%20href%3B%0A%0A//%20------%20Menu%20Items%20------%0Aapps.push%28%5B%27Run%20in%20IE%27%2C%20%20%20IExplorer%2C%20%27C%3A/Program%20Files/Internet%20Explorer/IEXPLORE.EXE%27%2C%20CurrentPage%5D%29%3B%0Aapps.push%28%5B%27Run%20in%20Google%20Chrome%27%2C%20%20%20%20%20%20%20%20Gchrome%2C%20%20%27C%3A/Documents%20and%20Settings/Admin/Local%20Settings/Application%20Data/Google/Chrome/Application/chrome.exe%27%2C%20CurrentPage%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27Open%20Drive%20C%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27C%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20D%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27D%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Profile%20Folder%27%2C%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20profilePath%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27Notepad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSNotepad%2C%20%27C%3A/WINDOWS/notepad.exe%27%5D%29%3B%0Aapps.push%28%5B%27Notepad++%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20NotepadPP%2C%20%27F%3A/Run/Textutils/notepad++/notepad++.exe%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Control%20Panel%27%2C%20%20%20%20%20%20%20CtrlPanel%2C%20%27C%3A/WINDOWS/system32/control.exe%27%5D%29%3B%0Aapps.push%28%5B%27Add/Remove%20Programs%27%2C%20AddRemove%2C%20%27C%3A/WINDOWS/system32/control.exe%27%2C%20%27C%3A/WINDOWS/system32/Appwiz.cpl%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Magnifier%27%2C%20%20%20%20%20%20%20%20%20%20%20Magnifier%2C%20%27C%3A/WINDOWS/system32/magnify.exe%27%5D%29%3B%0Aapps.push%28%5B%27On-Screen%20Keyboard%27%2C%20%20OnScrKeyb%2C%20%27C%3A/WINDOWS/system32/osk.exe%27%5D%29%3B%0Aapps.push%28%5B%27Task%20Manager%27%2C%20%20%20%20%20%20%20%20WinTskMngr%2C%27C%3A/WINDOWS/system32/taskmgr.exe%27%5D%29%3B%0Aapps.push%28%5B%27Calculator%27%2C%20%20%20%20%20%20%20%20%20%20Calculator%2C%27C%3A/WINDOWS/system32/calc.exe%27%5D%29%3B%0Aapps.push%28%5B%27Paint%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MSPaint%2C%20%20%20%27C%3A/WINDOWS/system32/mspaint.exe%27%5D%29%0Aapps.push%28%5B%27Command%20Prompt%27%2C%20%20%20%20%20%20CmdPrompt%2C%20%27C%3A/WINDOWS/system32/cmd.exe%27%5D%29%3B%0A//%20------------------------%0A%0A%0Avar%20nMItem%20%3D%20function%28label%2Cimg%2Cpath%2Cargs%2Cobj%29%20%7B%0A%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27path%27%2Cpath%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%20%3D%20obj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27event.stopPropagation%28%29%3Bthis.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%2Cthis%29%27%29%3B%0A%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20if%20%28%21img%29%20img%20%3D%20Default%3B%0A%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20m.tooltipText%20%3D%20label%3B%0A%20%20return%20m%3B%0A%7D%0A%0Athis.startProcess%20%3D%20function%28path%2Cargs%2Cmi%29%20%7B%0A%20%20this.currentCommand%3Dmi%3B%0A%20%20this.image%3Dmi.getAttribute%28%22image%22%29%3B%0A%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20var%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIProcess%29%3B%0A%20%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%0A%20%20args%20%3D%20args.replace%28/%5C//g%2C%27%5C%5C%27%29%3B%0A%20%20if%20%28args%3D%3D%27%27%29%20%7B%20file.launch%28%29%3B%20return%3B%20%7D%20%0A%20%20process.init%28file%29%3B%0A%20%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%20%3D%20document.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3B%20i%3Capps.length%3B%20i++%29%20%7B%0A%20%20if%20%28apps%5Bi%5D%20%3D%3D%20%27separator%27%29%20%7B%0A%20%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%20%28%21apps%5Bi%5D%20%5B3%5D%29%20apps%5Bi%5D%20%5B3%5D%3D%27%27%3B%0A%20%20%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2C%20apps%5Bi%5D%20%5B1%5D%2C%20apps%5Bi%5D%20%5B2%5D%2C%20apps%5Bi%5D%20%5B3%5D%2C%20this%29%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0Athis.orient%20%3D%20%22horizontal%22%3B%0Athis.image%3DmP.firstChild.getAttribute%20%28%22image%22%29%3B%0Athis.currentCommand%3DmP.firstChild%3B%0A%0AmP.%20firstChild.%20setAttribute%20%28%22oncommand%22%2C%20%27event.stopPropagation%28%29%3Bthis.f%28this.getAttribute%28%22path%22%29%2CgetBrowser%28%29.contentDocument.location.href%2Cthis%29%3B%27%29%3B%0AmP.%20firstChild.%20nextSibling.%20setAttribute%20%28%22oncommand%22%2C%20%27event.stopPropagation%28%29%3Bthis.f%28this.getAttribute%28%22path%22%29%2CgetBrowser%28%29.contentDocument.location.href%2Cthis%29%3B%27%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Athis.currentCommand.doCommand%28%29%0A%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

ps

vurdalak написал:

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

нп, не бери в голову

Anton написал:

Я не знаю. Если честно, я и свои не все помню (но эту точно не писал).

Твои как раз видно по характерным пробелам. =)

vurdalak написал:

Ничего себе, не ожидал :/

Ну, там структура не предусматривает передачу динамических параметров.

ПОМОГИТЕ МНЕ СОЗДАТЬ КНОПКУ ПЕРЕВЕСТИ :whistle:

Kemerover написал:

ПОМОГИТЕ МНЕ СОЗДАТЬ КНОПКУ ПЕРЕВЕСТИ

Такая кнопка уже есть.

Код:

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%u041F%u0435%u0440%u0435%u0432%u043E%u0434%u0447%u0438%u043A%20Google%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADPElEQVR4nGWTTWhjZRSG3/uTNr39mTqTn1KacagTqyKIlYJ2ExQCUhiprgpduRVFpLvZjOCsXEgWFqRk0RZcWLopmOnCQcPUsVBiTEZbalrGTJOZJm2aNGm++92b737fcdGZTfvAuznwnMV7OBouEI/HdSHEyNzcXCwajb7r8/n6T09P99bW1u4PDw8/SiQSbHd396IGBINBJJPJQDqdvssYK0kpO0SkiIiUUlII0SqVSr8lk8n3JycnjUsLZmdnb5bL5T+klPK5RNzp0BlzyHEFKXU+cxynubKy8tXExIQJABoAzM/PB6amptYikch70DRtv3iMh5kClPQglcKzozMMXhnAh7E3EL0RhCcEX19f/6xSqSxhdHRUT6VS39i2LYUQtJ7epm9/uEdHtSZJKUkpRa0zm75fvE+f3/mRmM3JcRyqVqulmZmZl7G6uhopl8sHtm3TduEpffH1T1Srn9FFavUmnTRaJKUkx3Go0WiojY2N22aj0Yj5fL6wJyVS6R289koYVwd7L3V07aUBAICUEkopSCk1v99/Sw+Hw5NSyi7OXZQrTQwFBy6f6DlKKSil4HkeOp0ODMO4btq23S+EgFQaAAKzO1BKQdd1AICmaSAiEBGUlBBCwHVduK4LzrlpHh4e7nHOVW+vofdbPmxkHuPWB6/D6vFD13UoRfj38TPsP6mBOxJjN64gdNUC5xz1er2l5/P5XxqNBvNEByPBLmS2n+LXzQK4zcH5ebp9GkAeEksPwJgNxhhs20axWMzo7Xb7US6Xyx7Xanh7LIhXRywklh7i9z/30Wy1YNsMfT0mrG4DGoCO64Ixhlqt5uTz+UVjZ2dHDA0NFYPB4Cd9fVb3W2MhnDZb+DldwD+FCk5OWvivVEX27ycY7APevHkNouNSNpu9l8vlvtMAIBQKGfF4/Mvp6em7oVCoxzAMOB0PjAsQEfxdPvi7DBgG4Dgu5fP5vxYWFj4uFAoHBgAwxmhvby8jpTywLOsdy7IGfKah9XSb56IOeJ7A0dGxs7m5mVpeXv60Xq8fcM7Pf+EFsVhMq1Qq18fHx2ej0ehHgUAgYpqm2W63W6VSKVMsFhe3trYeVKtV/sL5HwhICaDODiyAAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bif%20%28%21window.%20cbTranslateButton2%29%0A%7B%0A%09getBrowser%20%28%29.%20addEventListener%0A%09%28%0A%09%09%22mouseup%22%2C%0A%09%09function%20%28event%29%0A%09%09%7B%0A%09%09%09if%20%28event.%20button%20%21%3D%200%29%0A%09%09%09%09return%3B%0A%09%09%09getBrowser%20%28%29.%20contentDocument.%20defaultView.%20cbTranslateButton2X%20%3D%20event.%20clientX%3B%0A%09%09%09getBrowser%20%28%29.%20contentDocument.%20defaultView.%20cbTranslateButton2Y%20%3D%20event.%20clientY%3B%0A%09%09%7D%2C%0A%09%09false%0A%09%29%3B%0A%09window.%20cbTranslateButton2%20%3D%20true%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%09original%20script%20is%20operajs%20Google-Translate%20v%201.6.12%0A%09opera%20ujs%20is%20http%3A//lexi.ucoz.ru/google-translate.js%0A%09original%20author%3A%20Lex1%0A%09modified%20by%20Anton%0A*/%0A%0Aconst%20UJS_TOOLBAR_ID%20%3D%20%22ujs_toolbar%22%3B%0Aconst%20UJS_GOOGLE_TRANSLATE_FRAME_ID%20%3D%20%22ujs_googletranslateframe%22%3B%0A%0Afunction%20cbTranslatorButton%20%28browser%29%0A%7B%0A%09this.%20doc%20%3D%20browser.%20contentDocument%3B%0A%09this.%20win%20%3D%20browser.%20contentDocument.%20defaultView%3B%0A%7D%0AcbTranslatorButton.%20prototype%20%3D%0A%7B%0A%09doc%3A%20null%2C%0A%09win%3A%20null%2C%0A%09toolbar%3A%20null%2C%0A%09clse%3A%20null%2C%0A%09frame%3A%20null%2C%0A%09%0A%09grabX%3A%200%2C%0A%09origX%3A%200%2C%0A%09grabY%3A%200%2C%0A%09origY%3A%200%2C%0A%09%0A%09handleEvent%3A%20function%20%28event%29%0A%09%7B%0A%09%09switch%20%28event.%20type%29%0A%09%09%7B%0A%09%09%09case%20%22mousedown%22%3A%0A%09%09%09%09this.%20tbOnMouseDown%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22mousemove%22%3A%0A%09%09%09%09this.%20tbOnMouseMove%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22mouseup%22%3A%0A%09%09%09%09this.%20tbOnMouseUp%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22click%22%3A%0A%09%09%09%09this.%20clseOnClick%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09case%20%22load%22%3A%0A%09%09%09%09this.%20frameOnLoad%20%28event%29%3B%0A%09%09%09%09break%3B%0A%09%09%09default%3A%3B%0A%09%09%7D%0A%09%7D%2C%0A%09%0A%09tbOnMouseMove%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20toolbar.%20style.%20left%20%3D%20this.%20origX%20+%20event.%20clientX%20-%20this.%20grabX%20+%20%27px%27%3B%0A%09%09this.%20toolbar.%20style.%20top%20%3D%20this.%20origY%20+%20event.%20clientY%20-%20this.%20grabY%20+%20%27px%27%3B%0A%09%7D%2C%0A%09%0A%09tbOnMouseUp%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20doc.%20removeEventListener%20%28%27mousemove%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.%20toolbar.%20style.%20zIndex%20%3D%209997%3B%0A%09%7D%2C%0A%09%0A%09tbOnMouseDown%3A%20function%20%28event%29%0A%09%7B%0A%09%09if%20%28event.%20target%20%3D%3D%20this.%20toolbar%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20event.%20preventDefault%20%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20toolbar.%20style.%20zIndex%20%3D%209998%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20grabX%20%3D%20event.%20clientX%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20grabY%20%3D%20event.%20clientY%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20origX%20%3D%20parseInt%20%28this.%20toolbar.%20style.%20left%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20origY%20%3D%20parseInt%20%28this.%20toolbar.%20style.%20top%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20doc.%20addEventListener%20%28%27mousemove%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.%20doc.%20addEventListener%20%28%27mouseup%27%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%09%7D%2C%0A%09%0A%09removeEventListener%3A%20function%20%28element%2C%20eventType%2C%20captureFlag%29%0A%09%7B%0A%09%09try%0A%09%09%7B%0A%09%09%09element.%20removeEventListener%20%28eventType%2C%20this%2C%20captureFlag%29%3B%0A%09%09%7D%0A%09%09catch%20%28err%29%20%7B%7D%0A%09%7D%2C%0A%09%0A%09removeElement%3A%20function%20%28element%29%0A%09%7B%0A%09%09try%0A%09%09%7B%0A%09%09%09element.%20parentNode.%20removeChild%20%28element%29%3B%0A%09%09%7D%0A%09%09catch%20%28err%29%20%7B%7D%0A%09%7D%2C%0A%09%0A%09clseOnClick%3A%20function%20%28event%29%0A%09%7B%0A%09%09this.%20clse.%20removeEventListener%20%28%27click%27%2C%20this%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20toolbar%2C%20%27mousedown%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20doc%2C%20%27mousemove%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20doc%2C%20%27mouseup%27%2C%20false%29%3B%0A%09%09this.%20removeEventListener%20%28this.%20frame%2C%20%27load%27%2C%20false%29%3B%0A%09%09this.%20removeElement%20%28this.%20toolbar%29%3B%0A%09%09this.%20removeElement%20%28this.%20frame%29%3B%0A%09%09this.%20frame%20%3D%20null%3B%0A%09%09this.%20clse%20%3D%20null%3B%0A%09%09this.%20toolbar%20%3D%20null%3B%0A%09%09this.%20win%20%3D%20null%3B%0A%09%09this.%20doc%20%3D%20null%3B%0A%09%7D%2C%0A%09%0A%09ujs_createWindow%3A%20function%20%28txt%29%0A%09%7B%0A%09%09var%20doc%20%3D%20this.%20doc%3B%0A%09%09var%20win%20%3D%20this.%20win%3B%0A%09%09var%20h%2C%20w%3B%0A%09%20%20%20%20var%20txtLen%20%3D%20txt.%20length%3B%0A%09%20%20%20%20var%20tbId%20%3D%20UJS_TOOLBAR_ID%3B%0A%09%20%20%20%20if%20%28arguments.%20length%20%3E%202%29%0A%09%20%20%20%20%20%20%20%20tbId%20+%3D%20arguments%20%5B2%5D%3B%0A%09%09var%20toolbar%20%3D%20doc.%20getElementById%20%28tbId%29%3B%0A%09%20%20%20%20if%20%28toolbar%29%0A%09%20%20%20%20%20%20%20%20toolbar.%20parentNode.%20removeChild%20%28toolbar%29%3B%0A%09%20%20%20%20toolbar%20%3D%20doc.%20createElement%20%28%27div%27%29%3B%0A%09%20%20%20%20this.%20toolbar%20%3D%20toolbar%3B%0A%09%20%20%20%20toolbar.%20id%20%3D%20tbId%3B%0A%09%09if%20%28arguments.%20length%20%3D%3D%205%29%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20w%20%3D%20arguments%20%5B3%5D%3B%0A%09%20%20%20%20%20%20%20%20h%20%3D%20arguments%20%5B4%5D%0A%09%20%20%20%20%7D%0A%09%20%20%20%20else%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20h%20%3D%2015%3B%0A%09%20%20%20%20%20%20%20%20w%20%3D%2020%3B%0A%09%20%20%20%20%20%20%20%20if%20%28txtLen%20%3E%202000%29%0A%09%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2050%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2066%0A%09%20%20%20%20%20%20%20%20%7D%0A%09%20%20%20%20%20%20%20%20else%20if%20%28txtLen%20%3E%20250%29%0A%09%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%2025%3B%0A%09%20%20%20%20%20%20%20%20%20%20%20%20w%20%3D%2033%0A%09%20%20%20%20%20%20%20%20%7D%3B%0A%09%20%20%20%20%20%20%20%20h%20%3D%20parseInt%20%28h%20*%20win.%20innerHeight%20/%2030%29%3B%0A%09%20%20%20%20%20%20%20%20w%20%3D%20parseInt%20%28w%20*%20win.%20innerWidth%20/%2050%29%0A%09%20%20%20%20%7D%3B%0A%09%09var%20title%20%3D%20%28arguments.%20length%20%3E%201%29%20%3Farguments%20%5B1%5D%3A%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%3B%0A%09%09toolbar.%20innerHTML%20%3D%20%27%3Cimg%20src%3D%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAStJREFUOE+1k9tqhDAQhtOHqO37P4E3IlQFQQSvBBVEl1TBVVi1B+1C8XAx3QmNqIVqhBV+DEPmy8z8ycPX9Ruq6kLqqiRHvkfpiUjSMyGUJtB1HfR9D8MwCAlz6voNkEGCIGDJeZ5DURTCatoWNE0D4nk+jOMoDMBD8fDPpoGXu4OyLAPUutV1/N+KcPPNPaY4jidYktwG+hunlLL4ZmsI4EloxhxiGAY4jgNpmm6D8DQEcBj/I8SyrKnSzYr4bDzPm2CKoiwgu1rDTfN2eEWu6y4M2KxoPRNVVRcz4xXvdm0+k/nMwjDc5xraa9v2n5kgwDRNMdfQXtT6Us7jy9Z8n738Iw82O5/hUpag6zqQ0+kVmqZld0NUURSxl48M8v5xZQtZlg8Jc5HxA5fIE73hTda3AAAAAElFTkSuQmCC%22%20title%3D%22Close%22%20width%3D%2218%22%20height%3D%2218%22%3E%26nbsp%3B%27%20+%20title%20+%20%27%3Cdiv%3E%3C/div%3E%27%3B%0A%09%09toolbar.%20setAttribute%28%27style%27%2C%20%27position%3Afixed%3Bbackground%3Awhite%3Bdisplay%3Ablock%3Bvisibility%3Ahidden%3Bleft%3A0%3Btop%3A0%3Bheight%3Aauto%3Bwidth%3A%27%20+%20w%20+%20%27px%3Bfont%3A16px%20Times%20New%20Roman%3Bborder%3A1px%20solid%20gray%3Bpadding%3A3px%3Bz-index%3A9997%3Boverflow%3Avisible%3Bcursor%3Amove%3B%27%29%3B%0A%09%09toolbar.%20addEventListener%20%28%27mousedown%27%2C%20this%2C%20false%29%3B%0A%09%09var%20clse%20%3D%20toolbar.%20firstChild%3B%0A%09%09this.%20clse%20%3D%20clse%3B%0A%09%20%20%20%20clse.%20setAttribute%20%28%27style%27%2C%20%27float%3Aright%3Bbackground%3Awhite%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3Anone%3Bcursor%3Apointer%3B%27%29%3B%0A%09%09clse.%20addEventListener%20%28%27click%27%2C%20this%2C%20false%29%3B%0A%09%09var%20textbar%20%3D%20toolbar.%20lastChild%3B%0A%09%20%20%20%20textbar.%20innerHTML%20%3D%20txt%3B%0A%09%09textbar.%20setAttribute%20%28%27style%27%2C%20%27display%3Ablock%3Bborder%3A1px%20solid%20%23aaaaaa%3Bmargin%3A2px%200%200%200%3Bpadding%3A4px%3Bbackground-color%3A%23fafcfe%3Bfont%3A14px%20Times%20New%20Roman%3Bheight%3A%27%20+%20h%20+%20%27px%3Bwidth%3Aauto%3Boverflow%3Aauto%3Bcursor%3Atext%3B%27%29%3B%0A%09%09doc.%20documentElement.%20appendChild%20%28toolbar%29%3B%0A%09%09var%20halfWidth%20%3D%20parseInt%20%28toolbar.%20offsetWidth%20/%202%29%3B%0A%09%09var%20strict%20%3D%20doc.%20compatMode%20%3D%3D%20%27CSS1Compat%27%3B%0A%09%09var%20mX%20%3D%20%28strict%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientWidth%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientWidth%29%20-%20toolbar.%20offsetWidth%3B%0A%09%09var%20mY%20%3D%20%28strict%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20documentElement.%20clientHeight%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20doc.%20body.%20clientHeight%29%20-%20toolbar.%20offsetHeight%3B%0A%09%20%20%20%20var%20lastClickX%20%3D%20win.%20cbTranslateButton2X%3B%0A%09%20%20%20%20var%20lastClickY%20%3D%20win.%20cbTranslateButton2Y%3B%0A%09%09toolbar.%20style.%20left%20%3D%20%28%28lastClickX%20%3C%20mX%20+%20halfWidth%29%3F%0A%09%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%28lastClickX%20%3E%20halfWidth%3F%0A%09%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%28lastClickX%20-%20halfWidth%29%3A%0A%09%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%200%29%3A%0A%09%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%20mX%29%20+%20%22px%22%3B%0A%09%09toolbar.%20style.%20top%20%3D%20%28%28lastClickY%20%3C%20mY%29%3F%0A%09%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%20lastClickY%3A%0A%09%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%20mY%29%20+%20%22px%22%3B%0A%09%09toolbar.%20style.%20visibility%20%3D%20%27visible%27%3B%0A%09%20%20%20%20return%20textbar%3B%0A%09%7D%2C%0A%09%0A%09frameOnLoad%3A%20function%20%28event%29%0A%09%7B%0A%09%09var%20fr%20%3D%20event.%20currentTarget%3B%0A%09%09fr.%20removeEventListener%20%28%27load%27%2C%20this%2C%20false%29%3B%0A%09%09var%20tbId%20%3D%20fr.%20id.%20substring%20%28UJS_GOOGLE_TRANSLATE_FRAME_ID.%20length%29%3B%0A%09%09var%20toolbar%20%3D%20this.%20doc.%20getElementById%20%28UJS_TOOLBAR_ID%20+%20tbId%29%3B%0A%09%09var%20frdoc%20%3D%20fr.%20contentDocument%3B%0A%09%09var%20a%20%3D%20frdoc.%20getElementById%20%28%27autotrans%27%29%3B%0A%09%09var%20title%20%3D%20%28a%20%26%26%20%21/%23808080/.%20test%20%28a.%20innerHTML%29%29%3F%0A%09%09%09%09%09%09%27%26nbsp%3B-%26nbsp%3B%27%20+%20a.%20textContent.%20replace%20%28/%5E.+%3A%20%7C%20%5B%28%5CxBB%5D.+%24/g%2C%20%27%27%29%3A%0A%09%09%09%09%09%09%27%27%3B%0A%09%09var%20result%20%3D%20frdoc.%20getElementById%20%28%27result_box%27%29.%20innerHTML%3B%0A%09%09var%20ancor%20%3D%20toolbar.%20getElementsByTagName%20%28%22a%22%29%20%5B0%5D%3B%0A%09%09ancor.%20innerHTML%20+%3D%20title%3B%0A%09%09ancor.%20nextSibling.%20innerHTML%20%3D%20result%3B%0A%09%09setTimeout%0A%09%09%28%0A%09%09%09function%20%28%29%0A%09%09%09%7B%0A%09%09%09%09fr.%20parentNode.%20removeChild%20%28fr%29%3B%0A%09%09%09%7D%2C%0A%09%09%090%0A%09%09%29%3B%0A%09%7D%2C%0A%09%0A%09google_translate%3A%20function%20%28language%29%0A%09%7B%0A%09%09var%20doc%20%3D%20this.%20doc%3B%0A%09%09var%20win%20%3D%20this.%20win%3B%0A%09%09var%20t%20%3D%20document.%20commandDispatcher.%20focusedWindow.%20getSelection%20%28%29.%20toString%20%28%29%3B%0A%09%09var%20lng%20%3D%20%28win.%20navigator.%20language%20%3D%3D%20%27ru%27%29%3F%20%27ru%27%3A%20%27en%27%3B%0A%09%20%20%20%20if%20%28t%20%26%26%20location.%20hostname%20%21%3D%20%27translate.google.com%27%29%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%20%20%20%20this.%20ujs_createWindow%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%28lng%20%3D%3D%20%27ru%27%3F%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu041F%5Cu0435%5Cu0440%5Cu0435%5Cu0432%5Cu043E%5Cu0434%5Cu0438%5Cu043C%27%3A%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27Translating%27%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%5Cu2026%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%3Ca%20href%3D%22http%3A//translate.google.com/%22%20target%3D%22_blank%22%20style%3D%22text-decoration%3Anone%3Bcolor%3A%23000099%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20btoa%20%28escape%20%28t%29%29%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%09var%20gtfId%20%3D%20UJS_GOOGLE_TRANSLATE_FRAME_ID%3B%0A%09%09%09var%20fr%20%3D%20doc.%20getElementById%20%28gtfId%29%3B%0A%09%20%20%20%20%20%20%20%20if%20%28%21fr%29%0A%09%20%20%20%20%20%20%20%20%20%20%20%20fr%20%3D%20doc.%20createElement%20%28%27iframe%27%29%3B%0A%09%20%20%20%20%20%20%20%20this.%20frame%20%3D%20fr%3B%0A%09%09%09fr.%20setAttribute%20%28%27id%27%2C%20gtfId%20+%20btoa%20%28escape%20%28t%29%29%29%3B%0A%09%20%20%20%20%20%20%20%20fr.%20setAttribute%20%28%27frameborder%27%2C%20%270%27%29%3B%0A%09%09%09fr.%20setAttribute%20%28%27style%27%2C%20%27width%3A0px%3Bheight%3A0px%3Bvisibility%3Ahidden%3Bposition%3Aabsolute%3Bleft%3A-999em%3B%27%29%3B%0A%09%09%09fr.%20setAttribute%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27src%27%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate_t%3Ftext%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20encodeURIComponent%20%28t%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%26ujs%3Dgtt%27%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%09fr.%20addEventListener%20%28%27load%27%2C%20this%2C%20false%29%3B%0A%09%20%20%20%20%20%20%20%20doc.%20documentElement.%20appendChild%20%28fr%29%3B%0A%09%20%20%20%20%7D%0A%09%20%20%20%20else%0A%09%20%20%20%20%7B%0A%09%20%20%20%20%09getBrowser%20%28%29.%20addTab%0A%09%20%20%20%20%20%20%20%20%28%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27http%3A//translate.google.com/translate%3Fu%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20escape%20%28doc.%20location.%20href%29%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26hl%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20lng%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26langpair%3D%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20language%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%27%26tbb%3D1%27%20+%0A%09%20%20%20%20%20%20%20%20%20%20%20%20%28doc.%20charset%3F%20%27%26ie%3D%27%20+%20doc.%20charset%3A%20%27%27%29%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20null%2C%0A%09%20%20%20%20%20%20%20%20%20%20%20%20null%0A%09%20%20%20%20%20%20%20%20%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%3B%0A%0Avar%20ct%20%3D%20getBrowser%20%28%29.%20selectedTab%3B%0Aif%20%28%21ct.%20cbTranslateButton5%29%0A%09ct.%20cbTranslateButton5%20%3D%20%5B%5D%3B%0Avar%20translator%20%3D%20new%20cbTranslatorButton%20%28getBrowser%20%28%29%29%3B%0Act.%20cbTranslateButton5.%20push%20%28translator%29%3B%0Atranslator.%20google_translate%20%28%22auto%7Cru%22%29%3B%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

Есть расширение
https://addons.mozilla.org/ru/firefox/addon/10127

Как вызвать панель с сайтами через кнопку Custom Button (по умолчанию назначен key "Ctrl+Space")  ?
Помогите, а то мои попытки увенчались неуспехом...

vurdalak

Код:

loadURI ("chrome://sitelauncher/content/home.html");

либо так (+средний клик для новой вкладки):

Код:

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%3ESiteLauncher%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-1%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*/%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.url2xul%3D%20%27chrome%3A//sitelauncher/content/home.html%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%09loadURI%28this.url2xul%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B%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

Это немного не то , чего бы хотелось. Об chrome://sitelauncher/content/home.html я знал.
Проблема в том , что оно вызывает панель сайтов вместе с фиктивным home.html и URL вкладки заменяется им. Смысл такой, что javascript расширения следит за открытием chrome://sitelauncher/content/home.html и после этого выполняется команда отображения панели сайтов, ну и также после нажатия Ctrl-Space . Вот эту то команду, я не смог найти, когда ковырялся в расширении (автор там зашифровал все что мог наверное :) ). Вся надежда на местных гуру.
Средний клик тоже не устраивает, к тому же у меня Firefox после этого че-то вываливался.
Должен быть другой способ, такой же , какой используется в расширении без применения home.html .

vurdalak написал:

Как вызвать панель с сайтами через кнопку Custom Button (по умолчанию назначен key "Ctrl+Space")  ?

Как-то так:

Код:

var evt = document.createEvent("KeyEvents");
evt.initKeyEvent(
    "keydown", true, true, window, 
    true /*ctrlKey*/, false /*altKey*/, false /*shiftKey*/, false /*metaKey*/,
    evt.DOM_VK_SPACE /*keyCode*/, 0 /*charCode*/
);
document.documentElement.dispatchEvent(evt);

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

Infocatcher
Спасибо
Это конечно вариант, но хотелось бы по правильному, не через кейивенты а как бы изнутри.
Пытаюсь просто вникнуть в принцип работы расширения, так как пытаюсь мутить че-то свое на его основе.
P.S. Панель сайтов - это элемент Popup как я понял ?

vurdalak написал:

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

Публикация кода "как бы изнутри" нарушает требование, изложенное в copyright.txt расширения.

Блин, так это ж для самоизучения.
А если в PM ?

А для самообучения пригодится http://jsbeautifier.org/.

Кнопка для удаления истории текущей вкладки (ЛКМ) или истории всех вкладок (СКМ, Ctrl+ЛКМ)
Т.е. очищается список страниц для переходов вперед/назад.

Код для секции «инициализация»:

Код:

// Purge Tab(s) History
// (c) Infocatcher 2009
// version 0.2.0 - 2009-12-13

const uid = "__custombutton__" + this.id;
if(uid in window)
    window[uid]("rebuild");

var destroy = window[uid] = function _ds(reason) {
    var hnd = _ds.evtHandler;
    window.removeEventListener("unload",   hnd, false);
    window.removeEventListener("TabOpen",  hnd, false);
    window.removeEventListener("TabClose", hnd, false);
    gBrowser.removeProgressListener(hnd.progressListener);
    _ds.evtHandler = null;
    //alert(reason + " => destroy()");
};

this.updUI = function() {
    UpdateBackForwardCommands(gBrowser.webNavigation);
};
this.updButtonState = function() {
    this.setAttribute(
        "disabled",
        !gBrowser.browsers.some(
            function(br) {
                return br.sessionHistory && br.sessionHistory.count > 1;
            }
        )
    );
};
this.forceSaveSession = function() {
    const dummyVal = "custombuttonsDummyValue-" + Math.random();
    // Firefox or SeaMonkey
    var ss = (
        Components.classes["@mozilla.org/browser/sessionstore;1"]
        || Components.classes["@mozilla.org/suite/sessionstore;1"]
    ).getService(Components.interfaces.nsISessionStore);
    setTimeout(function(ss, val) {
        ss.setWindowValue(window, val, "0");
        ss.deleteWindowValue(window, val);
    }, 0, ss, dummyVal);
};
this.upd = function() {
    this.updUI();
    this.updButtonState();
    this.forceSaveSession();
};
this.purgeBrowserHistory = function(br, updFlag) {
    var sh = br.sessionHistory
        .QueryInterface(Components.interfaces.nsISHistoryInternal);
    if(sh.count == 0)
        return;
    var indx = sh.index;
    var cur = indx > -1 ? sh.getEntryAtIndex(indx, false) : null;
    sh.PurgeHistory(sh.count);
    cur && sh.addEntry(cur, true);
    if(updFlag === true)
        this.upd();
};
this.purgeBrowsersHistory = function() {
    gBrowser.browsers.forEach(this.purgeBrowserHistory, this);
    this.upd();
};

var dummy = function() {};
var progressListener = {
    button: this,
    QueryInterface: function(iid) {
        if(
            iid.equals(Components.interfaces.nsIWebProgressListener)
            || iid.equals(Components.interfaces.nsISupportsWeakReference)
            || iid.equals(Components.interfaces.nsISupports)
        )
            return this;
        throw Components.results.NS_NOINTERFACE;
    },
    onStateChange: dummy,
    onProgressChange: dummy,
    onLocationChange: function(aWebProgress, aRequest, aLocation) {
        this.button.updButtonState();
    },
    onStatusChange: dummy,
    onSecurityChange: dummy
};

var hnd = destroy.evtHandler = {
    button: this,
    progressListener: progressListener,
    destroy: destroy,
    handleEvent: function(e) {
        switch(e.type) {
            case "TabOpen":
            case "TabClose":
                setTimeout(function(button) {
                    button.updButtonState();
                }, 5, this.button);
            break;
            case "unload":
                this.destroy(e.type);
        }
    }
};

window.addEventListener("TabOpen",  hnd, false);
window.addEventListener("TabClose", hnd, false);
window.addEventListener("unload",   hnd, false);
gBrowser.addProgressListener(progressListener, Components.interfaces.nsIWebProgress.NOTIFY_LOCATION);

this.updButtonState();

this.onclick = function(e) {
    if(e.button == 1 || e.button == 0 && e.ctrlKey)
        this.purgeBrowsersHistory();
    else if(e.button == 0)
        this.purgeBrowserHistory(gBrowser.mCurrentBrowser, true);
};

Такой вопрос: можно ли с помощью кнопки реализовать подобную функцию?

А можете сделать кнопку для отчистки кэша в дополнении Textarea cache. а то задолбало каждый раз окно открывать =(

MySh

Такой вопрос: можно ли с помощью кнопки реализовать подобную функцию?

Можно, другой вопрос - кто бы справился с Selection и Range : )

Вот для одинарного выделения, вроде работает:

Код:

var doc = gBrowser. contentDocument;
var win = document. commandDispatcher. focusedWindow;
var sel = win. getSelection (). QueryInterface (Components. interfaces. nsISelectionPrivate);
var range = sel. getRangeAt (0). cloneRange ();
sel. startBatchChanges ();
sel. removeAllRanges ();
var r = doc. createRange ();
sel. addRange (r);
r. selectNodeContents (doc. body);
r. setEnd (range. startContainer, range. startOffset);
r = doc. createRange ();
sel. addRange (r);
r. selectNodeContents (doc. body);
r. setStart (range. endContainer, range. endOffset);
sel. endBatchChanges ();
//win. blur ();
//win. focus ();

Инвертирует одинарное выделение, правда, по самому выделению после выполнения операции этого не видно (синим окрашено как попало), но если скопировать и посмотреть во внешнем редакторе, то, вроде бы выделенное не копируется.

20-08-2009 17:51:37
Najlus
Вот команда для открытия диалога Textarea Cache:

Код:

window.openDialog ("chrome://tacache/content/cacheWindow.xul");

20-08-2009 17:54:05
ps:

Код:

gPref.clearUserPref("extensions.tacache.cache");

а это, вроде, очищает кэш

Anton написал:

Вот команда для открытия диалога Textarea Cache:

Это и стандартная кнопка дополнения умеет =(

Anton написал:

ps:
а это, вроде, очищает кэш

Не работает =(

Najlus
Попробуй добавить первой строкой перед "gPref.clearUserPref"

Код:

var gPref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);

Спасибо =) это работает =)
Единственный минус: в статусбаре всёравно продолжает гореть иконка данного дополнения.

Najlus
Добавь в конце

Код:

window. focus ();

Anton
Спасибо, буду пробовать :)

Интересно оно работает — текст инвертируется, но только в пределах одной строчки. Причём к ссылкам это не относится (они работают отдельно). Не совсем то, что мне хотелось, но для начала тоже неплохо! :)
Занятно, каким макаром захват выделения работает в Scrapbook — тот захватывает не только текст, но и все сопутствующие части страницы. Вот если бы ему как-то объяснить, что как раз их-то захватывать не надо… А возможно ли, условно говоря, перебрать все элементы страницы и узнать, выделены они или нет? Или так оно не сработает?

MySh

текст инвертируется, но только в пределах одной строчки

Выделение инвертируется полностью, только этого не видно. Предлагаю для проверки выделить кусок текста на этой странице, выполнить код кнопки, "Правка" -> "Копировать", и вставить куда-нибудь в OO Writer - там будет видно.

Занятно, каким макаром захват выделения работает в Scrapbook

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

Если надо удалить выделение из страницы перед сохранением в Scrapbook, есть код попроще:

Код:

var sel = document. commandDispatcher. focusedWindow. getSelection ();
sel. deleteFromDocument ();

Он работает и с множественным выделением.

Anton

Выделение инвертируется полностью, только этого не видно

Гм… А ведь верно! Работает, и работает весьма неплохо! Правда, местами всё равно подчищать приходится. Чёткой закономерности пока не вывел. Поработаю ещё, попробую, как пойдёт.

21-08-2009 00:51:39

Если надо удалить выделение из страницы перед сохранением в Scrapbook

Наоборот — то, что не выделено изначально.

Anton написал:

Добавь в конце

Спасибо =)

MySh

Наоборот — то, что не выделено изначально.

Ну, пока только вот так:

Код:

var doc = gBrowser. contentDocument;
var win = document. commandDispatcher. focusedWindow;
var sel = win. getSelection (). QueryInterface (Components. interfaces. nsISelectionPrivate);
var range = sel. getRangeAt (0);
sel. startBatchChanges ();
var docfrag = range. extractContents ();
sel. removeAllRanges ();
range = doc. createRange ();
sel. addRange (range);
range. selectNodeContents (doc. body);
range. deleteContents ();
sel. endBatchChanges ();
doc. body. appendChild (docfrag);

только для одинарного выделения.

Инверсия множественного выделения:

Код:

function notNull (x) x != null;
function compareRanges (r1, r2)
{
    return r1. compareBoundaryPoints (Range. START_TO_START, r2);
}
var doc = gBrowser. contentDocument;
var win = document. commandDispatcher. focusedWindow;
var sel = win. getSelection (). QueryInterface (Components. interfaces. nsISelectionPrivate);
var ranges = [];
var i, j;
for (i = 0; i < sel. rangeCount; i++)
    ranges. push (sel. getRangeAt (i). cloneRange ());
ranges. sort (compareRanges);
var range1, range2;
var css, cse, ces, cee;
for (i = 0; i < ranges. length; i++)
{
    range1 = ranges [i];
    if (!range1)
        continue;
    if (range1. collapsed)
    {
        ranges [i] = null;
        continue;
    }
    for (j = i + 1; j < ranges. length; j++)
    {
        range2 = ranges [j];
        if (!range2)
            continue;
        css = range1. compareBoundaryPoints (Range. START_TO_START, range2);
        cse = range1. compareBoundaryPoints (Range. START_TO_END, range2);
        ces = range1. compareBoundaryPoints (Range. END_TO_START, range2);
        cee = range1. compareBoundaryPoints (Range. END_TO_END, range2);
        if ((css <= 0) && (cee >= 0))
        {
            ranges [j] = null;
            continue;
        }
        if ((css <= 0) && (cse >= 0) && (cee <= 0))
        {
            range1. setEnd (range2. endContainer, range2. endOffset);
            ranges [j] = null;
            continue;
        }
    }
    if (range1. collapsed)
    {
        ranges [i] = null;
        continue;
    }
}
ranges = ranges. filter (notNull);
sel. startBatchChanges ();
sel. removeAllRanges ();
var range = doc. createRange ();
sel. addRange (range);
range. setStartBefore (doc. body. firstChild);
for (i = 0; i < ranges. length; i++)
{
    range. setEnd (ranges [i]. startContainer, ranges [i]. startOffset);
    if (range. collapsed)
        sel. removeRange (range);
    range = doc. createRange ();
    sel. addRange (range);
    range. setStart (ranges [i]. endContainer, ranges [i]. endOffset);
}
range. setEndAfter (doc. body. lastChild);
if (range. collapsed)
    sel. removeRange (range);
if (sel. rangeCount == 0)
    sel. addRange (doc. createRange ());
sel. endBatchChanges ();
win. blur ();
win. focus ();
//sel. deleteFromDocument ();

Anton
Спасибо, кнопка работает прекрасно. Скорость выскрапбучивания данных из интернетов выросла в разы. :)
Заодно у меня тут пока и пиктограммка нарисовалась, а то с этих звёздочек уже в глазах рябит:
http://forum.mozilla-russia.org/uploaded/Is_script.png

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAASCAIAAAA2bnI+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAD3GlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHja7ZZdTFNnGMf/5xxKW6CWjxap0vFaQQGxw+InCAJHEDK+0nasrQMpLZYC/fBwQAQCbhkytgluMToz5r4kWJ0yXYy6LOp0WRbGMp02tTFujCFxxDDmNjfDFnbBNsgull3MO/43z5P/8+b9v2/yu3gAsRUAaBpwOHlOuyWbGIwmIvQhCEpIEY1Qs6XeXajL1QOALocluSWbCWZFAQ+8oADgepIuh507+y+SWNwcD1AEwHprVb0FoAwAdlsdTitA3QTQbHVYrQCtB1DJGYwmgD4HQGab6YcAyCpn+mEAsp28mwfonwDIOL2WBRgRQIfY9FoWEMgAOqRSr2UBIQHoEIu5jgfESQBkjfaqnYA4E0AsX9XEAwDrcu/i7LZqnsRbEogmOTmF6MyO+ganjeTUVVl4zuW0W+oJ61InkQLeipl/AABi/zq4khSZ+QbOXEdYV52LIyWci6xSJ5N8thD/t+bkK//1oY9Ac7IFhBDyKDIMRtOf9za4gLQ3AOb1WU97Ajj9PLDMMOutUAFhfuBe66z3YwYoAFSk29LANf6N80xhIEQwwhAFggSsRhaKUAYndmM/PLiEm7hPSahEKp+yUy9SA9QNaoqOpYvpFtpD+5kgJp3hGA8zEhAdYAw4GOATKARlgrcF44EpgW2BnwkXCWuFF0QRohrRFbFS3Cz2B20I6g2mgm3BV0NSQ/olkZI9kocLnAvuSMul/tDSUG9YaZg/vDx8LMIVMSXrkivkxyI3RXoXOqJEUUcUrGJ0UefipMU3otuUCUrfY50xqTETpG9JuUqh8i09EGuIi477dtnx5Y3xbEJ4wmji2RXdSdtXZqqV6t8e/yr5o1X9mn0pzatta0rX5q3buF6zITE1Lk21cUn60ozlm9SZa7OysovZbZt35HTk9m45k3ct//snpAWawqeK2os9JV5tgG6NvvrJw6U+Q5ixyNS99WqZrHzrtiMVk5UZlh7ryPZ1tp7q72pya/scQmet68sdaVw/L2/oaPy1yblrrKWi9XZbWfvXz1ieHX+uvmO6s7sr5oXTL+Xt/aan9WXFK+f3P32AOug5pHsNvQOHzW/K3xp6Z09fdj919PKxjncLTsoHhk+dfL/9jPZs/Hl8cOvDcxdevdRyueLjvE80n5JB6RD1+YMvJq7dvX7HO+ob84/f+uH21LBoZOFo/Fj6Xf24417XxNHJwfsTP8t/yXhYM3Xo98Hp6XkW5lmYZ2GehX+yYOXtDgCYsxupZnYFgMk1H2c4k4m5eOoK+k+o8F5TEy5OmgDQfwBMZtCjN+4TcwAAACBjSFJNAABtqQAAc7QAAPq1AACAlQAAYy4AAOVvAAA3hQAAFbAnc1zwAAABjElEQVR42mRTO3IVMRDsbkl+yxV8AhJIXGQEriL0Aci4AoHLnIDsQcAVnBKTv4SQxCEH4Arss3Y1BKPPLk81wainRz0zkmhmZiiGYrYWLMVKQTErRgMIiCZSQhSDIFIEiYi2zGAGGF6+fXDk6XR8dVv93z+PlcDKZ9dcS9VcVitGM7y+fXg6HUmIFgNdM6hqqmuSIECAJPaLZAsNULs0AgS5Y9QtN5yRySbFoTwysT2URA2rOl46IdQ2/Gxe4C6zqXajgIvMzt4y9V9VY+h7Hi66iNc39+4FKaUwHdI0pemQXhzSn19f373/8vec53Oe5zyfc87rWsqFpg+A7BViU3kPDU20CyQpUWKQ3LwQNw/1bDOrmiIpioxB1aIAxKiOdM5IaaOnAim6CtuY61ZUoBqZpNBuWKJX5DZeWUNEqQltJsTRp4e3j3aHczOh/qb9r52+f3Lw7sO3H48f3X9z9xnjPxgAXt/ce4dXKaYYpilNVzGlGKMklVKWpeS8zM/LPOe8rM95KasVs38DALR8gMtwnJ/jAAAAAElFTkSuQmCC

Кнопка для отмены закрытия вкладок (аналог расширения Undo Closed Tabs Button)

ЛКМ – отменить закрытие вкладки
СКМ, Ctrl+ЛКМ – очистить список закрытых вкладок
ПКМ – список закрытого

ПКМ по любому из пунктов меню – восстановить окно/вкладку без скрытия меню

Shift+ПКМ (а также ПКМ с любой другой клавишей-модификатором) – показать оригинальное меню кнопки

Скриншот:
http://forum.mozilla-russia.org/uploaded/undoCloseTabsList.png

Кнопка использует встроенную компоненту сохранения сессий, отмена закрытия окон работает в Firefox 3.5 и выше.
Используемые строки задаются в самом начале и их можно корректировать:

Код:

this._strings = {
    ...
};

Иконки взяты из расширения Undo Closed Tabs Button. Часть кода, определяющая внешний вид, начинается с

Код:

//===================
// Styles

Код (секция «инициализация»):

Код:

this._strings = {
    restoreAllTabs: "Restore all tabs",
    restoreAllTabsAccesskey: "t",
    clearTabsHistory: "Clear history of closed tabs",
    clearTabsHistoryAccesskey: "C",

    restoreAllWindows: "Restore all windows",
    restoreAllWindowsAccesskey: "w",
    clearWindowsHistory: "Clear history of closed windows",
    clearWindowsHistoryAccesskey: "l"
};
this.openOnMouseover = false;

this._mp = this.appendChild(document.createElement("menupopup"));
this._mp.setAttribute("onpopupshowing", "return this.parentNode.drawUndoList();");

this._ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
    .getService(Components.interfaces.nsISessionStore);
this.clearUndoTabsList = function() {
    var pId = "browser.sessionstore.max_tabs_undo";
    var val = navigator.preference(pId);
    navigator.preference(pId, 0);
    navigator.preference(pId, val);
    this.updUIGlobal();
};
this.getClosedWindowCount = function() {
    return "getClosedWindowCount" in this._ss ? this._ss.getClosedWindowCount() : null;
};
this.clearUndoWindowsList = function() {
    if(!("getClosedWindowCount" in this._ss))
        return;
    this._ss.setWindowState(window, '{"windows":[{}],"_closedWindows":[]}', false);
    this.updUIGlobal();
};
this.showMenu = function(e, button) {
    var mp = this._mp;
    if("openPopupAtScreen" in mp)
        mp.openPopupAtScreen(e.screenX, e.screenY);
    else
        mp.showPopup(button, e.screenX, e.screenY, "popup", null, null);
};
this.drawUndoList = function() {
    var mp = this._mp;
    while(mp.hasChildNodes())
        mp.removeChild(mp.lastChild);
    var wc = this.getClosedWindowCount();
    var tc = this._ss.getClosedTabCount(window);
    if(wc) {
        this.addUndoWindowsList(mp);
        tc && mp.appendChild(document.createElement("menuseparator"));
    }
    if(tc)
        this.addUndoTabsList(mp);
    if(wc || tc)
        return true;
    mp.hidePopup();
    return false;
};
this.addUndoWindowsList = function(undoPopup) {
    // Code from chrome://browser/content/browser.js
    // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre
    // with some improvements

    // populate menu
    let undoItems = JSON.parse(this._ss.getClosedWindowData());
    for (let i = 0; i < undoItems.length; i++) {
        let undoItem = undoItems[i];
        let menuLabel = "%title (%count)"
            .replace("%title", undoItem.title)
            .replace("%count", undoItem.tabs.length);
        let m = document.createElement("menuitem");
        m.setAttribute("label", menuLabel);
        let selectedTab = undoItem.tabs[undoItem.selected - 1];
        if (selectedTab.attributes.image) {
            let iconURL = selectedTab.attributes.image;
            // don't initiate a connection just to fetch a favicon (see bug 467828)
            if (/^https?:/.test(iconURL))
                iconURL = "moz-anno:favicon:" + iconURL;
            m.setAttribute("image", iconURL);
        }
        m.setAttribute("class", "menuitem-iconic bookmark-item");
        m.setAttribute("oncommand", "undoCloseWindow(" + i + ");");
        m.setAttribute("onclick", "if(event.button == 1) { undoCloseWindow(" + i + "); this.parentNode.parentNode.drawUndoList(); }");
        m.setAttribute("tooltiptext", selectedTab.entries[selectedTab.index - 1].url);
        if (i == 0)
            m.setAttribute("key", "key_undoCloseWindow");
        undoPopup.appendChild(m);
    }

    // "Open All in Windows"
    undoPopup.appendChild(document.createElement("menuseparator"));
    let m = undoPopup.appendChild(document.createElement("menuitem"));
    m.id = "menu_restoreAllWindows";
    m.setAttribute("label", this._strings.restoreAllWindows);
    m.setAttribute("accesskey", this._strings.restoreAllWindowsAccesskey);
    m.setAttribute("tooltiptext", "");
    m.setAttribute("oncommand", "for (var i = 0; i < " + undoItems.length + "; i++) undoCloseWindow();");

    // Clear tabs list:
    m = undoPopup.appendChild(document.createElement("menuitem"));
    m.setAttribute("label", this._strings.clearWindowsHistory);
    m.setAttribute("accesskey", this._strings.clearWindowsHistoryAccesskey);
    m.setAttribute("tooltiptext", "");
    m.setAttribute("oncommand", "this.parentNode.parentNode.clearUndoWindowsList();");
};
this.addUndoTabsList = function(undoPopup) {
    // Code from chrome://browser/content/browser.js
    // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre
    // with some improvements

    // populate menu
    var undoItems = eval("(" + this._ss.getClosedTabData(window) + ")");
    for (var i = 0; i < undoItems.length; i++) {
        var m = document.createElement("menuitem");
        var undoItem = undoItems[i];
        m.setAttribute("label", undoItem.title);
        if (undoItem.image) {
            let iconURL = undoItem.image;
            // don't initiate a connection just to fetch a favicon (see bug 467828)
            if (/^https?:/.test(iconURL))
                iconURL = "moz-anno:favicon:" + iconURL;
            m.setAttribute("image", iconURL);
        }
        m.setAttribute("class", "menuitem-iconic bookmark-item");
        m.setAttribute("value", i);
        m.setAttribute("oncommand", "undoCloseTab(" + i + ");");
        m.setAttribute("onclick", "if(event.button == 1) { undoCloseTab(" + i + "); this.parentNode.parentNode.drawUndoList(); }");
        m.setAttribute("tooltiptext", undoItem.state.entries[undoItem.state.index - 1].url);
        //m.addEventListener("click", this._undoCloseMiddleClick, false);
        if (i == 0)
            m.setAttribute("key", "key_undoCloseTab");
        undoPopup.appendChild(m);
    }

    // "Restore All Tabs"
    undoPopup.appendChild(document.createElement("menuseparator"));
    m = undoPopup.appendChild(document.createElement("menuitem"));
    m.setAttribute("label", this._strings.restoreAllTabs);
    m.setAttribute("accesskey", this._strings.restoreAllTabsAccesskey);
    m.setAttribute("tooltiptext", "");
    m.setAttribute("oncommand", "for (var i = 0; i < " + undoItems.length + "; i++) undoCloseTab();");

    // Clear tabs list:
    m = undoPopup.appendChild(document.createElement("menuitem"));
    m.setAttribute("label", this._strings.clearTabsHistory);
    m.setAttribute("accesskey", this._strings.clearTabsHistoryAccesskey);
    m.setAttribute("tooltiptext", "");
    m.setAttribute("oncommand", "this.parentNode.parentNode.clearUndoTabsList();");
};
this.updUI = function() {
    if(this.getClosedWindowCount() || this._ss.getClosedTabCount(window))
        this.removeAttribute("disabled");
    else
        this.setAttribute("disabled", "true");
};
this.updUIGlobal = function() {
    var ws = Components.classes["@mozilla.org/appshell/window-mediator;1"]
        .getService(Components.interfaces.nsIWindowMediator)
        .getEnumerator("navigator:browser");
    while(ws.hasMoreElements())
        ws.getNext().customButtonUndoCloseList.updUI();
};
this.evtHandler = {
    button: this,
    handleEvent: function(e) {
        switch(e.type) {
            case "TabClose":
            case "SSTabRestoring":
                this.button.updUI();
            break;
            case "unload":
                this.button.updUIGlobal();
                delete window.customButtonUndoCloseList;
                window.removeEventListener("TabClose", this, false);
                window.removeEventListener("SSTabRestoring", this, false);
                window.removeEventListener("unload", this, false);
        }
    }
};
this.onclick = function(e) {
    if(e.target != this)
        return;
    if(e.button == 1 || e.button == 0 && e.ctrlKey) {
        this.clearUndoTabsList();
        this.clearUndoWindowsList();
    }
    else if(e.button == 0) {
        if(this._ss.getClosedTabCount(window))
            undoCloseTab();
        else
            this.showMenu(e, this);
    }
    else if(e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) {
        this.showMenu(e, this);
    }
};
this.oncontextmenu = function(e) {
    if(e.target == this && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey)
        e.preventDefault();
};
this.onmouseover = function() {
    this.updUI();
    if(!this.openOnMouseover)
        return;
    var mp = this._mp;
    if("openPopup" in mp)
        mp.openPopup(this, "after_start");
    else
        mp.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
};
window.addEventListener("TabClose", this.evtHandler, false);
window.addEventListener("SSTabRestoring", this.evtHandler, false);
window.addEventListener("unload", this.evtHandler, false);
window.customButtonUndoCloseList = this;
this.updUIGlobal();

//===================
// Styles
// Used icons from Undo Closed Tabs Button extension
var sId = "__custombuttonsStyle__" + this.id; // Unique style "id"
var cssStr = <![CDATA[
    %button% {
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPbSURBVEiJzVVbTBxlFP7+mX9ndmcvXIRiuYSL0K2him2hatIisRqoJqJV40M1NftirLHWqDGV+CCJlRhIm6gvpjV9wEbpk4kETU2pRDFSUWlrQV1a2LZQwZ1lZ9mZ2cvM8UFoYKkUiU38ku/lzznn+79z/gsjItxMCKtNPA6IY4ATAPvPBYJByP4YKmNxbB0EXMsGE9G/Yv8lcg3rdO/Pmt214/0vzlS1HPt2ufgVO2AAGwQUXzbuiSetA62fnGyuLcnb4OTC+mAQ8lv/0I2VCrBfALekoSGeSh14s/Or+vuqiqXWRzYzj8R97/7Q/7qrb+Tu8xpyT50CX5Q4f4raO9qeA7AfQHZmdYcss1uKy3n+7XXyO5//KD68cR2e2uKHVwKmojrOXp7Gse+GcXUmZm0rEI8Emne+6s/DLABiRIT2jjaJMabu2rVbzsleXJ8AxGyRjcZSwr6PvmT11evQVFuNoAaIDMiRgTVOoCYXuDxj4I3jXyNJ7ETrC41P1gLafIsUAHbBmgLTMEx9IWeNpBmxGB3tPcO4pMDvr8bIDJCyAdMCJnVgSAU6R4HxhAsfBhqhcGH7e53fvPw7IGXOwCai8EIKsMOKnYw8U78hpcdjODHwE2YNA3HDgG6Y1zhrmDg3nUDPWAotzVuF4JWplq7e83U8U4AxFl40JACKneKlbil+KNC49sXDPbKZSGJ9RRlAwPDFi4jGNGT5fCjKz4fq9cFKSrizrFgMTqivZAoQEYUz1sBAcFFSLfVI8UOBpoq9R3pcRsKEV3HjQmjM2r2tOjw8GfH2Dgy4Sm5di0RFGfSkzVJWumqJgCAIaqYA8Pd59lB65rYsWT8Y2FG993C3wrmMXEXSAnWlfcTKpUii5qEH2z/jHpcbU5Eo8txC7g1nsJAirAk3EkOVufLpg4Em1TT1NAimQPZVTtaVIp9MAojC0Sj+jKhouKN8cokDAEtatBCibcNLiYg/T1E/ePZ+iZlmaC6H9/02yYjAptUIeZwOe/tdlV2Lbx1jtiAIywrMtUvNouQfmwp9osP2mABIT1rOfZ/28zQRvIpotT79wFlO6ObtHW0OAHtW6uCaEyKIRGwuBy6nw/la0yZrIqoJDTVV474cb6uu4QLnnO8vLCzaWVRUPAjAD+C6Q74RLMDz+BY/GxkP/Roa6k8NhkI5Lz2/x+AASh979AmdMXYynU53r9RBJhxEMw7BfntjRUlBDktlj4+cEwEQZ0w4zTm/pGnax6spPA8iQiIeP+p0Oku5IGwGMAoAXBSF7xljim3bq9r5dYTSTGAGgAlgwXN9s7DqT/9/I/AXr+4N9n05Pw8AAAAASUVORK5CYII=") !important;
    }
    %button%:hover {
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPWSURBVEiJzVVbaFxVFF3n3MfM3EkmSWObTJrnmGJrEklpYj6iBSEaEpDQooJiv9L6IalURAP2xyrSfCRq0A+xIKIWYj/8kFa0lDbFKmptadImhJhM3s/Oo/O4c+/MnXu2PwkkY5umKYILNud87H3WWWvvw2FEhP8S/GFq+yfhBMA2SmJbUTAMqEiilCyUmDH8sc+LxD2TieiB4hKRcyhBDQMR0df62U8Du949fWWj/E1bxAB2DdAK0ngyadkfnvju4oEab161Q+a7hwEV97BqswRsCHArOvbrMevk8W8uPLPHm692PLuPOxXJ83Hfr+/0XB5puAnk9fdDXle42oPunq4jADoBZGXeXVYdLL+kQt2xp8598ux1pc5XjOfrq+CQgPH5ZYwu3MbFWxMQwk43Fsin2tsOdD72COIAiBERunu6VMZY4JWXD7k8npx1xxOABJPZeCzNj335M6utKEVj9S5MRdKQGKDJHB4HR3G2jKnlAL6+fB3Zbu38Bx3NL9UB0VWLNAAoLPSalmUl1oZp2eYdIdFX/YOMSwq8hUW4tRBDRDcQihuYDesYXozh/FgYwbQDrzU/hXBMb/r02ytv/g2omT0QRBRcGxwiqIlU+NDTNZZpmvhtaBSxhAndMKGvriv7yUAcN+bjeG5vFb82Onv8zKXhejmTgDEWXN8BwE2WVO5W9d7DLd6jp350WOk0SnYUgIgws7wM0zTgdDqR78lBwuVCVOHIz8uVxhfCb2UqoEwFRBSEEMsupPxlbmmst73FCISD8M/NYTEYQiB0236hvnzJt81hDPnH4J+dRSiagJGyWcqyKzMVEOc8dLc55QCyKH3H51ETnxxuffyNL85pQXC2XXNE2+vLfhH1FWogUdPa/NEPssvhgm0L6MnUtvv2YG1IsOddSA48mqv+1XukJSzSKYuBTCbEokz2XFG2gyQQxQ0DUT2G/VXli/9SACCIDaAIgWxKhivznKHP25sUShjTKzXyheEZTmCIxGPk0VTRVFvZt/7VMSY45xsSrNgVyqHU0hMFWZIiNBMARQxL6/z+T8kmgkeT0++/2jTAFZyTu3u6FADHNqtgFRIRJCK2UgOP06G/3bJXBBMGGqt807l5WSciKiZkznlnWWn5waKdOwcB+DZLkAkbyHqxYTdGZ2bHpwd/N25MTWw/+nqHKQMoaWs7qAM4a1mWCeCuU3Q/KJwiioT3aitKinMopU2O3GQASGaMXZUkaSkajZ7ZysGrICIkdf20y+XyyZxXA/ADgMwYu8oYGxFCbMmaTAghbM55FMAisMUv80HwMJ/+/4PgH15AMczwErl/AAAAAElFTkSuQmCC") !important;
    }
    %button%[disabled="true"] {
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMJSURBVEiJvZVLbxtVFMf/59x7Z+zadVXHYMdikGmSsUOQKK8s2CBF8B34AGxAirJg4awCCySUXVcsIsQnYMUmiEWzQUg8khhQm6I8JBPjoSFOYns8djyPy4ZGaWP3kSj8VyPNOed3f2dGuqS1xmWGL3X6RQHlcvn6/Pz8+4+rofOuqFwuj0opvw+C4AYAc3FxsT+o7lwGCwsLNxKJxNrU1NSLiUSiZ5rmlWG1JwbrlVUG8C6A9OOG13Zr1sbGH5/Yth0fGxvjlZWV4yiK/o7FzLupVOrHyZdLt167+UbzDKDy69ptIWRBSvHPsOH7+/vJtdVKsVQqiXw+DwAIggDNZhOtVgt1px5JIcNOp/P23NzcLyeA9cpqEsDezVdfV0EQdAcNdxxHLC8vx23bpkwmM/AAWms4joPt7e1eGIZvzs7O3pH/vZMAfADadd3eoOajoyMzHo8jlUoNXR8RIZ/PQwhhVqvVb5aWlqbkIzUaQGNQs2VZ6Ha76a2trczExAQrpYaCstksua6ba7fbn50BENFAAAAUi8UGEXWr1eoLhUJBCCFQq9VC13VZKRUlk0keGRkhpRSy2ewV3/ffGWRwMPRoAGzbPgBwXK/Xx3K5nPB9HzMzM8ue58Xb7fZbOzs7CcuyyDAMGIaROwNg5qEGD1IqlX5g5n6j0ZiMxWKRYRh7hmHAsiz7/t590ev14lJKmKapHwIQ0RMNTpl8t7m56XueVzjVE0khWSkFz/M6SqnPzxhorZ9o8CDj4+Nfa61Zax0BwOHhoRJSGGEY+sx8aJrmV8/8DR4NEZ08O45zXUlFRPS7Uuq96enpY7leWc0C+JKIPAAGhvymT2lU37h3J9RatwG8BOBAMvOno6P5V5KJq00AV6WUz2RwOoZhdIr2ZMzretnd3eqHAD6QzNx9LvP8Xd/3v+j3++FFDPr9/sdCiNi11LWP/mL+EwAkEf9ERLUwDH8DAObz30FRFDWISDDzbSK+BwCSmX4GEG+1WudezekwM6XT6W+ZqQlc4EZ7auClTv8/AP8CT2Mu5lYEkjwAAAAASUVORK5CYII=") !important;
    }
    toolbar[iconsize="small"] %button% {
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABZVBMVEX////w8PD09PTx8fHw8PCPkIvv7++LjIfw8PDu7u6ZmZXv7+/29vbw8PD///+Txdt8lJ2RkY2Sk4+bzeJcnLsbcp6LjIcwf6bg4N/m//+XyuDf7/+LvNGmr68ufqbg4N9OhaLm8PJvrstCjrPg4N9Rk7Q8hqfk8PRoqMc5h60vgKk9ia/f4N7w8PDi7/ZgpMOLtMny9fYmeaIqfaff4N6hpKLv7+/h8PVwqcTB1N3L3ebv7+9trMqLjIeOj4rf39719vbM7PaMt81hpMPL7fmbnJeoqaXr6+tin774+/vF2t+lq6qKlI+hop38/Pz7+/v5+fn9/f29vruLjIeqq6f7+/v5+fnGxsSLjId5rcfg8vw4ibN8ud3n8vgacZ2extrA5//4+/wacp4yha8ZcZ18wuyIxuthrNc5irdvt+KRzvO62ep+w+7N6PeY1/+U1v+h2/9am7sbcp4keaXm8/ovgq07jLe+yJo8AAAAWXRSTlMAES5KZr+CMJ7X7Lr4ZwHdD4f0yftxJtP6Cj4Q/EIe9HPg/tXy/kvL/fr++fGfuf3Bzv787+6DptCRyLvRDs/u+P3O+TSw5Or8ovXiHqKWW0aBpyVHNSZMDw1FfDAAAACvSURBVHhehchTcwRBAIXRXmewtG3btm0jtn9/elPZmpqnnKd7P0DgADK5glyUQpH4b0pYkJo730t1PADxBSiKhlVvT4v11myBgSHD8Vz+cP388rr7rGlg0CIIojccrx5v7u4fjDCYMAxLWm1f33bHcuWEwXUBuT3eS58/cBuEIcQ8iURj8cT7RwqkM1n6LzabXtgUS6BcqdLO6o1mC7Q7XepZrz8YgtGYQphMZ+BfP976HHRDoNUhAAAAAElFTkSuQmCC") !important;
    }
    toolbar[iconsize="small"] %button%:hover {
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJBSURBVDiNlZNdSJNhFMf/Z+/HfOfHXMvwYyZNIleWTCUpjC7Mishl1E0QgXQVXeqVV1Y3XrjIroIoLAILgu7CSLpQ+1DCzI8lSKJu6LA5B+51m3vf93Q1W6m1fvBcPJznf/ifc55DzIxMIAIxY8tjUyZiHyD3Ti1XEUD/neAHkDPydfHNq8EvIyWtPTe2OEuV0OXtLAOgpAdL9x2wRhxVj4cmZg+2nanGtYd9n0vk5ANXsdDrbbm6vpmg+/7d2wBaJUmKp8RmS7YpWlqb2zfuF1pO1SHfYsZyOIzx+SAm5pdYjcdOD7Rf6Sdmxr3urncez8UTRYXFBgAwgJl1kjydz+nyyWOQlVxoBiNbMsFuESHpKl4MjekRNV4mppWixePxuZSDPaKknD/q2ts/OknVFS4QgOlIBJasLNjzcrDfUST4/MHXIn7BRBRIXRTWqL2xMnRL090ffVMmsyxDhJaMJXVRECQq3F2A1WisYnMKBDKIyJ92FnJIm+g4535bU15oLIZW0HzYMTzU1jQWVaMcXAmDmYV0B2DmAP7AgkTgjqcmZJNNh447C0a/BVfr1jeSxOoaGt3lk2KXt9MqCMIuBhtE5N/uL+Qh6e84WzkAgB99+l4PEBqqnBvXG2tbRJvN9jQ/32a35ln19B7sxM2GI1P1TnvFzNhwaPDJ+1VRkuSV5guXXhqG8SGRSGzr4Dd0vcftdEyv+WdcSwuzoqgolmfMHFZVde6fYgCapgUURZk3m+VyAMuU6TbuREbb+Dd+Auhp6cpgWPGjAAAAAElFTkSuQmCC") !important;
    }
    toolbar[iconsize="small"] %button%[disabled="true"] {
        list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHnSURBVDiNvZPPi9NQEMdnXl7yknTbpdCljaLSluCpIrQWRBC9Sukf4a0nj4Fe/Q88yR4E0WNvnmV19Wi3P9h61JW+2tDqNhpqaF7a58UusbqsKPiFOc18P/NlYFBKCf8i8qeDjuPcdBwn81eAZrPZQMQXiHh3s4dSSuh02zoA1ABga3Og/ebgjud9qedyOTYej93Udur1+XPWw1qt/vwE0Ot3nupMr2uaJuLmweCtORp9ZOVyGSmlMJ1OYTabgeu6oKrqvUaj8WAN2Cvki9cBMFybwzDEVqu1VSqVIJlM/pQqCALo9/tBFEU3Tm4gAaLlcnm0LkVR3lerVT4cDldhGIIQAiaTCXieB4wxsG1bT6VSuzQGXiEij28qFApcSvmVc36ZMYaKohwLIRKcc92yLDQMIx8HSAAYbR6xWCyOCCHfXNetWJY1sG3b3N9/WQ6CABOJREBj9l8SxJOYpvkunU4f+b5/S9MYkVIudF2/TzvddhYRdxBBAvweAABgWRYHAPB9/7ZhGBIRnlUq13YpY/pj0zS3NY2JxWJxKmCtbDZ7qCgkfzz7fKXbOyhQVVX5xQuXelEUvSKEnAkQQjzKZHa6q9Xq6vTTFKmqqk8IIbP5fP7hLPMPAAcATik9JIRM8L9942n6DjCB0nCnWKo+AAAAAElFTkSuQmCC") !important;
    }
    ]]>.toString().replace(/%button%/g, "#" + this.id);
function sheet(cssStr, removeFlag) {
    var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
        .getService(Components.interfaces.nsIStyleSheetService);
    var ios = Components.classes["@mozilla.org/network/io-service;1"]
        .getService(Components.interfaces.nsIIOService);
    var data = "data:text/css," + encodeURIComponent(cssStr);
    var uri = ios.newURI(data, null, null);
    if(sss.sheetRegistered(uri, sss.USER_SHEET))
        sss.unregisterSheet(uri, sss.USER_SHEET);
    if(removeFlag)
        return;
    sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
    window[sId] = cssStr;
}
if(!(sId in window))
    sheet(cssStr);
else if(window[sId] != cssStr) {
    sheet(window[sId], true);
    sheet(cssStr);
}

21-11-2009 19:53:33
Вместо showPopup используется метод openPopupAtScreen (если доступен).

04-06-2010 21:48:17
Добавлено восстановление закрытых окон и вкладок кликом средней кнопки мыши без скрытия списка.
Добавлена опция для разворачивания меню при наведении мыши («this.openOnMouseover = false;» в начале кода).

04-06-2010 23:53:51
Улучшено предотвращение появления оригинального контекстного меню кнопки.

Infocatcher, а вот за это громадный +
Единственное - попробую ка я сменить порядок: сначала вкладки, затем окна

3Jlou написал:

Единственное - попробую ка я сменить порядок: сначала вкладки, затем окна

Заменить

Код:

    if(wc) {
        this.addUndoWindowsList(mp);
        tc && mp.appendChild(document.createElement("menuseparator"));
    }
    if(tc)
        this.addUndoTabsList(mp);

на

Код:

    if(tc) {
        this.addUndoTabsList(mp);
        wc && mp.appendChild(document.createElement("menuseparator"));
    }
    if(wc)
        this.addUndoWindowsList(mp);

Infocatcher
Спасибо, очень полезная кнопка! А можно зделать кнопочку История (Журнал), чтобы по ЛКМ выпадал список журнала (ну скажем последние 30 посещенных ссылок), ПКМ - открытие в боковой панели, а СКМ - открытие Журнала в отдельном окне?
Кстати, извиняюсь что еще раз возвращаюсь к вопросу по поводу кнопки "Закладки", знаю что Anton много раз говорил, что к этому вопросу больше не подойдет, но все же. Есть расширение Personal Menu, оно при установке добавляет кнопку Закладок. Хочу спросить, возможно ли эту кнопку выдернуть в CB или там это сделано по другому совсем (может это не кнопка а кусок из меню переброшен :) )?

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

Najlus написал:

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

Или userContent.css

Код:

input[type="text"], textarea {
  color: black !important;
  background-color: white !important;
}

, или нужны подробности.

26-08-2009 00:39:43
P.S. Подправил удаление обработчиков при закрытии окна.

Или userContent.css
Не работает :(

Najlus написал:

Не работает :(

А так:

Код:

input[type="text"], input:not([type]), textarea {
  color: black !important;
  background-color: white !important;
  -moz-appearance: none !important;
}

?

Не пашет =(
Может то что на Linux, и тема стили браузера перебивает?

(На всякий случай.)

Вниманию пользователей:

Версия 0.0.4.4, устраняющая несовместимость с Adblock Plus 1.1.1 выпущена 16.08.09
Загрузить можно со страницы http://custombuttons.mozdev.org/installation.html

На AMO выложена тоже 16.08.09, но пока ещё ожидает рецензии.

гм... у гугла есть прекрасная кнопка, работающая из закладок вида:

Код:

javascript:var%20b=document.body;var%20GR________bookmarklet_domain='http://www.google.com';if(b&&!document.xmlVersion){void(z=document.createElement('script'));void(z.src='http://www.google.com/reader/ui/link-bookmarklet.js');void(b.appendChild(z));}else{}

А можно как нибудть это в кнопку интегрировать? банальным

Код:

loadURI('')

непроходит...

ishua написал:

Код:

loadURI('')

непроходит...

А

Код:

loadURI("")

?

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

Jarichek написал:

А можно зделать кнопочку История (Журнал), чтобы по ЛКМ выпадал список журнала (ну скажем последние 30 посещенных ссылок), ПКМ - открытие в боковой панели, а СКМ - открытие Журнала в отдельном окне?

Вот, что-то вроде:

Код:

var menu = document. getElementById ("goPopup"). cloneNode (true);
for (var i = 0; i < menu. childNodes. length; i++)
{
    if (menu. childNodes [i]. hasAttribute ("id"))
        menu. childNodes [i]. setAttribute ("hidden", "true");
}
menu. setAttribute ("place", "type=0&sort=4&maxResults=30");
this. appendChild (menu);
this. type = "menu";
this. orient = "horizontal";
this. onclick = function (event)
{
    var node = event. originalTarget. node;
    if ((event. button < 2) && node)
    {
        PlacesUIUtils. markPageAsTyped (node. uri);
        openUILink (node. uri, event, false, true);
    }
    else if (event. button == 1)
        PlacesCommandHook.showPlacesOrganizer('History');
    else if (event. button == 2)
    {
        if (event. shiftKey)
            return;
        toggleSidebar ("viewHistorySidebar");
        event. preventDefault ();
        event. stopPropagation ();
    }
};

27-08-2009 18:25:07

Есть расширение Personal Menu, оно при установке добавляет кнопку Закладок. Хочу спросить, возможно ли эту кнопку выдернуть в CB или там это сделано по другому совсем (может это не кнопка а кусок из меню переброшен :) )?

Простое копирование меню "Закладки":

Код:

var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true);
this. appendChild (menu);
this. type = "menu";
this. orient = "horizontal";

Anton
Лучше бы рекурсивно потереть все идентификаторы.

Код:

var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true);
this. appendChild (menu);
this. type = "menu";
this. orient = "horizontal";

alert(document. getElementById ("bookmarksMenuPopup").parentNode.getAttribute("label"));

А теперь размести кнопку слева от панели меню.

27-08-2009 18:38:37

Код:

var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true);
function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);

Infocatcher

Лучше бы рекурсивно потереть все идентификаторы.

Это "убъёт" первую кнопку.

Anton написал:

Это "убъёт" первую кнопку.

Так ведь

Код:

var menu = document. getElementById ("goPopup"). cloneNode (true);
for (var i = 0; i < menu. childNodes. length; i++)
{
    if (menu. childNodes [i]. hasAttribute ("id"))
        menu. childNodes [i]. setAttribute ("hidden", "true");
}

function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);

На первый взгляд все нормально.

27-08-2009 19:01:50
Ну, кроме того, что список не хочет обновляться. Но он и с идентификаторами не хочет.

На первый взгляд все нормально.

Всё верно, это у меня баг был.

Что-то я не совсем понял про кнопку закладок ... Добавил в Инициализацию вот этот код:

Код:

var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true);
this. appendChild (menu);
this. type = "menu";
this. orient = "horizontal";

alert(document. getElementById ("bookmarksMenuPopup").parentNode.getAttribute("label"));

Теперь при каждом запуске вылетает окно - "[Приложение Javascript] - Закладки". И еще вот эта кнопка клонировалась и появилась в Настройке панелей:

Код:

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%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C/%u0441%u043A%u0440%u044B%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%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.pref%3D%27permissions.default.image%27%3B%0Athis.setState%3Dfunction%28%29%7B%0A%09switch%28this.PS.getIntPref%28this.pref%29%29%0A%09%7B%0A%09case%201%3A%0A%09%09this.image%3D%20%27data%3Aimage/png%3Bbase64%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%3D%3D%27%3B%0A%09%09this.tooltipText%3D%20%27%u0417%u0430%u0433%u0440%u0443%u0436%u0430%u0442%u044C%20%u0432%u0441%u0435%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%27%3B%0A%09%20%09break%3B%0A%09case%202%3A%0A%09%09this.image%3D%0A%27data%3Aimage/png%3Bbase64%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%3D%3D%27%3B%0A%09%09this.tooltipText%3D%20%27%u041D%u0435%20%u0437%u0430%u0433%u0440%u0443%u0436%u0430%u0442%u044C%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0438%27%3B%0A%09%09break%3B%0A%09case%203%3A%20%0A%09%09this.image%3D%0A%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAIFSURBVHjaxJO9a1NRFMB/9yMvr3n5aPva1FotjTj4ASJkEUGHDoJQsJOLIC4uLi4KDg4Ogrv/gO5CF6EgHSxUEIQuJYNiiUq1VWloisn7zHvX4YU0iIt08MCBew6cH+f+uFcYYzhMSA4ZeunRvIn8Nmn6b4NCQLniohGCb9VrqZs/Kp1CASUUOa2QSiEtjVAKqSVohcxJ6J+3PjdSu7kktQBUviw3mWXh9TIXGm/AcaBUgaINpRKUy1AZg0rWj1yXl+6spNl30On6TM6Msrp4k6Ub96HkgJ0DrcEYCEMIPPAC8ENUt4vEHEhs/+rwZXuX2qRDu17n+e0ndKZqUCxBfiQDAcQJ9AJU6JOm4gBg0oTV9fesbXxi1JZMzFVZvnWPj/Ur2fqFImgLlMggfozoW9cAJukRBx7vGk0aW21OzB5nbqbK91OX+eCeZGH9RbaFZYPOgRAYYxADQJoQhR46tIkDm68/WrR8Q6Ecs1E5wtvzd3jw6iklaxump0BNIMTQFUh6xIE/yCj0iPsZhT4tu8jj6w9ZO7MIrT3Y/UncCYYcmIQo6A6G4sAbAmY9P4GVs5d4Nn8XEyqIksyBAa6eVu1zxwqpUClS7yO1h1Y7SGUhlEYlGuVZRoWQE7BycZqdvU1RE2Jc65Gx/WC3abl/eeZ/1L0UCPvFtI3IO+P74r//xt8DAGJ/1vE4ifveAAAAAElFTkSuQmCC%27%3B%0A%09%09this.tooltipText%3D%20%27%u0417%u0430%u0433%u0440%u0443%u0436%u0430%u0442%u044C%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0441%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0434%u043E%u043C%u0435%u043D%u0430%27%3B%0A%09%09break%3B%0A%09%7D%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bswitch%28this.PS.getIntPref%28this.pref%29%29%7B%0A%09case%201%3A%20this.PS.setIntPref%28this.pref%2C2%29%3Bbreak%3B%0A%09case%202%3A%20this.PS.setIntPref%28this.pref%2C3%29%3Bbreak%3B%0A%09case%203%3A%20this.PS.setIntPref%28this.pref%2C1%29%3Bbreak%3B%0A%7D%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

И что делать с этим:

Код:

var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true);
function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);

А вот это надо было добавить в код кнопки Истории:

Код:

function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);

?

Jarichek
Взять код Антона и добавить

Код:

function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);

перед

Код:

this. appendChild (menu);

(в обоих случаях)


Теперь при каждом запуске вылетает окно - "[Приложение Javascript] - Закладки".

Это для демонстрации. Если эту кнопку разместить перед панелью с меню, вылетать будет название кнопки, а не название меню.

Infocatcher, Anton
Очередной раз вам огромное спасибо.
Остался один глюк, та кнопка, о которой я упомянул в предыдущем сообщении, она у меня находилась на панели и при добавлении кнопки История (в изначальном виде, без доработки) эта кнопка дублировалась в Настройке панелей инструментов, правда там иконки стали искаженными и на ней стандартное контекстное меню кнопки СВ не появляется, т.е. я не могу ее удалить никак. Посмотрел в файле buttonsoverlay.xul там ничего лишнего не заметил. Причем если эту кнопку тоже вынести на панель куда-нибудь, то если переключать одну из них, то и вторая аналогично переключается сама :) Как ее можно удалить?

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

Anton написал:

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

Я воспроизвел только раскопирование CB-кнопок, но они получаются вполне полноценными и легко удаляются.

Infocatcher
а у меня что-то не получается уже, но у меня вторая дублированная кнопка не удаляется, на ней стандартное меню кнопки Firefox, как например у Stop или Reload

Jarichek написал:

но у меня вторая дублированная кнопка не удаляется, на ней стандартное меню кнопки Firefox

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

Код:

var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true);
function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);
this. appendChild (menu);
//this. type = "menu-button";
//this. orient = "horizontal";
this. setAttribute ("popup", menu. id = "cbBookmarks-" + this. id);

this. onclick = function (event)
{
   
    if (event. button == 1)
        PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId);
    else if (event. button == 2)
    {
        if (event. shiftKey)
            return;
        toggleSidebar('viewBookmarksSidebar');
        event. preventDefault ();
        event. stopPropagation ();
    }
};

как тут сделать, чтобы по правому клику на закладках появлялось стандартное меню (сейчас открывается в боковой панели), и по средней кнопке на закладках не появлялось окно для добавления в закладки?

Jarichek

Anton, как в твоей кнопке "История" убрать срабатывание правой кнопки мыши в выпадающем списке, чтобы не открывалась боковая панель?

Для этого надо заменить строку

Код:

if (event. shiftKey)

на

Код:

if (event. shiftKey || (event. originalTarget. nodeName != "toolbarbutton"))

Jarichek написал:

как тут сделать, чтобы по правому клику на закладках появлялось стандартное меню (сейчас открывается в боковой панели), и по средней кнопке на закладках не появлялось окно для добавления в закладки?

Для этого надо убрать строку

Код:

this. onclick = function (event)

и всё, что после неё.

Anton

Anton написал:

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

Да нет, я хотел дополнить кнопку: СКМ - добавить страницу в закладки, а ПКМ - открытие в боковой панели :) С твоей подсказкой доделал и вроде все работает, вот что получилось:

Код:

var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true);
function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);
this. appendChild (menu);
//this. type = "menu-button";
//this. orient = "horizontal";
this. setAttribute ("popup", menu. id = "cbBookmarks-" + this. id);

this. onclick = function (event)
{
    if (event. button == 1)
    {
        if (event. originalTarget. nodeName != "toolbarbutton")
            return;
        PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId);
    }
    else if (event. button == 2)
    {
        if (event. shiftKey || (event. originalTarget. nodeName != "toolbarbutton"))
            return;
        toggleSidebar('viewBookmarksSidebar');
        event. preventDefault ();
        event. stopPropagation ();
    }
};

Надеюсь особых ошибок не наделал. Очередное спасибо!

Что могут означать следующие записи в консоле ошибок (при этом ни одна из кнопок не отображается.):
Предупреждение: Warning: cannot register non-local URI 'custombuttons://content/buttonsoverlay.xul' as an overlay.
Источник: custombuttons://content/buttonsoverlay.xul
Строка: 4
Предупреждение: Warning: cannot register non-local URI 'custombuttons://content/cbbutton.xul' as an overlay.
Источник: custombuttons://content/cbbutton.xul
Строка: 6
Failed to load XPCOM component: D:\FirefoxPortable3\Data\profile\extensions\{f759ca51-3a91-4dd1-ae78-9db5eee9ebf0}\components\idl\arIUnMHTProtocolHandler.idl

alexmac написал:

Что могут означать следующие записи в консоле ошибок...

Это значит, что используется версия Custom Buttons 0.0.4.3 или более ранняя, а кроме того, установлено какое-нибудь расширение, которое при инициализации своих js xpcom сервисов загружает скрипты из chrome:// с помощью mozISubscriptLoader.

В общем, самое время обновить Custom Buttons до версии 0.0.4.4: http://custombuttons.mozdev.org/installation.html

А можно ли как нибудь поднять строку поиска (вызываемую F3) где нибудь пикселей на 10 выше

Najlus

А можно ли как нибудь поднять строку поиска (вызываемую F3) где нибудь пикселей на 10 выше

Строку поиска браузера ? Custom Buttons - не лучший инструмент для решения этой задачи. userChrome.css, я думаю, более подходит в данном случае.

Anton написал:

Строку поиска браузера ?

именно её

userChrome.css, я думаю, более подходит в данном случае.

Ну через него тогда как нибудь можно?

Najlus
Например #FindToolbar { height: 200px; }

А лучше спроси в теме Stylish, там участники лучше меня разбираются в css.

Anton
В ОпереАС есть удобное меню "Цитировать с тегами", появляющееся на выделенном тексте. Вот как выглядит код в самом меню - Файл (бросил в файл, тут форум ругнулся на неверный синтаксис тегов BBCode). Тут используются функции из этого скрипта. Можно ли сделать подобную кнопку для СВ?

Jarichek
Записываешь скрипт bbcode.js в файл, например c:\bbcode1.js
Код отсюда записываешь в файл, например c:\bbcode2.js
Код для кнопки

Код:

var doc = gBrowser. contentDocument;
var win = doc. defaultView;
win. navigator. lastFocusedTextArea = document.commandDispatcher.focusedElement;
var ssl = Components. classes ["@mozilla.org/moz/jssubscript-loader;1"].
      getService (Components. interfaces. mozIJSSubScriptLoader);
if (!win. ujs_bbcode_tag)
    ssl. loadSubScript ("file:///C:/bbcode1.js", win);
ssl. loadSubScript ("file:///C:/bbcode2.js", win);

Anton
Не совсем правильно работает. На данном форуме цитаты вставляет, но в тексте пропадают Enter'ы. На forum.ru-board.com вообще цитаты не работают:

Код:

Deprecated method document.getSelection() called.  Please use window.getSelection() instead.
Ошибка: c.parentNode.firstChild.innerText is undefined
Источник: custombutton://buttons/Firefox/code/custombuttons-button73
Строка: 4294967127

Кстати, когда первый раз когда пробовал эту кнопку, стояла версия 0.0.4.3 - так в ней показывалась правильно "Строка: 115" в ошибке. Установил новую версию, номер строки стал каким-то большим :)

Jarichek

Не совсем правильно работает.

Сдаюсь.

Anton написал:

Сдаюсь.

:)
ладно, тогда хочу другой вопрос спросить. На этом форуме для вставки ссылки вида {url="Сайт"}"Название ссылки"{/url} приходится ручками дополнять, можно ли сделать такую кнопку, допустим, в форме ответа есть выделенный текст, при клике на кнопку появляется окно с двумя текстовыми полями - в первом из них вписан выделенный текст ("Название ссылки", если ничего не выделено поле остается пустым), во второй вписывается руками "Сайт". И в итоге получается в тегах таким образом -{url="Сайт"}"Название ссылки"{/url}.

Jarichek
Используй расширение BBCode

Sergeys
BBCode не удобно, из контекстного меню долго лезть за нужным кодом. Видел кнопки на СВ, использующие функции этого расширения, но зачем устанавливать лишнее расширение, когда это реализуется кнопками СВ.

Jarichek

Код:

this. pasteText = function (desc, url)
{
    var doc = new XPCNativeWrapper (gBrowser. contentDocument). wrappedJSObject;
    var theBox = doc. forms ["post"] ["req_message"];
    var startPos = theBox.selectionStart;
    var endPos = theBox. selectionEnd;
    var oPosition = theBox. scrollTop;
    var oHeight = theBox. scrollHeight;
    var text = theBox. value. substring (0, startPos);
    text += "[url= + url + ]" + desc + "[/url]";
    text += theBox. value. substring (endPos, theBox. value. length);
    theBox. value = text;
    theBox. selectionStart = startPos;
    theBox. selectionEnd = startPos + 6 + url. length + desc. length + 6;
    var nHeight = theBox. scrollHeight - oHeight;
    theBox. scrollTop = oPosition + nHeight;
};

this. showURLDialog = 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="Custom Buttons"
                onload="windowController.init()"
                ondialogaccept="return windowController.accept();">
            <script type="application/x-javascript">
                <![CDATA[
                    var windowController =
                    {
                        init: function ()
                        {
                            var stb = document. getElementById ("texttb");
                            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);
                        }
                    };
                ]]>
            </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="Сайт"/>
                            <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);
};

var focusedWindow = document. commandDispatcher. focusedWindow;
var text = focusedWindow. getSelection (). toString ();
this. showURLDialog (this. pasteText, text);

Anton

text += "[url=" + url + "]" + desc + "[/url]";

Все работает как надо, опять тебе спасибо :)

Добавлено:
так, почему-то на forum.ru-board.com не хочет вставлять в форму ответа, жмешь на ОК а окно не закрывается (textarea id="post", name="post").
И еще, как сделать, чтобы выделенное воспринималось не только на странице а и в самой форме? Встречал на подобных кнопках такую запись:

Код:

var theBox = document.commandDispatcher.focusedElement;

Не получается сделать, чтобы или на странице или в форме выделение бралось

Добавлено:
По второй части вопроса вроде решил, сделал вот так:

Код:

var focusedWindow = document. commandDispatcher. focusedWindow;
var text = focusedWindow. getSelection (). toString ();
if (!text)
{
    var theBox1 = document.commandDispatcher.focusedElement;
    var startPos1 = theBox1.selectionStart;
    var endPos1 = theBox1.selectionEnd;
    text= theBox1.value.substring(startPos1, endPos1);
}

Остается не понятным первый вопрос

Anton
Ты уж извини, вопросов много что-то задаю :) Еще один появился. Пытаюсь сделать кнопку с выпадающем меню, делаю свою на основе кнопки Favorite Applications. Исправил под себя меню, все появляется как надо. Вот например:

Код:

var nMItem = function(label,img,args) {
  var m = document.createElement('menuitem');
  m.setAttribute('label',label);
  //m.f = obj.startProcess.bind(obj);
  //m.setAttribute('oncommand','this.f("'+path+'","'+args+'")');
  m.setAttribute('class','menuitem-iconic');
  m.setAttribute('image',img);
  m.tooltipText = label;
  return m;
}

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

Jarichek написал:

Anton

text += "[url=" + url + "]" + desc + "[/url]";

Конечно. Просто форум "отрезает" кавычки.

так, почему-то на forum.ru-board.com не хочет вставлять в форму ответа, жмешь на ОК а окно не закрывается (textarea id="post", name="post").

Кнопка сделана только для forum.mozilla-russia.org
Для ru-board, наверное, будет работать
var theBox = doc. getElementById ("post");
вместо
var theBox = doc. forms...

01-09-2009 20:32:29
Jarichek

Как определить атрибут oncommand, если нужно выполнить функцию (она для всех элементов меню одинаковая), которая принимает один агрумент (args)?

А какой там есть ?
Прошу прощения, в указанном коде он есть.
Наверное, так:

Код:

m.setAttribute('oncommand','this.f('+args+')');

ps.:

Кстати, когда первый раз когда пробовал эту кнопку, стояла версия 0.0.4.3 - так в ней показывалась правильно "Строка: 115" в ошибке. Установил новую версию, номер строки стал каким-то большим :)

Спасибо за багрепорт.

Anton написал:

Наверное, так:
m.setAttribute('oncommand','this.f('+args+')');

Ладно, вот приведу что у меня получилось:

Код:

var apps = new Array;

Red='data:image/x-icon;base64, ...;
Green='data:image/png;base64, ...;
Blue='data:image/png;base64, ...;

// ------ Menu Items ------
apps.push(['Red',        Red,  '#FF0000']);
apps.push(['Green',   Green, '#00FF00']);
apps.push(['Blue',       Blue, '#0000FF']);
// ------------------------

var nMItem = function(label,img,args) {
  var m = document.createElement('menuitem');
  m.setAttribute('label',label);
  //m.f = obj.startProcess.bind(obj);
  //m.setAttribute('oncommand','this.f("'+path+'","'+args+'")');
  m.setAttribute('oncommand','this.onCl("'+args+'")');
  m.setAttribute('class','menuitem-iconic');
  m.setAttribute('image',img);
  m.tooltipText = label;
  return m;
}

this.onCl=function(args)
{
    var open="[color= + args + ]";
    var close="[/color]";
    var theBox = document.commandDispatcher.focusedElement;
    var startPos = theBox.selectionStart;
    var endPos = theBox.selectionEnd;
    var pastetext= theBox.value.substring(startPos, endPos);
    var oPosition = theBox.scrollTop;
    var oHeight = theBox.scrollHeight;
    var text=theBox.value.substring(0,startPos);
    text +=open+pastetext+close;
    text +=theBox.value.substring(endPos, theBox.value.length);
    theBox.value = text;
    theBox.selectionStart = startPos;
    theBox.selectionEnd = startPos + open.length + pastetext.length + close.length;
    var nHeight = theBox.scrollHeight - oHeight;
    theBox.scrollTop = oPosition + nHeight;
}

var mP = document.createElement('menupopup');
for (var i=0; i<apps.length; i++) {
    if (!apps[i] [3]) apps[i] [3]='';
    mP.appendChild(nMItem(apps[i] [0], apps[i] [1], apps[i] [2], apps[i] [3], this));
  
}

this.appendChild(mP);
this.type = "menu";
this.orient = "vertical";

А вот кнопка оригинальная, которую я переделывал:

Код:

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%3EFavorite%20Applications%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACvUlEQVR4nO2Uz2tcVRTHP+ecN3ltM2kwEESiGbSx6EawIkK7aUAQoSi4cu0/4EYYCykONLSMdOF/4dKN4F5adKEL3bTVbNog2TlpJ5nM3PfuPS7e/LImcWxc9guXe9/l3e/n3nPOvfBM/yJxdwA2N29+FmNsA3pCz2RmzY2Nq7cAcHfcnVbregwh+EkVQvBW63oc+WZTZFU13vz4K3a7/afa+tLZ0/z89adMR2EaQBkTj/f6XHznDcyEzHTYJuPj9M13P/5jLjvkP8qYcAQRwdRBFBcBqUACOFV4cSf5cHyIDgUkdzI1VBU1Q9QwVdQE1clJ3J00jHVKswIE1CbmajpuFaQC9UPk0f6A/X5B76Bg7yDMegIBmZjK2NQQUwYx8sefA7q9QHInxURMjprNHiLRCiIiqBqmRpmcTm/AICQcOJXXiMmJMRFjpNQ0O8AdokOIEIn0iirpqkqeG+AT8zJSyqHeRwP6ZSISqdWEGkaWKbXMqgpSwZNTxkQpcbyhNEsVZaacref8+tMvR2/pGC0tnjkeYKZ8e+ujpzI/StOAVBSFrqysnsiwKAqAccbHADNr3rjR/t9e09GHHHXFR7rZ3vT8VM7c3NwTrcbvv21xtblxTA0NASJi7S/bW6q69NrrawtqKmZGjJH/0heh8Ht3t7oxps7nzeaau5fWarVweHt5efmTK1fef+7x3q5kWcbc6Rr1+QUw54XnVwixz7mXX2W/3+WVYT+ar59ZgKx6Hi9dvJTv7OykCxfe+n798uVtBUjJ322sri6mlCiKkhACMTidTof5vM7D7Qf0ugfcu3+XXveA+8P+4fYD5vM6nd0OMVRrU0o0Go3FlPw9GCZZRT5YX1/P8jxn7dz5E+YYXnqxYXdu//Ah8EUGMBgEu3at9UikupXAMHEuUzXwRDL/VhxC9XrLyMNMFeAvxD6eG31AG3sAAAAASUVORK5CYII%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%5Bvar%20login%20%3D%20%22Administrator%22%3B%20%20%20%20%20%20%20%20%20%20//%20Here%20put%20your%20login%20name%21%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%20%20//%20So%20you%20can%20use%20%22Show%20Desktop%22%20command%21%0A%0A/*%0AIf%20you%20deleted%20%22Show%20Desktop%22%20from%20your%20Quick%20Launch%20toolbar%2C%20just%20enter%20this%20URI%0Ain%20your%20Firefox%20and%20save%20the%20file%20as%20%22Show%20Desktop.scf%22.%20Then%20you%20can%20put%20it%20in%20you%20Quick%20Launch%21%21%0AShowDesktop%3D%22data%3Aapplication/x-unknown-content-type%3Bbase64%2CW1NoZWxsXQ0KQ29tbWFuZD0yDQpJY29uRmlsZT1leHBsb3Jlci5leGUsMw0KW1Rhc2tiYXJdDQpDb21tYW5kPVRvZ2dsZURlc2t0b3ANCg%3D%3D%22%3B%0A*/%0A%0Avar%20apps%20%3D%20new%20Array%3B%0ADefault%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%27%3B%0AShowDesk%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAioFc/4lLHf9dPCL/Sj8u/zZMRv86Ukv/O1RN/0VhWf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZbEv+tSQT/p0wR/8F4MP/BeDD/wXgw/8F4MP9FOCj/OUc+/ztTTf8+Vk//RmNb/1p+dP8AAAAAAAAAAAAAAAC2WxL/tlsS/7/WzP++8vv/t/D7/7fw+/+37vv/wXgw/8F4MP/BeDD/wXgw/1M3H/8+Qjf/TGpi/wAAAAAAAAAAtlsS/8fQvf/F8/z/xfP8/8x6O//Mejv/zHo7/7fu+/+37vv/t+77//DOpv+1UAH/tVAB/ztUTf8AAAAAAAAAANiBJ//L0bz/yvX7/8r1+//3ozD//+PH///lzP/Mejv/zHo7/8x6O//Q9vz/8M6m/8xnAf87VE3/AAAAAAAAAADYgSf/z9K9/9D2/P/Q9vz/96Mw///lzP//5cz//+XM///lzP/Mejv/0Pb8/9D2/P/MZwH/PldQ/wAAAAAAAAAA2IEn/9Tt7P/U9vz/1Pb8//ejMP//8+f/AQ4U/wEOFP/Zhzf/2Yc3/9mHN//U9vz/zGcB/zZMRv8AAAAAAAAAANiBJ//c+P3/3Pj9/9z4/f/3ozD///Pn///y5f9hhJL//+TJ//XDkP/Zhzf/2Yc3/8xnAf8pOTX/Ql1V/2eShv/YgSf/4fn9/+H5/f/h+f3/96Mw///8+f//8uX///Pn/9mHN///5Mn//+XM//zRpv/Zhzf/ETG5/y9CPf9UeG7/2IEn/+Xi0P/o+v7/6Pr+//ejMP////////r1///y5f//7dz/2Yc3/9mHN///5cz/H1zV/y6G8v8RMbn/bJiL/9iBJ//YgSf/7Pv+/+z7/v/3ozD/+7JB//uyQf//+vX///Ll/8x6O//s+/7/2Yc3/9mHN/8eJJb/AAAAAAAAAADYgSf//+26/9iBJ//0/P7/9Pz+//T8/v/w2L//+7JB//uyQf/Mejv/9Pz+//T8/v/Zhzf/O1RN/wAAAAAAAAAA2IEn/++mRv/vpkb/2IEn//DOpv/w2L///P7///z+///8/v///P7///z+///vpkb/2Yc3/ztUTf8AAAAAAAAAAAAAAACOn4b/oLac/6ilhf/vpkb/76ZG/++mRv/vpkb/8tKf//LRo//vpkb//L12/9mHN/9Sc2n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+mRv/vpkb/76ZG/++mRv/vpkb/AAAAAAAAAAAAAAAA//9zQQD/c0EAB3NBAANzQQADc0EAA3NBAANzQQADc0EAAHNBAABzQQAAc0EAA3NBAANzQQADc0GAA3NB/wdzQQ%3D%3D%27%3B%0AIExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%3D%27%3B%0AWExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%3D%3D%27%3B%0ACtrlPanel%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAEG0lEQVR42mJkTDzG8P/ffwYpEU6Gzz/+8H//9Y+dh4s1+cOn3+zMbMwWf/8wWAAVMOi/nLtX8uet4L+MrAz/GBgYmIHY/ft3BoAAYgHSOYyMjCIfv/2x+Pnnv8WfH/+YPnz4zMsAVMbC+p9BQYCV4dNfNoYvf9j4vn37wvCXkZ3hF9BADyFhBtVv3xgAAoiF4e/fif+//Wb6+ukvAzvrPwYtUVYGSyM+Bl15HgYTLSkGRUkOhty5txkOXP//F+TSv/9+MrCxsjBICggw/H73jgEggFgYvn37HGXEx+9lJMpgqCrEoCTJw8DBycoAAh++vGP4y8TO8O8/IwMj0FaGf38Y2ISUGZgktBlYGR4x/P//nwEggFj+//jBkO2py2BlIAnW9Auo7uMvBoYfP38zvD2aycBr1MPAxsLO8PsvM8PPb58ZhByDGb4x8TAwPL0HNJiJASCAmFhYWRkevvoG1vz9NwPDN5Dm/wwMX57sZPjLrcnAwCfLwMXJzPDr19//X8XNGX5JWzP8/flVjOnLq5lC7G+XAwQQCwsLE8PHL7/BBvwG2v7zL9AVQAO+3V/E8E86juEvkP3/90+GbyzCzJ90wsRUuDhmGqgKO6v/4ufl/HiCASCAWJgYGRlefQBay/Cf4fsfRoZfjEDNTw4x/P5wiYHVyInh/hsGhhc//jEEhwU4OFmo3/vOxMN98Yo8w+p/ir8EX0uvBggAQQC+/wQBAAAA8fkCAPf25ADuzJEABC2AAPnkrgD/FUcA6ujpAMTU2gBKOz4ADgkHBcfU4wXNzbvV8efcyCAD8ZMlFRvSAgBBAL7/BAYFAwDz9vgA+AcnAP8IHAD0vkgAAAUPAPkplQCyqrAAEQDYAKTmJQDhz8HdGv3XbBUE9L8QAQT5BgIBAAP+/QACiAUc8n/+Mvz8DYw6pVyGf68OAWML6CUuBQYG23yGHwxfGMwefmK4/fj2dQbu5zsYhIFpjJmNAehZcLgBBBALIxMTw2dgIH79AQo8YGjrLWb4/fEWw+8/DAyaAowMh9/zMnAy/2L4w8TP+uLjK4a33xkZ+Pn/M8gKAh3K+I8BIIBY/gDN+gNMYT+AGn4AI+M3IzfDT35DsOninAwM8m9+Mxy5+Yrhz5+/zIzAhPPr1x+Gly+/MHz78p/h5x8hBoAAYvnz9x/DT6BrmNiAOoCGfAUmiRcf/jLcuPmU4eS5+wy3rt1g+Pfuyk8VtkefeNk+gxMPCAC9z/CekZkBIIBY/v/5wvL8LQfDtGW3GO49eMXwCpjCvjy7+Ov/99cf2P5/mKvO/eseA/v7E0wsbPc5OHmByfcfAzIACCAW9t9v3t6/+vzP0wub//D+f3pGkPnZaQHmP2t4eTjvMTKzfmZj4wAmbXagRiag7f+BNIp+BoAAAwDAMqTgcw5bNAAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSNotepad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAoJJREFUOE+lk/tL01EUwO0fy1ely6IUMoi0AoM0Sy1TMDMitZyvfLDNdM5HPle6RNt0mlvz0ebmYzoVN5vO4cQ5yxQFAz/NbxTo9Kcu3Hu4h3s/fM6BcwYI+q91CBBXdGDtjaG88LUQywoK/9yLJEKseaulRnzX/5Sg41tIiKsWaauX0mdxolUr6Btz0NpWh9Ls4ZNugHbbDpklMvKkTQEQAVD4YQmN+yeGzX00qzvUu9aodKwhc25TurhLtnWbuNb10wF5ygUqnD4UTg8Sxwa5Nhc5026eTnpIG18lYWSdBO3B6QCF2krutI838z7ypzdJNS+RZHJz3/idWyNeLvd7iFEfkKYwnFxCl95Mnm2FdPMGj81bxA25uKZfJla3wZXPm4R0exC93yGtdysAIvRAPWSm1rlEvP4H8UM+ogZcRPS5idKsc6HHQ7BymUj5Kum6A15KWo5YCIAeg5ku7xTXtV5itD7CuhcIVzm41LlChNLO2Xoboko7qV1bpFQNHLEQAB/9JUzsWUkaXOVih4tz7dOENU8gejeLqMFGsMyCqGCSpFoHyU32QIBKb8G6byR/fJmLTQ5C60Y5LzchqrYQKflKcNEXIrMNJBaP8ah1jVdVzf/KEAxUOgsLv6ZodM5xtWGe0LIBQkq0RBSPEF48TIjYRLTYRkqd3W+wyL2c0qOADp2ZyT0jet8Md1Quf8OMxCqnSO63kzVuJ2d2huhMKS8KyykqrQ5sYrfBb8AExt1hVOtzlLkHkXtHaVxxIJuZJ7trnhsJz0+fhXqNlc5lO3LTN3I7p3hQMcjNrBZuP6wkOb2EfLH0xM/CJB8eGc+kJGbIeJJTISge1zxpCv/mfgPvVs+ANDa5fgAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSWordpad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAD5ElEQVR42gBBAL7/Af///wDgz3tx+e7eSe7mDMcTHwhq3d3+lhQQ9Tfb4fDGGxEsa+z105z+AkJFDP3M9PEQRo8qKSyz1d3qAFlVRwACiBFkwPKlJz9+e7WVT1hYgOHZGy4GKcHHDM8/mzIoi55kePEzhEGQcRUDi0gSA9OHVQwfGdUYWCXkTa89en+mOsGTASCAWBiAgJFdgkHbyJ5B21Cb4em9lwwS0h4MHz6zMkiIGDJ8+yPM8O9vAQMXDx8D458Yhv5FhxgOv/s9lf/fvyag1q0AAQQxgPMDg7y9IcP7n38ZBLSkGX4xMDFw8P1mePmHgeEX4zOGv6wMDFyMnxhefWdiWPNZkeH9dwmzIL73y4Ba+QECCGzAH6A33v98z/Dz2y8GZkYGBlZGJgZuFi4GFqBBXKxCDMwsPxnOPvrJMO8gK8Ozj2IMfI/3Mbzn+wjU6ccAEEBgA5gYmRlYmTkZ2Ni5GH78+crw+98vhtc/3gK1/2cQ5eZheHLjP8OWQ78YTj1jY+D/eZNB8dcdBk4uoRcgvQABBDbg59/vQL9+ZWD/z8XAAbSZnYmf4c/fnwzsLL8ZDt78yrBk+x8Gpk//GEwYfzJ8//aUQYCf9a20lKgPSC9AAIENYGPmYmADavzx+ycDw78/DD8ZWRiEONkYdlz8x9C7hZXh0Yd/DOrCnAzm0swMHz69ZbA3MXomLCJ8G6QXIIDABvz+/4vhF9DZTEysDH+B4fGb8TvD8Qd/GCbv/M3w4O1vBj0ZDgYPPUEGA4VvDNc+izAY6GkyCAoKgLQyAAQQE4j4C7L132+g5n8M3Bw8DKz/BBiWbPzEcPflLwYjOW4GGxURBluNvwyWSowMjEzMDMxMTAwsoNAGAoAAArsAFIAg20Hh8OfXV4Yv11kZOF/+YHDTlmLQV+Zg0JT9yCAm8Jfhww9ggIOCFuhKIAIDgAACG/D3/1+giZwMLOwcDO8ufWfYsOk5g5ieGIO2Fj+Drsx/BmHebwzffv1i+Pz7L8N/uMMhLgAIIKgBvxk+/3rPwPqXjeEt628GeRceBlmVPwzS/M8YuNnYGf4BY4edGRg+fz8B2f8YkAFAAIENYGbkYmBl4WX48fMzg7DiPwZpNV4GblYOYIz8Yvj+5zvDX6bvDHzs3Ay87OLgNPMf6g4QAAggsAH/WX4w/GcVZBDgE2FgBdrw48d3hj9ffjNw/AI68xcnw9vX7xgefnjG8PPzD2A6YWXg4+F+x8bKCjYAIIDABiiKcq97e/lN2KfHr7/9+AAMxK/fGH7++Al0wC+wk7m4OBl4eLgZ+Hi52a0tjG5xc3NEMUNjASDAAGRtWmcAXa/AAAAAAElFTkSuQmCC%27%3B%0ATimenDate%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqBJREFUOE+Fk2tIk1EAho9F2J8uFF0gol92g6j+WEFGTGrQBYYynGnrYllOwbIx2aJWUEiJoZiFIYSaoJFdSEFrXcwaUZFz4Vrq5mWX+lz25UQpop62SaOLowPn1+F5znvOeU8cIGKN7FcbIosJc3cK24cvQozPF9/erxDXM5PjokxYMNk8+HI9xe5cmkbrqQtcJK9DwdKGvUw55UNdawkhE1xMWNW2nKLegzR+rqM52MQxu5mVjcXEnStHnJrNsfKrEcmkgk1VPlbfSCacwuRI4aSzkNwOWHCtH1EqEEbB4kOpmEymf+OLomHmmxzMuHCGNXcWktSyhM2tXpbU/0CUeBFnQ4Kjgpm7M2ILpu9rR+R3Ma9Ex5zLK5hWqSIsFqfVCIMg/vAsFqnzSU9PR9hbS/l7Omr34yrdDucToWg9WWdXhWIrEAcsTM3IIyF7G2tTDBOCkeeVcD0NKhSgX8ZY8Q6C5XuQm0oYtbfyfegt2Zf2InYdQSgbiVdUosi6wDplDoWFhQh32x1s927x7FEb7a5hbN4RXIExPIHPBIY/IffZOFF1l+kba5inqGdD+iMSd5xDo9FM3MHN1qdYB0Z5EoLtLi+DVguyvZ2gz4Xs6kAe6KTmtoct+5+TpH3A2q1G1Gp1BI48Y1jQ0j3O6/4A3X2DSD1vkD3d+Ls7kboe43c85M07H2k5FSiVSnQ6XRSOCpq7RpAkiaDdyteAB39/D/6BHiRHC0FZYrCvl/x8I2azOdrAP5p494Ubr8/HR3sbX9/eJzj8gUG3E1mWsTo/UXC8InLjv2L/Xv1IE8PHkIYCkRRhyO+XsFieUVZ2hbTduWRmZk4KR6scFjidbqqrGygoMJKaqonsqNfrY4L/fCatVotKpcJgMPwX+v0IPwEurq5/p1hhrwAAAABJRU5ErkJggg%3D%3D%27%3B%0AAddRemove%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAs9JREFUOE+Vk91L02EUx+2q/yII6iJIxRoRRlHdiRBGF0KglFIkpRWKdKEpJlqEkQRR1txsbqY1dM40Naf5sqm/+ba20sxyc75szqHzNTf36fdb2Bh104EvPJznnA/PeXn2COZJov7DZEcP7IkIlwBPhTUemfxUmYPUDoNOVPsomKygrR9g8quHYBCMRiMGgwHRonYVJQGMY+M8GQrwsG8Hee8Wyg4fqhYP6oZ5uno9uN3g9QZJTk4mMTExEiCRJMj73nFyCt9ReE9PWVk7iso+6moERs0TbK24cTkdZGbeiEiWckNP+fLZxo/ZJUyjMywvuHC5PNhnXUw45miyzlPYaueWbpq0q7f/Deju/BAq47YJigQ/d3q3udYZIKlhk5TnNp41O3hrmKe8vIX8fPnfJTyo6+d+ywy53ZDaCte6RDUHKK224HYusuGDqUkYFpvbLPrz8hr/QEIlZNZYOP/Gh8YCLwY2UHVPUakR8LqWpECWl8EiQJMeXqlAoQiQnl4UgoQAjTod+q8b1FvWWddexv80np6qGnzr4PeLEavwzeBD+LhDpQL0Iqi0pIPs7Ozf85QAbrcX/bdV3k2nMKg5xnu1kaER+D4FP2xOKlRtmIUlBLFHg8I2avUQ8fHxYYDD6cFgX+X63AUO6/Yh1/ZjHoBBUWOmOeobTDinV1hb38K3toVa00VsbGwYYHcsMDC7wtmeOPYqo8iRK+hoAWUVtOlgtD3ApljKrl25kodMJgsDRkasfFpc5qB2P/vrDpFe8ZJqcWJKJbzVQoe4wdJGStbTYyUu7kS4B69f12C1fcG3A599DuyrP5F/9FJQYuRN7ab4B2BiAjyeoJhs49Spc8TExISnIDWyuLgYVbWGu3kFpKSkcvrMWY7KjpOQcImMjPvk5Dzm4sWbHDlykujo6Mg92P1ZaWlpJCUlhZ4madcvnXNzc8nKyorwS/e/AIz06Svr2XfUAAAAAElFTkSuQmCC%27%3B%0ACmdPrompt%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAQ1JREFUOE9j/P//PwNFAGQAJZiB17Xrv17m9v+G2bv/G2TtwonN8vf+N83b+9+8YN9/6+wN/yU8W4H2Al0vXHbzv3jPh//iXW9xYrHOt/+jN//677/29//4zT/+T+tb/N8yZuH/4uLi/wwupQv+G0YV/DeOLcOLLePL/lsAMYh2jMv5rxXQAjHAwSsOFIokYxHNQIgBtp7xYM0eHh4gP4EBiI1sKMSzqJYIa0ANsHKNBkvCNMIMgokhyyEbgtUAXF5BNhSmBm4AzAv4XIDNFRgG4AsD5DDC6QJSYwLuAkfvRJKjEGSZqGYQJBqN/ev/K5iG/le2iCIaq1hE/Je3K4EYAIpiEINcTFFOBFkOAK4+5J3cVDxkAAAAAElFTkSuQmCC%27%3B%0AComputers%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZRJREFUOE+NUz1Lw1AUtT/Hn9BVcDDgYDe7iTiFTsFJXCRjcAod5FmhkA6FdCikW7oE4lCIg5AMhdehwxscInTI4HC898XU2tqPwOF93XPeffee1AAcbfueX7K1w08den1Vry05LFBBdFJodBO43RTBMIbox3CHCcRE6vHk1EbzzCJKyVuSecFE5ynQweJVISyAhA7iL8BfAK7CHgG6TWQFnBkgPkpSQODRozXvGxfO7gzEpMBdVgYLurGCM4fev77xdwhQBuFYwnwHLAq2p79gsvlGuE+2C3Ad/H6CRkQ3TX4ITCLw2qD9ZlvuFnDbJDDIYYyhhSrw2hgdIGB3Yy1QHwB1IjDMqNBtNVvl+7e2seqt1ZM4HlLRohx+n2rSimGcBxvkDR9UAs5jgmAk4dGtPOfWrRvoXyNVm5xusSig5oqEUmqdpzOwH8osVt37x4najWRlJud5DjmTiCPOIkTj0j1QgOyslIKcKqSZJF+k8Hoh1cHTQnsz4CysWwF/ENPPlOhRdFhAHF5EFqnatT6uvp/n35Q1zXl/mKThAAAAAElFTkSuQmCC%27%3B%0AMagnifier%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqxJREFUOE+Vkt1L01EYx48vFQRFdwVdVFQ3URFBd0HQjf9AhXWnBGLRMtdUiLLCt8RGbxZoQvaiglhRai03Z9Za5dbUueb2U/emNXx3upkv26ffFrndlRdfznkOz/dznuecJwkQmwsdpK7bIEJLEZEkksUyEbEmOVlEksJiYTFZLIbDYtP6tSKSkiI2igWxR/jF1lS3qFYdSxJRwJZzWnYrdexS6dmp1MfWv/tovCNXx4FCA3sLP3Hospbs6/VsO14kWxExQKXBD0sOAn4rgdE+ZmUFZS3O2CEowZyDcECS4wHmAwNRI+l59+MAdccoBGz4nF2MDJrxeyyM+yyYDB08b3iJtllLt6GT0JiN5ZlB2bhMeu7dOKBM5ycy3kv/dyOSowunzYjmTQfvPlh5YRumsX+KZwYfD6pbcNs/xio4kXM7DijV/iQy3ceA04zXbUHfYaTzq0QoMI7GPUGtbYI3E3PUmMZQ36yVjUFO5dxKALT9gKlehpxf8di/0KjrQTf8g0bzEA02FxqXG63HR1ckzLXqNiSrgQxVQgulOhkwaWHQYaTP9J6mD/08+SbxyGhHM+Dgs9uJZdiFNTRFTXs3LU31nFYltFCmjwJMDNoNOLr11L/tkW/2USdDDJ4hHB4XIyNeRiO/uNfUTuvzx2TlqeMt1PTOysEIhIdZCHnRtJl42jXJx/kg5tlpXLOT8jfPsSBnqfKLCAftZBfciQOOKppJO9/K0TOv6dFUYGytovi2jrfyeIzH3hwWZV26+pjtBzPIqbSyPy0/YQ7UatSymisz4dU+zCVZnEzPpKL8LorcEi4WlJN5OjeWk6iVSYxu8NaB/jDSDQXKs/djibHzf+hPgiSPZfMRrMU5KM/X/Ld5pYKWKiXSrXwuKh6uyrwCiJaruHBl1eYo4DduhgDBD20V8AAAAABJRU5ErkJggg%3D%3D%27%3B%0AOnScrKeyb%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJVJREFUOE9j/P//PwNFAGQAJRismSHz/H9SMLKFDAxtb/6Tg0tLS4HmgLwPNCD62H+SsELPhf8YBvz9+/f/zDNf///79w+FBlkDEgfJb7gPsQirAaS4AqcLGs78///r19//6DTIBTBx2rkAZDLIZpA/Qf4FARANshnkAmQvUj8MQCaSiuHRCEoMIA45GJyQKMkHg8MAACArvHlXxbSqAAAAAElFTkSuQmCC%27%3B%0AWinTskMngr%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJ5JREFUOE+VU9EOgCAIxPXQY7/sp/lnxpFMTEpkYzST4+AwEVFir+yUc5YYMb6LvG5ILqUsvbK1Qr0YDqKGu58AYNDacSP+xwGqzMX40+IaAImabCN/xwCGqgaMogwEAHLOHmKwkvI1g0MWQQ+jEcO1Uv5K58k6sNhZIl02F8Dr3as+DVIZyBY2rT0w+1YMg/0BmuSTGV76HHcHiWSxG7luAcTplZKTAAAAAElFTkSuQmCC%27%3B%0ASystProps%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAiRJREFUOE99kj9o21AQxl82jx67Crpo9FZDlxoyWNDBKhki8BCMBmMyBOGhuF2MmyFoKsKD0VRQh4A8GORNWQLyUFAGgzy4KEOGN3Tw0MGFDl/vnSu5TkgFH/p397vv7t0RAPHc9en7B/4pf2kckizeidSuHh3EK8BjjdYDKPnSgzv34axMGDcaxGWE2mRD4fscTo7mGQ40ixBeJwinKYIvSQmo0rPo5wQyS0gJSBYUfJMiWuasWG753b3bwFtk5CBDZexDXNUghgJG12NICXCXW7IMhOQw/g1E5MJ/70J9d6YS+gw7wGWFXJDsBqy2tetF2VeBo3swxP9BOu3AW20wWAPWZ7I9ocCPLjkQEBekJwCy6izBCQwiwGAFdO6A+jDjASrrnNytQLctGE1j78BfkNVxCKdPU1d3krUAzNu/gH4Kcd6BONOh2QZqzR4ax+b+ODxqozEHA9yXNRoaWKp/NTBxEkO8jVBpuqjbDvQTD2brH4CagzYFy7nOMJpTS/2ErYr2AOI4hHgVQGsFqJ8GXL0cYjnIb3R0MwlvnKF3nqBDUpWqb0K8IIDeitFo07fXFnrd3uEx5g8bJLc58rXkpRoNI3IQ8yIZZ8kukWBF5WIby2Pc/txCSUpJoIw30b2KCJBSNbdMLCo/AeT3OeSDhLpHc7XCIbUSw58k3OvjxAOAenEuHEoIEHyNubp6Lio/l1yuckFTEBWsjkctyf8qFzl/ABIpmnDaTkSAAAAAAElFTkSuQmCC%27%3B%0ACalculator%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAmhJREFUOE91k99PklEYx18vyrXVRbeuu278T7zK1kWtrVbO8qLwoiybM12aLEdz5mqaqUPE3JJUwAQhfwBq4i/wxwSFyECSgZZaJpaSnw5stlq+Z3v3PO+z8/2e7/d5zkkDpIM15VvjaPoRaXPrpxTf/SXF99OkldiGdOp0hnT8xDHpZEa65O1blK5kZab9ASUJkl/PgF8ECO7Bkoifkvk+hEX0/4De2S1GgjDqjye3pTCpww+SDvM8YYEaEYgyTZCrj0Ncrlwmu2SJ86WLnFHGOVsaoK3XdziBxe4nHIFO1zbZynUu1MGl55DXDPltUNAu4otNjIMppf8rsNp9+IXErsk4ReooNTZQdSd4oA1RrvmAShej0fadoemonIIFZgS5/SM0277yrCtEi2019e9cFfXpeUbcXszjXw4nMA94GJ8XzVoAs3uTFmsAy1wCozNAo2OHmO4aa9qiVE22iY4peCtUNOu9uNZBWTuKeU5Y6dhg9mYm1sIs3CkHMlOwjkF/ABRl/SgeTmAUii4qXmL0QJ3pPZpZmPJtyxMYHQlMwoLOEUHnDKOzbxHahYaeEAZnnPo3EQYnYvIEBtse3eIUtcGPTTTvVoUFVesala1Bbj8ao6h2ieGZz/IEr6y7WEUP8pVDXC8epm8Zcu5o6F2E9qFltLYYAxNr8gRa0w76GehwRDG6olRrvQgHKJvm0JhWKW+O4HDJjDF5lZv031IWnrZ5UA9CRYOHnHt91BgS3K1eILfMi2NyRV6BWty8fvGSCp+4KajyU9W5R16JhRvFr/8BHTrGZPFcbj0Fqnco7utlAX+Dk/lvcXcJCTRwbTMAAAAASUVORK5CYII%3D%27%3B%0ANetConnect%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAtxJREFUOE91k2tI01EYh8/SDxVaGpQVVAYV+CEQchRppandEMEP2WXa1Uq7MUShIk2taGWIdr86M0vn0ka1NishHTMj3RKMxtBIa00zoxxUhPH0/09mSnXghXP58Zzf+573KADhG87v3+j80Sxs/QOi5cNYERroFCF+iSL450SxKyJYMSwcOZEBclS6zZR0H+D2p7NoezTkOpJJagxj2vVjBBZ+5NKLz5JsSDsyvIsiZyl77Mu46Mqh/ruZewO1FHcdZb11PlPLNYh8N4qCZHKrn/wF8QLCayLY/HwBxzu2UtpzhcuufCo+NrHB+ppJ2gYUp7MRBQL/LBUWi2UURKj0bgJOGVj+aDZbJMheezTqtvVkt38gygT+F1skiwKRI1DsCyJibfZoQNgJB2MO2gmtnEnE/eksNc9iibmZ+QaYd+0ra27ZyHxgQK2rZsq+MOYlZYxyIeYcsiEy7IzJfcC48ykElYUwvlTJjOI+7tp60bX2Y+gc5NZLD1ctXagOXUKr1Q67EMo8CbCuHrGrFZHpkHLdjygULC5OJ++2g6qWT5idA7R+AWsf1L37xdHz+j+AvLpeRLwekWRCqBoQ22sQBwQxmiwvoOSRi6o2D/cdHkpM7ym4001S6n70+iGIkAHTUk0oosoRcdWIVbWMSw/GLzkFZcoNih52U946QL6uE31LH82ub+zIPDJcB+8zypAZqfWExOqYvOIyczdmERB1gwmRpShVRoqMbvL1XewuuInWbONZzyB36p4POfB1lQxZuLWM8J3NxO18TKJUk8gtTSiTDShX7iE2fjXR0dFoNBqqrG+50uDGZJLSHtmWMkQWhK/aRnjcJhbFJJKwNo1N6dlUGF/wtL0fa6eHe85BTta0k5CQ8Hdv+4B11lfUtn3B+AZ0dg+VNimk/3DG2EHeGZ3XUVpa2v8BZZZezjV6SD98wWvdF/KtarXa63RUDf7102SxL+9/nct7vwFQw5ZrKBhJFQAAAABJRU5ErkJggg%3D%3D%27%3B%0APowOptions%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAetJREFUOE+lk99rklEYx9e/0VU3QfdB/0JMyEaoF17JZNlg8cqsi8naClSaiBk2jOY71BbOC3/UunBBGkHEgkZu5KiGroiRWxJa6rrp03sOOHS+FNGBL5zDc57PeZ7vwzkGDP3XEoBexdQIR3X0Tu9ZN7m2W+Pzq2eUc3HUxA6j9qtaTv9D3fMAoLWdo7G/xutHyyRv3OH+1GPsdh+BQEAXIgFLiTjpdEaW3infhY9uWr6TPDkxROSUmUvjQSZdk/qARTVK6FYQj8cjAV+rT+GTn4b/NPkzx4nZgsQSL5jzRw/V54HT6SQyP4/b7ZaA2n6dTusbb9deknnwnMzDLyjKLAaDgYmJywMQ2YKAdFWv12m3D3izWSGd3SSb29U8mNLkIJFIkUplJURRFNlSn4kCsre3R6fTplR6Ty5XIhwWKrCxUWVrq0E+v8PY2Aw226g+oNlsaoFflMtVVlbe4fUWKRYrVCo/WV//QaHQYnX1Ow7H9UGAKEl4cWjYXFxzP43PG+d2KEkoVCKqftBUZXo6Kdvua6HrrghYrVZMJjMXRi7KsbqUa8zMbsv9orqkVRDDYrHoA3rHpC5EZNJy2MTw8Ljc37vp4pzxCmaz+e8AARPJQmKUC76zWEbOYzSa9D3408fRi+l68C+Q35MrucWVT9wHAAAAAElFTkSuQmCC%27%3B%0AMSPaint%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZZJREFUOE+NkjFowkAUhnVzdMxYoYubdhM6uTWbgQ7tJodDkQwiTuIimUJwEHEKHYRkKMShoFtcCnYoOGY8x4zt1m5/711MjEZbDw6O4973vvfe5QHkaG21G/xcfclzecTz8nDJIgBt3qjCuysi6JTAWkxcRffpbZh+5j55sNAZ7EoR9m11D/jIwerVkiACsJZzADnI0O9N0NYtqPfd6FEKQMHWLABr2OcBk7kPzQwSwKfLEgMC+FM7U96BAQEexxxqx5NZ/FFhX0JTkeV5D/uS5ADSTXLcANpgA2MsNIW+NyrDWoUIXQuo5CSAdjomY1A3F5HmDtCdcYS6hvBaAHoWqE9nAcbrGvWXMpRmAYEbTYB6QiMmCDX4X4D97oDNGPiyhoVQ91ZrcFPF91ycXR/d4R8GpEYW6lQTHS9hLUCBCISuINxupMHx58r+th3AGRbRf27L7KRPEzrOnpmCNHA30sB4UqQBBiXZPAq+CEAQ6oFm1iOA0D9Ve1xKpgRpsTRAvfDfuPx9VPup7CdLiMmx8jn1+N0vr+ulS/dQUwwAAAAASUVORK5CYII%3D%27%3B%0A%0A%0Avar%20directoryService%20%3D%20Components.classes%5B%27@mozilla.org/file/directory_service%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%3B%0Avar%20profileFolder%20%3D%20directoryService.get%28%27ProfD%27%2C%20Components.interfaces.nsIFile%29%3B%0Avar%20profilePath%20%3D%20profileFolder.QueryInterface%28Components.interfaces.nsILocalFile%29.path%3B%0A%20%20%20%20profilePath%20%3D%20profilePath.replace%28/%5C%5C/g%2C%27/%27%29%3B%0A%0A%0A//%20------%20Menu%20Items%20------%0Aapps.push%28%5B%27Show%20Desktop%27%2C%20%20%20%20%20%20%20%20ShowDesk%2C%20%20%27C%3A/Documents%20and%20Settings/%27+login+%27/Application%20Data/Microsoft/Internet%20Explorer/Quick%20Launch/Show%20Desktop.scf%27%5D%29%3B%0Aapps.push%28%5B%27Open%20My%20Computer%27%2C%20%20%20%20Computers%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27%3A%3A%7B20D04FE0-3AEA-1069-A2D8-08002B30309D%7D%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Open%20Drive%20C%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27C%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20D%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27D%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Profile%20Folder%27%2C%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20profilePath%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Internet%20Explorer%27%2C%20%20%20IExplorer%2C%20%27C%3A/Program%20Files/Internet%20Explorer/IEXPLORE.EXE%27%5D%29%3B%0Aapps.push%28%5B%27Notepad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSNotepad%2C%20%27C%3A/WINDOWS/notepad.exe%27%5D%29%3B%0Aapps.push%28%5B%27WordPad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSWordpad%2C%20%27C%3A/Program%20Files/Windows%20NT/Accessories/wordpad.exe%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Control%20Panel%27%2C%20%20%20%20%20%20%20CtrlPanel%2C%20%27C%3A/WINDOWS/system32/control.exe%27%5D%29%3B%0Aapps.push%28%5B%27Add/Remove%20Programs%27%2C%20AddRemove%2C%20%27C%3A/WINDOWS/system32/control.exe%27%2C%20%27C%3A/WINDOWS/system32/Appwiz.cpl%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0Aapps.push%28%5B%27Magnifier%27%2C%20%20%20%20%20%20%20%20%20%20%20Magnifier%2C%20%27C%3A/WINDOWS/system32/magnify.exe%27%5D%29%3B%0Aapps.push%28%5B%27On-Screen%20Keyboard%27%2C%20%20OnScrKeyb%2C%20%27C%3A/WINDOWS/system32/osk.exe%27%5D%29%3B%0Aapps.push%28%5B%27Task%20Manager%27%2C%20%20%20%20%20%20%20%20WinTskMngr%2C%27C%3A/WINDOWS/system32/taskmgr.exe%27%5D%29%3B%0Aapps.push%28%5B%27Calculator%27%2C%20%20%20%20%20%20%20%20%20%20Calculator%2C%27C%3A/WINDOWS/system32/calc.exe%27%5D%29%3B%0Aapps.push%28%5B%27Paint%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MSPaint%2C%20%20%20%27C%3A/WINDOWS/system32/mspaint.exe%27%5D%29%0Aapps.push%28%5B%27Command%20Prompt%27%2C%20%20%20%20%20%20CmdPrompt%2C%20%27C%3A/WINDOWS/system32/cmd.exe%27%5D%29%3B%0A//%20------------------------%0A%0A%0Avar%20nMItem%20%3D%20function%28label%2Cimg%2Cpath%2Cargs%2Cobj%29%20%7B%0A%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%20%3D%20obj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27this.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%29%27%29%3B%0A%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20if%20%28%21img%29%20img%20%3D%20Default%3B%0A%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20m.tooltipText%20%3D%20label%3B%0A%20%20return%20m%3B%0A%7D%0A%0Athis.startProcess%20%3D%20function%28path%2Cargs%29%20%7B%0A%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20var%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProcess%29%3B%0A%20%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%0A%20%20args%20%3D%20args.replace%28/%5C//g%2C%27%5C%5C%27%29%3B%0A%20%20if%20%28args%3D%3D%27%27%29%20%7B%20file.launch%28%29%3B%20return%3B%20%7D%20%0A%20%20process.init%28file%29%3B%0A%20%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%20%3D%20document.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3B%20i%3Capps.length%3B%20i++%29%20%7B%0A%20%20if%20%28apps%5Bi%5D%20%3D%3D%20%27separator%27%29%20%7B%0A%20%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%20%28%21apps%5Bi%5D%20%5B3%5D%29%20apps%5Bi%5D%20%5B3%5D%3D%27%27%3B%0A%20%20%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2C%20apps%5Bi%5D%20%5B1%5D%2C%20apps%5Bi%5D%20%5B2%5D%2C%20apps%5Bi%5D%20%5B3%5D%2C%20this%29%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.orient%20%3D%20%22vertical%22%3B%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

Моя кнопка должна была заключать выделенный текст в форме ответа в теги цвета, соответственно выбираемого из меню кнопки. (Хочу себе полностью сделать панель ВВ-кодов :) ). Соответственно, там где в моей кнопке закомментированы 2 строчки должно быть что-то другое, я правильно полагаю?

Anton написал:

Для ru-board, наверное, будет работать
var theBox = doc. getElementById ("post");
вместо
var theBox = doc. forms...

Ну да, так работает ... а нельзя ли это совместить? Или как-нибудь универсально написать, чтобы всем подходило? Нашел у себя такую кнопку для вставки цитаты, причем она работает и тут и на ру-борде:

Код:

this.onclickFunction=function(event){
switch (event.button){
  case 0: loadURI("javascript:{ta =              window.document.getElementsByTagName('textarea');     ta[ta.length-1].value += '[quote]'+document.getSelection()+'[/quote]
\n'; ta[ta.length-1].focus();}"); break;
  case 1: loadURI("javascript:{ta =              window.document.getElementsByTagName('textarea');     ta[ta.length-1].value += '[b]'+document.getSelection()+'[/b]\n'; ta[ta.length-1].focus();}"); break;
}
}
this.setAttribute('onclick','this.onclickFunction(event);');

Попробовал прикрутить в кнопку var theBox = window.document.getElementsByTagName('textarea'); ничего не вышло :)
Кстати, а можно ли в этой кнопке (Обрамление выделенного текста в ссылку) сохранять ENTER-ы в тексте, а то сейчас этот код заменяет их я так понял на пробелы:)

Добавлено:
А есть ли какая-нибудь возможность изменять размер текста в выпадающем меню?

Jarichek написал:

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

"Что-то другое" должно быть не только в тех строчках. Сравни: http://pastebin.mozilla-russia.org/past … iff=101174

Jarichek написал:

Или как-нибудь универсально написать, чтобы всем подходило?

Так не написать, чтобы всем абсолютно подходило.

Jarichek написал:

Нашел у себя такую кнопку для вставки цитаты, причем она работает и тут и на ру-борде:

Ну, тогда, наверное

Код:

var tbs = doc. getElementsByTagName ("textarea");
var theBox = tbs [tbs. length - 1];

вместо

Код:

var theBox = doc. get...

будет работать здесь и на ру-борде и ещё где-нибудь.

Jarichek написал:

Кстати, а можно ли в этой кнопке (Обрамление выделенного текста в ссылку) сохранять ENTER-ы в тексте, а то сейчас этот код заменяет их я так понял на пробелы

Замени

Код:

                            <textbox id="texttb" flex="1"/>

на

Код:

                            <textbox id="texttb" flex="1" multiline="true"/>

Jarichek написал:

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

Попробуй

Код:

m. style. fontSize = "xx-large";

Anton
здорово! :D
А как можно убрать пустое место в выпадающем меню кнопки, которое отводится под label, если этот атрибут не определен? Т.е. уменьшить ширину меню до размеров самой кнопки ну или наоборот, растянуть это меню по ширине иконки в выпадающем списке (все иконки будут одинаковой ширины)?
Да, Custom Buttons - это конечно не заменимое расширение! С твоей помощью, Anton, и помощью Infocatcher уже отпали за не надобностью с десяток расширений. Кстати, хотелось бы еще удалить и расширение UrlCorrector :) Пришла в голову идея насчет такой кнопки - по ЛКМ делается преобразование имеющегося текста в адресной строке с кириллицы на латиницу (можно в принципе и наоборот преобразование тоже сделать :) если это не сильно будет сложно), по ПКМ - выделенного текста в форме ответа (можно в принципе и во всех полях, где можно набирать текст, опять же если это реализуемо) ну а здесь конечно желательно и с кириллицы и с латиницы.

Jarichek написал:

А как можно убрать пустое место в выпадающем меню кнопки, которое отводится под label, если этот атрибут не определен?

userChrome.css:

Код:

menuitem:not([label]) > .menu-iconic-text,
menuitem:not([label]) > .menu-accel-container {
  display: none !important;
}

Infocatcher
Благодарю!

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

Jarichek написал:

Кстати, хотелось бы еще удалить и расширение UrlCorrector :)

Вообще говоря, некоторые вещи «прямее» делать расширениями, так что не нужно пытаться реализовывать все подряд кнопками. Но это так, к слову.


Кнопка для перевода выделенного текста в другую раскладку

Код:

Код:

this.switchSelKeybLayout();

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

Код:

this.noSelUseFullText = true;
this.convTableForward = {
    "\"": "@",
    ":": "^",
    ";": "$",
    "?": "&",
    ",": "?",
    "/": "|",
    ".": "/",
    "э": "'",
    "б": ",",
    "ю": ".",
    "Ж": ":",
    "ж": ";",
    "Б": "<",
    "Ю": ">",
    "Э": "\"",
    "х": "[",
    "ъ": "]",
    "ё": "`",
    "Х": "{",
    "Ъ": "}",
    "Ё": "~",
    "№": "#",
    "Ф": "A",
    "ф": "a",
    "И": "B",
    "и": "b",
    "С": "C",
    "с": "c",
    "В": "D",
    "в": "d",
    "У": "E",
    "у": "e",
    "А": "F",
    "а": "f",
    "П": "G",
    "п": "g",
    "Р": "H",
    "р": "h",
    "Ш": "I",
    "ш": "i",
    "О": "J",
    "о": "j",
    "Л": "K",
    "л": "k",
    "Д": "L",
    "д": "l",
    "Ь": "M",
    "ь": "m",
    "Т": "N",
    "т": "n",
    "Щ": "O",
    "щ": "o",
    "З": "P",
    "з": "p",
    "Й": "Q",
    "й": "q",
    "К": "R",
    "к": "r",
    "Ы": "S",
    "ы": "s",
    "Е": "T",
    "е": "t",
    "Г": "U",
    "г": "u",
    "М": "V",
    "м": "v",
    "Ц": "W",
    "ц": "w",
    "Ч": "X",
    "ч": "x",
    "Н": "Y",
    "н": "y",
    "Я": "Z",
    "я": "z",
    __proto__: null
};

this.convTableBackward = { __proto__: null };
for(var c in this.convTableForward)
    this.convTableBackward[this.convTableForward[c]] = c;

this.insertText = function(ta, text, noFocus) {
    var editor = ta.QueryInterface(Components.interfaces.nsIDOMNSEditableElement)
        .editor
        .QueryInterface(Components.interfaces.nsIPlaintextEditor);
    if(editor.flags & editor.eEditorReadonlyMask)
        return;

    var sTop = ta.scrollTop;
    var sHeight = ta.scrollHeight;
    var sLeft = ta.scrollLeft;
    // var sWidth = ta.scrollWidth;

    if(noFocus) {
        var val = ta.value;
        var ss = ta.selectionStart;
        ta.value = val.substring(0, ss) + text + val.substring(ta.selectionEnd);
        var se = ss + text.length;
        ta.selectionStart = se;
        ta.selectionEnd = se;
    }
    else {

        if(text)
            editor.insertText(text);
        else
            editor.deleteSelection(0);
    }

    ta.scrollTop = sTop + (ta.scrollHeight - sHeight);
    ta.scrollLeft = sLeft; // + (ta.scrollWidth - sWidth);
};
this.inPrimaryLayout = function(s) {
    var c;
    for(var i = 0, l = s.length; i < l; i++) {
        c = s.charAt(i);
        if(c in this.convTableForward)
            return true;
        if(c in this.convTableBackward)
            return false;
    }
    return false;
};
this.switchKeybLayout = function(convTable, s) {
    var r = "", c;
    for(var i = 0, l = s.length; i < l; i++) {
        c = s.charAt(i);
        r += c in convTable ? convTable[c] : c;
    }
    return r;
};
this.switchSelKeybLayout = function(s) {
    try {
        var ta = document.commandDispatcher.focusedElement;
        var val = ta.value;
        var sel = val.substring(ta.selectionStart, ta.selectionEnd);
    }
    catch(e) {
        return;
    }
    if(this.noSelUseFullText && !sel) {
        ta.selectionStart = 0;
        ta.selectionEnd = val.length;
        sel = val;
    }
    if(!sel)
        return;

    sel = this.switchKeybLayout(
        this.inPrimaryLayout(sel) ? this.convTableForward : this.convTableBackward,
        sel
    );
    this.insertText(ta, sel);
};

Можно было вставлять текст в readonly-поля – исправил.
Только не понял, как вызывать editor.canPaste() – на MDC написано только

Код:

boolean canPaste(in long aSelectionType);

А где брать aSelectionType, я не понял.

Если будет глючить – удалить или закомментировать

Код:

    if(editor.flags & editor.eEditorReadonlyMask)
        return;

Jarichek написал:

...
1) ...
2) ...

http://pastebin.mozilla-russia.org/101198
?

Infocatcher

А где брать aSelectionType, я не понял.

Я предполагаю, что скорее всего из nsIClipboard

Код:

PRInt32 kSelectionClipboard = 0
PRInt32 kGlobalClipboard    = 1

Anton написал:

Я предполагаю, что скорее всего из nsIClipboard

Да, похоже на то.

И я как-то забыл, что есть и другая сторона вставки текста – если в буфере нет данных в нужном формате, сanPaste() вернет false.
А нужно было определить, что в данное текстовое поле можно вставлять текст – то, что сейчас делается через

Код:

    if(editor.flags & editor.eEditorReadonlyMask)
        return;

Anton, Infocatcher
Да, спасибо вам обоим :) Пока вроде все работает как надо

Anton написал:

Сдаюсь.

У меня есть только один маленький вопрос,  там в коде скрипта есть такой фрагмент:

Код:

    var n='';
    var u='';
    var c=navigator.lastClicked;
    if(location.hostname=='forum.ru-board.com'){
        while(c.className!='tpc' && c.parentNode){c=c.parentNode};
        if(c.className!='tpc')return;
        var tn=c.parentNode.parentNode.childNodes[1].childNodes[0].childNodes[1];
        n='[b]'+c.parentNode.firstChild.innerText.replace(/\n.*/g,'')+'[/b] ';
        u='[url=+tn.childNodes[5].href+][color=#007777][size=1][u]'+
        tn.childNodes[7].innerText.replace(/^ +/,'').replace(/ +$/,'')+'[/u][/size][/color][/url] ';
    };

Тут, если выделять что-либо в ответе пользователя, то переменной "n" присваивается имя пользователя, а переменной "u" - ссылка на пост с временем этого поста. Как такой код правильно в кнопке сделать? :blush:

Jarichek
Если добавить в раздел "Инициализация"

Код:

var THIS = this;
window. addEventListener
(
    'mouseup',
    function (e)
    {
        if (e. target == THIS)
            return;
        navigator ["lastClicked"] = e. target;
    },
    true
);

то, скорее всего, будет работать указанный тобою код. Только надо заменить

Код:

location.hostname

на

Код:

gBrowser. contentDocument. location. hostname

Эх, к сожалению не работает :(

Jarichek
Ну, попробуй так:

Код:

var THIS = this;
window. addEventListener
(
    'mouseup',
    function (e)
    {
        if (e. originalTarget == THIS)
            return;
        navigator ["lastClicked"] = e. originalTarget;
    },
    true
);

Код:

var n='';
    var u='';
    var c=navigator.lastClicked;
    if(gBrowser. contentDocument.location.hostname=='forum.ru-board.com'){
        while(c.className!='tpc' && c.parentNode){c=c.parentNode};
        if(c.className!='tpc')return;
        var tn=c.parentNode.parentNode.childNodes[1].childNodes[0].childNodes[1];
        n='[b]'+c.parentNode.firstChild.textContent.replace(/\n.*/g,'')+'[/b] ';
        u='[url=+tn.childNodes[5].href+][color=#007777][size=1][u]'+
        tn.childNodes[7].textContent.replace(/^ +/,'').replace(/ +$/,'')+'[/u][/size][/color][/url] ';
    };

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

Jarichek
Обработчик 'mouseup' не на месте
http://pastebin.mozilla-russia.org/101239

Anton написал:

Обработчик 'mouseup' не на месте

Да, спасибо, единственное что пришлось добавить:

n = '' + c.parentNode.firstChild.firstChild.textContent.replace(/\n.*/g, '') + ' ';

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

Anton
хочу еще 2 вопроса выяснить:
1) В тем кнопках, которые ты мне написал, где появляется окно при клике, как этому окну можно присвоить свои высоту и ширину?
2) Как можно проверить текст в переменной, является ли он ссылкой (например, есть ли у него в начале "www.", "ftp://", "http://")?

Jarichek
1.

Код:

<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                id="dlg02"
                title="Custom Buttons"
                onload="windowController.init()"
                width="640" height="480"
                ondialogaccept="return windowController.accept();">

2.

Код:

if (переменная. indexOf ("www.") == 0)
{
    ...
}

p.s. Исправил - забыл закрывающую скобку в if ...

Спасибо вам, друзья, за помощь и терпение :) Вроде бы желания уже иссякли

Капец полный.Сегодня обновил все расширения и у меня полностью слетели все кнопки.Методом тыка выяснил,что причиной стало расширение Adblock Plus.Каким макаром оно повлияло непонятно,но факт что конопки просто исчезли,как будто их и не было.Помогло только отключение Adblock Plus.

vv07
а если обновиться до версии 0.0.4.4? На АмО есть, во всех версия пока что :) Вроде там исправлялась ошибка работы с Adblock Plus -ом.

vv07
Доступна новая версия, 0.0.4.4, она не конфликтует с ABP 1.1.1
Её можно установить отсюда: http://custombuttons.mozdev.org/installation.html

или здесь: http://forum.mozilla-russia.org/viewtopic.php?id=10943

FFUser665 написал:

кнопка запуска внешнего приложения срабатывает только один раз

Ну если только для запуска блокнота и без параметров то вроде так:

Код:

var path='C:\\windows\\notepad.exe';

var file = Components.classes['@mozilla.org/file/local;1']
    .createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);
 file.initWithPath(path); 
 file.launch();

FFUser665 написал:

потому что охота потом соорудить следующее:

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

Код:

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%3EFavorite%20Applications%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%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%5Bvar%20login%20%3D%20%22Administrator%22%3B%20%20%20%20%20%20%20%20%20%20//%20Here%20put%20your%20login%20name%21%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%20%20//%20So%20you%20can%20use%20%22Show%20Desktop%22%20command%21%0A%0A/*%0AIf%20you%20deleted%20%22Show%20Desktop%22%20from%20your%20Quick%20Launch%20toolbar%2C%20just%20enter%20this%20URI%0Ain%20your%20Firefox%20and%20save%20the%20file%20as%20%22Show%20Desktop.scf%22.%20Then%20you%20can%20put%20it%20in%20you%20Quick%20Launch%21%21%0AShowDesktop%3D%22data%3Aapplication/x-unknown-content-type%3Bbase64%2CW1NoZWxsXQ0KQ29tbWFuZD0yDQpJY29uRmlsZT1leHBsb3Jlci5leGUsMw0KW1Rhc2tiYXJdDQpDb21tYW5kPVRvZ2dsZURlc2t0b3ANCg%3D%3D%22%3B%0A*/%0A%0Avar%20apps%20%3D%20new%20Array%3B%0ADefault%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACkElEQVR4XqXNa2jVZQAG8N//nJ3jmbs4l6XZhSGI0sWhQ9CCpKhcWljOYCLZDZEgsA+RFEQWCcEsF8vsy9yHLiKCGxgsVnZZzLm2BV2kYdgWJ7cyN6Zn7nLO8bwh9KmBX/rB8/F5niiE4H/r2qX+xLPaTu4TPt1mvG2LyfYnjaAYcdcQXS1PxBzOZnh4L0bI/M7oKL+ccD6W1Vt7VB1yKMwauPpcvd6m6+7BcWQxByVkphjKcbbd4cfa7MDUf0dilzM2Dg0gzfRl6e//sG84q7Ww0ExZDVVLyOdsbqn1IlKIAEDfHiH0C6FTSO/ViuW4teEFa3/rrSyEv4WZHuHI1lRI7vwod8u2lqeQQASxzBky3chy8002vVHnelw8OPXJK5svNEcqSMb5NXOnxTXriiZnHCqrb0nfsKV5OxKxfNLuzi9cchGlole3+ybT6UC5P28zXkEBw6xeNGDZYJ/b77s/mn/XqoX5bHYDSiMkv3zG5XvvVqQYU5iLxYhjEEmG0rxz7vn+gQdfW1UqGX1+sp++gY4YcoWk/EiCn0bJ1mAMP+MvXKL7K3q+lW7a/97TUTT8VmpJifLVa2QrylfGEKbH7Ow56nTXcQ2nWl2BoTGGKrGCsYvzfLbmyHlMd9RWN5bk4yZGZ4TxTCoCJFCO4o5dTi99VHnPuy4cG1u3oG7FDxpT+5294wk3zg0SybiRqci5HLraRYAIRYg3r7c15NUeiuq/O7Xs8YbUvMpocnkVySpGUYoJ/NguMXAmbTYJzMeiBRvffq7ykaYPyjYc6PX+YPDmSHCwO/g6hKjuwwKqzSZCEZIoRmXZA417vHwsxHd8PD1n7esNsYeapotW7n4JSyPXFiGOJEr/DVxBwOQ/YMb/YyJTjUkAAAAASUVORK5CYII%3D%27%3B%0AGchrome%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAAA5AAAARgAAAEEAAAA4AAAAJAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAU8dLhSTS2YrwmGEU9U8hoPMCXCHwAg/SqMCEBNtAAAALQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGRUeD3dShTXYerNF/3nFov844ff/E9///xLY//8Vz/X/G6jG8RBIVqoAAABAAAAABQAAAAAAAAAAAAAAChsoEndjpzvzY6sr/3q7nf835f//Etz//xDZ//8P1vz/EdL3/yDJ7f8jwOP/D2d7wwECAjUAAAAAAAAAAAcNBD5enDjpUq4e/0CPFf91n5z/ZeP5/zbm//8h3f//Edn//w/X/f8U0PX/H8Hl/yC94f8NUWGhAAAADQAAAAY5WSWYYLYw/0CiHv9LskP/V6BZ/3iUkf973O7/XfD//zjl//8O2f//Ddf9/xLP9P8iweT/HKbF8wMSFTwOFAooZJxD11CuLf9MsEX/Vr1t/23Tm/+Zyqn/fYGB/4ajr/+Qzdv/bOv//xLb//8O1fr/Fsjt/yK94f8LS1l5KDYeTWyxTO5Lrz7/Vrxq/2jOmP+m2bz/ZHpc/01JMP9aQCD/TD8y/3iQmv9e5fz/Ctf+/xLQ9f8hxOn/GXOIoSk7IFNntVL0ULdX/13GiP+S4L7/epN2/2VWJP/Hghv/340n/7l7Iv9TRzT/ZbLI/yTi//8J1f3/H9H2/x17kak1Qi86d8Bv6la+bv9q0KH/ot69/2JuTf+8fiz/759M//K6g//yo1L/mXs+/1ubp/887///I9Tt/0Covf8fc4mRHyocC3u6fMpiyYn/c9Sq/6Tfwf9wcWH/wYg4//WtYv/2yJH/96te/7KNTP9ff5P/Voel/0NQkf9KWbL/Hl9xUwAAAABTelpzgd6q/5Hfu/+ZwKn/hYS//3RjY//Hk1//0o9Z/7J5Of+WhI3/UE/U/w8I3f8JA+7/P2Dz3RQnJhEAAAAAFyEaDKTiw8244sL/jY+5/zQy9/9kZdT/a2me/2dilf9naK//YmPt/xEQ8/8AAOr/EhL0/ytPj1IAAAAAAAAAAAAAAAA5SUMqpcip2nJ0sP8WFeb/AwPh/yor5f81NuX/ISHk/wAA2f8AANb/CAje/w0Nj3kAAAAAAAAAAAAAAAAAAAAAAAAAAB8kHRZAQ4OKXFzf7iUlzP8TE8v/EhLK/xoay/8tLc/+NTXD0h8fe1YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2cD98fOOadnbc03d33Nh/f+TAa2u9bx4eNBcAAAAAAAAAAAAAAAAAAAAA+A8AAOAHAADAAwAAgAEAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAEAAMADAADgBwAA+A8AAA%3D%3D%27%3B%0AIExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAgtJREFUOE+NU99LU2EYnvSHdNP0uHUcw7n8RTmNgYKgWESXQexGNAoSIsoiutDhUDbndEmLWo1ayEydgV1FXWi1HINipC1rP9x2cptnJoo8nu+Dc9xxg3XggcP3ve/zvu/zPl8FAMX/fuaVGA0+keMUN9rYCppHCMphZCmI4eWoEHYUS85o8VLJ5FJE15s1dAR2ce62j0KML0kgJplCMRAYV3eg9Weh8nLQvN6C3p2QSIoICtu0hLNo9P2C8r4fpyyfwbiiqHr0B6wriQb3pqwTaYSxLynanuFjHo0zETBd/dC0XsaZi9dRfXMB1Y4YTk/EUf8sW0xQmEwImAeLULb3SvMSAv1wAKw9AZ3zL4Woh0zE1g95sN40Kh8LLdvXwdgiUFkjUFt/g7XGoR3fRMNUBoYnXDHB2SUe7CsOldNRqAe/loWsA5N/A3VzPFSuBJTjGzhpegpd97WykHzQPL+DWu82agSVVfYoGHMY6ksPZcYhOjR5ePQFD3DH//1ohCuC4uzkGq2mf56D1plCjTCvZjRONyBuweDj0Rvah/UbL99C52waLbde0mqUxCGsypmBfkIwztQWml/k0P3uHwZCexhaTtJkEic6UmGc4SQCkaT27ns02dZh9CTRM5fB1dmf9F/UpdD+ih73D9TfeysxXnCsSlWOC1nq3VAfnLcFoBv6BJJc7mUevz8EdJ2boXU7oPQAAAAASUVORK5CYII%3D%27%3B%0AShowDesk%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAioFc/4lLHf9dPCL/Sj8u/zZMRv86Ukv/O1RN/0VhWf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZbEv+tSQT/p0wR/8F4MP/BeDD/wXgw/8F4MP9FOCj/OUc+/ztTTf8+Vk//RmNb/1p+dP8AAAAAAAAAAAAAAAC2WxL/tlsS/7/WzP++8vv/t/D7/7fw+/+37vv/wXgw/8F4MP/BeDD/wXgw/1M3H/8+Qjf/TGpi/wAAAAAAAAAAtlsS/8fQvf/F8/z/xfP8/8x6O//Mejv/zHo7/7fu+/+37vv/t+77//DOpv+1UAH/tVAB/ztUTf8AAAAAAAAAANiBJ//L0bz/yvX7/8r1+//3ozD//+PH///lzP/Mejv/zHo7/8x6O//Q9vz/8M6m/8xnAf87VE3/AAAAAAAAAADYgSf/z9K9/9D2/P/Q9vz/96Mw///lzP//5cz//+XM///lzP/Mejv/0Pb8/9D2/P/MZwH/PldQ/wAAAAAAAAAA2IEn/9Tt7P/U9vz/1Pb8//ejMP//8+f/AQ4U/wEOFP/Zhzf/2Yc3/9mHN//U9vz/zGcB/zZMRv8AAAAAAAAAANiBJ//c+P3/3Pj9/9z4/f/3ozD///Pn///y5f9hhJL//+TJ//XDkP/Zhzf/2Yc3/8xnAf8pOTX/Ql1V/2eShv/YgSf/4fn9/+H5/f/h+f3/96Mw///8+f//8uX///Pn/9mHN///5Mn//+XM//zRpv/Zhzf/ETG5/y9CPf9UeG7/2IEn/+Xi0P/o+v7/6Pr+//ejMP////////r1///y5f//7dz/2Yc3/9mHN///5cz/H1zV/y6G8v8RMbn/bJiL/9iBJ//YgSf/7Pv+/+z7/v/3ozD/+7JB//uyQf//+vX///Ll/8x6O//s+/7/2Yc3/9mHN/8eJJb/AAAAAAAAAADYgSf//+26/9iBJ//0/P7/9Pz+//T8/v/w2L//+7JB//uyQf/Mejv/9Pz+//T8/v/Zhzf/O1RN/wAAAAAAAAAA2IEn/++mRv/vpkb/2IEn//DOpv/w2L///P7///z+///8/v///P7///z+///vpkb/2Yc3/ztUTf8AAAAAAAAAAAAAAACOn4b/oLac/6ilhf/vpkb/76ZG/++mRv/vpkb/8tKf//LRo//vpkb//L12/9mHN/9Sc2n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+mRv/vpkb/76ZG/++mRv/vpkb/AAAAAAAAAAAAAAAA//9zQQD/c0EAB3NBAANzQQADc0EAA3NBAANzQQADc0EAAHNBAABzQQAAc0EAA3NBAANzQQADc0GAA3NB/wdzQQ%3D%3D%27%3B%0AComputers%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZRJREFUOE+NUz1Lw1AUtT/Hn9BVcDDgYDe7iTiFTsFJXCRjcAod5FmhkA6FdCikW7oE4lCIg5AMhdehwxscInTI4HC898XU2tqPwOF93XPeffee1AAcbfueX7K1w08den1Vry05LFBBdFJodBO43RTBMIbox3CHCcRE6vHk1EbzzCJKyVuSecFE5ynQweJVISyAhA7iL8BfAK7CHgG6TWQFnBkgPkpSQODRozXvGxfO7gzEpMBdVgYLurGCM4fev77xdwhQBuFYwnwHLAq2p79gsvlGuE+2C3Ad/H6CRkQ3TX4ITCLw2qD9ZlvuFnDbJDDIYYyhhSrw2hgdIGB3Yy1QHwB1IjDMqNBtNVvl+7e2seqt1ZM4HlLRohx+n2rSimGcBxvkDR9UAs5jgmAk4dGtPOfWrRvoXyNVm5xusSig5oqEUmqdpzOwH8osVt37x4najWRlJud5DjmTiCPOIkTj0j1QgOyslIKcKqSZJF+k8Hoh1cHTQnsz4CysWwF/ENPPlOhRdFhAHF5EFqnatT6uvp/n35Q1zXl/mKThAAAAAElFTkSuQmCC%27%3B%0AWExplorer%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAADNmjT/////AP7+/gD+/v4AOWzSCwAAAPj////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AzJkz///////////////////////Cjyn/AAAAEQAAAAL///8A////AP///wD///8A////AP///wD///8AAcyZM/8zZswAAACaAAAAAAAAAAAAAAAAAAAAZgC+iyUA/f39AP39/QD+/v4A/v7+AP39/QBQg+kLAAAA+P////4E////AAD4kgAA/f0A9fYCAMTVKQD1DjIA/P/nAA87uQAhFAsAJiYXAAAAAAAAAAAAr3wWAAAAAB8AAADhAAAA9gT+/v4AAPT0APPp6QCitxQAIl1DAAkFAwAKAwAANw8AANrd7AC1kFEACPrTAPz8/AAGBgYAs4Aa1urq6gABAQELBP7+/gAA9fUA49fXABE6mQAaFwMA+foAAPn7AADL6gAADxsUAA9AmAA8MBcAAAAAAADngQDq+PgAroeNAAAAAB8E/v7+AP3x8QDn3t4ADScFABYAAAACBgAA8QYAAN/5AAD89gAA/QPxAAAAsQAAAAAA+d/fAN/n5wDq+A8AAADsCgL9/f0A6ODgABUWGAAA9vcAFgAAABEAAAAHAAAACAcAAPn8AAAS/NcAAPj4AAD4+AD39/cA387OAH+j7D4AAAD5Av7+/gDi4uIAIjBLABf/8gDp7/UA8QAAAPkAAAADAQAA4szdAA334AAA7+0AAPT0AODg4AAEBgYAAAAA+QAAAOgE/Pz8AAICAgAMLVMANvDWANnaygDpBDQA9fv7AALy6AAZ8OYA9t7NAAD49gAAHSEA3d3dANvl/AAAAAD9AAAA+AT7+/sAISEhAAD8/AAA68oAJwz1ACcA2AAACAAAAA0AAO4QEAC7vzcACM+3ACf+3QD69/cAeqL2PgAAAPkAAAD+BAUFBQDY2NgA1tZFAP39/QD+/v4A/f39AP39/QD9/f0A/v7+APsIMADICVQABNK7ADgsKgAAAMz5AAAA6AAAAPgERHfdCwAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAAxgCggI3MCPXUAAAAzP0AAAD4/////gEAAAACAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAA/QAAAOH////2Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAgAAAAAAAAA+P////59OFeo8fymrgAAAABJRU5ErkJggg%3D%3D%27%3B%0ACtrlPanel%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAAIuuYjyvIgAAACBjSFJNAACHGwAAi/8AAP/YAAB91AAAgSAAAOmkAAAz8AAAJVC/P0EaAAAEG0lEQVR42mJkTDzG8P/ffwYpEU6Gzz/+8H//9Y+dh4s1+cOn3+zMbMwWf/8wWAAVMOi/nLtX8uet4L+MrAz/GBgYmIHY/ft3BoAAYgHSOYyMjCIfv/2x+Pnnv8WfH/+YPnz4zMsAVMbC+p9BQYCV4dNfNoYvf9j4vn37wvCXkZ3hF9BADyFhBtVv3xgAAoiF4e/fif+//Wb6+ukvAzvrPwYtUVYGSyM+Bl15HgYTLSkGRUkOhty5txkOXP//F+TSv/9+MrCxsjBICggw/H73jgEggFgYvn37HGXEx+9lJMpgqCrEoCTJw8DBycoAAh++vGP4y8TO8O8/IwMj0FaGf38Y2ISUGZgktBlYGR4x/P//nwEggFj+//jBkO2py2BlIAnW9Auo7uMvBoYfP38zvD2aycBr1MPAxsLO8PsvM8PPb58ZhByDGb4x8TAwPL0HNJiJASCAmFhYWRkevvoG1vz9NwPDN5Dm/wwMX57sZPjLrcnAwCfLwMXJzPDr19//X8XNGX5JWzP8/flVjOnLq5lC7G+XAwQQCwsLE8PHL7/BBvwG2v7zL9AVQAO+3V/E8E86juEvkP3/90+GbyzCzJ90wsRUuDhmGqgKO6v/4ufl/HiCASCAWJgYGRlefQBay/Cf4fsfRoZfjEDNTw4x/P5wiYHVyInh/hsGhhc//jEEhwU4OFmo3/vOxMN98Yo8w+p/ir8EX0uvBggAQQC+/wQBAAAA8fkCAPf25ADuzJEABC2AAPnkrgD/FUcA6ujpAMTU2gBKOz4ADgkHBcfU4wXNzbvV8efcyCAD8ZMlFRvSAgBBAL7/BAYFAwDz9vgA+AcnAP8IHAD0vkgAAAUPAPkplQCyqrAAEQDYAKTmJQDhz8HdGv3XbBUE9L8QAQT5BgIBAAP+/QACiAUc8n/+Mvz8DYw6pVyGf68OAWML6CUuBQYG23yGHwxfGMwefmK4/fj2dQbu5zsYhIFpjJmNAehZcLgBBBALIxMTw2dgIH79AQo8YGjrLWb4/fEWw+8/DAyaAowMh9/zMnAy/2L4w8TP+uLjK4a33xkZ+Pn/M8gKAh3K+I8BIIBY/gDN+gNMYT+AGn4AI+M3IzfDT35DsOninAwM8m9+Mxy5+Yrhz5+/zIzAhPPr1x+Gly+/MHz78p/h5x8hBoAAYvnz9x/DT6BrmNiAOoCGfAUmiRcf/jLcuPmU4eS5+wy3rt1g+Pfuyk8VtkefeNk+gxMPCAC9z/CekZkBIIBY/v/5wvL8LQfDtGW3GO49eMXwCpjCvjy7+Ov/99cf2P5/mKvO/eseA/v7E0wsbPc5OHmByfcfAzIACCAW9t9v3t6/+vzP0wub//D+f3pGkPnZaQHmP2t4eTjvMTKzfmZj4wAmbXagRiag7f+BNIp+BoAAAwDAMqTgcw5bNAAAAABJRU5ErkJggg%3D%3D%27%3B%0AMSNotepad%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAoJJREFUOE+lk/tL01EUwO0fy1ely6IUMoi0AoM0Sy1TMDMitZyvfLDNdM5HPle6RNt0mlvz0ebmYzoVN5vO4cQ5yxQFAz/NbxTo9Kcu3Hu4h3s/fM6BcwYI+q91CBBXdGDtjaG88LUQywoK/9yLJEKseaulRnzX/5Sg41tIiKsWaauX0mdxolUr6Btz0NpWh9Ls4ZNugHbbDpklMvKkTQEQAVD4YQmN+yeGzX00qzvUu9aodKwhc25TurhLtnWbuNb10wF5ygUqnD4UTg8Sxwa5Nhc5026eTnpIG18lYWSdBO3B6QCF2krutI838z7ypzdJNS+RZHJz3/idWyNeLvd7iFEfkKYwnFxCl95Mnm2FdPMGj81bxA25uKZfJla3wZXPm4R0exC93yGtdysAIvRAPWSm1rlEvP4H8UM+ogZcRPS5idKsc6HHQ7BymUj5Kum6A15KWo5YCIAeg5ku7xTXtV5itD7CuhcIVzm41LlChNLO2Xoboko7qV1bpFQNHLEQAB/9JUzsWUkaXOVih4tz7dOENU8gejeLqMFGsMyCqGCSpFoHyU32QIBKb8G6byR/fJmLTQ5C60Y5LzchqrYQKflKcNEXIrMNJBaP8ah1jVdVzf/KEAxUOgsLv6ZodM5xtWGe0LIBQkq0RBSPEF48TIjYRLTYRkqd3W+wyL2c0qOADp2ZyT0jet8Md1Quf8OMxCqnSO63kzVuJ2d2huhMKS8KyykqrQ5sYrfBb8AExt1hVOtzlLkHkXtHaVxxIJuZJ7trnhsJz0+fhXqNlc5lO3LTN3I7p3hQMcjNrBZuP6wkOb2EfLH0xM/CJB8eGc+kJGbIeJJTISge1zxpCv/mfgPvVs+ANDa5fgAAAABJRU5ErkJggg%3D%3D%27%3B%0ANotepadPP%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAD//P8A//zwAP/3/wD/9/AA8P//APD98ADw9/8A8PTwAPD34ADw5+AA7///AO/08ADg8P8A4PDwAO//7wDv8O8A4PTvAO/o/wDg5/AA7+3vAO/n4ADg6O8A4OjgAODi4ADg3+AA4NzfAODY0ADf7+8A3+DgANDg7wDP+P8AwPD/ANDg0ADf3+AA393fAN/Y0ADQ2tAA0NDfANDU0ADQ0M8A0M/QAN/HwADP3N8Az9DfAM/Q0ADP1M8AwNDPAM/M0ADAyNAAz87PAM/HzwDPxcAAwM/PAMDEwADAx78A0LfQAM+3wADAv8AAsMjQAL/HwACwyMAAoMDAAJ/A4ACQx98Av8C/ALDAsACfr8AAn6DAAI+YwAC/v78Av7e/ALC4sACwt78AsLCwAL+orwC/r6AAv6egAK+/vwCvv7AAr7ewAK+vrwCvr6AAoKigAKCkoACgn7AAn6i/AJCosACfop8AkKCfAJ+foACPh68An5yfAJCYkACQl5AAj5CQAICQnwCPj48AgIeAAH/P3wBf3/AAT8jgAEDI3wB/sN8Af7/AAG+3wABgt8AAYKiwAH+QkABfoK8AT6+/AECgvwBAkK8AQICgAECAnwAw2OAAMNDvADDI7wAg0O8AIMjvACDH4AAvwNAAEMDgAC+43wAvl68AcGiPAHB4cABwd3AAb2xvAEBPXwAAAAAAf5CfAH+PkABwgJAAf4SPAHCAgABfmL8AUIe/AE+HvwA/zPAAP8fwADDP/wAwwvAAP8jvAC/A8AAwvPAAL77wAC+18AAguPAAH6//ABCH0AAfiM8AEIfPAA+A0AAgh78AH4i/AB+PsAAQgL8Af2/wAG93wABgWN8AYF/AAHB/gABveIAAYHeAAEB4vwBAf7AAQHigAEBwrwBfeJ8AUE+/AE9PrwBfUI8AT1+PABB/0AAQf88AD3/QAA9/zwA/YJAAP2CPADBojwA/X48AL1yPAC9YgAAvV4AAIF+PACBcgAAQfL8AEHiwABB3sAAPfL8AD3ewAABwsAB/fX8AcHh/AHB1cABgcH8Ab29wAG9qbwBgaG8AYGdvAGBiYABQZ3AAX2dvAF9gYABAYH8AUFhgAF9bXwBAT1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AYGF/f35hW0H+/v7+/v7+/lAHAAcTIjVQW2BhfX1+XP5TABMMAwgOBQAHAQADBS3+UwAWBwoACRkVAAAAAwBP/lsHJCAZgEIYBwQTAwcAYP5TAAsFAitobB0DEAsHB13+WwcxLyYzanJ7EQULBDEx/lcAMS8tGj14dW8wKhBd/v5TADUhNSYlPnpzcE0bXf7+WwtSNSY0ODdmd3lrKkj+/lcHJiImJCYzOmlldXES/v5bByIXFxABAgYfYnNkZ/7+WwdFRk8uNSlKWVZuY208/lwXRzlFTkFLTAMoQj8eXzJdFhcUIyRBNVEm/v7+VEN8UyYmMzE1QVhX/v7+/v5EWgD///8AAf//AAH//wAB//8AAf//AAH//wAB//8AA///AAP//wAD//8AA///AAP//wAB//8AAP//ADj//wB8//8%3D%27%3B%0ATimenDate%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAqBJREFUOE+Fk2tIk1EAho9F2J8uFF0gol92g6j+WEFGTGrQBYYynGnrYllOwbIx2aJWUEiJoZiFIYSaoJFdSEFrXcwaUZFz4Vrq5mWX+lz25UQpop62SaOLowPn1+F5znvOeU8cIGKN7FcbIosJc3cK24cvQozPF9/erxDXM5PjokxYMNk8+HI9xe5cmkbrqQtcJK9DwdKGvUw55UNdawkhE1xMWNW2nKLegzR+rqM52MQxu5mVjcXEnStHnJrNsfKrEcmkgk1VPlbfSCacwuRI4aSzkNwOWHCtH1EqEEbB4kOpmEymf+OLomHmmxzMuHCGNXcWktSyhM2tXpbU/0CUeBFnQ4Kjgpm7M2ILpu9rR+R3Ma9Ex5zLK5hWqSIsFqfVCIMg/vAsFqnzSU9PR9hbS/l7Omr34yrdDucToWg9WWdXhWIrEAcsTM3IIyF7G2tTDBOCkeeVcD0NKhSgX8ZY8Q6C5XuQm0oYtbfyfegt2Zf2InYdQSgbiVdUosi6wDplDoWFhQh32x1s927x7FEb7a5hbN4RXIExPIHPBIY/IffZOFF1l+kba5inqGdD+iMSd5xDo9FM3MHN1qdYB0Z5EoLtLi+DVguyvZ2gz4Xs6kAe6KTmtoct+5+TpH3A2q1G1Gp1BI48Y1jQ0j3O6/4A3X2DSD1vkD3d+Ls7kboe43c85M07H2k5FSiVSnQ6XRSOCpq7RpAkiaDdyteAB39/D/6BHiRHC0FZYrCvl/x8I2azOdrAP5p494Ubr8/HR3sbX9/eJzj8gUG3E1mWsTo/UXC8InLjv2L/Xv1IE8PHkIYCkRRhyO+XsFieUVZ2hbTduWRmZk4KR6scFjidbqqrGygoMJKaqonsqNfrY4L/fCatVotKpcJgMPwX+v0IPwEurq5/p1hhrwAAAABJRU5ErkJggg%3D%3D%27%3B%0AAddRemove%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAs9JREFUOE+Vk91L02EUx+2q/yII6iJIxRoRRlHdiRBGF0KglFIkpRWKdKEpJlqEkQRR1txsbqY1dM40Naf5sqm/+ba20sxyc75szqHzNTf36fdb2Bh104EvPJznnA/PeXn2COZJov7DZEcP7IkIlwBPhTUemfxUmYPUDoNOVPsomKygrR9g8quHYBCMRiMGgwHRonYVJQGMY+M8GQrwsG8Hee8Wyg4fqhYP6oZ5uno9uN3g9QZJTk4mMTExEiCRJMj73nFyCt9ReE9PWVk7iso+6moERs0TbK24cTkdZGbeiEiWckNP+fLZxo/ZJUyjMywvuHC5PNhnXUw45miyzlPYaueWbpq0q7f/Deju/BAq47YJigQ/d3q3udYZIKlhk5TnNp41O3hrmKe8vIX8fPnfJTyo6+d+ywy53ZDaCte6RDUHKK224HYusuGDqUkYFpvbLPrz8hr/QEIlZNZYOP/Gh8YCLwY2UHVPUakR8LqWpECWl8EiQJMeXqlAoQiQnl4UgoQAjTod+q8b1FvWWddexv80np6qGnzr4PeLEavwzeBD+LhDpQL0Iqi0pIPs7Ozf85QAbrcX/bdV3k2nMKg5xnu1kaER+D4FP2xOKlRtmIUlBLFHg8I2avUQ8fHxYYDD6cFgX+X63AUO6/Yh1/ZjHoBBUWOmOeobTDinV1hb38K3toVa00VsbGwYYHcsMDC7wtmeOPYqo8iRK+hoAWUVtOlgtD3ApljKrl25kodMJgsDRkasfFpc5qB2P/vrDpFe8ZJqcWJKJbzVQoe4wdJGStbTYyUu7kS4B69f12C1fcG3A599DuyrP5F/9FJQYuRN7ab4B2BiAjyeoJhs49Spc8TExISnIDWyuLgYVbWGu3kFpKSkcvrMWY7KjpOQcImMjPvk5Dzm4sWbHDlykujo6Mg92P1ZaWlpJCUlhZ4madcvnXNzc8nKyorwS/e/AIz06Svr2XfUAAAAAElFTkSuQmCC%27%3B%0ACmdPrompt%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAQ1JREFUOE9j/P//PwNFAGQAJZiB17Xrv17m9v+G2bv/G2TtwonN8vf+N83b+9+8YN9/6+wN/yU8W4H2Al0vXHbzv3jPh//iXW9xYrHOt/+jN//677/29//4zT/+T+tb/N8yZuH/4uLi/wwupQv+G0YV/DeOLcOLLePL/lsAMYh2jMv5rxXQAjHAwSsOFIokYxHNQIgBtp7xYM0eHh4gP4EBiI1sKMSzqJYIa0ANsHKNBkvCNMIMgokhyyEbgtUAXF5BNhSmBm4AzAv4XIDNFRgG4AsD5DDC6QJSYwLuAkfvRJKjEGSZqGYQJBqN/ev/K5iG/le2iCIaq1hE/Je3K4EYAIpiEINcTFFOBFkOAK4+5J3cVDxkAAAAAElFTkSuQmCC%27%3B%0AOnScrKeyb%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJVJREFUOE9j/P//PwNFAGQAJRismSHz/H9SMLKFDAxtb/6Tg0tLS4HmgLwPNCD62H+SsELPhf8YBvz9+/f/zDNf///79w+FBlkDEgfJb7gPsQirAaS4AqcLGs78///r19//6DTIBTBx2rkAZDLIZpA/Qf4FARANshnkAmQvUj8MQCaSiuHRCEoMIA45GJyQKMkHg8MAACArvHlXxbSqAAAAAElFTkSuQmCC%27%3B%0AWinTskMngr%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAJ5JREFUOE+VU9EOgCAIxPXQY7/sp/lnxpFMTEpkYzST4+AwEVFir+yUc5YYMb6LvG5ILqUsvbK1Qr0YDqKGu58AYNDacSP+xwGqzMX40+IaAImabCN/xwCGqgaMogwEAHLOHmKwkvI1g0MWQQ+jEcO1Uv5K58k6sNhZIl02F8Dr3as+DVIZyBY2rT0w+1YMg/0BmuSTGV76HHcHiWSxG7luAcTplZKTAAAAAElFTkSuQmCC%27%3B%0ASystProps%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAiRJREFUOE99kj9o21AQxl82jx67Crpo9FZDlxoyWNDBKhki8BCMBmMyBOGhuF2MmyFoKsKD0VRQh4A8GORNWQLyUFAGgzy4KEOGN3Tw0MGFDl/vnSu5TkgFH/p397vv7t0RAPHc9en7B/4pf2kckizeidSuHh3EK8BjjdYDKPnSgzv34axMGDcaxGWE2mRD4fscTo7mGQ40ixBeJwinKYIvSQmo0rPo5wQyS0gJSBYUfJMiWuasWG753b3bwFtk5CBDZexDXNUghgJG12NICXCXW7IMhOQw/g1E5MJ/70J9d6YS+gw7wGWFXJDsBqy2tetF2VeBo3swxP9BOu3AW20wWAPWZ7I9ocCPLjkQEBekJwCy6izBCQwiwGAFdO6A+jDjASrrnNytQLctGE1j78BfkNVxCKdPU1d3krUAzNu/gH4Kcd6BONOh2QZqzR4ax+b+ODxqozEHA9yXNRoaWKp/NTBxEkO8jVBpuqjbDvQTD2brH4CagzYFy7nOMJpTS/2ErYr2AOI4hHgVQGsFqJ8GXL0cYjnIb3R0MwlvnKF3nqBDUpWqb0K8IIDeitFo07fXFnrd3uEx5g8bJLc58rXkpRoNI3IQ8yIZZ8kukWBF5WIby2Pc/txCSUpJoIw30b2KCJBSNbdMLCo/AeT3OeSDhLpHc7XCIbUSw58k3OvjxAOAenEuHEoIEHyNubp6Lio/l1yuckFTEBWsjkctyf8qFzl/ABIpmnDaTkSAAAAAAElFTkSuQmCC%27%3B%0ACalculator%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAmhJREFUOE91k99PklEYx18vyrXVRbeuu278T7zK1kWtrVbO8qLwoiybM12aLEdz5mqaqUPE3JJUwAQhfwBq4i/wxwSFyECSgZZaJpaSnw5stlq+Z3v3PO+z8/2e7/d5zkkDpIM15VvjaPoRaXPrpxTf/SXF99OkldiGdOp0hnT8xDHpZEa65O1blK5kZab9ASUJkl/PgF8ECO7Bkoifkvk+hEX0/4De2S1GgjDqjye3pTCpww+SDvM8YYEaEYgyTZCrj0Ncrlwmu2SJ86WLnFHGOVsaoK3XdziBxe4nHIFO1zbZynUu1MGl55DXDPltUNAu4otNjIMppf8rsNp9+IXErsk4ReooNTZQdSd4oA1RrvmAShej0fadoemonIIFZgS5/SM0277yrCtEi2019e9cFfXpeUbcXszjXw4nMA94GJ8XzVoAs3uTFmsAy1wCozNAo2OHmO4aa9qiVE22iY4peCtUNOu9uNZBWTuKeU5Y6dhg9mYm1sIs3CkHMlOwjkF/ABRl/SgeTmAUii4qXmL0QJ3pPZpZmPJtyxMYHQlMwoLOEUHnDKOzbxHahYaeEAZnnPo3EQYnYvIEBtse3eIUtcGPTTTvVoUFVesala1Bbj8ao6h2ieGZz/IEr6y7WEUP8pVDXC8epm8Zcu5o6F2E9qFltLYYAxNr8gRa0w76GehwRDG6olRrvQgHKJvm0JhWKW+O4HDJjDF5lZv031IWnrZ5UA9CRYOHnHt91BgS3K1eILfMi2NyRV6BWty8fvGSCp+4KajyU9W5R16JhRvFr/8BHTrGZPFcbj0Fqnco7utlAX+Dk/lvcXcJCTRwbTMAAAAASUVORK5CYII%3D%27%3B%0ANetConnect%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAtxJREFUOE91k2tI01EYh8/SDxVaGpQVVAYV+CEQchRppandEMEP2WXa1Uq7MUShIk2taGWIdr86M0vn0ka1NishHTMj3RKMxtBIa00zoxxUhPH0/09mSnXghXP58Zzf+573KADhG87v3+j80Sxs/QOi5cNYERroFCF+iSL450SxKyJYMSwcOZEBclS6zZR0H+D2p7NoezTkOpJJagxj2vVjBBZ+5NKLz5JsSDsyvIsiZyl77Mu46Mqh/ruZewO1FHcdZb11PlPLNYh8N4qCZHKrn/wF8QLCayLY/HwBxzu2UtpzhcuufCo+NrHB+ppJ2gYUp7MRBQL/LBUWi2UURKj0bgJOGVj+aDZbJMheezTqtvVkt38gygT+F1skiwKRI1DsCyJibfZoQNgJB2MO2gmtnEnE/eksNc9iibmZ+QaYd+0ra27ZyHxgQK2rZsq+MOYlZYxyIeYcsiEy7IzJfcC48ykElYUwvlTJjOI+7tp60bX2Y+gc5NZLD1ctXagOXUKr1Q67EMo8CbCuHrGrFZHpkHLdjygULC5OJ++2g6qWT5idA7R+AWsf1L37xdHz+j+AvLpeRLwekWRCqBoQ22sQBwQxmiwvoOSRi6o2D/cdHkpM7ym4001S6n70+iGIkAHTUk0oosoRcdWIVbWMSw/GLzkFZcoNih52U946QL6uE31LH82ub+zIPDJcB+8zypAZqfWExOqYvOIyczdmERB1gwmRpShVRoqMbvL1XewuuInWbONZzyB36p4POfB1lQxZuLWM8J3NxO18TKJUk8gtTSiTDShX7iE2fjXR0dFoNBqqrG+50uDGZJLSHtmWMkQWhK/aRnjcJhbFJJKwNo1N6dlUGF/wtL0fa6eHe85BTta0k5CQ8Hdv+4B11lfUtn3B+AZ0dg+VNimk/3DG2EHeGZ3XUVpa2v8BZZZezjV6SD98wWvdF/KtarXa63RUDf7102SxL+9/nct7vwFQw5ZrKBhJFQAAAABJRU5ErkJggg%3D%3D%27%3B%0APowOptions%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAetJREFUOE+lk99rklEYx9e/0VU3QfdB/0JMyEaoF17JZNlg8cqsi8naClSaiBk2jOY71BbOC3/UunBBGkHEgkZu5KiGroiRWxJa6rrp03sOOHS+FNGBL5zDc57PeZ7vwzkGDP3XEoBexdQIR3X0Tu9ZN7m2W+Pzq2eUc3HUxA6j9qtaTv9D3fMAoLWdo7G/xutHyyRv3OH+1GPsdh+BQEAXIgFLiTjpdEaW3infhY9uWr6TPDkxROSUmUvjQSZdk/qARTVK6FYQj8cjAV+rT+GTn4b/NPkzx4nZgsQSL5jzRw/V54HT6SQyP4/b7ZaA2n6dTusbb9deknnwnMzDLyjKLAaDgYmJywMQ2YKAdFWv12m3D3izWSGd3SSb29U8mNLkIJFIkUplJURRFNlSn4kCsre3R6fTplR6Ty5XIhwWKrCxUWVrq0E+v8PY2Aw226g+oNlsaoFflMtVVlbe4fUWKRYrVCo/WV//QaHQYnX1Ow7H9UGAKEl4cWjYXFxzP43PG+d2KEkoVCKqftBUZXo6Kdvua6HrrghYrVZMJjMXRi7KsbqUa8zMbsv9orqkVRDDYrHoA3rHpC5EZNJy2MTw8Ljc37vp4pzxCmaz+e8AARPJQmKUC76zWEbOYzSa9D3408fRi+l68C+Q35MrucWVT9wHAAAAAElFTkSuQmCC%27%3B%0AMSPaint%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjA4ZXKc4QAAAZZJREFUOE+NkjFowkAUhnVzdMxYoYubdhM6uTWbgQ7tJodDkQwiTuIimUJwEHEKHYRkKMShoFtcCnYoOGY8x4zt1m5/711MjEZbDw6O4973vvfe5QHkaG21G/xcfclzecTz8nDJIgBt3qjCuysi6JTAWkxcRffpbZh+5j55sNAZ7EoR9m11D/jIwerVkiACsJZzADnI0O9N0NYtqPfd6FEKQMHWLABr2OcBk7kPzQwSwKfLEgMC+FM7U96BAQEexxxqx5NZ/FFhX0JTkeV5D/uS5ADSTXLcANpgA2MsNIW+NyrDWoUIXQuo5CSAdjomY1A3F5HmDtCdcYS6hvBaAHoWqE9nAcbrGvWXMpRmAYEbTYB6QiMmCDX4X4D97oDNGPiyhoVQ91ZrcFPF91ycXR/d4R8GpEYW6lQTHS9hLUCBCISuINxupMHx58r+th3AGRbRf27L7KRPEzrOnpmCNHA30sB4UqQBBiXZPAq+CEAQ6oFm1iOA0D9Ve1xKpgRpsTRAvfDfuPx9VPup7CdLiMmx8jn1+N0vr+ulS/dQUwwAAAAASUVORK5CYII%3D%27%3B%0AOpera%3D%27data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAQVSURBVHjaYv7//z9DvprmEyYGBgaGKxuuywAAAAD//2K8HZ2k9+Pe/UuMK/ks/tvyCTAAAAAA//8AIgDd/wP///8AYvID/0Ll66SRYWXuAf///wDvJ2T/4/sJ6R768RcAAAD//wBEALv/AdVESwAVVVLI+eXmxu64u3IEEiww/8KPt6Xa4NRxTzYl6gNr2gCABmZQLwDm/wgZ3uVoBAkBF7H/lbz/RywnAOvm8AEAAAD//wCEAHv/Af///wDcWmJ6Ejk1hfHw9QDy09MAH0E8APv4+QDsuLsBAgAAAAAK9gWFzZvAAOjm9AEFOUABrqK8pQHE1wAE9AXfAgAAAAD5wuAAD93qABtMRAUF4v4ADeoIMPvA4wD+2POzAP///wAAAAAPXRAppuIza/nwOXP/tyRU4wUBAj0AAAACAAgB9/4B1ERLAAH+/gAPPTuNCSYlV/308+XwwcRn99vd0C7KwgAE/u/yABlfWv8FCwkA3bO5ABIhHRsTNjXP8AgJeQAAAIgCBAsRff/d5ACzebQA483TJbeTpaTw1d8ACQwQhwAAAAACBP0GXQDk7wACEgOhEzg/3E2mnF3PvcwA/+DtAAAAAAAE+9bmCvzh9QD9JBbiBBwdAOGjvwAH8gMA+8TZAAAAAAACAgALuQH4BQDx5ehPEfUGABlDNAYfBQ4AAAAKAAAAAAAB1BBNABsNEP/7DQkA3vH06REOFxcV+/EA+u7zpxftqloAAAAAAgcBAzu3JVTi8Dpz/+IyavlbDyioAAAAEf///wAs0DtMU1EAgOH/cO5tby+3LbWlQQbBGAUtgaAJupjgK9Goi5OLi4OjI4sxOhji6KATu0YT44iNMcHF+IxGLUIEfPCw1EJtbx/AueceBxz+9Rt+YYyhcOochBq3v+9GYnjouuW6UtoWwrIxGEwQoLcUQaOpq2/e3moWZm6KaISBqTzCGMP0odF9yZOj76Mxx5MJj1I9xsvbE9CaUS6h8aUX2X/+NAdGcgQbW2zW67W1p88PDhVezVsAdmf3vbZi1TOWz9zSD768W14YvHphuJSfrEVTCXoPH0lOTTz5qMp+78DeHtqUSri79twFzlgA6sP3QdXVRGZSFBfKtPdlH2gRqXUcO0trsUzz299qR7rzUfHX6ljOjqPXKgTF1REAC0AoZ1kv+VmzoghrJerd8U63K0vQ2MDzdiBdB39lM5OYmSX4/JvQaIRx5gDaACJ41whjKC0ZSe6m/dPilek7j8d1ftZ1FjdijWfz41k7erk/lUVv2YShgzTuGLA9sVd6HI/sTF9K5x4eTfWcEBGJjkq0EBgBMgyxGopQG15Ufk7eX/968bX6UysElW1ACAEQ/58UEE9ZTjpjuwlArKlWbT1orRvwAQ1UAd8Yw78BAM0usKyCrCPaAAAAAElFTkSuQmCC%27%3B%0A%0Avar%20directoryService%20%3D%20Components.classes%5B%27@mozilla.org/file/directory_service%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIProperties%29%3B%0Avar%20profileFolder%20%3D%20directoryService.get%28%27ProfD%27%2C%20Components.interfaces.nsIFile%29%3B%0Avar%20profilePath%20%3D%20profileFolder.QueryInterface%28Components.interfaces.nsILocalFile%29.path%3B%0A%20%20%20%20profilePath%20%3D%20profilePath.replace%28/%5C%5C/g%2C%27/%27%29%3B%0A%20%20%20%20CurrentPage%20%3D%20getBrowser%20%28%29.%20contentDocument.%20location.%20href%3B%0A%0A//%20------%20Menu%20Items%20------%0Aapps.push%28%5B%27Run%20in%20IE%27%2C%20%20%20IExplorer%2C%20%27C%3A/Program%20Files/Internet%20Explorer/IEXPLORE.EXE%27%2C%20CurrentPage%5D%29%3B%0Aapps.push%28%5B%27Run%20in%20Google%20Chrome%27%2C%20%20%20%20%20%20%20%20Gchrome%2C%20%20%27C%3A/Documents%20and%20Settings/Admin/Local%20Settings/Application%20Data/Google/Chrome/Application/chrome.exe%27%2C%20CurrentPage%5D%29%3B%0Aapps.push%28%5B%27Run%20in%20Opera%27%2C%20Opera%2C%20%27d%3A/Programs/Opera9/OperaAC.exe%27%2C%20CurrentPage%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27Show%20Desktop%27%2C%20%20%20%20%20%20%20%20ShowDesk%2C%20%20%27C%3A/Documents%20and%20Settings/%27+login+%27/Application%20Data/Microsoft/Internet%20Explorer/Quick%20Launch/Show%20Desktop.scf%27%5D%29%3B%0Aapps.push%28%5B%27Open%20My%20Computer%27%2C%20%20%20%20Computers%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27%3A%3A%7B20D04FE0-3AEA-1069-A2D8-08002B30309D%7D%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20C%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27C%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Drive%20D%3A%27%2C%20%20%20%20%20%20%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20%27D%3A/%27%5D%29%3B%0Aapps.push%28%5B%27Open%20Profile%20Folder%27%2C%20WExplorer%2C%20%27C%3A/WINDOWS/explorer.exe%27%2C%20profilePath%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27Notepad%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20MSNotepad%2C%20%27C%3A/WINDOWS/notepad.exe%27%5D%29%3B%0Aapps.push%28%5B%27Notepad++%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20NotepadPP%2C%20%27F%3A/Run/Textutils/notepad++/notepad++.exe%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27Control%20Panel%27%2C%20%20%20%20%20%20%20CtrlPanel%2C%20%27C%3A/WINDOWS/system32/control.exe%27%5D%29%3B%0Aapps.push%28%5B%27Add/Remove%20Programs%27%2C%20AddRemove%2C%20%27C%3A/WINDOWS/system32/control.exe%27%2C%20%27C%3A/WINDOWS/system32/Appwiz.cpl%27%5D%29%3B%0Aapps.push%28%27separator%27%29%3B%0A%0Aapps.push%28%5B%27On-Screen%20Keyboard%27%2C%20%20OnScrKeyb%2C%20%27C%3A/WINDOWS/system32/osk.exe%27%5D%29%3B%0Aapps.push%28%5B%27Task%20Manager%27%2C%20%20%20%20%20%20%20%20WinTskMngr%2C%27C%3A/WINDOWS/system32/taskmgr.exe%27%5D%29%3B%0Aapps.push%28%5B%27Calculator%27%2C%20%20%20%20%20%20%20%20%20%20Calculator%2C%27C%3A/WINDOWS/system32/calc.exe%27%5D%29%3B%0Aapps.push%28%5B%27Paint%27%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20MSPaint%2C%20%20%20%27C%3A/WINDOWS/system32/mspaint.exe%27%5D%29%0Aapps.push%28%5B%27Command%20Prompt%27%2C%20%20%20%20%20%20CmdPrompt%2C%20%27C%3A/WINDOWS/system32/cmd.exe%27%5D%29%3B%0A//%20------------------------%0A%0A%0Avar%20nMItem%20%3D%20function%28label%2Cimg%2Cpath%2Cargs%2Cobj%29%20%7B%0A%20%20var%20m%20%3D%20document.createElement%28%27menuitem%27%29%3B%0A%20%20m.setAttribute%28%27path%27%2Cpath%29%3B%0A%20%20m.setAttribute%28%27label%27%2Clabel%29%3B%0A%20%20m.f%20%3D%20obj.startProcess.bind%28obj%29%3B%0A%20%20m.setAttribute%28%27oncommand%27%2C%27event.stopPropagation%28%29%3Bthis.f%28%22%27+path+%27%22%2C%22%27+args+%27%22%2Cthis%29%27%29%3B%0A%20%20m.setAttribute%28%27class%27%2C%27menuitem-iconic%27%29%3B%0A%20%20if%20%28%21img%29%20img%20%3D%20Default%3B%0A%20%20m.setAttribute%28%27image%27%2Cimg%29%3B%0A%20%20m.tooltipText%20%3D%20label%3B%0A%20%20return%20m%3B%0A%7D%0A%0Athis.startProcess%20%3D%20function%28path%2Cargs%2Cmi%29%20%7B%0A%20%20this.currentCommand%3Dmi%3B%0A%20%20this.image%3Dmi.getAttribute%28%22image%22%29%3B%0A%20%20var%20file%20%3D%20Components.classes%5B%27@mozilla.org/file/local%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20var%20process%20%3D%20Components.classes%5B%27@mozilla.org/process/util%3B1%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIProcess%29%3B%0A%20%20file.initWithPath%28path.replace%28/%5C//g%2C%27%5C%5C%5C%5C%27%29%29%3B%0A%20%20args%20%3D%20args.replace%28/%5C//g%2C%27%5C%5C%27%29%3B%0A%20%20if%20%28args%3D%3D%27%27%29%20%7B%20file.launch%28%29%3B%20return%3B%20%7D%20%0A%20%20process.init%28file%29%3B%0A%20%20process.run%28false%2C%5Bargs%5D%2C1%29%3B%20%0A%7D%0A%0Avar%20mP%20%3D%20document.createElement%28%27menupopup%27%29%3B%0Afor%20%28var%20i%3D0%3B%20i%3Capps.length%3B%20i++%29%20%7B%0A%20%20if%20%28apps%5Bi%5D%20%3D%3D%20%27separator%27%29%20%7B%0A%20%20%20%20mP.appendChild%28document.createElement%28%27menuseparator%27%29%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%20%28%21apps%5Bi%5D%20%5B3%5D%29%20apps%5Bi%5D%20%5B3%5D%3D%27%27%3B%0A%20%20%20%20mP.appendChild%28nMItem%28apps%5Bi%5D%20%5B0%5D%2C%20apps%5Bi%5D%20%5B1%5D%2C%20apps%5Bi%5D%20%5B2%5D%2C%20apps%5Bi%5D%20%5B3%5D%2C%20this%29%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.appendChild%28mP%29%3B%0Athis.type%20%3D%20%22menu-button%22%3B%0A//this.orient%20%3D%20%22horizontal%22%3B%0Athis.image%3DmP.firstChild.getAttribute%20%28%22image%22%29%3B%0Athis.currentCommand%3DmP.firstChild%3B%0A%0AmP.%20firstChild.%20setAttribute%20%28%22oncommand%22%2C%20%27event.stopPropagation%28%29%3Bthis.f%28this.getAttribute%28%22path%22%29%2CgetBrowser%28%29.contentDocument.location.href%2Cthis%29%3B%27%29%3B%0AmP.%20firstChild.%20nextSibling.%20setAttribute%20%28%22oncommand%22%2C%20%27event.stopPropagation%28%29%3Bthis.f%28this.getAttribute%28%22path%22%29%2CgetBrowser%28%29.contentDocument.location.href%2Cthis%29%3B%27%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Athis.currentCommand.doCommand%28%29%0A%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

FFUser665

FFUser665 написал:

кнопка запуска внешнего приложения срабатывает только один раз

Это случается потому, что nsIProcess вызывается как сервис:

Код:

var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);

раньше это работало, теперь надо создавать его как экземпляр (getService -> createInstance):

Код:

var process = Components.classes['@mozilla.org/process/util;1']
    .createInstance(Components.interfaces.nsIProcess);

Возникла одна трудность, которую никак не получается решить. Имеется кнопка по открытию дополнений в боковой панели:

Код:

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%u043F%u043E%u043B%u043D%u0435%u043D%u0438%u044F%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%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//mozapps/content/extensions/extensions.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%09openWebPanel%28this.tooltipText%2C%20this.url2xul%29%3B%20%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%7D%3B%0A%7D%3B%0Athis.setAttribute%28%27onclick%27%2C%27this.onClick%28event%29%3B%27%29%3B%0A%0A%0A%0A%0Aconst%20Cb%20%3D%20custombuttons%3B%0Aconst%20EXTENSION%20%3D%20Ci.nsIUpdateItem.TYPE_EXTENSION%3B%0A%0Afunction%20prop%28%20aElement%2C%20aString%20%29%20%7B%0A%20%20var%20emRDF%20%3D%20%22http%3A//www.mozilla.org/2004/em-rdf%23%22%3B%0A%20%20var%20arc%20%3D%20RDFService.GetResource%28emRDF+%20aString%29%3B%0A%20%20var%20target%20%3D%20extensionDS.GetTarget%28aElement%2C%20arc%2C%20true%29%3B%0A%20%20if%28target%20instanceof%20Ci.nsIRDFLiteral%29%20return%20target.Value%3B%0A%20%20if%28target%20instanceof%20Ci.nsIRDFInt%29%20return%20target.Value%3B%0A%20%20return%20null%3B%0A%7D%0A%0A%0Avar%20cloneCBcontext%20%3D%20%7B%0A%20%20cloneItems%3A%20function%28aNode%2C%20aID%2C%20aSeparate%29%20%7B%0A%20%20%20%20var%20menupopup%20%3D%20document.getElementById%28aID%29.cloneNode%28true%29%3B%0A%20%20%20%20var%20menuitems%20%3D%20menupopup.childNodes.length%3B%0A%20%20%20%20for%28var%20i%20%3D%200%3B%20i%20%3C%20menuitems%3B%20i++%29%0A%20%20%20%20%20%20aNode.appendChild%28menupopup.firstChild%29%3B%0A%20%20%20%20if%28aSeparate%29%0A%20%20%20%20%20%20aNode.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0A%20%20%7D%2C%0A%20%20makeMenu%3A%20function%28aNode%29%20%7B%0A%20%20%20%20var%20m%20%3D%20aNode.appendChild%28document.createElement%28%22menu%22%29%29%3B%0A%20%20%20%20m.setAttribute%28%22label%22%2C%20%22Custom%20Button%22%29%3B%0A%20%20%20%20m.setAttribute%28%22oncommand%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%20%20%20%20var%20mp%20%3D%20m.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0A%20%20%20%20cloneCBcontext.cloneItems%28mp%2C%20%22custombuttons-contextpopup%22%29%3B%0A%20%20%20%20aNode.insertBefore%28document.createElement%28%22menuseparator%22%29%2C%20m%29%3B%0A%20%20%7D%0A%7D%0A%0A%0A%0A%0Aconst%20popupID%20%3D%20%22cbContext-extensionsButton%22%3B%0A%0Avar%20test%20%3D%20document.getElementById%28popupID%29%3B%0Aif%28test%29%20test.parentNode.removeChild%28test%29%3B%0A%0Avar%20main%20%3D%20document.getElementById%28%22mainPopupSet%22%29%3B%0Avar%20cPopup%20%3D%20main.appendChild%28document.createElement%28%22popup%22%29%29%3B%0AcPopup.id%20%3D%20popupID%3B%0AcPopup.setAttribute%28%22oncommand%22%2C%0A%20%20%22event.stopPropagation%28%29%3B%20document.popupNode.openPrefs%28event%29%3B%22%29%0A%0A%0A%0Avar%20RDFService%20%20%3D%20Cc%5B%22@mozilla.org/rdf/rdf-service%3B1%22%5D.getService%28Ci.nsIRDFService%29%3B%0Avar%20Container%20%20%20%3D%20Cc%5B%22@mozilla.org/rdf/container%3B1%22%5D.getService%28Ci.nsIRDFContainer%29%3B%0Avar%20extensionDS%20%3D%20Cc%5B%22@mozilla.org/extensions/manager%3B1%22%5D.getService%28Ci.nsIExtensionManager%29.datasource%3B%0A%0Avar%20root%3B%0Atry%20%7B%0A%20%20root%20%3D%20RDFService.GetResource%28%22urn%3Amozilla%3Aitem%3Aroot%22%29%3B%0A%7D%20catch%28err%29%20%7B%0A%20%20root%20%3D%20RDFService.GetResource%28%22urn%3Amozilla%3Aextension%3Aroot%22%29%3B%0A%7D%0A%0AContainer.Init%28extensionDS%2Croot%29%3B%0A%0Avar%20elements%20%3D%20Container.GetElements%28%29%3B%0Avar%20extensionArray%20%3D%20%5B%5D%3B%0Avar%20i%20%3D%20-1%3B%0Awhile%28elements.hasMoreElements%28%29%29%20%7B%0A%20%20i++%3B%0A%20%20var%20element%3Delements.getNext%28%29%3B%0A%20%20element.QueryInterface%28Components.interfaces.nsIRDFResource%29%3B%0A%20%20var%20prop_OptionsURL%20%3D%20prop%28element%2C%20%22optionsURL%22%29%3B%0A%20%20if%28prop%28element%2C%20%22type%22%29%20%3D%3D%20EXTENSION%20%26%26%20%20prop_OptionsURL%29%20%7B%0A%20%20%20%20var%20prop_name%20%3D%20prop%28element%2C%20%22name%22%29%3B%0A%20%20%20%20extensionArray%5Bi%5D%20%3D%20%5B%5D%3B%0A%20%20%20%20extensionArray%5Bi%5D%20%5B0%5D%20%3D%20prop_name.charAt%280%29.toUpperCase%28%29%20+%20prop_name.substr%281%29%3B%0A%20%20%20%20extensionArray%5Bi%5D%20%5B1%5D%20%3D%20prop_OptionsURL%3B%0A%20%20%20%20extensionArray%5Bi%5D%20%5B2%5D%20%3D%20prop%28element%2C%20%22userDisabled%22%29%3B%0A%20%20%20%20extensionArray%5Bi%5D%20%5B3%5D%20%3D%20prop%28element%2C%20%22version%22%29%3B%0A%20%20%20%20extensionArray%5Bi%5D%20%5B4%5D%20%3D%20prop%28element%2C%20%22iconURL%22%29%3B%0A%20%20%20%20if%28%21extensionArray%5Bi%5D%20%5B4%5D%29%0A%20%20%20%20%20%20extensionArray%5Bi%5D%20%5B4%5D%20%3D%20%22chrome%3A//mozapps/skin/xpinstall/xpinstallItemGeneric.png%22%3B%0A%20%20%7D%0A%7D%0A%0AextensionArray.sort%28%29%3B%0A%0Avar%20features%20%3D%20%22chrome%2C%20dialog%20%3D%200%2C%20resizable%2C%20titlebar%2C%20toolbar%2C%20centerscreen%22%3B%0A%0Avar%20extCommand%20%3D%20%22window.openDialog%28%27ZZZ%27%2C%20%27%27%2C%20%27%22%20+%20features%20+%20%22%27%29%3B%22%3B%0A%0Afor%28var%20i%20%3D%200%3B%20i%20%3C%20extensionArray.length%3B%20i++%29%20%7B%0A%20%20var%20extArray%20%3D%20extensionArray%5Bi%5D%3B%0A%20%20try%20%7B%0A%20%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20mItem.setAttribute%28%22label%22%2C%20extArray%5B0%5D%20+%20%22%20%22%20+%20extArray%5B3%5D%29%3B%0A%20%20%20%20if%28extArray%5B4%5D%29%20%7B%0A%20%20%20%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%20bookmark-item%22%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22image%22%2C%20extArray%5B4%5D%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%28extArray%5B1%5D%29%0A%20%20%20%20%20%20mItem.setAttribute%28%22oncommand%22%2C%20extCommand.replace%28%22ZZZ%22%2C%20extArray%5B1%5D%29%29%3B%0A%20%20%20%20if%28extArray%5B2%5D%29%20mItem.setAttribute%28%22disabled%22%2C%20true%29%3B%0A%20%20%20%20cPopup.appendChild%28mItem%29%3B%0A%20%20%7D%20catch%28e%29%20%7B%0A%20%20%7D%0A%7D%0A%0AcloneCBcontext.makeMenu%28cPopup%29%3B%0Athis.setAttribute%28%22context%22%2C%20popupID%29%3B%0A%0Aif%28typeof%20Local_Install%20%21%3D%20%22object%22%29%20return%3B%0A%0Avar%20test%20%3D%20document.getElementById%28%22cbContext-extensions%22%29%3B%0Aif%28test%29%20test.parentNode.removeChild%28test%29%3B%0A%0Avar%20cbPopup%20%3D%20document.getElementById%28%22custombuttons-contextpopup-subCall%22%29.cloneNode%28true%29%3B%20//%20Cb%20context%0A%0A//%20var%20subPopup%20%3D%20document.createElement%28%22menupopup%22%29%3B%0A%0A//%20subPopup.appendChild%28cbPopup%29%3B%0A//%20subPopup.appendChild%28cbPopup.lastChild%29%3B%0A%0Avar%20subMenu%20%3D%20document.createElement%28%22menu%22%29%3B%0AsubMenu.setAttribute%28%22label%22%2C%20%22Custom%20Button%22%29%3B%0A//subMenu.setAttribute%28%22image%22%2C%20Cb.defaultImg%28%29%20%29%3B%0AsubMenu.appendChild%28cbPopup.lastChild%29%3B%0A%0Avar%20extensionsPopup%20%3D%20document.getElementById%28%22emb-context%22%29%3B%0Avar%20popup%20%3D%20extensionsPopup.cloneNode%28true%29%3B%0Apopup.id%20%3D%20%22cbContext-extensions%22%3B%0Apopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0Apopup.appendChild%28subMenu%29%3B%0A//popup.appendChild%28subPopup%29%3B%0A%0AextensionsPopup.parentNode.appendChild%28popup%29%3B%0A%0Athis.setAttribute%28%22context%22%2C%20popup.id%29%3B%0A//this.onclick%20%3D%20function%28aEvent%29%20%7B%0A//%20%20if%28aEvent.button%20%3D%3D%3D%201%29%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%27chrome%3A//mozapps/content/extensions/extensions.xul%3Ftype%3Dextensions%27%29%3B%0A//%7D%0A%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A/*%20-------------------------------------------------------------%0A%20%20%20Extensions%20Menu%0A%20%20%20Based%20on%20snippet%20by%20onemen%0A%20%20%20http%3A//forums.mozillazine.org/viewtopic.php%3Fp%3D1774082%231774082%0A%20%20%20Modified%20by%20LouCypher%20%28aka%20Zoolcar9%29%0A%20%20%20-------------------------------------------------------------%0A%20%20%20MiddleClick%20%26%20Rightclick%20menu%20Mod%20by%203Jlou%20%5Baka%20DeeP%20%28%20*_%3E*%29%5D%3A%20%0A%20%20%20http%3A//torrents.ru/forum/profile.php%3Fmode%3Dviewprofile%26u%3D512593%0A%20%20%20-------------------------------------------------------------%20*/%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

В firefox отключены Праверка совместимости расширений и Проверка безопасности обновлений:

Код:

extensions.checkCompatibility - false,
extensions.checkUpdateSecurity - false

Как заставить работать вот такой код и в боковой панели тоже:

Код:

@-moz-document url("chrome://mozapps/content/extensions/extensions.xul"){
    notification[type="warning"][label^="Проверка совместимости"],
    notification[label^="Было установлено"],
    notification[type="warning"][label^="Проверка безопасности обновлений"],
    #getMore 
{display: none !important;}}

Jarichek написал:

Как заставить работать вот такой код и в боковой панели тоже:

Странно, вроде, должно работать.

Jarichek
Infocatcher

Странно, вроде, должно работать.

Там browser в сайдбаре, из userContent.css по-моему должно работать.

Anton написал:

Там browser в сайдбаре, из userContent.css по-моему должно работать.

А, ну, возможно – я только через Stylish проверил.

Anton написал:

Там browser в сайдбаре, из userContent.css по-моему должно работать.

Да, точно, все работает. А то я как только не извращался с userChrome.css ничего не выходило :) Спасибо.

Anton
Скажи пожалуйста, есть ли возможность исправить кнопку-переключатель "Работать автономно", так чтобы она реагировал на те ситуации, когда фокс сам переключает эту галку? Например, он всегда ее ставит если выдернуть сетевой кабель :)
Код:

Код:

BrowserOffline.toggleOfflineStatus();

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

Код:

this.pref = 'browser.offline';
this.setState = function () {
    var state = this.PS.getBoolPref(this.pref);
    if (state == true) {
        this.image = 'data:image/png;base64,...
        this.checked = true;
    } else {
        this.image = 'data:image/png;base64,...
        this.checked = false;
    }
}

this.PS = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
this.ob = {};
this.ob.observe = this.setState.bind(this);
this.PS.addObserver(this.pref, this.ob, false);
this.setState();

Добавлено:
Кстати, вопрос по горячим клавишам. Если назначить клавишу а потом захотеть ее убрать, как это сделать (кроме убирания непосредственно из файла buttonsoverlay.xul)? Или надпись "DELETE" означает что клавиша не определена, а не клавишу Del на клавиатуре? :)
И еще, можно ли сделать чтобы горячая клавиша срабатывала в разных раскладках, а то получается переключил язык и клавиша не срабатывает? или тогда уже приделать возможность задавать не одну горячую клавишу.

Что то на макОС не работает. Кнопка создается, но не нажимается на панели...FF 3.5.3

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

1. Смотрим на создаваемое письмо, в нем в таблице со списокм адресатов уже есть некоторые записи
2. Если в таблице со списком адресатов НЕ существует запись с типом <ТИП> и адресом <АДРЕС>, то добавить в список адресатов запись с типом <ТИП> и адресом <АДРЕС>, в противном случае ничего не делать.
Где
<ТИП> - это одно из [кому;копия;скрытая копия;обратный адрес]
<АДРЕС> - email адрес

<ТИП>  и <АДРЕС> задается пользователем при создании кнопки (в коде), при этом таких записей может быть несколько, т.е. при нажатии на кнопку, в таблице должны быть добавлены,например:
Обратный адрес: 123@mail.ru
Обратный адрес: 999@ngs.ru
Копия: ivan@ya.ru
Копия: kot@narod.ru

Заранее спасибо!

Jarichek

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

Не знаю. Попробуй

Код:

this.setState = function (state) {
    var ios = Components. classes ["@mozilla.org/network/io-service;1"]. getService (Components. interfaces. nsIIOService);
    state = state || (ios. offline? "offline": "online");
    if (state == "online") {
        this.image = 'file:///m:/redicon.png';
        this.checked = true;
    } else {
        this.image = 'file:///m:/greenicon.png';
        this.checked = false;
    }
}
this. observer =
{
    THIS: null,
    
    QueryInterface: function (iid)
    {
        if (iid. equals (Components. interfaces. nsISupports) ||
            iid. equals (Components. interfaces. nsIObserver))
            return this;
        throw Components. results. NS_ERROR_NO_INTERFACE;
    },
    
    observe: function (subject, topic, data)
    {
        if (topic == "network:offline-status-changed")
            this. THIS. setState (data);
    }
};
this. observer. THIS = this;
var os = Components. classes ["@mozilla.org/observer-service;1"]. getService (Components. interfaces. nsIObserverService);
os. addObserver (this. observer, "network:offline-status-changed", false);
this.setState();

в раздел "Инициализация".

Если назначить клавишу а потом захотеть ее убрать, как это сделать

В поле "Сочетание клавиш" нажать клавишу ESC.

можно ли сделать чтобы горячая клавиша срабатывала в разных раскладках

Пока нет.

150pi

Что то на макОС не работает. Кнопка создается, но не нажимается на панели...FF 3.5.3

А поподробней ?

Куда уж подробней то ) Создал кнопку, поместил код в нее, засунул на панель инструментов, но кнопка не нажимается, скрипт не выполняется, соответственно, тоже

150pi
Что за кнопка ?

Код:

javascript:var%20s=document.createElement('script');s.src='http://videosaver.ru/vs.js?nc='+Math.random();document.body.appendChild(s);void(0);

150pi
А вот так:

Код:

loadURI ("javascript:var%20s=document.createElement('script');s.src='http://videosaver.ru/vs.js?nc='+Math.random();document.body.appendChild(s);void(0);");

?

Anton написал:

150pi
А вот так:

Код:

loadURI ("javascript:var%20s=document.createElement('script');s.src='http://videosaver.ru/vs.js?nc='+Math.random();document.body.appendChild(s);void(0);");

?

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

150pi
Ок, как раздобуду MacOS, буду смотреть и править.

А давайте попробуем с каким нить кодом типа msgbox ("Hello world");  ?
Как такой сделать?

150pi

А давайте попробуем с каким нить кодом типа msgbox ("Hello world");  ?
Как такой сделать?

Код:

alert(0)

Должно появиться предупреждение

Код:

[Приложение Javascript]
       0

Anton написал:

150pi

А давайте попробуем с каким нить кодом типа msgbox ("Hello world");  ?
Как такой сделать?

Код:

alert(0)

Должно появиться предупреждение

Код:

[Приложение Javascript]
       0

РАботает....попробовал другой код

Код:

javascript:(function(){function%20getPhotoInfo(){if(res%20=%20/([0-9\-]+)_(\d+)/.exec(location.href))return%20{"mid":%20res[1],%20"pid":%20res[2]};else%20return%20{"mid":%200,%20"pid":%200};}p_mark%20=%20function(i){if(i%20>=%20window.friends.length){ge('rotating').innerHTML%20=%20"<h4>%20All%20friends%20have%20been%20marked%20on%20this%20photo!</h4>";clearTimeout(timerID);return;}request_uri%20=%20"/photos.php?act=put&pid="+mid+"_"+pid+"&id=%20"+mid+"&oid=0&subject="+window.friends[i].id+"&name=%20"+encodeURI(window.friends[i].name)+"&add=1&x=0&y=0&x2=100&y2=100%20";img%20=%20new%20Image();img.src%20=%20request_uri;ge('commentArea').innerHTML%20=%20(i+1)%20+%20"%20of%20"%20+%20window.friends.length%20+%20"%20friends%20have%20been%20marked!";timerID%20=%20setTimeout("p_mark("%20+%20(i+1)%20+%20")",%20500);};p_markall%20=%20function(){if(!confirm("Are%20you%20sure%20want%20to%20mark%20all%20friends?\r\n\r\n\r\%D0%97%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%20%D0%BD%D0%B0%204vkontakte.ru"))%20return;ge('rotating').innerHTML%20=%20"<h4>%20Processing%20<img%20src=\"http://vkontakte.ru/images/upload.gif\"><br%20/>%20Please%20wait...</h4>";ajax%20=%20new%20Ajax(function(a,r){eval(r);window.friends%20=%20fr;%20p_mark(0);},%20function(a,r){alert("Request%20problem.%20Try%20again");});ajax.get("/photos.php?act=get");};if(!(location.%20href.match(/vkontakte.ru/)%20&&%20location.href.match(/photo/))){alert("Open%20page%20with%20photo");%20return;}var%20info%20=%20getPhotoInfo();var%20pid%20=%20info["pid"],%20mid%20=%20info["mid"],%20friends;p_markall();})();

то же не пашет....

Пишу loadurl ("код");
Может он именно лоддюрл не хочет делать?

150pi

РАботает....

Если это работает, уже хорошо. Спасибо за проверку.

попробовал другой код...
то же не пашет....

Пишу loadurl ("код");

Там двойные кавычки вперемешку с одинарными, просто так в loadURI не поместить. Надо переписывать текст букмарклета.

17-09-2009 19:33:29

Может он именно лоддюрл не хочет делать?

loadURI, не loadurl
В первом случае - букмарклет должен работать из loadURI ("...") без переделки.

Там двойные кавычки вперемешку с одинарными, просто так в loadURI не поместить. Надо переписывать текст букмарклета.

Странно...у меня из закладок оба эти скрипта работают. Ладно, будем ждать пока вы до маководов доберетесь )
Спасибо

mshubin
Вот код:

Код:

var msgTo = "a@b.c,b@c.d"; // кому
var msgCc = "c@d.e,d@e.f"; // копия
var msgBcc = "e@f.g,f@g.h"; // скрытая копия
var msgReply = "g@h.i,h@i.j"; // обратный адрес
function add (compFields, fieldName, addr)
{
    var addr1 = addr. split (",");
    var field = compFields [fieldName];
    var values = field. split (",");
    for (var i = 0; i < addr1. length; i++)
    {
        if (values. indexOf (addr1 [i]) == -1)
            field += "," + addr1 [i];
    }
    compFields [fieldName] = field;
}
var cf = Components. classes ["@mozilla.org/messengercompose/composefields;1"].
     createInstance (Components. interfaces. nsIMsgCompFields);
Recipients2CompFields (cf);
add (cf, "to", msgTo);
add (cf, "cc", msgCc);
add (cf, "bcc", msgBcc);
add (cf, "replyTo", msgReply);
CompFields2Recipients (cf);

В версии 0.0.4.4 есть ошибка, из-за которой кнопки не работают в окнах просмотра и составления сообщений Thunderbird.
Для запуска кода, можно воспользоваться предыдущей версией, например 0.0.4.3
Можно восстановить работоспособность "вручную", заменив в файле <каталог профиля Thunderbird>\extensions\custombuttons@xsms.nm.ru\chrome.manifest строки

Код:

overlay chrome://messenger/content/messenger.xul chrome://custombuttons/content/tcbbutton.xul

и

Код:

overlay chrome://messenger/content/messenger.xul chrome://custombuttons/content/tcbbutton.xul

на

Код:

overlay chrome://messenger/content/messageWindow.xul chrome://custombuttons/content/tcbbutton.xul

и

Код:

overlay chrome://messenger/content/messengercompose/messengercompose.xul chrome://custombuttons/content/tcbbutton.xul

соответственно.

Anton написал:

Не знаю. Попробуй

Как удивительно сочетаются фразы :D , особенно когда код работает отлично! Спасибо огромное :)

Anton написал:

можно ли сделать чтобы горячая клавиша срабатывала в разных раскладках

Пока нет.

Ну что ж, ждем с нетерпением в будущих версиях, очень нужная вещь.

хм, иногда глючит кнопка Закладок. при ее нажатии и выборе какой-нибудь папки в закладках появляется точно такой же список в левом верхнем угле браузера. Если передвигаться по папкам, то вточности такой же список и слева появляется. Даже не знаю с чем может быть связано, в консоли ошибок пусто, перезапуск браузера помогает, но на некоторое время, даже не знаю как добраться до источника проблемы.
http://pic.ipicture.ru/uploads/090918/thumbs/MT4aPW5OGQ.png

Спасибо! Отличный плагин, недавно начал им пользоваться :cool:

Подскажите как сделать кнопку - переход по URL?
и еще можно ли сделать что бы открывалось в новой вкладке. Т.е. идея - сделать в панели навигации кнопку по типу кнопок "избранных" в панели закладок.

4ira
Вот такой код например:

Код:

getBrowser (). addTab ("http://forum.mozilla-russia.org");

Jarichek написал:

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

помнится у меня подобный глюк возникал из-за того, что я накосячил с комментированием строки в userChrome.css, т.е. символы "/*" прописал, а "*/" забыл

Кстати, правильным ли будет код для кнопки "Меню", учитывая что имеются вот эти кнопки закладок и истории?

Код:

var mp = document. createElement ("menupopup");
this. appendChild (mp);
var mc = document. getElementById ("main-menubar");
while (mc. hasChildNodes ())
    mp. appendChild (mc. firstChild);
this. type = "menu";
this. orient = "vertical";
this. tooltipText = '';

Никто никого "убивать" не будет? :)

3Jlou написал:

глюк возникал из-за того, что я накосячил с комментированием строки в userChrome.css

хм, ну посмотрим, подчистил userChrome.css и привел в порядок

Jarichek

хм, иногда глючит кнопка Закладок.

Закладки ? Нет, увольте : )

4ira

Подскажите как сделать кнопку - переход по URL?

Код:

loadURI ("http://www.google.com");

что бы открывалось в новой вкладке.

Вот тут:
http://custombuttons.mozdev.org/drupal/ … ite-button
кнопка, которая создает новую кнопку-"закладку" на текущую страницу, созданная таким образом кнопка открывает "заложенный" адрес в новой вкладке

Jarichek

Jarichek написал:

Кстати, правильным ли будет код для кнопки "Меню"

Если работает - значит правильный.

TO ANTON:

СПАСИБО ОГРОМНОЕ!!!

Возможно ли создать кнопку-меню, чтобы заходить на gmail  под разными аккаунтами ?

Можно ли такую кнопочку сделать, которая бы добавляла сайт из активной вкладки в исключения (сохранения кукис)? Желательно верхний домен с *, типа, с этой страницы добавилось бы *mozilla-russia.org*, ну или после третьего слеша отсекать, если это проще http://forum.mozilla-russia.org/*
Коды для этого расширения работают с CB2?
Где расширение хранит коды кнопок, сохраняются ли коды, если кнопка была удалена с панели?

Лия написал:

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

Есть уже такая кнопка, вот тут, в самом низу кнопка "Site cookies". Все кнопки хранятся в <папка_профиля>\custombuttons\buttonsoverlay.xul. После перетаскивания кнопки с панели кнопка сохраняется, а вот если выбрать в контекстном меню кнопки удалить, то естественно удаляется (ну что б не страшно было там рядом сохраняется бэкап)

Всем привет!
А как можно вызвать процедуру "Запустить в папке фильтры" (и в качестве параметра процедуры передать имя папки) - т.е. тоже самое, что выполняется при выполнении пункт меню Инструменты/Запустить в папке фильтры

Просто хочу себе такую кнопочку на панель инструментов

Есть уже такая кнопка

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

Нет, это кнопка мне не подходит, нужных тонких настроек нет.

Привет, Лия. А https://addons.mozilla.org/en-US/firefo … h?q=cookie не?

Лия написал:

Нет, это кнопка мне не подходит, нужных тонких настроек нет.

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

Я не правильно поняла и добавляются в исключения и сохраняются куки не со всех открытых в данный момент сайтов?

Привет, Саша:)
Расширения всяческие по работе с куками у меня установлены, просто кнопочка удобнее. А расширения я бы удалила.

vurdalak

Возможно ли создать кнопку-меню, чтобы заходить на gmail  под разными аккаунтами ?

Возможно. Правда, следом встаёт вопрос "Кто делать ?"
У меня под рукой нет очевидного способа по реализации такого функционала.
Разве что кнопка "Login" отсюда: http://custombuttons.mozdev.org/drupal/ … comment-26

mshubin

А как можно вызвать процедуру "Запустить в папке фильтры" (и в качестве параметра процедуры передать имя папки) - т.е. тоже самое, что выполняется при выполнении пункт меню Инструменты/Запустить в папке фильтры

Вот, вроде работает:

Код:

var folderName = "test1";

function searchFolder (folderName)
{
    var res;
    var accountManager = Components. classes ["@mozilla.org/messenger/account-manager;1"].
                         getService (Components. interfaces. nsIMsgAccountManager);
    var allServers = accountManager. allServers;
    var numServers = allServers. Count ();
    for (var index = 0; index < numServers; index++)
    {
        var rootFolder = allServers. GetElementAt (index). QueryInterface (Components. interfaces. nsIMsgIncomingServer). rootFolder;
        if (rootFolder)
        {
            var allFolders = Components. classes ["@mozilla.org/supports-array;1"]. createInstance (Components. interfaces. nsISupportsArray);
            rootFolder. ListDescendents (allFolders);
            var numFolders = allFolders. Count ();
            for (var folderIndex = 0; folderIndex < numFolders; folderIndex++)
            {
                var cf = allFolders. GetElementAt (folderIndex). QueryInterface (Components. interfaces. nsIMsgFolder);
                if (cf. name. indexOf (folderName) != -1)
                {
                    res = cf;
                    break;
                }
            }
        }
    }
    return res;
}

var filterService = Components. classes ["@mozilla.org/messenger/services/filters;1"].
                    getService (Components. interfaces. nsIMsgFilterService);
var folder = searchFolder (folderName);
var selectedFolders = Components. classes ["@mozilla.org/supports-array;1"].
                      createInstance (Components. interfaces. nsISupportsArray);
selectedFolders. AppendElement (folder);
var curFilterList = folder. getFilterList (msgWindow);
var tempFilterList = filterService. getTempFilterList (folder);
var numFilters = curFilterList. filterCount;
tempFilterList. logStream = curFilterList. logStream;
tempFilterList. loggingEnabled = curFilterList. loggingEnabled;
var newFilterIndex = 0;
for (var i = 0; i < numFilters; i++)
{
    var curFilter = curFilterList. getFilterAt (i);
    if (curFilter. enabled && !curFilter. temporary)
    {
        tempFilterList. insertFilterAt (newFilterIndex, curFilter);
        newFilterIndex++;
    }
}
filterService. applyFiltersToFolders (tempFilterList, selectedFolders, msgWindow);

Лия

Я не правильно поняла и добавляются в исключения и сохраняются куки не со всех открытых в данный момент сайтов?

Из активной вкладки.

Из активной вкладки.

Спасибо.

Нужно, что бы при  нажати на кнопку выполнялся код

Код:

javascript:(function(){window.open('http://savefrom.net/?url='+escape(location.href));})()

Как правильно сделать?

Xvost написал:

Как правильно сделать?

Код:

loadURI ("javascript:(function(){window.open('http://savefrom.net/?url='+escape(location.href));})()");

Благодарю!

2 Yan:
а как сделать так, чтобы при нажатии на кнопку запускалось сначала локальное приложение, потом проверялось состояние запуска приложения и уже потом происходили действия, которые "повешены" на кнопку для [firefox]? Конкретно речь идет о кнопке Proxy On/Off.

Спасибо.

Классное расширение, создателю большой респект!
У меня такой вопрос, можно ли сделать кнопку, которая переключает в настройках браузера отображение картинок на страницах?

AKtor написал:

У меня такой вопрос, можно ли сделать кнопку, которая переключает в настройках браузера отображение картинок на страницах?

Код:

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%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C/%u0441%u043A%u0440%u044B%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%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%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%5Bthis.pref%3D%27permissions.default.image%27%3B%0Athis.setState%3Dfunction%28%29%7B%0A%09switch%28this.PS.getIntPref%28this.pref%29%29%0A%09%7B%0A%09case%201%3A%0A%09%09this.image%3D%20%27data%3Aimage/png%3Bbase64%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%3D%3D%27%3B%0A%09%09this.tooltipText%3D%20%27%u0417%u0430%u0433%u0440%u0443%u0436%u0430%u0442%u044C%20%u0432%u0441%u0435%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%27%3B%0A%09%20%09break%3B%0A%09case%202%3A%0A%09%09this.image%3D%0A%27data%3Aimage/png%3Bbase64%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%3D%3D%27%3B%0A%09%09this.tooltipText%3D%20%27%u041D%u0435%20%u0437%u0430%u0433%u0440%u0443%u0436%u0430%u0442%u044C%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0438%27%3B%0A%09%09break%3B%0A%09case%203%3A%20%0A%09%09this.image%3D%0A%27data%3Aimage/png%3Bbase64%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%27%3B%0A%09%09this.tooltipText%3D%20%27%u0417%u0430%u0433%u0440%u0443%u0436%u0430%u0442%u044C%20%u043A%u0430%u0440%u0442%u0438%u043D%u043A%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0441%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0434%u043E%u043C%u0435%u043D%u0430%27%3B%0A%09%09break%3B%0A%09%7D%0A%7D%0A%0Athis.PS%3D%0A%20Components.classes%5B%27@mozilla.org/preferences-service%3B1%27%5D%0A%20.getService%28Components.interfaces.nsIPrefBranch%29%3B%0Athis.ob%3D%7B%7D%3B%0Athis.ob.observe%3Dthis.setState.bind%28this%29%3B%0Athis.PS.addObserver%28this.pref%2Cthis.ob%2Cfalse%29%3B%0Athis.setState%28%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bswitch%28this.PS.getIntPref%28this.pref%29%29%7B%0A%09case%201%3A%20this.PS.setIntPref%28this.pref%2C2%29%3Bbreak%3B%0A%09case%202%3A%20this.PS.setIntPref%28this.pref%2C3%29%3Bbreak%3B%0A%09case%203%3A%20this.PS.setIntPref%28this.pref%2C1%29%3Bbreak%3B%0A%7D%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

Jarichek
Огромное спасибо!:)

Извините, если пишу не там. Мне нужны кнопки, которые позволяли бы перелистывать страницы например в Яндексе. Это как в Opere кнопка полный вперед и назад. Устанавливал расширение Rewind/Fastforward Buttons , но это не помогло (или не смог настроить). Он не перелистывает страницы. Для Яндекса перелиствать можно нажав клавишу Ctrl со стрелкой. Как можно это реализовать. Заранее спасибо

sipajlov
Если я правильно понял, то
Вперед:

Код:

var webNavigation = getWebNavigation ();
if (webNavigation. canGoForward)
{
    BrowserForward ();
}
else
{
    var doc = gBrowser. contentDocument;
    var links = doc. documentElement. getElementsByTagName ("link");
    var linkrel = "";
    for (var i = 0; i < links. length; i++)
    {
        if (links [i]. rel == "next")
        {
            linkrel = links [i]. href;
            break;
        }
    }
    var np = doc. getElementById ("next_page");
    np = np && np. href || linkrel;
    if (np)
        doc. location. href = np;
}

Назад:

Код:

var webNavigation = getWebNavigation ();
if (webNavigation. canGoBack)
{
    BrowserBack ();
}
else
{
    var doc = gBrowser. contentDocument;
    var links = doc. documentElement. getElementsByTagName ("link");
    var linkrel = "";
    for (var i = 0; i < links. length; i++)
    {
        if (links [i]. rel == "previous")
        {
            linkrel = links [i]. href;
            break;
        }
    }
    var np = doc. getElementById ("previous_page");
    np = np && np. href || linkrel;
    if (np)
        doc. location. href = np;
}

Кнопки слегка "заточены" под яндекс, раз уж он был упомянут.

Anton написал:

sipajlov
Если я правильно понял, то

Кнопки слегка "заточены" под яндекс, раз уж он был упомянут.

Спасибо, именно то что нужно. Сейчас ищу рисунки кнопок по стилю, и все О.К.
Конечно, жалко, что не для всех сайтов подходит, но в основном пользуюсь Яндексом, так что на 50% доволен! Жалко, что нет полнофункциональных кнопок как в Opera.

memini

Код:

content.location.pathname = "mypage.cgi";

Вообще, тут и обычной закладки на «адрес»

Код:

javascript: location.pathname = "mypage.cgi";

хватит. =)

memini написал:

А фавикон никак не сделать для нее, кстати?

Если ты делал обычную закладку, то можно в файл userChrome.css поместить следующий код:

Код:

.bookmark-item[label="Name"] {
list-style-image: url( 'data:image/x-icon;base64,...') !important;}

где Name - имя твоей закладки, а data:image/x-icon;base64,... картинка в base64(можешь найти подходящий фавикон и в том же CustomButtons преобразовать картинку и вставить туда получившийся код). Есть конечно и разные расширения для этого дела :)

Исправил - забыл в конце скобку закрывающую. И если закладка будет с русскими буквами то файл должен быть сохранен в кодировки UTF-8

Плагин супер, осталось разобраться с JAVA и XUL ) Помогите разобраться с объектами, или подскажите в какую сторону копать:
Нужна кнопка, которая будет сохранять в файл информацию о письмах (header + body) за текущий день из определенной папки.
Как можно пробежаться по папкам в Imap?
Большое спасибо!

а есть где-нибудь большой список готовых кнопок (на сайте мало очень)?

Возможно вопрос уже поднимался, но все же: под Ubuntu работать должен или нет? :-)
У меня кнопочки отжаты и не нажимаются:-(

Chelodoi Molovek

http://dark-demon.nm.ru/soft/custombuttons/
http://moz-firefox.narod.ru/knopki.html
http://minidata.googlepages.com/BackupC … iData.html

У меня такой вопрос, можно ли сделать кнопку, как для панели закладок (открытие - скрытие панели), только для панели меню? В 3.7 ее вынесли в контекстное меню (может и раньше вынесли), но хотелось бы кнопку... :blush:

ikerosin

Нужна кнопка, которая будет сохранять в файл информацию о письмах (header + body) за текущий день из определенной папки.
Как можно пробежаться по папкам в Imap?

Если письма хранятся не локально, это будет слишком сложно, я думаю.

Dadi

Возможно вопрос уже поднимался, но все же: под Ubuntu работать должен или нет? :-)
У меня кнопочки отжаты и не нажимаются:-(

По идее должен. Но проверить не могу.
А что за кнопки, может быть, неисправность в их коде ?

14-10-2009 19:41:52
COPA

У меня такой вопрос, можно ли сделать кнопку, как для панели закладок (открытие - скрытие панели), только для панели меню?

Вот код:

Код:

var tBar = document. getElementById ("toolbar-menubar");
tBar. collapsed = !tBar. collapsed;
document. persist ("toolbar-menubar", "collapsed");

Кнопки Offline и BlockSite не работают, а вот fit to width работает. Просто я дома работаю в Убунте, на работе в Винде, профиль firefox один. В винде кнопки работают нормально, под линем не активны.
Под линем также не работает весь функционал, что вызывается правой кнопкой мыши: Добавить, удалить, редактировать кнопку.

Dadi

Под линем также не работает весь функционал, что вызывается правой кнопкой мыши: Добавить, удалить, редактировать кнопку.

Вообще для всех кнопок ?

Anton
Большое спасибо!

Anton написал:

DadiПод линем также не работает весь функционал, что вызывается правой кнопкой мыши: Добавить, удалить, редактировать кнопку.Вообще для всех кнопок ?

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

Ммм, ладно, для чистосты эксперемента, попробую на свежеустановленной *nix системе, может у меня что не так.

--------------------------

Проверил, на RHEL 5.4, FF 3.0.12, все работает, буду разбираться, вопрос снимается.

Крошка Ру
:beer:

Всем привет!
Маленький вопрос. Что нужно написать в коде кнопки, расположенной на панели инструментов в диалоге создания письма, чтобы после нажатия письмо было отправлено (т.е. происходило то же самое, что происходит при нажатии на стандартную кнопку "отправить")?

Спасибо

mshubin

Код:

goDoCommand ("cmd_sendButton");

Спасибо!

Есть код кнопки - меню.

Код:

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%3EForum%20Links%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%5B//------/images-------%0Amozpic%3D%27data%3Aimage/x-icon%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg%3D%3D%27%3B%0Aoszpic%3D%27data%3Aimage/x-icon%3Bbase64%2CAAABAAMAEBAQAAEABAAoAQAANgAAABAQAAABAAgAaAUAAF4BAAAQEAAAAQAgAGgEAADGBgAAKAAAABAAAAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAhs54AAAAAIbObGzgAAAIzmzn5sYAAAl2gAAI6XAAubAAAAAJtwCbgAAAAAibCLkAjgCOgLmLmwgAgOdwubi5DgCAeOC7i5sAAAAAAJuAu4AAAAALuQC5sAAAAAubAAt3gAAI57AACH7m5+bHAAAABuzm5uAAAAAAiOeAAAAPgfAADgDwAAwAcAAMPDAACP8QAAj/EAABmIAAAWiAAAFogAAB/4AACP8QAAj/EAAMPDAADABwAA8A8AAPg/AAAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAANRtAQDUcQIA1XEHANlyAADccgAA0XELAMVwGwDWdhMA13oTANR9FgDYeRsA2H0aANh6HQDDeSQA3qEJANahEQDXphAA2KYSANinFADRpB8A2aYdANmBJADbhykA3o48AMylIQDMpicAxaUpANmsIwDcsSsA3bItAN2yNADesTkA35RG