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

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№115131-08-2009 23:34:59

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

Jarichek

Не совсем правильно работает.

Сдаюсь.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№115231-08-2009 23:49:04

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

Anton пишет

Сдаюсь.

:)
ладно, тогда хочу другой вопрос спросить. На этом форуме для вставки ссылки вида {url="Сайт"}"Название ссылки"{/url} приходится ручками дополнять, можно ли сделать такую кнопку, допустим, в форме ответа есть выделенный текст, при клике на кнопку появляется окно с двумя текстовыми полями - в первом из них вписан выделенный текст ("Название ссылки", если ничего не выделено поле остается пустым), во второй вписывается руками "Сайт". И в итоге получается в тегах таким образом -{url="Сайт"}"Название ссылки"{/url}.

Отсутствует

 

№115301-09-2009 00:22:23

Sergeys
Administrator
 
Группа: Administrators
Откуда: Moscow, Russia
Зарегистрирован: 23-01-2005
Сообщений: 14008
UA: Minefield 3.7
Веб-сайт

Re: Custom Buttons

Jarichek
Используй расширение BBCode


Через сомнения приходим к истине. Цицерон

Отсутствует

 

№115401-09-2009 00:25:39

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

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

Отсутствует

 

№115501-09-2009 00:29:24

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

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 (01-09-2009 20:19:04)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№115601-09-2009 01:48:20

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

Anton

text += "" + desc + "";

Все работает как надо, опять тебе спасибо :)

Добавлено:
так, почему-то на 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);
}

Остается не понятным первый вопрос

Отредактировано Jarichek (01-09-2009 16:46:43)

Отсутствует

 

№115701-09-2009 11:47:50

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

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)?

Отсутствует

 

№115801-09-2009 20:29:12

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

Jarichek пишет

Anton

text += "" + desc + "";

Конечно. Просто форум "отрезает" кавычки.

так, почему-то на 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 (01-09-2009 21:02:40)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№115901-09-2009 23:47:25

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

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 (02-09-2009 18:35:01)

Отсутствует

 

№116003-09-2009 21:01:06

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

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";

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№116103-09-2009 23:08:51

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

Anton
здорово! :D
А как можно убрать пустое место в выпадающем меню кнопки, которое отводится под label, если этот атрибут не определен? Т.е. уменьшить ширину меню до размеров самой кнопки ну или наоборот, растянуть это меню по ширине иконки в выпадающем списке (все иконки будут одинаковой ширины)?
Да, Custom Buttons - это конечно не заменимое расширение! С твоей помощью, Anton, и помощью Infocatcher уже отпали за не надобностью с десяток расширений. Кстати, хотелось бы еще удалить и расширение UrlCorrector :) Пришла в голову идея насчет такой кнопки - по ЛКМ делается преобразование имеющегося текста в адресной строке с кириллицы на латиницу (можно в принципе и наоборот преобразование тоже сделать :) если это не сильно будет сложно), по ПКМ - выделенного текста в форме ответа (можно в принципе и во всех полях, где можно набирать текст, опять же если это реализуемо) ну а здесь конечно желательно и с кириллицы и с латиницы.

Отсутствует

 

№116203-09-2009 23:44:37

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

Re: Custom Buttons

Jarichek пишет

А как можно убрать пустое место в выпадающем меню кнопки, которое отводится под label, если этот атрибут не определен?

userChrome.css:

Выделить код

Код:

menuitem:not([label]) > .menu-iconic-text,
menuitem:not([label]) > .menu-accel-container {
  display: none !important;
}

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

Отсутствует

 

№116304-09-2009 14:49:43

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

Infocatcher
Благодарю!

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

Отсутствует

 

№116404-09-2009 19:05:18

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

Re: Custom Buttons

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);
};

Отредактировано Infocatcher (04-09-2009 19:37:08)


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

Отсутствует

 

№116504-09-2009 19:40:54

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

Re: Custom Buttons

Можно было вставлять текст в readonly-поля – исправил.
Только не понял, как вызывать editor.canPaste() – на MDC написано только

Выделить код

Код:

boolean canPaste(in long aSelectionType);

А где брать aSelectionType, я не понял.

Если будет глючить – удалить или закомментировать

Выделить код

Код:

if(editor.flags & editor.eEditorReadonlyMask)
        return;

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

Отсутствует

 

№116604-09-2009 20:27:23

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

Jarichek пишет

...
1) ...
2) ...

http://pastebin.mozilla-russia.org/101198
?

Infocatcher

А где брать aSelectionType, я не понял.

Я предполагаю, что скорее всего из nsIClipboard

Выделить код

Код:

PRInt32 kSelectionClipboard = 0
PRInt32 kGlobalClipboard    = 1

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№116704-09-2009 20:38:08

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

Re: Custom Buttons

Anton пишет

Я предполагаю, что скорее всего из nsIClipboard

Да, похоже на то.

И я как-то забыл, что есть и другая сторона вставки текста – если в буфере нет данных в нужном формате, сanPaste() вернет false.
А нужно было определить, что в данное текстовое поле можно вставлять текст – то, что сейчас делается через

Выделить код

Код:

if(editor.flags & editor.eEditorReadonlyMask)
        return;

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

Отсутствует

 

№116804-09-2009 20:44:10

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

Anton, Infocatcher
Да, спасибо вам обоим :) Пока вроде все работает как надо

Отсутствует

 

№116905-09-2009 19:51:56

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

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:

Отсутствует

 

№117005-09-2009 23:11:08

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

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

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№117106-09-2009 00:03:22

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

Эх, к сожалению не работает :(

Отсутствует

 

№117206-09-2009 00:21:46

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

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] ';
    };

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№117306-09-2009 00:59:56

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

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

Отсутствует

 

№117406-09-2009 01:18:49

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

Jarichek
Обработчик 'mouseup' не на месте
http://pastebin.mozilla-russia.org/101239


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№117506-09-2009 18:27:51

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

Anton пишет

Обработчик 'mouseup' не на месте

Да, спасибо, единственное что пришлось добавить:

n = '' + c.parentNode.firstChild.firstChild.textContent.replace(/\n.*/g, '') + ' ';

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

Отсутствует

 

Board footer

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