Вы по ошибке установили дополнение «Форум Overclockers.ru», которое работает только в обозревателе Firefox! Пожалуйста, удалите этот дополнение и установите версию, специально созданное для вашего обозревателя (а еще лучше переходите на Firefox :). Подробная инструкция по установке и настройке находится здесь.
';
}
else
{
ИзменитьСодержимоеСтраницы();
}
}
function ИзменитьСодержимоеСтраницы()
// Главная функция.
{
try
{
var стрПредыдущаяВерсия = GM_getValue('FOR_AUVersion');
if (!стрПредыдущаяВерсия)
{
// Первый вызов сценария после установки.
GM_setValue('FOR_AUVersion', стрПредыдущаяВерсия = ВЕРСИЯ_СЦЕНАРИЯ);
}
г_обЗапрос = РазобратьЗапрос();
var лПроверятьОбновление;
switch (window.location.hostname)
{
case 'people.overclockers.ru':
лПроверятьОбновление = ИзменитьСодержимоеПС();
break;
case 'www.overclockers.ru':
г_фФлаги = GM_getValue('FOR_PrefFlags', 0);
лПроверятьОбновление = ИзменитьСодержимоеСайта();
break;
default:
г_фФлаги = GM_getValue('FOR_PrefFlags', 0);
лПроверятьОбновление = ИзменитьСодержимоеФорума();
}
document.addEventListener('click', ИзменитьАдресСсылки, false);
if (лПроверятьОбновление && стрПредыдущаяВерсия != ВЕРСИЯ_СЦЕНАРИЯ)
{
ПоказатьИсториюИзменений(стрПредыдущаяВерсия);
}
}
catch (обИсключение)
{
ОбработатьИсключение(обИсключение);
}
}
function ИзменитьСодержимоеПС()
// Возвращает false что бы не проверять обновление сценария.
{
// Страница загружена неполностью?
if (document.getElementById('footer') == null)
{
return false;
}
// Вызывается на каждой странице ПС.
ОбщиеИзмененияПС();
return true;
}
function ИзменитьСодержимоеСайта()
// Возвращает false что бы не проверять обновление сценария.
{
if (window.location.search == '?media=screen')
{
ИзменитьВерсиюДляПросмотра();
// Не отвлекать внимание.
return false;
}
// Страница загружена неполностью?
if (document.getElementById('footer-nav') == null)
{
return false;
}
// Вызывается на каждой странице сайта.
ОбщиеИзмененияСайта();
if (window.location.pathname.search(/^\/(lab|hardnews|softnews|itnews|sitenews)\/[\d_]+[\/\.]/) == 0)
{
ИзменитьСтатьюИлиНовость();
}
return true;
}
function ИзменитьСодержимоеФорума()
// Возвращает false что бы не проверять обновление сценария.
// http://jsperf.com/compare-substring
// http://jsperf.com/substr-vs-slice2/5
{
// Модифицированные изображения из Tango Desktop Project.
// http://tango.freedesktop.org/Tango_Desktop_Project
// На странице может находится несколько десятков этих значков. Хранение их в отдельном
// файле позволяет оборзевателю кешировать изображение, декодируя и храня в памяти одну
// копию вместо нескольких десятков.
г_стрЗначокНепрочитанногоСообщения = GM_getResourceURL('unreadpost');
г_стрЗначокПоследнегоСообщения = GM_getResourceURL('lastpost');
var лПеренаправление = РазборМетаданных();
// Всплывающее окно для выбора смайлика.
if (window.location.pathname == '/posting.php' && г_обЗапрос.mode == 'smilies')
{
// Страница загружена полностью? У этого окна нет #wrapfooter.
if (document.getElementById('wrapcentre') != null)
{
ИзменитьСписокВсехСмайликов();
}
return false;
}
// Просмотр всех сообщений темы.
if (window.location.pathname == '/viewtopic.php'
&& г_обЗапрос.view == 'print' && 'printfull' in г_обЗапрос)
{
ПоказатьВсеСообщенияТемы();
return true;
}
// Страница не загружена полностью, версия для печати или глюк форума.
if (document.getElementById('wrapfooter') == null
// Всплывающее окно: поиск пользователя.
|| (window.location.pathname == '/memberlist.php' && г_обЗапрос.field == 'username_list')
// Всплывающее окно: новое ЛС.
|| (window.location.pathname == '/ucp.php' && г_обЗапрос.mode == 'popup')
// Технические работы.
|| document.getElementById('login_menu').firstElementChild.firstElementChild.firstElementChild.children[1].nodeName == 'SPAN')
{
return false;
}
ОбщиеИзмененияФорума();
// Cтраница через несколько секунд будет автоматически перезагружена.
if (лПеренаправление)
{
return false;
}
// Форма для подтверждения удаления сообщения, сохранения черновика и т.д.
if (document.forms.namedItem('confirm') != null)
{
ИзменитьПодтверждениеДействия();
return false;
}
// Форма для захода на форум. Может быть показана по любому адресу.
// Есть флажок "Скрыть моё пребывание на конференции в этот раз"?
if (document.getElementsByName('viewonline').length > 0)
{
return true;
}
switch (window.location.pathname)
{
case '/':
case '/index.php':
ИзменитьГлавнуюСтраницуФорума();
break;
case '/viewforum.php':
ИзменитьПодфорум();
break;
case '/search.php':
if ("search_id" in г_обЗапрос || г_обЗапрос.sr == 'topics')
{
ИзменитьСписокНайденныхТем();
}
else if (document.getElementById('search') != null)
{
ИзменитьСписокНайденныхСообщений();
}
break;
case '/viewtopic.php':
ИзменитьТему();
break;
case '/posting.php':
ИзменитьРедакторСообщения();
break;
// Личный раздел.
case '/ucp.php':
if (г_обЗапрос.mode == 'subscribed' || г_обЗапрос.mode == 'bookmarks')
{
ИзменитьПодпискиИЗакладки();
ПромотатьШапку(КонецШапки(), true);
break;
}
else if (г_обЗапрос.i == '166' || г_обЗапрос.mode == 'compose')
{
ИзменитьРедакторСообщения();
}
// Личные сообщения.
else if (г_обЗапрос.i == 'pm')
{
if ("folder" in г_обЗапрос || г_обЗапрос.action == 'view_folder')
{
ИзменитьПапкуЛС();
ПромотатьШапку(КонецШапки(), true);
break;
}
else if (г_обЗапрос.mode == 'view' || ("f" in г_обЗапрос && "p" in г_обЗапрос))
{
ИзменитьПросмотрЛС();
}
}
ПромотатьШапку(КонецШапки(), false);
break;
case '/memberlist.php':
if (г_обЗапрос.mode == 'viewprofile')
{
// Просмотр профиля пользователя.
}
else
{
ИзменитьСписокПользователей();
}
break;
}
return true;
}
function ИзменитьАдресСсылки(обСобытие)
{
var элСсылка = обСобытие.target;
do
{
if (элСсылка.tagName == 'A')
{
// Все буквы в адресе уже переведены в нижний регистр.
if (элСсылка.protocol == 'http:'
&& (элСсылка.host == 'www.overclockers.ru' || элСсылка.host == 'overclockers.ru')
&& элСсылка.search == '' // Проверить на всякий случай.
&& элСсылка.getAttribute('class') != 'gm-for-byeprint-a')
{
var мстрЧасти = элСсылка.pathname.match(/^\/(lab|hardnews|softnews|itnews|sitenews)\/(\d+)(?:_\d+)?([\/\.].+)$/);
if (мстрЧасти)
{
// Всегда изменять адрес у изображения слева от ссылки на статью.
if ((г_фФлаги & ФЛ_ВЕРСИЯ_ДЛЯ_ПРОСМОТРА) == 0)
{
if (window.location.hostname != 'www.overclockers.ru'
|| window.location.pathname != '/'
|| обСобытие.target.tagName != 'IMG')
{
return;
}
var элПризнак = элСсылка.parentNode.parentNode;
if (элПризнак == null
|| элПризнак.tagName != 'DIV'
|| элПризнак.getAttribute('class') != 'items')
{
return;
}
}
элСсылка.pathname = '/' + мстрЧасти[1] + '/print/' + мстрЧасти[2] + мстрЧасти[3];
элСсылка.search = '?media=screen';
}
}
return;
}
}
while (элСсылка = элСсылка.parentNode);
}
function ПоказатьВсеСообщенияТемы()
// TODO Обрезать длинные строки.
{
ИзменитьЗначокФорума();
GM_addStyle('\
var { font-style: inherit !important }\
td { line-height: 130% !important }\
.quotecontent { font-size: 11px !important; line-height: 14px !important }\
.codecontent { font: 12px/15px Consolas, "Courier New", monospace !important }\
body > table { border-spacing: 0 !important; width: 100% !important }\
td[width="10%"] { display: none !important }\
body > table > tbody > tr:not(:last-child) { background: #E3E3E3 !important }\
hr[width="85%"] {\
width: 100% !important;\
margin-bottom: 0 !important;\
height: 3px !important;\
border: none !important;\
border-top: solid 1px #C0C0C0 !important;\
background: #E3E3E3 !important;\
}\
hr.sep {\
margin-top: 0 !important;\
height: 3px !important;\
border: none !important;\
border-bottom: solid 1px #C0C0C0 !important;\
background: #E3E3E3 !important;\
}\
#gm-for-trash { margin: 6px 0 2px !important }\
');
// TBODY первой таблицы.
var а = document.body.firstElementChild.firstElementChild;
// Надпись "Конференция Overclockers.ru" с ссылкой.
а.removeChild(а.firstElementChild);
// Пустая строка.
а.removeChild(а.firstElementChild);
// Название темы с ссылкой.
а.firstElementChild.firstElementChild.style.textAlign = 'center';
// Последняя таблица с бесполезной информацией.
document.body.removeChild(document.body.lastElementChild);
// Нижний HR.
document.body.removeChild(document.body.lastElementChild);
//
// Добавить на страницу кнопку для скрытия мусора.
//
а = а.lastElementChild.firstElementChild;
а.appendChild(document.createElement('br'));
var б = document.createElement('button');
б.setAttribute('id', 'gm-for-trash');
б.setAttribute('type', 'button');
б.setAttribute('title', г_обТекст[25]);
б.textContent = г_обТекст[23];
б.addEventListener('click', ОбработатьСкрытиеМусора, false);
а.appendChild(б);
// Стиль для скрытия мешающего поиску текста.
var элСкрытиеМусора = null;
//
// В версии для печати ссылки на изображения недоступны. Исправляем этот глюк.
//
var элЯкорь = document.createElement('a');
элЯкорь.setAttribute('class', 'postlink');
элЯкорь.setAttribute('target', '_blank');
элЯкорь.setAttribute('rel', 'nofollow');
элЯкорь.textContent = г_обТекст[22];
var мэлVar = document.getElementsByTagName('var');
for (var индVar = 0, элVar; элVar = мэлVar[индVar]; ++индVar)
{
// Это полноценное изображение без ссылки?
if (элVar.parentNode.nodeName != 'A')
{
элЯкорь.setAttribute('href', элVar.getAttribute('title'));
ЗаменитьУзел(элЯкорь.cloneNode(true), элVar);
--индVar;
}
else
{
// Меняем послание для роботов #77 на понятный кускам мяса текст.
// http://jsperf.com/textcontent-vs-createtextnode/3
элVar.firstChild.nodeValue = г_обТекст[22];
// Это полноценное изображение с ссылкой на главную страницу хостинга?
// Иначе это миниатюра со ссылкой на полноразмерное изображение.
if (элVar.parentNode.pathname == '/')
{
элVar.parentNode.setAttribute('href', элVar.getAttribute('title'));
}
}
}
function ОбработатьСкрытиеМусора(обСобытие)
{
if (элСкрытиеМусора == null)
{
элСкрытиеМусора = ДобавитьСтиль('\
/* Название темы */\
.topic,\
/* Автор и время сообщения */\
body > table > tbody > tr:not(:last-child),\
/* ... писал(а), Код:, Вложение: */\
.quotetitle, .codetitle, .attachtitle,\
/* Вложения, кроме IMG */\
.gensmall, .genmed,\
/* Добавлено спустя ... */\
span[style="font-size: 85%; line-height: normal"],\
span[style="font-size: 75%; line-height: normal"]\
{ display: none !important }\
');
обСобытие.target.textContent = г_обТекст[24];
}
else
{
элСкрытиеМусора.parentNode.removeChild(элСкрытиеМусора);
элСкрытиеМусора = null;
обСобытие.target.textContent = г_обТекст[23];
}
}
}
function РазборМетаданных()
// Заполняет г_фРусскийЯзык и г_обТекст.
// Возвращает true если страница через несколько секунд будет автоматически перезагружена.
{
var лПеренаправление = false;
var сэлМетаданные = document.getElementsByTagName('meta');
for (var ы = 0, элМетаданные; элМетаданные = сэлМетаданные[ы]; ++ы)
{
var стрКлюч = элМетаданные.getAttribute('http-equiv');
if (стрКлюч && стрКлюч.toLowerCase() == 'content-language')
{
if (элМетаданные.getAttribute('content') == 'en-gb')
{
г_фРусскийЯзык = false;
г_обТекст =
{
0: 'Select text before cite them.',
1: 'Size: ',
2: 'Show image',
3: 'Next',
4: 'Previous',
5: 'New Topics and Posts',
6: 'Thematic Forums',
7: 'Common Forums',
8: 'Other Forums',
9: 'Script preferences',
10: 'Tools',
11: '[posts]',
12: 'Найти в этой теме все сообщения пользователя ',
13: 'Search my posts',
14: 'Найти в этой теме все мои сообщения',
15: '[quote]',
16: '[and go]',
17: 'Процитировать выделенный текст и перейти к форме быстрого ответа',
18: '[reply]',
19: 'Show all posts',
20: 'Загрузить все сообщения темы для поиска или сохранения на диске',
21: '0 new messages',
22: '[Image]',
23: 'Hide trash',
24: 'Show trash',
25: 'Будет скрыт или показан мешающий поиску текст:\r\n• Заголовки сообщений (автор и время)\r\n• Заголовки цитат (... писал(а))\r\n• Вложения\r\n• Строки "Добавлено спустя"'
};
}
else
{
г_фРусскийЯзык = true;
г_обТекст =
{
0: 'Для вставки цитаты сначала выделите цитируемый текст.',
1: 'Размер: ',
2: 'Просмотр изображения',
3: 'Следующая',
4: 'Предыдущая',
5: 'Новые темы и сообщения',
6: 'Тематические форумы',
7: 'Общекомпьютерные форумы',
8: 'Прочие форумы',
9: 'Настройки дополнения',
10: 'Тема',
11: '[сообщения]',
12: 'Найти в этой теме все сообщения пользователя ',
13: 'Найти мои сообщения',
14: 'Найти в этой теме все мои сообщения',
15: '[цитировать]',
16: '[и перейти]',
17: 'Процитировать выделенный текст и перейти к форме быстрого ответа',
18: '[ответить]',
19: 'Просмотреть все сообщения',
20: 'Загрузить все сообщения этой темы для поиска или сохранения на диске',
21: 'Новых ЛС: 0',
22: '[Изображение]',
23: 'Скрыть мешающий поиску текст',
24: 'Показать мешающий поиску текст',
25: 'Будет скрыт или показан мешающий поиску текст:\r\n• Заголовки сообщений (автор и время)\r\n• Заголовки цитат (... писал(а))\r\n• Вложения\r\n• Строки "Добавлено спустя"'
};
}
}
else if (стрКлюч == 'refresh')
{
лПеренаправление = true; ;
}
}
return лПеренаправление;
}
function ИзменитьЗначокФорума()
{
// Новый значок форума 16x16x32.
УстановитьЗначокСтраницы('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACd0lEQVR42pWTX0iTURjG36P7NnFubOlwzX1GjlGukoEXI3QwEBS6keyiSwkCSQjBP40KiQYxKBtDimYRJNhsNupiJhkbRWOwJhtEG6kznN/XZGMbTpj79pd1FDGsFfOBl3Nxnud3zvtyDoL/aGZmBpaXl6FQKIBMJoOOjg5QKBSHPKhc0Ov1gt/vP7GVTF78ubl5Lp3NIpFYHJaQ5DzZ1PTlgkbzb4DZbIZIJDIWjcV0sUSiporNBqKubrOWxwvzBIKtZqn04xmF4qFKLs//BXA4HCyPxzO5QdPXMvk8HGto8PeQ5EtNMJhiu1xcSKer0mp1ItfX5xDw+T+QSvUbYLfbwefz3VoPhe7thkmJ5PVNhBZqlpYGcT9K2Ngg9q07uBagpeUGHkroAGCxWNROp/PzDsNAY2PjB71YvIiHcQdWV/mwvg64rz+7pYDP1+wBbDYbuN3uxUg02l3D5SZvt7ePHafpR+DxcHAVIJOJAQbjlY/t3AMEizWxB9Dr9W0UTX/N5nLQqVTevyISXYK5ORm4XCZobX0O2awPqqtLQBAtGNgPqZQWx9i4jMhqte6ebkxubw9VcziUqbd3Cmzv7sLbN1ehmZxGLtehe5cGBgCs1m5IJNqgvn4emUwmCAQC4RTDSE7JZE+0QqEajMZnIBJNIqez7AMrjY8DrK0Bmp0FZDAYTn/HKuCN4a6ukbPT0yoIBi8jbKhESKfTDVAUZWLX1sYfE8RT/H5foWj0W0XpXYBWq30Rj8f7BULhpwmfbwHC4QdoZaXSPKDR0dH3DMP0yKXSqSE2x4pGhu0Vp/cBvGKxKDwplkSuq87nkKbzKPnyv/Eo+gUMHQKCdTZkpAAAAABJRU5ErkJggg==');
}
function ОбщиеИзмененияФорума()
{
ИзменитьЗначокФорума();
// Стили общие для всего форума.
GM_addStyle('\
/* Исправить расположение списка модераторов */\
h2 + .moderators {\
margin-top: 0.8em !important;\
margin-bottom: -0.8em !important;\
}\
br + .moderators {\
margin-top: -0.3em !important;\
margin-bottom: 0.3em !important;\
}\
/* Увеличить размер ников авторов сообщений */\
.postauthor { font-size: small !important }\
/* Сделать более разборчивым текст "В сети" */\
.online {\
font-weight: bold !important;\
color: green !important;\
}\
/* Уменьшить промежуток перед сообщением */\
.postbody { margin-top: -0.4em !important }\
/* Скрыть лишние пустые строки после сообщения */\
.postbody ~ br { display: none !important }\
.postbody ~ .gensmall {\
display: block !important;\
margin-top: 1em !important;\
}\
.postbody + br + br + .tablebg { margin-top: 1em !important }\
/* Уменьшить высоту заголовка [quote], [code] и вложения */\
.quotetitle, .codetitle, .attachtitle {\
padding-top: 0 !important;\
padding-bottom: 2px !important;\
background-color: #B3C2CC !important;\
}\
/* Убрать пустое место до и после [quote], [code], [spoiler=] и вложения */\
.quotetitle, .codetitle, .attachtitle, .sp-wrap { margin-top: 5px !important }\
.quotecontent, .codecontent, .attachcontent, .sp-wrap { margin-bottom: 5px !important }\
/* Увеличить кнопки листания страниц */\
.pagination > a, .pagination > strong, .gotoprevpage, .gotonextpage {\
display: inline-block !important;\
border: 1px solid #BFBFBF !important;\
border-radius: 3px !important;\
padding: 1px 3px !important;\
font-size: 12px !important;\
}\
.pagination > a, .pagination > strong {\
margin: 0 -0.15em 0 -0.15em !important;\
min-width: 1.8em !important;\
text-align: center !important;\
}\
.pagination > a:hover, .gotoprevpage:hover, .gotonextpage:hover {\
text-decoration: none !important;\
box-shadow: 0 0 2px gray !important;\
}\
.pagination {\
padding: 0 !important;\
white-space: nowrap !important;\
}\
/* Нижняя строка с ссылками для поиска тем и сообщений */\
#searchbarbottom {\
margin-top: .2em !important;\
margin-bottom: .8em !important;\
}\
/* Количество новых и непрочитанных личных сообщений в шапке форума */\
.unreadpmcount { color: red !important }\
/* В шапке форума убрать выделение ссылки на wiki */\
.cross > span { color: #004488 !important; font-weight: normal !important }\
/* Расстояние между смайликами в форме редактирования */\
#qr_smilies, #qr_smilies_hide { padding: 0 2px !important }\
.insertsmile-img { padding: 2px !important }\
/* Убрать лишние переводы строки перед формой быстрого ответа */\
.qr_nofloat { margin-top: -3ex !important }\
/* Убрать оранжевый цвет у элементов списка в ЛР и ЛС */\
option.sep {\
color: inherit !important;\
background-color: inherit !important;\
}\
/* Для г_стрЗначокНепрочитанногоСообщения и г_стрЗначокПоследнегоСообщения */\
.gm-for-uplp {\
float: left !important;\
margin: .3em 5px 0 0 !important;\
}\
/* Анимация нажатия г_стрЗначокНепрочитанногоСообщения и г_стрЗначокПоследнегоСообщения */\
.gm-for-anipress:active {\
position: relative !important;\
top: 1px !important;\
left: 1px !important;\
}\
/* Форма быстрого поиска */\
.gm-for-s-help:hover { text-decoration: none !important }\
#gm-for-s-vargroup {\
display: inline-block !important;\
line-height: 17px !important;\
margin: 3px 4px 0 0 !important;\
border: 1px solid #D3A467 !important;\
padding-right: 4px !important;\
background: #FFC477 !important;\
}\
input[name=gm-for-s-variant] {\
/* Если отключено масштабирование изображений */\
height: 1.15em !important;\
vertical-align: text-top !important;\
margin: 0 1px 0 4px !important;\
}\
');
// Ячейка в шапке со ссылками Вход, Регистрация, FAQ.
var элСтрока1 = document.getElementById('search-box').previousElementSibling;
//
// Перенести ссылку на правила форума в правый верхний угол к ФАК-ам.
//
var а = document.getElementById('mmenu').getElementsByClassName('mainmenu')[0];
// Убрать неуместный красный цвет.
элСтрока1.firstChild.removeAttribute('style');
ВставитьУзел(элСтрока1.firstChild, а);
ВставитьУзел(элСтрока1.firstChild, а);
// Выполнен вход на форум?
if (document.getElementById('login_form') == null)
{
г_стрМойНик = encodeURIComponent(document.getElementById('login_menu').firstElementChild.firstElementChild
.firstElementChild.firstElementChild.textContent.match(/\[(.+)\]\s*$/)[1].trim());
//
// Выделить в шапке форума количество новых и непрочитанных личных сообщений.
//
а = элСтрока1.parentNode.nextElementSibling.firstElementChild.lastElementChild;
if (а.textContent.trim() != г_обТекст[21])
{
if (а.children.length == 1)
{
а.className = 'unreadpmcount';
}
else
{
а.lastElementChild.className = 'unreadpmcount';
// Запретить мигание текста.
а.lastElementChild.removeAttribute('style');
}
}
}
if ((г_фФлаги & ФЛ_НЕ_ИСКАТЬ_СТАРЫЕ_СООБЩЕНИЯ) == 0 && г_стрМойНик !== undefined)
{
// Изменить ссылку "Ваши сообщения", которая перестанет искать темы,
// в которые пользователь не писал долгое время.
document.getElementsByClassName('searchbar')[0].lastElementChild.lastElementChild.setAttribute(
'href', './search.php?sk=t&sd=d&sr=topics&t=0&st=180&author=' + г_стрМойНик);
}
ИзменитьФормуБыстрогоПоиска();
//
// Заменить лишнюю ссылку на ФАК на вызов настроек сценария.
//
а = элСтрока1.lastElementChild;
а.setAttribute('href', 'javascript:');
а.firstChild.nodeValue = г_обТекст[9];
а.addEventListener('click', ПоказатьДиалогСНастройками, false);
}
function ИзменитьФормуБыстрогоПоиска()
{
var элТекст = document.getElementById('keywords');
// На странице расширенного поиска нет формы быстрого поиска.
if (элТекст == null)
{
return;
}
var элФорма = элТекст.form;
// Удалить подсказку "Поиск...", которая мешает вставке текста.
// Не добавлять placeholder, потому что кнопка справа имеет идентичную надпись.
элТекст.removeAttribute('onclick');
элТекст.removeAttribute('onblur');
if (элТекст.value == 'Поиск…')
{
элТекст.value = '';
}
элТекст.style.width = '24em';
var стрКнопки = '\
\
\
\
';
var элФлажок1, элФлажок2, стрИдентфикатор;
var элВставка = элТекст.nextElementSibling.nextElementSibling.nextElementSibling;
if (элВставка.getAttribute('type') == 'checkbox')
{
элФлажок1 = элВставка;
стрИдентфикатор = элФлажок1.getAttribute('value');
элФлажок1.setAttribute('type', 'hidden');
элФорма.removeChild(элФлажок1.nextSibling);
if (элФлажок1.getAttribute('name') == 't')
{
// Поиск в теме.
элФлажок2 = элФлажок1.nextElementSibling;
элФорма.removeChild(элФлажок2.nextSibling);
стрКнопки += '\
';
}
else
{
// Поиск в подфоруме.
стрКнопки += '\
';
}
}
элВставка.insertAdjacentHTML('beforebegin', стрКнопки + '');
элВставка = document.createElement('a');
элВставка.setAttribute('href', 'javascript:');
элВставка.setAttribute('class', 'gm-for-s-help');
элВставка.setAttribute('title', 'Справка по составлению поискового запроса. Для ее просмотра выберите вариант поиска слева и щелкните этот знак вопроса.');
элВставка.addEventListener('click', ПоказатьСправку, false);
элВставка.appendChild(document.createTextNode('?'));
элФорма.appendChild(элВставка);
элФорма.getElementsByTagName('a')[0].firstChild.nodeValue = 'Расширенный';
элФорма.addEventListener('submit', ОбработатьОтправкуФормы, false);
function ПолучитьВариантПоиска()
{
return элФорма.querySelector('input[name="gm-for-s-variant"]:checked').getAttribute('id');
}
function ПоказатьСправку()
{
switch (ПолучитьВариантПоиска())
{
case 'gm-for-s-forum':
case 'gm-for-s-subforum':
case 'gm-for-s-topic':
window.alert('ОГРАНИЧЕНИЯ ПОИСКА\n\nДвижок форума не умеет искать произвольную часть текста, он умеет искать только слова. Слова могут состоять только из букв и цифр, остальные символы считаются разделителями слов и не принимают участия в поиске. Минимальная длина слова - два символа. Таким образом попытка найти версию программы 1.5.0 обречена на провал - в этом запросе нет ни одного слова, а значит и искать нечего. Еще одна неприятность: в крупных темах поиск периодически глючит, находя только часть сообщений.\n\nМои рекомендации. Если вас не устраивают результаты поиска в конкретной теме, то зайдите в эту тему, в менюшке "Тема" выберите пункт "Просмотреть все сообщения", нажмите кнопку "Скрыть мешающий поиску текст" и начинайте искать средствами вашего оборзевателя. Если же нужно искать по всему форуму определенную фразу или текст со спецсимволами, то пользуйтесь Яндексом или Гуглом - они позволяют составлять более гибкие поисковые запросы, хотя результаты поиска представлены в менее удобном виде.');
window.alert('ПОИСКОВЫЙ ЗАПРОС\n\nДвижок форума ищет сообщения, которые содержат в произвольном порядке ВСЕ введенные слова. Для поиска сообщений, которые содержат ЛЮБОЕ КОЛИЧЕСТВО введенных слов, разделяйте слова символом |, например cool|quiet|cmd. Обратите внимание на отсутствие пробелов между | и словами. Регистр букв на поиск не влияет.\n\nДвижок форума умеет искать слова с разными окончаниями, а так же части слова. Например, поиск слова "хитрый" найдет "хитрый", "хитры", "хитрая", но не найдет "хитрожопый". "точить" найдет "точ", "точнее", "точен", но не найдет "заточить". "ликвидный" найдет "ликвидный", "ликвидности", но не найдет "ликвидировать". Часть слова "ко" найдет "скопировать", "около", "кое", "консольная", но по непонятной причине не найдет "оконная".\n\nЕсли найдено слишком много сообщений (их максимальное число 250), то поробуйте уточнить запрос, добавив в него одно или несколько слов. Для этого используйте "Поиск в найденном", который находится над результатами поиска.\n\nИ последнее. В расширенном поиске советуют использовать в запросе специальные символы - и *. На самом деле они на поиск никак не влияют. Улыбаемся и машем.');
break;
case 'gm-for-s-yandex':
window.open('http://help.yandex.ru/search/?id=481939');
break;
case 'gm-for-s-google':
window.open('https://support.google.com/websearch/bin/answer.py?hl=ru&answer=136861');
break;
}
}
function ОбработатьОтправкуФормы(обСобытие)
// Современные оборзеватели используют back-forward cache, поэтому эта
// функция может вызываться несколько раз с разными selectedIndex.
{
// Не введен текст для поиска?
if (элТекст.value.trim() == '')
{
обСобытие.preventDefault();
обСобытие.stopPropagation();
return;
}
switch (ПолучитьВариантПоиска())
{
case 'gm-for-s-forum':
НастроитьФорму('post', './search.php', 'keywords', '', '', '', '');
break;
case 'gm-for-s-yandex':
НастроитьФорму('get', 'http://yandex.ru/yandsearch', 'text', 'site', 'forums.overclockers.ru', 'numdoc', '20');
break;
case 'gm-for-s-google':
НастроитьФорму('get', 'https://www.google.ru/search', 'query', 'as_sitesearch', 'forums.overclockers.ru', 'num', '20');
break;
case 'gm-for-s-topic':
НастроитьФорму('post', './search.php', 'keywords', 't', стрИдентфикатор, 'sf', 'msgonly');
break;
case 'gm-for-s-subforum':
НастроитьФорму('post', './search.php', 'keywords', 'fid[]', стрИдентфикатор, '', '');
break;
}
}
function НастроитьФорму(стрЗапрос, стрАдрес, стрИмяТекста, стрИмя1, стрЗначение1, стрИмя2, стрЗначение2)
{
элФорма.setAttribute('method', стрЗапрос);
элФорма.setAttribute('action', стрАдрес);
элТекст.setAttribute('name', стрИмяТекста);
if (!элФлажок1)
{
элФлажок1 = document.createElement('input');
элФлажок1.setAttribute('type', 'hidden');
элФорма.appendChild(элФлажок1);
}
элФлажок1.setAttribute('name', стрИмя1);
элФлажок1.setAttribute('value', стрЗначение1);
if (!элФлажок2)
{
элФлажок2 = document.createElement('input');
элФлажок2.setAttribute('type', 'hidden');
элФорма.appendChild(элФлажок2);
}
элФлажок2.setAttribute('name', стрИмя2);
элФлажок2.setAttribute('value', стрЗначение2);
}
}
function ИзменитьПодтверждениеДействия()
{
// Увеличить размер кнопок.
GM_addStyle('\
.btnlite, .btnmain {\
font-size: 140% !important;\
margin-bottom: 1ex !important;\
padding: .5ex .5em !important;\
border-radius: 4px !important;\
background: -moz-linear-gradient(#f4f4f4 40%, #e2e2e2) !important;\
background: linear-gradient(#f4f4f4 40%, #e2e2e2) !important;\
}\
.btnlite:hover, .btnmain:hover {\
background: -moz-linear-gradient(#fcfcfc 40%, #e8e8e8) !important;\
background: linear-gradient(#fcfcfc 40%, #e8e8e8) !important;\
}\
.btnlite:active, .btnmain:active {\
background: -moz-linear-gradient(#e2e2e2, #f4f4f4 40%) !important;\
background: linear-gradient(#e2e2e2, #f4f4f4 40%) !important;\
}\
.btnmain {padding: .5ex 2em !important}\
');
}
function ИзменитьГлавнуюСтраницуФорума()
{
//
// Названия тем в таблице "Новые темы и сообщения" на главной странице форума
// не обрезаются на широкоугольных мониторах.
//
var элСтараяТаблица = document.getElementById('recentTbl');
/*
Создать новую таблицу используя div вместо table. Ширина ячеек пропорциональна ширине
окна браузера. Не влезающий в ячейки текст автоматически обрезается и добавляется многоточие.
Используется innerHTML, который во всех браузерах работает быстрее чем document.createElement().
Заголовок состоит из трех частей что бы в Хромом и Опере его ширина не отличалась от ширины
остальных строк (из-за округления при переводе процентов в пикселы). Для Лисы и Осла это не
требуется. Опера 11.01 отбрасывает дробную часть свойства width, если оно задано в процентах.
Размер и стиль новой таблицы почти полностью идентичен старой что бы уменьшить мерцание во время
модификации страницы сценарием.
*/
var элНоваяТаблица = document.createElement('div');
элНоваяТаблица.setAttribute('id', 'ntap-root');
элНоваяТаблица.innerHTML = '\
\
' + г_обТекст[5] + '
\
\
' + г_обТекст[6] + '
\
' + г_обТекст[7] + '
\
' + г_обТекст[8] + '
\
\
\
\
';
//
// Создание шаблона нового элемента таблицы. Клонирование шаблона занимает меньше
// времени, чем создание элементов с нуля.
//
var элШаблон = document.createDocumentFragment();
var элСсылкаНаПоследСообщ = элШаблон.appendChild(document.createElement('a'));
var элИзображениеПоследСообщ = элСсылкаНаПоследСообщ.appendChild(document.createElement('img'));
элИзображениеПоследСообщ.setAttribute('width', '18');
элИзображениеПоследСообщ.setAttribute('height', '9');
var элСсылкаНаПервоеСообщ = элШаблон.appendChild(document.createElement('a'));
элСсылкаНаПервоеСообщ.setAttribute('class', 'ntap-topic');
var элНазваниеТемы = элСсылкаНаПервоеСообщ.appendChild(document.createTextNode(''));
var элХрень = элШаблон.appendChild(document.createElement('span'));
элХрень.setAttribute('class', 'ntap-replies');
var элКоличествоОтветов = элХрень.appendChild(document.createTextNode(''));
элШаблон.appendChild(document.createElement('br'));
// Перекидывание ссылок из ячеек старой таблицы в новую таблицу.
for (var чЯчейка = 0; чЯчейка < 3; ++чЯчейка)
{
// table/tbody/tr[3]/td[чЯчейка]/span/a
var элВыдернуть = элСтараяТаблица.firstElementChild.lastElementChild.children[чЯчейка].firstElementChild.firstElementChild;
var элВставитьВ = элНоваяТаблица.children[6 + чЯчейка].firstElementChild;
// Количество проходов цикла равно количеству ссылок в одной ячейке.
for (var чТема = 0; чТема < 24; ++чТема)
{
элСсылкаНаПоследСообщ.setAttribute('href', элВыдернуть.getAttribute('href'));
элХрень = элВыдернуть.firstElementChild;
элИзображениеПоследСообщ.setAttribute('src', элХрень.getAttribute('src'));
элИзображениеПоследСообщ.setAttribute('title', элХрень.getAttribute('title'));
элВыдернуть = элВыдернуть.nextElementSibling;
// Какая-то хрень для модераторов, точно не помню.
if (элВыдернуть.nodeName != 'A')
{
элВыдернуть = элВыдернуть.nextElementSibling;
}
элСсылкаНаПервоеСообщ.setAttribute('href', элВыдернуть.getAttribute('href'));
элНазваниеТемы.nodeValue = элВыдернуть.getAttribute('title');
элКоличествоОтветов.nodeValue = элВыдернуть.nextSibling.nodeValue.slice(2, -15);
// В названиях тем квадратные скобки используются реже круглых.
элСсылкаНаПервоеСообщ.setAttribute('title', элНазваниеТемы.nodeValue + ' [' + элКоличествоОтветов.nodeValue + ']');
элВставитьВ.appendChild(элШаблон.cloneNode(true));
элВыдернуть = элВыдернуть.nextElementSibling.nextElementSibling;
}
}
GM_addStyle('\
#ntap-root {\
min-width: 640px;\
max-width: 100500px;\
}\
#ntap-root:after {\
content: " ";\
clear: both;\
display: block;\
}\
.ntap-col1 {width: 33.4%; float: left}\
.ntap-col2 {width: 33.1%; float: left}\
.ntap-col3 {width: 33.5%; float: left}\
.ntap-row1, .ntap-row2, .ntap-row3 {\
overflow: hidden;\
text-overflow: ellipsis;\
white-space: nowrap;\
border: 1px solid #cccccc;\
}\
.ntap-row1 {\
padding: 7px 5px;\
font-weight: bold;\
font-size: 1.1em;\
background-color: #8b9ec2;\
color: #ffffff;\
text-align: center;\
}\
.ntap-row2 {\
padding: 4px;\
font-weight: bold;\
background-color: #efefef;\
}\
.ntap-row3, .ntap-fade {\
padding-top: 4px;\
padding-bottom: 4px;\
font-size: 9pt;\
}\
.ntap-row3 {\
padding-left: 4px;\
padding-right: 4px;\
background-color: #efefef;\
}\
.ntap-topic {padding: 0 .5em}\
.ntap-replies {color: #202020}\
.ntap-col1 > .ntap-row1 {border-bottom: none; border-right: none}\
.ntap-col2 > .ntap-row1 {border-bottom: none; border-right: none; border-left: none}\
.ntap-col3 > .ntap-row1 {border-bottom: none; border-left: none}\
.ntap-col2 > .ntap-row2 {border-left: none}\
.ntap-col3 > .ntap-row2 {border-left: none}\
.ntap-col1 > .ntap-row3 {border-top: none}\
.ntap-col2 > .ntap-row3 {border-left: none; border-top: none}\
.ntap-col3 > .ntap-row3 {border-left: none; border-top: none}\
');
// Заменить старую таблицу на только что созданную.
ЗаменитьУзел(элНоваяТаблица, элСтараяТаблица);
// Не изменять значки в списке "Новые темы и сообщения".
ЗаменитьЗначокПоследнегоСообщения(элНоваяТаблица.nextElementSibling.nextElementSibling);
ПромотатьШапку('menubar', true);
}
function ИзменитьПодфорум()
{
// Скрыть бесполезную скрепку.
GM_addStyle('img[src="./styles/ocss2/imageset/icon_topic_attach.gif"] { display: none !important }');
var элМама = document.getElementById('wrapcentre');
ЗаменитьЗначокПоследнегоСообщения(элМама);
ЗаменитьЗначокНепрочитанногоСообщения(элМама);
ИзменитьКнопкиЛистанияСтраниц(1);
ПромотатьШапку(КонецШапки(), true);
}
function ИзменитьСписокНайденныхТем()
{
// Подфорумы барахолки.
var обСкрытьПодфорумы =
{
49: 49, // Покупка
83: 83, // Покупка->Москва
84: 84, // Покупка->Санкт-Петербург
91: 91, // Покупка->Другие города
50: 50, // Продажа
85: 85, // Продажа->Москва
86: 86, // Продажа->Санкт-Петербург
92: 92 // Продажа->Другие города
};
GM_addStyle('\
/* Уменьшить ширину колонок */\
th { font-size: 100% !important }\
/* Скрыть пустую вторую колоноку */\
#gm-for-foundtopics { border-collapse: collapse !important }\
#gm-for-foundtopics > tbody > tr > td, #gm-for-foundtopics > tbody > tr > th { border: solid 1px #ccc !important }\
#gm-for-foundtopics > tbody > tr > td:nth-child(2) { border: none !important; width: 0 !important; padding: 0 !important }\
#gm-for-foundtopics > tbody > tr > td:nth-child(3) { border-left: none !important }\
/* Скрыть бесполезную скрепку */\
img[src="./styles/ocss2/imageset/icon_topic_attach.gif"] { display: none !important }\
/* Выделять строку под курсором мыши */\
#gm-for-foundtopics > tbody > tr:hover > .row1 { background: #F5F5F5 }\
#gm-for-foundtopics > tbody > tr:hover > .row2 { background: #EAEFF2 }\
/* Скрыть ссылку на первую страницу темы, эта ссылка уже есть в названии темы. */\
.topictitle + .gensmall > a:nth-child(2),\
.topictitle + .gensmall > .page-dots,\
.topictitle + .gensmall > .page-sep:nth-child(3) {\
display: none !important;\
}\
.topictitle + .gensmall:not(:last-child) {\
/* Разместить ссылки на страницы справа от названия темы, как в подфорумах.\
Уменьшается высота строк, значит больше строк влезет в окно оборзевателя. */\
display: inline !important;\
margin-left: 10px !important;\
white-space: nowrap !important;\
/* Скрыть текст [ На страницу ] */\
font-size: 0 !important;\
}\
.topictitle + .gensmall:not(:last-child) > a,\
.topictitle + .gensmall:not(:last-child) > span {\
font-size: 10px !important;\
}\
/* Сделать стиль последнего сообщения как на всем форуме */\
td[width="120"] { text-align: left !important }\
td[width="120"] > p:first-child {\
white-space: nowrap !important;\
' + ((г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ) == 0
? 'margin-left: 36px !important;' : 'margin-left: 23px !important;') + '\
}\
td[width="120"] > p:last-child > a:first-child {\
display: block !important;\
white-space: nowrap !important;\
' + ((г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ) == 0
? 'margin-left: 36px !important;' : 'margin-left: 23px !important;') + '\
/* Обрезать слишком длинные ники */\
max-width: 12em !important;\
overflow: hidden !important;\
text-overflow: ellipsis !important;\
}\
td[width="120"] > p:last-child > a:last-child {\
float: left !important;\
' + ((г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ) == 0
? 'margin-top: -2.3em !important;' : 'margin-top: -2.4em !important; padding: 5% 0 !important;') + '\
}\
');
var элТаблица = document.getElementById('wrapcentre').children[4];
// Ничего не найдено?
if (элТаблица.nodeName != 'FORM')
{
return;
}
// Тег TBODY.
элТаблица = элТаблица.children[2].firstElementChild;
// Для ускорения CSS.
элТаблица.parentNode.setAttribute('id', 'gm-for-foundtopics');
// Уменьшить неправильно заданную ширину первой колонки заголовка (будет как в подфорумах).
элТаблица.firstElementChild.firstElementChild.removeAttribute('width');
if ((г_фФлаги & ФЛ_НЕ_ИСКАТЬ_В_БАРАХОЛКЕ) == 0 || (г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ) == 0)
{
// Перебор строк (найденных тем) таблицы.
for (var чСтрока = элТаблица.children.length - 2; чСтрока >= 1; --чСтрока)
{
// Тег TR.
var элСтрока = элТаблица.children[чСтрока];
// Тег A с названием темы.
var элТема = элСтрока.getElementsByClassName('topictitle')[0];
//
// Скрыть тему из подфорумов, которые перечислены в обСкрытьПодфорумы.
//
if ((г_фФлаги & ФЛ_НЕ_ИСКАТЬ_В_БАРАХОЛКЕ) == 0
&& элТема.getAttribute('href').match(/f=(\d+)/)[1] in обСкрытьПодфорумы)
{
элСтрока.style.display = 'none';
continue;
}
if ((г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ) == 0)
{
//
// Увеличить изображение для перехода к первому непрочитанному сообщению.
//
var элХрень = элТема.parentNode.firstElementChild.firstElementChild;
if (элХрень != null)
{
элХрень.setAttribute('src', г_стрЗначокНепрочитанногоСообщения);
элХрень.setAttribute('width', '31');
элХрень.setAttribute('height', '22');
элХрень.parentNode.setAttribute('class', 'gm-for-uplp gm-for-anipress');
}
//
// Увеличить изображение для перехода к последнему сообщению.
//
элХрень = элСтрока.lastElementChild.lastElementChild.lastElementChild.firstElementChild;
элХрень.setAttribute('src', г_стрЗначокПоследнегоСообщения);
элХрень.setAttribute('width', '31');
элХрень.setAttribute('height', '22');
элХрень.parentNode.setAttribute('class', 'gm-for-anipress');
}
}
}
ИзменитьКнопкиЛистанияСтраниц(2);
ПромотатьШапку(КонецШапки(), true);
}
function ИзменитьСписокНайденныхСообщений()
{
ЗаменитьИзображенияСмайликов();
УдалитьПустыеСтрокиВСообщениях();
ИзменитьКнопкиЛистанияСтраниц(2);
ИзменитьСсылкиВСообщениях(true);
ПромотатьШапку(КонецШапки(), false);
}
function ИзменитьТему()
{
var Хрень;
try
{
// Извлечь идентификаторы подфорума и темы из ссылки с названием темы.
// На данный момент идентификаторы состоят из цифр.
// location.search теоретически может не содержать идентификатора подфорума.
// [1] - идентификатор подфорума.
// [2] - идентификатор темы.
var мстрИдентификаторы = document.getElementById('pageheader')
.firstElementChild.firstElementChild.getAttribute('href').match(/\?f=(\d+)&t=(\d+)/);
}
catch (e)
{
// Тема недоступна, например помещена в карантин.
return;
}
УдалитьПустыеСтрокиВСообщениях();
ИзменитьКнопкиЛистанияСтраниц(0);
КомпактныйЗаголовокТемы(мстрИдентификаторы[2]);
// Форма быстрого ответа.
var элФорма = document.getElementById('postform');
//
// Создать ссылку для поиска в теме всех сообщений пользователя.
//
var элПоискФрагмент = document.createDocumentFragment();
var элПоискЯкорь = элПоискФрагмент.appendChild(document.createElement('a'));
элПоискЯкорь.textContent = г_обТекст[11];
элПоискФрагмент.appendChild(document.createTextNode(' '));
var стрПоискАдрес = './search.php?t=' + мстрИдентификаторы[2] + '&author=';
//
// Перебор всех сообщений на странице.
// .profile не находит скрытые сообщения недругов.
//
for (var ы = 0, элСообщение; элСообщение = document.anchors[ы]; ++ы)
{
// Это не идентификатор сообщения?
Хрень = элСообщение.getAttribute('name');
if (Хрень.charAt(0) != 'p' || Хрень.charAt(1) < '0' || Хрень.charAt(1) > '9')
{
continue;
}
if (элПервоеСообщение === undefined)
{
var элПервоеСообщение = элСообщение;
}
else if (элВтороеСообщение === undefined)
{
var элВтороеСообщение = элСообщение;
}
var элПоследнееСообщение = элСообщение;
// Это скрытое сообщение недруга?
if (элСообщение.parentNode.hasAttribute('colspan'))
{
continue;
}
var элНик = элСообщение.nextElementSibling;
var элСсылки = элСообщение.parentNode.nextElementSibling.firstElementChild.firstElementChild.firstElementChild.lastElementChild.firstElementChild;
//
// Добавить ссылку для поиска в теме всех сообщений пользователя.
// Вместо идентификатора пользователя (author_id) используется ник (author), потому что у
// некоторых пользователей нет ссылки [профиль], из которой извлекается идентификатор.
//
Хрень = элНик.textContent;
элПоискЯкорь.setAttribute('href', стрПоискАдрес + encodeURIComponent(Хрень));
элПоискЯкорь.setAttribute('title', г_обТекст[12] + Хрень);
// Количество и состав [ссылок] предсказать практически невозможно.
// Вставить ссылку справа от [профиль] и слева от СК.
элСсылки.insertBefore(элПоискФрагмент.cloneNode(true), элСсылки.children.length < 2 ? null : элСсылки.lastElementChild);
if (элФорма != null)
{
//
// Удалить лишнюю ссылку [цитировать].
//
if (элСсылки.firstElementChild.hasAttribute('onclick'))
{
элСсылки.removeChild(элСсылки.firstChild);
элСсылки.removeChild(элСсылки.firstChild);
элСсылки.firstChild.nodeValue = элСсылки.firstChild.nodeValue.substring(1);
}
//
// Вставка цитаты не будет прокручивать страницу вниз.
// Так же добавить в заголовок цитаты ссылку на цитируемое сообщение.
//
Хрень = элСообщение.parentNode.parentNode.nextElementSibling.firstElementChild.getElementsByTagName('a')[0];
// Заключить текст ссылки в [].
Хрень.firstChild.nodeValue = г_обТекст[15];
Хрень.setAttribute('onclick', 'return false');
Хрень.addEventListener('click', ОбработатьВставкуЦитаты, false);
//
// Добавить ссылку для цитирования с прокруткой до формы редактирования.
//
var элКопия = Хрень.cloneNode(true);
элКопия.firstChild.nodeValue = г_обТекст[16];
элКопия.setAttribute('title', г_обТекст[17]);
элКопия.setAttribute('style', 'margin-left: .5em');
элКопия.addEventListener('click', ОбработатьВставкуЦитатыИПерейти, false);
ВставитьУзел(элКопия, Хрень, true);
//
// Вставка ника не будет прокручивать страницу вниз. Хрому это исправление не требуется.
//
элНик.firstElementChild.setAttribute('onclick', 'return false');
элНик.firstElementChild.addEventListener('click', ОбработатьВставкуНика, false);
}
}
//
// Изменить форму быстрого ответа.
//
if (элФорма != null)
{
var элЯчейкаСоСмайликами = document.getElementById('qr_smilies');
var элВключПлавФорму = элФорма.getElementsByClassName('qr_float_link')[0];
//
// Скрыть ячейку для вставки смайликов независимо от ее прежнего состояния.
//
if (г_фФлаги & ФЛ_СКРЫТЬ_СМАЙЛИКИ)
{
// Изменить идентификатор что бы код на странице не смог показать ячейку.
элЯчейкаСоСмайликами.setAttribute('id', 'qr_smilies_hide');
// Управление видимостью ячейки без использования cookie.
элВключПлавФорму.previousElementSibling.setAttribute('onclick', "$('#qr_smilies_hide').toggle()");
}
// Убрать лишний | после ссылки "Включить плавающую форму".
элВключПлавФорму.nextSibling.nodeValue = '';
ИзменитьСмайликиНаСтраницеИВФормеРедактирования(элФорма, элЯчейкаСоСмайликами, элЯчейкаСоСмайликами.lastElementChild);
ИзменитьBBTags();
ДобавитьСочетанияКлавишВФормуРедактирования();
}
else
{
ЗаменитьИзображенияСмайликов();
}
//
// Скопировать три строки из верхней части страницы в нижнюю.
//
var элМама = document.getElementById('pagecontent');
// Строка с ссылками "Новая тема" и "Пред. тема".
var узСтрока1 = document.getElementById('first_row').cloneNode(true);
узСтрока1.removeAttribute('id');
узСтрока1.firstElementChild.firstElementChild.lastElementChild.setAttribute('valign', 'middle');
// cloneNode() не копирует обработчики событий.
узСтрока1.firstElementChild.firstElementChild.firstElementChild.lastElementChild.addEventListener('click', ОбработатьВызовМенюТемы, false);
// Заменить нижнюю строку с ссылкой "Ответить" и кнопками для листания страниц.
элМама.replaceChild(узСтрока1, элПоследнееСообщение.parentNode.parentNode.parentNode.parentNode.nextElementSibling.nextElementSibling);
// Строка с ссылкой "Ваши сообщения".
Хрень = document.getElementsByClassName('searchbar')[0].cloneNode(true);
// Идентификатор используется в CSS и для прокрутки к последнему сообщению.
Хрень.setAttribute('id', 'searchbarbottom');
элМама.insertBefore(Хрень, узСтрока1.nextElementSibling);
// Строка с кнопками для листания страниц.
элМама.insertBefore(элМама.firstElementChild.cloneNode(true), узСтрока1.nextElementSibling);
ИзменитьСсылкиВСообщениях(false);
//
// Код для прокрутки должен выполняться в сценарии последним.
//
if (window.location.hash == '#pagecontentbottom')
{
// Показать последнее сообщение и кнопки для листания страниц.
ПрокрутитьДо('searchbarbottom');
}
else if (window.location.hash == '#toppost')
{
// Прокрутить до первого сообщения, пропуская закрепленное. Закрепленное сообщение определяется
// по наличию дополнительной ячейки с изображением желтого восклицательного знака.
ПрокрутитьДоЯкоря(элВтороеСообщение && элПервоеСообщение.parentNode.parentNode.querySelector('td[width="20"]')
? элВтороеСообщение : элПервоеСообщение);
}
else if (window.location.hash.length > 1)
{
// HACK Firefox 20 при переходе к location.hash промахивается, потому что не учитывает
// загрузку изображений и изменения в верстке страницы, которые сделал JS. Обновляем
// location.hash что бы лиса учла изменения.
window.location.hash = window.location.hash;
}
else
{
ПромотатьШапку('pagecontent', false);
}
}
function ИзменитьРедакторСообщения()
// Настройка формы для редактирования сообщения в теме или ЛС.
// Не использовать для формы быстрого ответа.
// Вызывает ЗаменитьИзображенияСмайликов().
{
// document.forms['postform'] не работает в XPCNativeWrapper.
var элФорма = document.getElementsByName('postform')[0];
// Возможно сообщение запрещено редактировать, оно было отправлено получателю или удалено.
if (элФорма)
{
// TR со смайликами и TEXTAREA.
var элГлавнаяСтрока = элФорма.querySelector('td[width="22%"][valign="top"]').parentNode;
// Поле для редактирования текста.
var элТекст = элГлавнаяСтрока.getElementsByTagName('textarea')[0];
//
// Уменьшить ширину панели со смайликами. Размер редактируемого текста увеличится до размера
// просматриваемого текста (примерно). Так же все кнопки уместятся в одной строке. В случае нехватки
// места для кнопок строка автоматически разделится на две.
//
элГлавнаяСтрока.firstElementChild.setAttribute('width', '148px');
элГлавнаяСтрока.lastElementChild.removeAttribute('width');
// Заголовок ЛС.
if (элГлавнаяСтрока.previousElementSibling.children.length > 1)
{
элГлавнаяСтрока.previousElementSibling.firstElementChild.removeAttribute('width');
элГлавнаяСтрока.previousElementSibling.lastElementChild.removeAttribute('width');
}
//
// Уменьшить высоту панели с кнопками с двух строк до одной.
//
// Верхняя строка с кнопками.
var элВерхняяЯчейка = элГлавнаяСтрока.lastElementChild.lastElementChild
.firstElementChild.firstElementChild.firstElementChild;
// Нижняя строка с кнопками.
var элНижняяЯчейка = элВерхняяЯчейка.parentNode.nextElementSibling.firstElementChild;
// Сократить текст 'Размер шрифта' до 'Размер' что бы кнопки влезли в одну строку.
элВерхняяЯчейка.getElementsByTagName('span')[0].firstChild.nodeValue = г_обТекст[1];
// Переместить кнопки из нижней строки в верхнюю.
while (элНижняяЯчейка.firstChild)
{
элВерхняяЯчейка.appendChild(элНижняяЯчейка.firstChild);
}
// Удалить нижнюю строку.
элНижняяЯчейка.parentNode.parentNode.removeChild(элНижняяЯчейка.parentNode);
// mode=quote - редактирование ответа на сообщение в теме
// mode=reply - редактирование нового сообщения в теме
// mode=edit - редактирование отправленного сообщения в теме
// mode=compose&action=quote - редактирование ответа на сообщение в ЛС
// mode=compose&action=reply - редактирование нового сообщения в ЛС
// mode=compose&action=edit - редактирование исходящего сообщения в ЛС
if ((г_обЗапрос.mode == 'quote' || г_обЗапрос.action == 'quote')
// Снят флажок "Отключить в этом сообщении BBCode"?
&& !document.getElementsByName('disable_bbcode')[0].checked)
{
var стрТекст = УдалитьВложенныеЦитаты(элТекст.value);
// Добавить в заголовок цитаты ссылку на цитируемое сообщение.
if ((г_фФлаги & ФЛ_ССЫЛКА_В_ЦИТАТЕ) == 0 && г_обЗапрос.mode == 'quote' && г_обЗапрос.p)
{
// Ссылка еще не добавлена?
if (стрТекст.substr(0, 8) == '[quote="' && стрТекст.substr(8, 5) != '[url=')
{
var чКонецНика = стрТекст.indexOf('"]', 8);
стрТекст = '[quote="[url=http://forums.overclockers.ru/viewtopic.php?p='
+ г_обЗапрос.p
+ '#p'
+ г_обЗапрос.p
+ ']'
+ стрТекст.substring(8, чКонецНика)
+ '[/url]'
+ стрТекст.substring(чКонецНика);
}
}
элТекст.value = стрТекст;
}
ИзменитьСмайликиНаСтраницеИВФормеРедактирования(
элФорма,
элФорма.querySelector('a[onclick^="insert_text(\':D"]').parentNode,
null);
УдалитьПустыеСтрокиВСообщениях();
ИзменитьРазмерСпискаПоследнихСообщений();
ИзменитьСсылкиВСообщениях(true);
ИзменитьBBTags();
ДобавитьСочетанияКлавишВФормуРедактирования();
элТекст.focus();
// Прокрутить страницу в начало предпросматриваемого сообщения на случай
// если оно уехало за пределы экрана после focus().
ПрокрутитьДоЯкоря(элФорма);
}
}
function УдалитьВложенныеЦитаты(стрТекст)
{
var рвТеги = /\[\/?code\]|\[\/?quote\]|\[quote=".*?"\]/ig;
var мстрТег;
var лКод = false; // Действует тег [code]?
var чУровень = 0; // Текущий уровень вложенности цитат.
var индНачало; // Индекс начала удаляемой цитаты.
var стрРезультат = стрТекст;
while (мстрТег = рвТеги.exec(стрТекст))
{
var v = мстрТег[0].charAt(1);
if (v == '/')
{
if (мстрТег[0].charAt(2).toLowerCase() == 'c') // [/code]
{
лКод = false;
}
else if (!лКод && чУровень-- == 2) // [/quote]
{
v = стрТекст.length - стрРезультат.length;
стрРезультат = стрРезультат.substr(0, индНачало - v) + стрРезультат.substr(рвТеги.lastIndex - v);
}
}
else if (v.toLowerCase() == 'c') // [code]
{
лКод = true;
}
else if (!лКод && ++чУровень == 2) // [quote]
{
индНачало = мстрТег.index;
}
}
// Не менять текст если не хватает закрывающих тегов [/code] или [/quote].
// Пусть пользователь сам в этой каше ковыряется.
return !лКод && чУровень == 0 ? стрРезультат : стрТекст;
}
function ИзменитьПодпискиИЗакладки()
{
// Скрыть бесполезную скрепку.
GM_addStyle('img[src="./styles/ocss2/imageset/icon_topic_attach.gif"] { display: none !important }');
if (г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ)
{
return;
}
var сэлИзображения = document.getElementById('ucp').getElementsByTagName('img');
for (var ы = 0, элИзображение; элИзображение = сэлИзображения[ы]; ++ы)
{
var стрАдрес = элИзображение.getAttribute('src');
if (стрАдрес == './styles/ocss2/imageset/icon_topic_newest.gif')
{
//
// Увеличить изображение для перехода к первому непрочитанному сообщению.
//
элИзображение.setAttribute('src', г_стрЗначокНепрочитанногоСообщения);
элИзображение.setAttribute('width', '31');
элИзображение.setAttribute('height', '22');
элИзображение.parentNode.setAttribute('class', 'gm-for-uplp gm-for-anipress');
}
else if (стрАдрес == './styles/ocss2/imageset/icon_topic_latest.gif')
{
//
// Увеличить изображение для перехода к последнему сообщению.
//
элИзображение.setAttribute('src', г_стрЗначокПоследнегоСообщения);
элИзображение.setAttribute('width', '31');
элИзображение.setAttribute('height', '22');
элИзображение.parentNode.setAttribute('class', 'gm-for-uplp gm-for-anipress');
var элЯчейка = элИзображение.parentNode.parentNode;
// Это подписка на форум?
if (элЯчейка.nodeName == 'TD')
{
элЯчейка.removeAttribute('align');
}
else
{
элЯчейка = элЯчейка.parentNode;
}
элЯчейка.style.minWidth = '16em';
элЯчейка.removeAttribute('valign');
элЯчейка.insertBefore(элИзображение.parentNode, элЯчейка.firstChild);
}
}
}
function ИзменитьПапкуЛС()
{
GM_addStyle('\
/* Скрыть вторую колонку если в ней нет значков */\
form[name="viewfolder"] > table > tbody > tr > td:nth-of-type(2) {\
width: 0 !important;\
padding: 0 !important;\
}\
');
ИзменитьКнопкиЛистанияСтраниц(3);
//
// Переименовать кнопки "Перейти" в "Выполнить".
//
if (г_фРусскийЯзык)
{
var сэлКнопки = document.getElementsByTagName('input');
for (var ы = 0, элКнопка; элКнопка = сэлКнопки[ы]; ++ы)
{
if (элКнопка.getAttribute('value') == 'Перейти')
{
элКнопка.setAttribute('value', 'Выполнить');
}
}
}
//
// Изменить действие по-умолчанию над выбранными сообщениями с "Пометить" на "Удалить".
//
var мэлМеню = document.getElementsByName('mark_option');
// В папке есть сообщения?
if (мэлМеню.length > 0)
{
мэлМеню[0].value = 'delete_marked';
}
}
function ИзменитьПросмотрЛС()
{
ЗаменитьИзображенияСмайликов();
УдалитьПустыеСтрокиВСообщениях();
ИзменитьРазмерСпискаПоследнихСообщений();
ИзменитьСсылкиВСообщениях(true);
}
function ИзменитьСписокПользователей()
{
ИзменитьКнопкиЛистанияСтраниц(4);
ПромотатьШапку(КонецШапки(), false);
}
function HTMLSpecialChars(стрТекст)
// Аналог функции PHP.
// http://jsperf.com/htmlescape-replacevstextcontent/4
// TODO Кэшировать регулярные выражения если функция станет вызываться в цикле.
{
return ('' + стрТекст).replace(/&/g, '&').replace(//g, '>');
}
function IsElementContentWhitespace(элТекст)
// isElementContentWhitespace оборзевателями больше не поддерживается :(
{
return элТекст.nodeType == 3 && элТекст.nodeValue.search(/\S/) < 0;
}
function ЗаменитьУзел(элНовый, элСтарый)
{
return элСтарый.parentNode.replaceChild(элНовый, элСтарый);
}
function ВставитьУзел(элНовый, элСтарый, фПосле)
{
return фПосле
? элСтарый.parentNode.insertBefore(элНовый, элСтарый.nextSibling)
: элСтарый.parentNode.insertBefore(элНовый, элСтарый);
}
function ВставитьВНачалоСтраницы(элНовый)
{
return document.body.insertBefore(элНовый, document.body.firstChild);
}
function ПрокрутитьДоЯкоря(варЯкорь)
// HACK Greasemonkey < 1.0: location.replace('#anchor') не работает.
// HACK Opera 12.13: location.replace('#anchor') по ошибке адрес добавляет, а не замещает.
// В обоих случаях нужно использовать абсолютный URL.
// Если адрес заканчивается на #, то страница прокручивается в начало и location.hash
// возвращает пустую строку (только осел возвращает #).
{
if (typeof(варЯкорь) != 'string')
{
var стрИдентификатор = варЯкорь.getAttribute('id');
if (!стрИдентификатор)
{
стрИдентификатор = варЯкорь.getAttribute('name');
if (!стрИдентификатор || варЯкорь.nodeName != 'A')
{
варЯкорь.setAttribute('id', стрИдентификатор = 'gm-for-scroll');
}
}
варЯкорь = стрИдентификатор;
}
var l = window.location;
l.replace(l.protocol + '//' + l.host + l.pathname + l.search + '#' + варЯкорь);
}
function ПрокрутитьДо(стрИдентификаторЭлемента)
{
var элЦель = document.getElementById(стрИдентификаторЭлемента);
//
// Из-за загружающихся изображений элемент может уехать вниз. Нельзя
// слишком долго возвращать его обратно, т.к. это блокирует прокрутку
// страницы пользователем. Начальная задержка довольно большая, что бы
// страницу меньше колбасило во время загрузки, что довольно неприятно.
//
window.setTimeout(Таймер, 500);
window.setTimeout(Таймер, 1000);
function Таймер()
{
элЦель.scrollIntoView(false);
}
}
function КонецШапки()
// Возвращает первый элемент, расположеный под шапкой форума.
{
return document.getElementsByClassName('breadcrumbs')[0]
.parentNode.parentNode.parentNode.parentNode.nextElementSibling.nextElementSibling;
}
function ПромотатьШапку(варЯкорь, лОбновитьСтраницу)
// Прокручивает шапку. Используется location.hash вместо scrollIntoView() что бы при перезагрузке
// страницы не было повторной прокрутки. Так же функция запрещает использовать Лисе кэш для
// перехода на страницу с помощью кнопок Вперед/Назад.
{
if (window.location.hash.length < 2)
{
ПрокрутитьДоЯкоря(варЯкорь);
}
if (лОбновитьСтраницу)
{
window.addEventListener('pageshow', ОбновитьСтраницу, false);
}
}
function ОбновитьСтраницу(обСобытие)
// Если перейти из списка тем к последнему непрочитанному сообщению и после этого вернуться в список
// нажав кнопку Назад, то тема по-прежнему будет помечена как непрочитанная, потому что Лиса 20
// сохранила страницу в кэше. Для отключения кэширования нужно добавить HTTP-заголовок cache-control:
// no-store. Это нельзя сделать с помощью JS. Для обновления списка перезагружаем страницу. В качестве
// негативного побочного эффекта все файлы, на которые ссылается перезагружаемая страница, будут проверены
// на изменение, что немного замедлит перезагрузку. Опера 12 так же сохраняет страницу в кэше, но она не
// поддерживает событие pageshow. Хромой 26 всегда перезагружает страницу, возможно потому что сервер
// посылает cache-control: no-cache и expires: 0.
{
if (обСобытие.persisted)
{
// Добавляем несуществующий #идентификатор что бы после перезагрузки страница не была перемотана.
ПрокрутитьДоЯкоря('gm-for-null');
window.location.reload();
}
}
function УстановитьЗначокСтраницы(стрUrlЗначка)
// Устанавливает или меняет значок страницы.
// Предполагается, что страница разобрана и в ней нет .
{
var элЗначок = document.createElement('link');
элЗначок.setAttribute('rel', 'shortcut icon');
элЗначок.setAttribute('href', стрUrlЗначка);
document.head.appendChild(элЗначок);
}
function ДобавитьСтиль(стрСтиль)
// В отличие от GM_addStyle() возвращает вставленный элемент.
{
if (document.head)
{
var элСтиль = document.createElement('style');
элСтиль.textContent = стрСтиль;
return document.head.appendChild(элСтиль);
}
return null;
}
function ДляРегВыр(стрТекст)
// Возвращает текст, который можно использовать в составе шаблона регулярных выражений.
// https://developer.mozilla.org/en/javascript/guide/regular_expressions
{
return стрТекст.replace(/[\\^$*+?.|(){}[\]]/g, '\\$&');
}
function РазобратьЗапрос()
// Возвращает объект с результатами разбора строки location.search.
// Параметры без названия игнорируются.
{
var обЗапрос = {};
if (window.location.search.length > 1)
{
for (var а = window.location.search.substr(1).split('&'), ы = а.length; --ы >= 0;)
{
var б = а[ы], в = б.indexOf('=');
if (в > 0)
{
обЗапрос[б.substr(0, в)] = decodeURIComponent(б.substr(в + 1));
}
else if (в < 0)
{
обЗапрос[б] = '';
}
}
}
return обЗапрос;
}
function ПоказатьМенюшку(обКоординаты, узМенюшка)
// Показывает менюшку узМенюшка поверх элемента с координатами обКоординаты.
// Высота пункта меню должна быть не меньше высоты элемента, иначе менюшка,
// состоящая из одного пункта, может исчезнуть сразу после появления.
{
// Ширина рамки в пикселах у focused элемента которую нужно скрыть.
var РАМКА = 2;
// Минимальное расстояние в пикселах между низом менюшки и окном.
// Должно вместить горизонтальную полосу прокрутки окна и тень менюшки.
var ОТСТУП = 50;
// Не дать менюшке выйти за нижнюю границу окна.
узМенюшка.style.top = window.pageYOffset + Math.min(обКоординаты.top - РАМКА,
Math.max(window.innerHeight - ОТСТУП, обКоординаты.bottom + РАМКА) - узМенюшка.offsetHeight) + 'px';
узМенюшка.style.left = window.pageXOffset + обКоординаты.left - РАМКА + 'px';
узМенюшка.style.minWidth = РАМКА + обКоординаты.width + РАМКА + 'px';
узМенюшка.setAttribute('class', 'gm-for-pm-popup-show');
document.addEventListener('mousemove', function ОбработатьДвижениеМышиНадМенюшкой(обСобытие)
// Если событие направлено узлу, который не входит в состав менюшки,
// то значит мышь вышла за ее пределы и менюшку нужно скрыть.
{
if (обСобытие.target !== узМенюшка
&& (обСобытие.target.compareDocumentPosition(узМенюшка) & DOCUMENT_POSITION_CONTAINS) == 0)
{
document.removeEventListener('mousemove', ОбработатьДвижениеМышиНадМенюшкой, false);
узМенюшка.setAttribute('class', 'gm-for-pm-popup-hide');
}
}, false);
}
function ОбработатьВызовМенюТемы(обСобытие)
// Показывает менюшку поверх щелкнутой ссылки.
{
var узЯкорь = обСобытие.target.nodeName == 'A' ? обСобытие.target : обСобытие.target.parentNode;
var обКоординатыЯкоря = узЯкорь.getBoundingClientRect();
var обКоординатыИзображения = узЯкорь.firstChild.getBoundingClientRect();
var обКоординаты = {};
обКоординаты.top = Math.min(обКоординатыЯкоря.top, обКоординатыИзображения.top);
обКоординаты.bottom = Math.max(обКоординатыЯкоря.bottom, обКоординатыИзображения.bottom);
обКоординаты.left = обКоординатыЯкоря.left;
обКоординаты.right = обКоординатыЯкоря.right;
обКоординаты.height = обКоординаты.bottom - обКоординаты.top;
обКоординаты.width = обКоординаты.right - обКоординаты.left;
ПоказатьМенюшку(обКоординаты, document.getElementById('gm-for-pm-popup'));
}
function КомпактныйЗаголовокТемы(стрИдентификаторТемы)
// Перегруппировать элементы в заголовке темы (две строки), уменьшив его горизонтальный размер.
{
// BUG В Opera 12 после появления менюшки не подсвечен ее пункт.
// В Firefox подсвечен, потому что после щелчка курсор смещается на один пиксель.
GM_addStyle('\
#first_row { margin: -6px 0 0 0 }\
#gm-for-pm-popup {\
position: absolute;\
z-index: 1000;\
border: 1px solid black;\
box-shadow: .5em .5em 1em rgba(0,0,0,.2);\
visibility: hidden;\
opacity: 0;\
}\
.gm-for-pm-popup-show {\
visibility: visible !important;\
opacity: 1 !important;\
-moz-transition: opacity .15s ease-out;\
transition: opacity .15s ease-out;\
}\
.gm-for-pm-popup-hide {\
-moz-transition: opacity .15s ease-out, visibility 0s ease .15s;\
transition: opacity .15s ease-out, visibility 0s ease .15s;\
}\
.gm-for-pm-item {\
display: block;\
padding: .4em;\
background-color: white;\
}\
.gm-for-pm-item:hover {\
text-decoration: none;\
color: black;\
background-color: #FFB444;\
}\
.gm-for-pm-item + .gm-for-pm-item { border-top: 1px solid #B0B0B0 }\
');
// Ячейка с двумя ссылками: "Новая тема" и "Ответить".
var элЯчейка0 = document.getElementById('pagecontent').firstElementChild.firstElementChild.firstElementChild.firstElementChild;
// Ячейка с ссылками "Подписаться на тему", "В закладки" и т.д. Эти ссылки будут перемещены в
// менюшку, а на их место перемещены "Новая тема", "Ответить" и ссылка для вызова менюшки.
var элЯчейка1 = document.getElementById('first_row').firstElementChild.firstElementChild.firstElementChild;
элЯчейка1.nextElementSibling.setAttribute('valign', 'bottom');
// Создать менюшку.
var элМенюшка = document.createElement('div');
элМенюшка.id = 'gm-for-pm-popup';
// Переместить ссылки в менюшку.
var лВсеСообщения = false;
for (var сэлЯкоря = элЯчейка1.getElementsByTagName('a'), элЯкорь; элЯкорь = сэлЯкоря[0];)
{
элМенюшка.appendChild(элЯкорь);
// Ускорение работы селектора CSS.
элЯкорь.setAttribute('class', 'gm-for-pm-item');
if (элЯкорь.search.substr(-10) == '&printfull')
{
лВсеСообщения = true;
элЯкорь.setAttribute('title', г_обТекст[20]);
элЯкорь.firstChild.nodeValue = г_обТекст[19];
}
else
{
// Удалить дублирующую подсказку.
элЯкорь.removeAttribute('title');
}
}
// По непонятной причине, если не авторизоваться, то у части тем нет ссылки
// на просмотр всех сообщений. Добавляем ее.
if (!лВсеСообщения)
{
элЯкорь = document.createElement('a');
элЯкорь.setAttribute('class', 'gm-for-pm-item');
элЯкорь.setAttribute('href', './viewtopic.php?t=' + стрИдентификаторТемы + '&view=print&printfull');
элЯкорь.setAttribute('title', г_обТекст[20]);
элЯкорь.textContent = г_обТекст[19];
элМенюшка.appendChild(элЯкорь);
}
// Добавить в менюшку ссылку для поиска в теме всех своих гениальных сообщений.
if (г_стрМойНик)
{
элЯкорь = document.createElement('a');
элЯкорь.setAttribute('class', 'gm-for-pm-item');
элЯкорь.setAttribute('href', './search.php?t=' + стрИдентификаторТемы + '&author=' + г_стрМойНик);
элЯкорь.setAttribute('title', г_обТекст[14]);
элЯкорь.textContent = г_обТекст[13];
элМенюшка.appendChild(элЯкорь);
}
ВставитьВНачалоСтраницы(элМенюшка);
//
// К двум ссылкам добавить третюю, которая будет вызывать менюшку.
//
элЯкорь = document.createElement('a');
элЯкорь.setAttribute('href', 'javascript:');
элЯкорь.addEventListener('click', ОбработатьВызовМенюТемы, false);
var элЗначок = элЯкорь.appendChild(document.createElement('img'));
элЗначок.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAANCAYAAABLjFUnAAAAdklEQVR42mNkgIKzl278f/H6PYzLICEqyGCsp8HIQAKAK9669/h/LycLuER1z3yGttIkygwLaU1gWFO9AG5YSGrlf2QNa2a3YxWjnctAYbZ25zG4hIGmIkOYj+MgCrObIowM6m/+j4YZCYYZ5RxkODfFfpiFGQCJP3wOeRxihwAAAABJRU5ErkJggg==');
элЗначок.setAttribute('width', '19');
элЗначок.setAttribute('height', '13');
элЯкорь.appendChild(document.createTextNode(' ' + г_обТекст[10]));
элЯчейка0.appendChild(document.createTextNode(' / '));
элЯчейка0.appendChild(элЯкорь);
// Перенести три ссылки на строку ниже.
ЗаменитьУзел(элЯчейка0, элЯчейка1);
}
function ИзменитьКнопкиЛистанияСтраниц(идМестонахождение)
// Изменяет блок с кнопками для листания страниц.
// идМестонахождение:
// 0 - тема
// 1 - подфорум
// 2 - результат поиска
// 3 - папка с личными сообщениями
// 4 - список пользователей форума
{
var стрПредыдущаяСтраница, стрСледующаяСтраница;
// TIP Во всех обозревателях getElementsByXXX() быстрее чем querySelectorXXX().
// TIP Во всех обозревателях querySelectorXXX() быстрее чем evaluate().
var nlSpans = document.getElementsByClassName('pagination');
ПереборБлоков:
for (var idxSpan = 0, emSpan; emSpan = nlSpans[idxSpan]; ++idxSpan)
{
switch (идМестонахождение)
{
case 0:
// Не тратить время на изменение нижнего блока, который позже будет удален.
if (idxSpan == 1)
{
continue;
}
break;
case 2:
if (idxSpan == 0)
{
GM_addStyle('\
.nav {\
/* Отделить блок с кнопками от таблицы */\
display: inline-block !important;\
margin-top: 5px !important;\
/* Убрать жирный шрифт */\
font-weight: inherit !important;\
}\
');
}
break;
case 3:
if (idxSpan == 1)
{
//
// Блок не умещается в ячейке на мониторах с низким разрешением.
// Перенести содержимое блока ниже, слева от ссылок "Отметить все" и "Снять выделение".
//
GM_addStyle('\
#pagecontent > table:nth-of-type(2) { margin-bottom: 5px !important }\
form[name="sortmsg"] { text-align: center !important }\
');
var emParent = emSpan.parentNode;
var emDiv = document.createElement('div');
emDiv.style.cssFloat = 'left';
emDiv.innerHTML = emParent.innerHTML;
emParent.parentNode.removeChild(emParent);
emParent = document.getElementById('pagecontent');
emParent.insertBefore(emDiv, emParent.children[emParent.children.length - 2]);
emSpan = nlSpans[idxSpan];
}
break;
case 4:
// Удалить лишние классы.
nlSpans[0].removeAttribute('class');
nlSpans[0].removeAttribute('class');
// Список найденных пользователей занимает одну страницу?
if ((emSpan = nlSpans[0]) == undefined)
{
break ПереборБлоков;
}
break;
}
// Переносить элементы блока на мониторах с низким разрешением.
emSpan.parentNode.removeAttribute('nowrap');
//
// Кнопка <
//
var emA = emSpan.previousElementSibling;
if (emA != null && emA.textContent == '<')
{
// Упростить селектор css.
emA.setAttribute('class', 'gotoprevpage');
// Изменить название кнопки.
emA.firstChild.nodeValue = г_обТекст[4];
// Всплывающая подсказка с сочетанием клавиш.
emA.setAttribute('title', 'Z');
// После загрузки страницы прокрутить содержимое окна.
emA.setAttribute('href', стрПредыдущаяСтраница = emA.getAttribute('href')
+ (идМестонахождение == 0 ? '#pagecontentbottom' : ''));
}
//
// Кнопка >
//
emA = emSpan.nextElementSibling;
if (emA != null && emA.textContent == '>')
{
emA.setAttribute('class', 'gotonextpage');
emA.firstChild.nodeValue = г_обТекст[3];
emA.setAttribute('title', 'X');
emA.setAttribute('href', стрСледующаяСтраница = emA.getAttribute('href')
+ (идМестонахождение == 0 ? '#toppost' : ''));
}
}
//
// Переход на предыдущую/следующую страницу с помощью клавиш Z и X.
//
if (стрПредыдущаяСтраница || стрСледующаяСтраница)
{
// Очищаем переменную nlSpans и заодно ускоряем проверку типа элемента.
nlSpans = { email: 0, number: 0, password: 0, search: 0, text: 0, url: 0 };
document.addEventListener('keydown', function(обСобытие)
{
//
// Не перехватывать нажатия клавиш в поле для набора текста.
//
var обЦель = обСобытие.target;
if (обЦель.nodeName == 'TEXTAREA'
|| (обЦель.nodeName == 'INPUT' && обЦель.getAttribute('type') in nlSpans))
{
return;
}
if (!обСобытие.ctrlKey && !обСобытие.shiftKey && !обСобытие.altKey && !обСобытие.metaKey)
{
// В Опере нет константы обСобытие.DOM_VK_Z.
if (стрПредыдущаяСтраница && обСобытие.keyCode == 90)
{
// Запретить Лисе включать быстрый поиск.
обСобытие.preventDefault();
window.location.href = стрПредыдущаяСтраница;
}
// В Опере нет константы обСобытие.DOM_VK_X.
else if (стрСледующаяСтраница && обСобытие.keyCode == 88)
{
обСобытие.preventDefault();
window.location.href = стрСледующаяСтраница;
}
}
}, false);
}
}
function УдалитьПустыеСтрокиВСообщениях()
// Удаляет пустые строки после [quote], [code], [spoiler=] и вложения. С помощью CSS это сделать невозможно.
{
УдалитьПустыеСтрокиПослеКласса('quotecontent', true);
УдалитьПустыеСтрокиПослеКласса('codecontent', false);
УдалитьПустыеСтрокиПослеКласса('attachcontent', false);
УдалитьПустыеСтрокиПослеКласса('sp-wrap', false);
function УдалитьПустыеСтрокиПослеКласса(стрИмяКласса, лУдалитьВсе)
{
var сэлБлоки = document.getElementsByClassName(стрИмяКласса);
for (var ы = 0, элБлок; элБлок = сэлБлоки[ы]; ++ы)
{
for (;;)
{
var элСледующий = элБлок.nextSibling;
if (элСледующий != null)
{
// Пробелы после блоков встречаются редко.
if (IsElementContentWhitespace(элСледующий))
{
элСледующий.parentNode.removeChild(элСледующий);
continue;
}
else if (элСледующий.nodeName == 'BR')
{
элСледующий.parentNode.removeChild(элСледующий);
if (лУдалитьВсе)
{
continue;
}
}
}
break;
}
}
}
}
function ИзменитьBBTags()
// В форме редактирования сообщения кнопка URL вставляет [url=] вместо [url].
{
unsafeWindow.bbtags[unsafeWindow.bbtags.indexOf('[url]')] = '[url=]';
}
function ДобавитьСочетанияКлавишВФормуРедактирования()
// Отправка сообщения по Ctrl+Enter.
// Предпросмотр сообщения по Ctrl+Space.
{
// Кнопка "Отправить".
var элОтправить = document.getElementsByName('post')[0];
элОтправить.setAttribute('title', 'Ctrl+Enter');
// Кнопка "Предпросмотр".
var элПредпросмотр = document.getElementsByName('preview')[0];
элПредпросмотр.setAttribute('title', 'Ctrl+Space');
document.getElementsByName('message')[0].addEventListener('keydown', function(обСобытие)
{
if (обСобытие.ctrlKey && !обСобытие.shiftKey && !обСобытие.altKey && !обСобытие.metaKey)
{
// Ctrl+Enter. В Опере нет константы обСобытие.DOM_VK_RETURN.
if (обСобытие.keyCode == 13)
{
обСобытие.preventDefault();
элОтправить.click();
}
// Ctrl+Space. В Опере нет константы обСобытие.DOM_VK_SPACE.
else if (обСобытие.keyCode == 32)
{
// Запретить Хромому вставлять пробел.
обСобытие.preventDefault();
элПредпросмотр.click();
}
}
}, false);
}
function ЗаменитьЗначокПоследнегоСообщения(элВЭлементе)
// Увеличивает изображение для перехода к последнему сообщению.
{
if (г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ)
{
return;
}
var сэлИзображения = элВЭлементе.querySelectorAll('img[src="./styles/ocss2/imageset/icon_topic_latest.gif"]');
for (var ы = 0, элИзображение; элИзображение = сэлИзображения[ы]; ++ы)
{
элИзображение.setAttribute('src', г_стрЗначокПоследнегоСообщения);
элИзображение.setAttribute('width', '31');
элИзображение.setAttribute('height', '22');
элИзображение.parentNode.style.cssFloat = 'left';
элИзображение.parentNode.setAttribute('class', 'gm-for-anipress');
}
}
function ЗаменитьЗначокНепрочитанногоСообщения(элВЭлементе)
// Увеличивает изображение для перехода к первому непрочитанному сообщению.
{
if (г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ)
{
return;
}
var сэлИзображения = элВЭлементе.querySelectorAll('img[src="./styles/ocss2/imageset/icon_topic_newest.gif"]');
for (var ы = 0, элИзображение; элИзображение = сэлИзображения[ы]; ++ы)
{
элИзображение.setAttribute('src', г_стрЗначокНепрочитанногоСообщения);
элИзображение.setAttribute('width', '31');
элИзображение.setAttribute('height', '22');
элИзображение.style.verticalAlign = 'middle';
элИзображение.parentNode.setAttribute('class', 'gm-for-anipress');
}
}
function ИзменитьСсылкиВСообщениях(лВсеСсылки)
// - Ссылки в сообщениях открываются в новой вкладке.
// - Адрес в ссылках фотохостингов по возможности меняется на адрес изображения.
// - Удаляются лишние ссылки, которые ведут на главную страницу фотохостинга.
{
var сэлСсылки = document.getElementsByClassName('postlink-local');
for (var ы = 0, элСсылка; элСсылка = сэлСсылки[ы]; ++ы)
{
элСсылка.setAttribute('target', '_blank');
}
if (лВсеСсылки || (г_фФлаги & ФЛ_ССЫЛКИ_НА_ФОТОХОСТИНГИ) == 0)
{
сэлСсылки = document.getElementsByClassName('postlink');
for (ы = 0; элСсылка = сэлСсылки[ы]; ++ы)
{
if (лВсеСсылки)
{
элСсылка.setAttribute('target', '_blank');
}
if ((г_фФлаги & ФЛ_ССЫЛКИ_НА_ФОТОХОСТИНГИ) == 0)
{
ИзменитьСсылкуНаИзображение(элСсылка);
}
}
}
}
function ИзменитьСсылкуНаИзображение(элСсылка)
// Перед изменением адреса делаются казалось бы лишние проверки с помощью регулярных выражений.
// Это нужно, что бы не было ложных срабатываний - пользователи любят ошибаться при вводе
// bbcode, а хостинги могут изменить формат адреса.
{
var стрУзел = элСсылка.hostname.toLowerCase();
var стрРеклама = элСсылка.getAttribute('href');
var стрМиниатюра = (элСсылка.firstElementChild != null && элСсылка.firstElementChild.nodeName == 'VAR')
? элСсылка.firstElementChild.getAttribute('title') : '';
var стрИзображение, мстрРВ1, мстрРВ2;
// Оставить только поддомен второго уровня.
// http://jsperf.com/lastindexof-vs-split/2
switch (стрУзел.substr(стрУзел.lastIndexOf('.', стрУзел.lastIndexOf('.') - 1) + 1))
{
case '10pix.ru':
// Реклама: http://10pix.ru/view/4348/8029150/
// Миниатюра: http://10pix.ru/img1/4348/8029150.th.png
// Изображение: http://10pix.ru/img1/4348/8029150.png
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/10pix\.ru\/view(\/\w+\/\w+)\/$/i)) != null
&& (мстрРВ2 = стрМиниатюра.match(new RegExp('^(http://10pix\\.ru/img1' + мстрРВ1[1] + ')\\.th(\\.[a-z]+)$', 'i'))) != null)
{
стрИзображение = мстрРВ2[1] + мстрРВ2[2];
}
break;
case '4put.ru':
// Ошибка хостинга: всем изображениям присваивается расширение jpg.
// Реклама: http://4put.ru/view-max-picture.php?id=1090666
// Миниатюра: http://4put.ru/pictures/small/355/1090666.jpg
// Изображение: http://4put.ru/pictures/max/355/1090666.jpg
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/4put\.ru\/view-max-picture\.php\?id=(\w+)$/i)) != null
&& (мстрРВ2 = стрМиниатюра.match(new RegExp('^(http://4put\\.ru/pictures/)small(/\\w+/' + мстрРВ1[1] + '\\.jpg)$', 'i'))) != null)
{
стрИзображение = мстрРВ2[1] + 'max' + мстрРВ2[2];
}
break;
case 'funkyimg.com':
// Реклама: http://funkyimg.com/viewer.php?img=/2/1850/190/1112222000x2000_PNG.png
// Миниатюра: http://funkyimg.com/t2/1850/190/1112222000x2000_PNG.png
// Изображение: http://funkyimg.com/u2/1850/190/1112222000x2000_PNG.png
if (стрРеклама.substr(0, 36).toLowerCase() == 'http://funkyimg.com/viewer.php?img=/')
{
стрИзображение = 'http://funkyimg.com/u' + стрРеклама.substr(36);
}
break;
case 'ifotki.info':
// Реклама: http://ifotki.info/11/2a57c716001a5d1d9192fbc4a2107da3bcff68123806603.png.html
// Миниатюра: http://f11.ifotki.info/thumb/2a57c716001a5d1d9192fbc4a2107da3bcff68123806603.png
// Изображение: http://f11.ifotki.info/org/2a57c716001a5d1d9192fbc4a2107da3bcff68123806603.png
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/ifotki\.info\/(\d+)\/([\w\.]+)\.html$/i)) != null)
{
стрИзображение = 'http://f' + мстрРВ1[1] + '.ifotki.info/org/' + мстрРВ1[2];
}
break;
case 'imagepost.ru':
// Ошибка хостинга: нет доступа к миниатюрам.
// Реклама: http://www.imagepost.ru/?v=2000x2000_3.PNG
// Миниатюра: http://imagepost.ru/thumbs/2/00/2000x2000_3.PNG
// Изображение: http://imagepost.ru/images/2/00/2000x2000_3.PNG
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/(?:www\.)?imagepost\.ru\/\?v=(.)(..)(.+)$/i)) != null)
{
стрИзображение = 'http://imagepost.ru/images/' + мстрРВ1[1] + '/' + мстрРВ1[2] + '/' + мстрРВ1[1] + мстрРВ1[2] + мстрРВ1[3];
}
break;
case 'imageshack.us':
// Ссылка рекламы поменялась, ссылки миниатюры и изображения остались прежними.
// Реклама 1: http://imageshack.us/photo/my-images/696/2000x2000.png/
// Реклама 2: http://img696.imageshack.us/i/2000x2000.png/
// Миниатюра: http://img696.imageshack.us/img696/6885/2000x2000.th.png
// Изображение: http://img696.imageshack.us/img696/6885/2000x2000.png
if (((мстрРВ1 = стрРеклама.match(/^http:\/\/imageshack\.us\/photo\/my-images\/(\d+)(\/[^\/]+)\.([a-z]+)\/$/i)) != null
|| (мстрРВ1 = стрРеклама.match(/^http:\/\/img(\d+)\.imageshack\.us\/i(\/[^\/]+)\.([a-z]+)\/$/i)) != null))
{
if ((мстрРВ2 = стрМиниатюра.match(new RegExp('^(http://img' + мстрРВ1[1] + '\\.imageshack\\.us/img' + мстрРВ1[1] + '/\\w+' + ДляРегВыр(мстрРВ1[2]) + '\\.)th\\.' + мстрРВ1[3] + '$', 'i'))) != null)
{
стрИзображение = мстрРВ2[1] + мстрРВ1[3];
}
else if (стрМиниатюра.search(new RegExp('^http://img' + мстрРВ1[1] + '\\.imageshack\\.us/img' + мстрРВ1[1] + '/\\w+' + ДляРегВыр(мстрРВ1[2]) + '\\.' + мстрРВ1[3] + '$', 'i')) == 0)
{
стрИзображение = null;
}
}
break;
case 'imageshost.ru':
// Реклама: http://imageshost.ru/photo/2005353/id2146842.html
// Миниатюра: http://img13.imageshost.ru/img/2012/07/02/image_4ff1a96bdbe1d_small.png
// Изображение: http://img13.imageshost.ru/img/2012/07/02/image_4ff1a96bdbe1d.png
if (стрРеклама.search(/^http:\/\/imageshost\.ru\/photo\/\w+\/id\w+\.html$/i) == 0
&& стрМиниатюра.search(/^http:\/\/\w+\.imageshost\.ru\/img\/.+\/image_\w+_small\.[a-z]+$/i) == 0)
{
стрИзображение = стрМиниатюра.replace('_small.', '.');
}
break;
case 'imgur.com':
// Реклама: http://imgur.com/4xjcn
// Миниатюра 1: http://i.imgur.com/4xjcns.png
// Миниатюра 2: http://i.imgur.com/4xjcnl.png
// Изображение: http://i.imgur.com/4xjcn.png
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/imgur\.com\/(\w{5})$/i)) != null)
{
if ((мстрРВ2 = стрМиниатюра.match(new RegExp('^http://i\\.imgur\\.com/' + мстрРВ1[1] + '.(\\.[a-z]+)$', 'i'))) != null)
{
стрИзображение = 'http://i.imgur.com/' + мстрРВ1[1] + мстрРВ2[1];
}
else
{
// Вариант как для savepic.
стрИзображение = 'http://i.imgur.com/' + мстрРВ1[1] + '.jpg';
}
}
break;
case 'ipicture.ru':
// Реклама 1: http://ipicture.ru/Gallery/Viewfull/11539889.html
// Реклама 2: http://s1.ipicture.ru/Gallery/Viewfull/11539889.html
// Миниатюра: http://s1.ipicture.ru/uploads/20120701/thumbs/W8fexsHc.png
// Изображение: http://s1.ipicture.ru/uploads/20120701/W8fexsHc.png
if (стрРеклама.search(/^http:\/\/(?:\w+\.)?ipicture\.ru\/Gallery\/Viewfull\/\w+\.html$/i) == 0
&& стрМиниатюра.search(/^http:\/\/\w+\.ipicture\.ru\/uploads\/\w+\/thumbs\/[^\/]+/i) == 0)
{
стрИзображение = стрМиниатюра.replace('/thumbs/', '/');
}
break;
case 'jpegshare.net':
// Реклама: http://jpegshare.net/9c/a3/9ca3e88e7a8c90e4ec45633df2917e52.png.html
// Миниатюра: http://jpegshare.net/thumbs/9c/a3/9ca3e88e7a8c90e4ec45633df2917e52.jpg
// Изображение: http://jpegshare.net/images/9c/a3/9ca3e88e7a8c90e4ec45633df2917e52.png
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/jpegshare\.net(\/\w+\/\w+\/\w+\.[a-z]+)\.html$/i)) != null)
{
стрИзображение = 'http://jpegshare.net/images' + мстрРВ1[1];
}
break;
case 'pic4net.com':
// Реклама 1: http://pic4net.com/pt-H7K9.html
// Реклама 2: http://pic4net.com/pm-H7K9.html
// Миниатюра 1: http://pic4net.com/dt-H7K9.png
// Миниатюра 2: http://pic4net.com/dm-H7K9.png
// Изображение: http://pic4net.com/di-H7K9.png
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/pic4net\.com\/p.(-\w+)\.html$/i)) != null)
{
if ((мстрРВ2 = стрМиниатюра.match(new RegExp('^http://pic4net\\.com/d.' + мстрРВ1[1] + '(\\.[a-z]+)$', 'i'))) != null)
{
стрИзображение = 'http://pic4net.com/di' + мстрРВ1[1] + мстрРВ2[1];
}
else
{
// Вариант как для savepic.
стрИзображение = 'http://pic4net.com/di' + мстрРВ1[1] + '.jpg';
}
}
break;
case 'piccy.info':
// Нельзя узнать прямую ссылку на изображение.
// Изображения с большим разрешением переводятся в jpeg.
// Показываем изображение с максимальным разрешением.
// Реклама 1: http://piccy.info/view3/3204993/b95ffb45e5a8272144931ec0cd64c847/
// Реклама 2: http://piccy.info/view3/3204993/b95ffb45e5a8272144931ec0cd64c847/orig/
// Миниатюра 1: http://i.piccy.info/i7/5d6fae2bfa8a07679daa3666f50f71ee/1-8-310/60400760/2000x2000_240.jpg
// Миниатюра 2: http://i.piccy.info/i7/91ec9a8b12a45d50d16ede14e0f4a935/1-8-310/60405106/2000x2000_500.jpg
// Миниатюра 3: http://i.piccy.info/i7/f11d79139bf0dc5080526e90a8eb4897/1-8-310/60412813/2000x2000_800.jpg
// Изображение: http://i.piccy.info/i7/17a2a93e64944efc863178d2c511791d/1-8-310/60310238/2000x2000.jpg
if (стрРеклама.search(/^http:\/\/piccy\.info\/view3\/\w+\/\w+\/$/i) == 0)
{
стрИзображение = стрРеклама + 'orig/';
}
break;
case 'pixs.ru':
// Реклама: http://pixs.ru/showimage/2000x2000P_1679045_5169694.png
// Миниатюра: http://i5.pixs.ru/thumbs/6/9/4/2000x2000P_1679045_5169694.jpg
// Изображение: http://i5.pixs.ru/storage/6/9/4/2000x2000P_1679045_5169694.png
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/pixs\.ru\/showimage(\/[^\/]+\.)([a-z]+)$/i)) != null
&& (мстрРВ2 = стрМиниатюра.match(new RegExp('^(http://\\w+\\.pixs\\.ru/)thumbs(/\\w+/\\w+/\\w+)' + ДляРегВыр(мстрРВ1[1]) + 'jpg$', 'i'))) != null)
{
стрИзображение = мстрРВ2[1] + 'storage' + мстрРВ2[2] + мстрРВ1[1] + мстрРВ1[2];
}
break;
case 'radikal.ru':
// Реклама: http://radikal.ru/F/s11.radikal.ru/i184/1207/d1/6bab954b1256.png.html
// Миниатюра: http://s11.radikal.ru/i184/1207/d1/6bab954b1256t.jpg
// Изображение: http://s11.radikal.ru/i184/1207/d1/6bab954b1256.png
if (стрРеклама.substr(0, 20).toLowerCase() == 'http://radikal.ru/f/' && стрРеклама.substr(-5) == '.html')
{
стрИзображение = 'http://' + стрРеклама.slice(20, -5);
}
break;
case 'radikal.ua':
// Сейчас radikal.ua загружает изображения на radikals.ru.
// Реклама: http://radikal.ua/full/49112/0fccf/10003bb043.jpg.html
// Миниатюра: http://radikal.ua/data/upload/49112/0fccf/10003bb043_preview.jpg
// Изображение: http://radikal.ua/data/upload/49112/0fccf/10003bb043.jpg
if (стрРеклама.substr(0, 23).toLowerCase() == 'http://radikal.ua/full/' && стрРеклама.substr(-5) == '.html')
{
стрИзображение = 'http://radikal.ua/data/upload/' + стрРеклама.slice(23, -5);
}
break;
case 'rghost.ru':
case 'rghost.net':
// Ошибка хостинга: всем изображениям присваивается расширение png.
// Реклама 1: http://rghost.net/39061180.view
// Миниатюра 1: http://rghost.net/39061180/thumb.png
// Изображение 1: http://rghost.net/39061180/image.png
// Реклама 2: http://rghost.net/private/39061318/3f3748afbbe648e78b800daf933db6ca.view
// Миниатюра 2: http://rghost.net/private/39061318/3f3748afbbe648e78b800daf933db6ca/thumb.png
// Изображение 2: http://rghost.net/private/39061318/3f3748afbbe648e78b800daf933db6ca/image.png
if ((мстрРВ1 = стрРеклама.match(/^(http:\/\/rghost\.(?:ru|net)\/(?:\d+|private\/\d+\/\w+))\.view$/i)) != null)
{
стрИзображение = мстрРВ1[1] + '/image.png';
if (стрМиниатюра == стрИзображение)
{
стрИзображение = null;
}
}
break;
case 'saveimg.ru':
// Реклама: http://saveimg.ru/show-image.php?id=30dd28bc089e00dc3762e5d13519672a
// Миниатюра: http://saveimg.ru/thumbnails/02-07-12/b66dff0ae0a32aaa8f24e0e8783514a8.PNG
// Изображение: http://saveimg.ru/pictures/02-07-12/b66dff0ae0a32aaa8f24e0e8783514a8.PNG
if (стрРеклама.substr(0, 36).toLowerCase() == 'http://saveimg.ru/show-image.php?id='
&& стрМиниатюра.search(/^http:\/\/saveimg\.ru\/thumbnails\/[^\/]+\/\w+\.[a-z]+$/i) == 0)
{
стрИзображение = стрМиниатюра.replace('/thumbnails/', '/pictures/');
}
break;
case 'savepic.ru':
case 'savepic.su':
case 'savepic.net':
// Реклама: http://savepic.net/3020118.htm
// Миниатюра: http://savepic.net/3020118m.png
// Изображение: http://savepic.net/3020118.png
if ((мстрРВ1 = стрРеклама.match(/^http:\/\/savepic\.([a-z]+)\/(\w+)\.htm$/i)) != null)
{
if ((мстрРВ1 = стрМиниатюра.match(new RegExp('^http://savepic\\.' + мстрРВ1[1] + '/' + мстрРВ1[2] + 'm\\.([a-z]+)$', 'i'))) != null)
{
стрИзображение = стрРеклама.slice(0, -3) + мстрРВ1[1];
}
else
{
// Если расширение не известно, то можно использовать jpg. Но в этом случае
// при сохранении изображения Chrome будет всегда предлагать расширение jpg
// вместо реального, что может привести к неприятностям. Некоторые хостинги
// так же выставляют неправильные расширения.
стрИзображение = стрРеклама.slice(0, -3) + 'jpg';
}
}
break;
case 'yandex.ru':
// Реклама: http://fotki.yandex.ru/users/ferrariforza/view/520727/
// Миниатюра: http://img-fotki.yandex.ru/get/6114/8035363.0/0_7f217_f069716e_S.jpg
// Изображение: http://img-fotki.yandex.ru/get/6114/8035363.0/0_7f217_f069716e_orig
if (стрУзел != 'fotki.yandex.ru')
{
стрМиниатюра = '';
}
else if ((мстрРВ1 = стрРеклама.match(/^http:\/\/fotki\.yandex\.ru\/users\/[^\/]+\/view\/(\d+)\/?$/i)) != null
&& (мстрРВ2 = стрМиниатюра.match(new RegExp('^(https?://img-fotki\\.yandex\\.ru/get/[^/]+/[^/]+/[0-9a-z]+_' + Number(мстрРВ1[1]).toString(16) + '_[0-9a-z]+_)[^o]+$', 'i'))) != null)
{
стрИзображение = мстрРВ2[1] + 'orig';
}
break;
case 'youpic.su':
// Ошибка хостинга: не создаются миниатюры для изображений с большим разрешением или соотношением сторон 1.
// Реклама: http://youpic.su/view.php?id=s002.youpic.su/pictures/1341518400/1cde4ce7c377effd6afaf3b3348fc9b9.jpeg
// Миниатюра: http://s002.youpic.su/pictures/1341518400/thumb_1cde4ce7c377effd6afaf3b3348fc9b9.jpeg
// Изображение: http://s002.youpic.su/pictures/1341518400/1cde4ce7c377effd6afaf3b3348fc9b9.jpeg
if (стрРеклама.substr(0, 29).toLowerCase() == 'http://youpic.su/view.php?id=')
{
стрИзображение = 'http://' + стрРеклама.substr(29);
}
break;
// Проверка referer.
case 'fastpic.ru':
case 'picatom.com':
// Нельзя узнать прямую ссылку на изображение.
// fotkidepo.ru
// picasaweb.google.com
case 'hostingkartinok.com':
case 'keep4u.ru':
case 'imageban.ru':
case 'imglink.ru':
case 'postimage.org':
case 'radikals.ru':
break;
// Это не фотохостинг. Не удалять ссылку.
default:
стрМиниатюра = '';
}
// Заменить адрес рекламы на адрес изображения.
if (стрИзображение)
{
элСсылка.setAttribute('href', стрИзображение);
}
// Удалить лишнюю ссылку на главную страницу хостинга, которую по привычке жмут что бы
// увидеть полноразмерное изображение. Так же лишняя ссылка мешает одним щелчком
// отключить масштабирование изображения.
else if (стрИзображение === null
|| (стрМиниатюра != '' && (элСсылка.pathname == '' || элСсылка.pathname == '/')))
{
элСсылка.removeAttribute('href');
}
}
function ИзменитьРазмерСпискаПоследнихСообщений()
// Изменяет размер списка с последними сообщениями темы, который находится
// под просматриваемым/редактируемым сообщением.
{
var элСписок = document.querySelector('div[style="overflow: auto; width: 100%; height: 300px;"]');
if (элСписок != null)
{
// Увеличить высоту окна со списком.
элСписок.style.height = '500px';
// Уменьшить ширину первой колонки с никами.
элСписок.firstElementChild.firstElementChild.firstElementChild.firstElementChild.removeAttribute('width');
}
}
//
// Смайлики.
//
function ЗаменитьИзображенияСмайликов()
// Заменяет изображение смайликов на всей странице.
// TODO Использовать MutationObserver?
{
if ((г_фФлаги & ФЛ_СТАРЫЕ_СМАЙЛИКИ) == 0)
{
return;
}
// querySelectorAll(): 730, 105, 340
// getElementsByTagName(): 1040, 330, 330
// evaluate(): 900, 480, 630
var сэлИзображения = document.querySelectorAll('img[src^="./images/smilies/"]');
for (var ы = 0, элИзображение; элИзображение = сэлИзображения[ы]; ++ы)
{
// элИзображение.src всегда возвращает абсолютный url и работает медленнее чем
// getAttribute('src') если в HTML указан относительный url.
var стрИмяФайла = элИзображение.getAttribute('src').substring(17);
for (var ю = 0, мСмайлик; мСмайлик = г_мСмайлики[ю]; ++ю)
{
if (мСмайлик[0] === стрИмяФайла)
{
элИзображение.src = мСмайлик[2];
элИзображение.width = мСмайлик[3];
элИзображение.height = мСмайлик[4];
элИзображение.title = мСмайлик[5]; // Описание.
элИзображение.alt = мСмайлик[6]; // BBCode.
break;
}
}
}
}
function ИзменитьСсылкиДляВставкиСмайликов(фОкно, элМама, элКонец)
// Заменяет все ссылки для вставки смайликов.
// Так же вызывает ЗаменитьИзображенияСмайликов().
// фОкно - true если элМама находится во всплывающем окне, иначе в форме редактирования.
// элМама - элемент, в котором находятся ссылки.
// элКонец - элемент, перед которым заканчиваются ссылки. null если в элМама только смайлики.
{
//
// Удалить ссылки.
//
if (элКонец == null)
{
элМама.innerHTML = '';
}
else
{
while (элМама.firstChild != элКонец)
{
элМама.removeChild(элМама.firstChild);
}
}
// Вызвать функцию после удаления, но перед добавлением ссылок, что бы
// не расходовать зря время на замену их изображений.
ЗаменитьИзображенияСмайликов();
//
// Добавить ссылки.
//
var элФрагмент = document.createDocumentFragment();
var элЯкорь = document.createElement('a');
var элИзображение = элЯкорь.appendChild(document.createElement('img'));
элИзображение.setAttribute('class', 'insertsmile-img');
for (var ы = 0, мСмайлик; мСмайлик = г_мСмайлики[ы]; ++ы)
{
if (мСмайлик[1] >= (фОкно ? 1 : 2))
{
if (мСмайлик[6]) // BBCode.
{
элЯкорь.setAttribute('href', фОкно
? "javascript:initInsertions(); insert_text('" + мСмайлик[6] + "', true, true); undefined"
: "javascript:insert_text('" + мСмайлик[6] + "', true); undefined");
элИзображение.setAttribute('alt', мСмайлик[6]);
}
else
{
элЯкорь.setAttribute('href', фОкно
? "javascript:initInsertions(); insert_text('[img]" + мСмайлик[2] + "[/img]', true, true); undefined"
: "javascript:insert_text('[img]" + мСмайлик[2] + "[/img]', true); undefined");
элИзображение.setAttribute('alt', мСмайлик[5]);
}
элИзображение.setAttribute('src', мСмайлик[2]);
элИзображение.setAttribute('width', мСмайлик[7] ? мСмайлик[7] : мСмайлик[3]);
элИзображение.setAttribute('height', мСмайлик[8] ? мСмайлик[8] : мСмайлик[4]);
элИзображение.setAttribute('title', мСмайлик[5]);
элФрагмент.appendChild(элЯкорь.cloneNode(true));
}
}
элМама.insertBefore(элФрагмент, элКонец);
}
function ИзменитьСписокВсехСмайликов()
{
GM_addStyle('\
/* Расстояние между смайликами */\
.insertsmile-img {padding: 3px 7px !important}\
/* Переделать ссылку "Закрыть окно" в кнопку */\
.nav {\
display: block !important;\
line-height: 3.6ex !important;\
margin-top: -0.4ex !important;\
border: 1px solid #A9B8C2 !important;\
font-size: 8.5pt !important;\
font-weight: normal !important;\
background-color: #FAFAFA !important;\
color: #333333 !important;\
border-radius: 3px !important;\
}\
.nav:hover {\
border-color: #888 !important;\
color: #000 !important;\
text-decoration: none !important;\
}\
');
if (г_фФлаги & ФЛ_СТАРЫЕ_СМАЙЛИКИ)
{
var элКонец = document.getElementsByTagName('br')[0];
ИзменитьСсылкиДляВставкиСмайликов(true, элКонец.parentNode, элКонец);
}
else
{
GM_addStyle('\
/* Уменьшить расстояние между смайликами */\
.row1 {font-size: 80% !important}\
/* Скрыть повторы обычных смайликов */\
a[onclick^="initInsertions(); insert_text(\':haha:\'"],\
a[onclick^="initInsertions(); insert_text(\':angry:\'"],\
a[onclick^="initInsertions(); insert_text(\':on_the_quiet:\'"],\
a[onclick^="initInsertions(); insert_text(\':rofl:\'"],\
a[onclick^="initInsertions(); insert_text(\':to_take_umbrage:\'"],\
a[onclick^="initInsertions(); insert_text(\':tongue:\'"] {\
display: none !important;\
}\
');
}
}
function ИзменитьСмайликиНаСтраницеИВФормеРедактирования(элФорма, элМама, элКонец)
// Настройка смайликов в форме редактирования сообщения, включая форму быстрого ответа.
// Так же вызывает ЗаменитьИзображенияСмайликов().
{
if (г_фФлаги & ФЛ_СТАРЫЕ_СМАЙЛИКИ)
{
ИзменитьСсылкиДляВставкиСмайликов(false, элМама, элКонец);
}
//
// Настройка ссылки "Еще смайлики".
//
var элЕщеСмайлики = элФорма.querySelector('a[href^="./posting.php?mode=smilies"]');
// В форме быстрого ответа заменить | на пробелы.
if ((г_фФлаги & ФЛ_СТАРЫЕ_СМАЙЛИКИ) == 0 && элЕщеСмайлики.previousSibling)
{
элЕщеСмайлики.previousSibling.nodeValue = '\u00a0';
}
// Уменьшить высоту всплывающего окна со смайликами.
элЕщеСмайлики.setAttribute('onclick', элЕщеСмайлики.getAttribute('onclick')
.replace('720, 600', (г_фФлаги & ФЛ_СТАРЫЕ_СМАЙЛИКИ) ? '720, 460' : '720, 550'));
// Заменить текст "Еще смайлики" на изображение.
элЕщеСмайлики.innerHTML = ''
: 'width="16" height="23" style="padding: 1px 2px" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAXCAYAAAAC9s/ZAAACKklEQVR42t3TXUiTURzH8e/J4UwqjSaMZaaQ0KZUKAaGDit6VSpvjFhaUJJddCEV2RQ1iggtKCtEjKJgxLAX7U0dTCVWgUUOZY0uIlouRhsVvRgz42mP4GNjW1B0ER04nIv//3w4PP/nJ3r7HJLP/55oS5syl1/V1q0qEOKy9bZUUVYStWlPTTNtJw7GrGk0Gv000C9AB43vgnhtbbQ37FOAnjzB+vqGyYuujDKysg1TgEkBBu568JxOoycdUquKaModUIDOSsGWA3AvoYtZ9y0Yy62RgGgUlGuq0eY/ZfucFJZkdijATSEobQdHt4qx7AnWHpEigTP9ObxQfcT5JMC5kjVhwCVzLXHSG4rn3aHKItExFIgE/vAjmoQ8xuu9D6M2LdNn4HS/jFkb9X/6Cy+YAq564a0fXn+B8hWwVEwDN04W8nVRBRMFlahCPSZ9FMD+6jGrF+ZN6lJoi59e4NYJbLshc1cXw02bqDkfBRDLQ2OsqCY3S88YqRxeuUEBBj1nafUdIzASZL92mKLitEhgprEOnUFHclI8ybNV2Ot2KkCsEf9vYzxlEKhngM8F20ZcSuJk4Pi1XoKpRoQUF5bUMEBOXGIiDLWoyb+yWUmcDFhvtfI53cS49zmOllos3bZIQE5cfIKapI3fwxInA6VmG6POQb7N1/Dswl7GpShpjJU4GdixtZ4FD/pwHzLzofModvujf2eMhfIvj7n54uLQkcPvLU9oB34AtKVzY3De80EAAAAASUVORK5CYII="/>');
}
//
// Обработка событий.
//
function ОбработатьВставкуЦитатыИПерейти(обСобытие)
{
ОбработатьВставкуЦитаты(обСобытие, true);
}
function ОбработатьВставкуЦитаты(обСобытие, фПерейти)
{
var обВыделение = window.getSelection();
// Лиса умеет выделять более одной области.
if (обВыделение.rangeCount == 1 && !обВыделение.isCollapsed)
{
// Искать DIV сообщения, в котором выделен текст.
var узСообщение = обВыделение.getRangeAt(0).commonAncestorContainer;
do
{
// узСообщение может не иметь функции getAttribute().
if (узСообщение.className == 'postbody')
{
ВставитьЦитату(
// Неслабые breadcrumbs...
узСообщение.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.previousElementSibling.lastElementChild.firstElementChild.firstElementChild.firstElementChild
// Обойти изображение прилепленного сообщения.
.lastElementChild.previousElementSibling
// getAttribute('href') не катит, потому что BBCode не поддерживает относительные адреса.
.firstElementChild.firstElementChild.href,
узСообщение.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.previousElementSibling.firstElementChild.textContent,
обВыделение.toString()
);
if (фПерейти)
{
var элФорма = document.getElementById('postform');
// Должна быть видна кнопка для отправки сообщения.
элФорма.scrollIntoView(false);
элФорма.getElementsByTagName('textarea')[0].focus();
}
return;
}
}
while ((узСообщение = узСообщение.parentNode) != null);
}
window.alert(г_обТекст[0]);
}
function ОбработатьВставкуНика(обСобытие)
{
insert_text_keepfocus('[b]' + обСобытие.target.textContent + '[/b] ');
}
//
// Варианты функций editor.js, из которых удалены вызовы focus().
// Так же был выкинут ослячий код и добавлена поддержка XPCNativeWrapper.
// К названиям функций добавлено _keepfocus.
//
function mozWrap_keepfocus(txtarea, open, close)
{
var selLength = txtarea.textLength;
var selStart = txtarea.selectionStart;
var selEnd = txtarea.selectionEnd;
var scrollTop = txtarea.scrollTop;
if (selEnd == 1 || selEnd == 2)
{
selEnd = selLength;
}
var s1 = txtarea.value.substring(0, selStart);
var s2 = txtarea.value.substring(selStart, selEnd);
var s3 = txtarea.value.substring(selEnd, selLength);
txtarea.value = s1 + open + s2 + close + s3;
txtarea.selectionStart = selStart + open.length;
txtarea.selectionEnd = selEnd + open.length;
txtarea.scrollTop = scrollTop;
}
function insert_text_keepfocus(text, spaces, popup)
{
mozWrap_keepfocus(
(popup ? opener.document : document).forms.namedItem('postform').elements.namedItem('message'),
spaces ? (' ' + text + ' ') : text,
''
);
}
function ВставитьЦитату(стрАдресСообщения, стрНик, стрЦитата)
{
if ((г_фФлаги & ФЛ_ССЫЛКА_В_ЦИТАТЕ) == 0)
{
// Добавить в заголовок цитаты ник автора цитаты и ссылку на цитируемое сообщение.
insert_text_keepfocus('[quote="[url=' + стрАдресСообщения + ']' + стрНик.trim() + '[/url]"]' + стрЦитата.trim() + '[/quote]\r\n');
}
else
{
// Добавить в заголовок цитаты только ник автора цитаты.
insert_text_keepfocus('[quote="' + стрНик.trim() + '"]' + стрЦитата.trim() + '[/quote]\r\n');
}
}
function ОбщиеИзмененияСайта()
{
GM_addStyle('\
/* Увеличить ширину основного текста */\
#contentplace {max-width: ' + МАКС_ШИРИНА_ТЕКСТА_САЙТА + ' !important; width: auto !important}\
#wrapper, #hpath {width: auto !important}\
#leftplace {padding: 0 5px 0 10px !important}\
#mainplace {padding: 0 10px !important}\
#rightplace {padding: 0 10px 0 5px !important}\
/* Увеличить межстрочный интервал основного текста */\
#fixoldhtml > p {line-height: 130% !important}\
');
}
function ИзменитьСтатьюИлиНовость()
{
//
// Заменить бесполезную ссылку "ссылка на материал" на версию для просмотра.
//
var элЯкорь = document.querySelector('h6 > span > a[onclick]');
элЯкорь.removeAttribute('onclick');
элЯкорь.pathname = элЯкорь.pathname.replace(/^\/(.+?)\//, '$&print/')
элЯкорь.search = '?media=screen';
элЯкорь.style.fontWeight = 'bold';
элЯкорь.style.color = '#007030';
элЯкорь.firstChild.nodeValue = 'версия для просмотра';
}
function ИзменитьВерсиюДляПросмотра()
{
GM_addStyle('\
html {height: 100% !important; background: #f0f0f0 !important}\
body {\
max-width: ' + МАКС_ШИРИНА_ТЕКСТА_САЙТА + ' !important;\
min-height: 100% !important;\
margin: 0 auto !important;\
padding: 0 1em !important;\
outline: #e8e8e8 solid 2px !important;\
}\
body > table {font: inherit !important}\
/* Шапка и счетчики */\
body > table > tbody > tr:first-child, #mainplace, #mainplace + hr, body > div[align] {display: none !important}\
/* Название записи */\
td[colspan="3"] > h1 {margin-top: -12px !important}\
/* Увеличить межстрочный интервал основного текста */\
#fixoldhtml > p {line-height: 130% !important}\
.gm-for-byeprint-c {padding: 15px 0; text-align: center}\
/* Серая малозаметная кнопка которая не мешает просмотру */\
.gm-for-byeprint-a {display: inline-block; padding: .45em .8em; border: .1em solid #aaa; border-radius: 5px; color: #404040; text-decoration: none}\
/* Стиль кнопок Вперед/Назад в статьях */\
.gm-for-byeprint-a:hover {background: #004488; border-color: #004488; color: white}\
');
// Добавить в конец материала ссылку на возврат в обычный режим.
// Класс gm-for-byeprint-a помимо своей прямой функции так же запрещает сценарию изменять адрес ссылки.
// Запрет можно было сделать, запихнув в search адреса произвольный текст, но теоретически такую ссылку
// могут случайно выложить на форуме, и перейдя по ней владельцы сценария увидят статью в непотребном виде.
document.body.insertAdjacentHTML('beforeend', '