Вы неправильно установили дополнение Форум Overclockers.ru! Пожалуйста, удалите дополнение и установите его по этой инструкции.
';
}
else
{
ШалитьДоЗагрузкиДомика();
if (document.readyState == 'loading')
{
document.addEventListener('DOMContentLoaded', function ОбработатьЗагрузкуДомика()
{
document.removeEventListener('DOMContentLoaded', ОбработатьЗагрузкуДомика, false);
ИзменитьСодержимоеСтраницы();
}, false);
}
else
{
ИзменитьСодержимоеСтраницы();
}
}
}
function ШалитьДоЗагрузкиДомика()
// Настройки дополнения в данный момент недоступны (ограничение CRX).
{
if (window.location.hostname == 'www.overclockers.ru')
{
// Убрать мешающий вопрос о распечатке текста. Во-первых мы сюда не печатать пришли.
// Во-вторых перед печатью полезно выделить текст, отсеев рекламу.
if (window.location.search == '?media=screen')
{
unsafeWindow.print = undefined;
}
}
else if (window.location.hostname == 'forums.overclockers.ru')
{
// На форуме скрыть колонку справа с ссылками на новости и статьи.
ДобавитьСтиль('\
td[style^="max-width:241px"], /* Тема */\
td[style^="max-width:301px"] /* Подфорум */\
{display: none}\
');
}
}
function ИзменитьСодержимоеСтраницы()
// Главная функция.
{
try
{
г_обЗапрос = РазобратьЗапрос();
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);
ПроверитьОбновлениеДополнения(лПоказатьУведомление);
}
catch (обИсключение)
{
ОбработатьИсключение(обИсключение);
}
}
function ИзменитьСодержимоеПС()
// Возвращает false чтобы не проверять обновление сценария.
{
// Страница загружена неполностью?
if (document.getElementsByClassName('footer-container').length == 0)
{
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 чтобы не проверять обновление сценария.
// https://jsperf.com/compare-substring
// https://jsperf.com/substr-vs-slice2/5
{
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)
{
ИзменитьСписокНайденныхСообщений();
}
else
{
ИзменитьРасширенныйПоиск();
}
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:' || элСсылка.protocol == 'https:')
&& (элСсылка.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 Обрезать длинные строки.
{
ИзменитьЗначокФорума();
ДобавитьСтиль('\
var { font-style: inherit !important }\
td { line-height: 1.3 !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 }\
/* Выход содержимого спойлера за пределы экрана не приведет к появлению на странице горизонтальной полосы прокрутки. */\
.sp-body { overflow-x: auto !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 на понятный кускам мяса текст.
// https://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
{
УдалитьУзел(элСкрытиеМусора);
элСкрытиеМусора = 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: 'Загрузить все сообщения темы для поиска или сохранения на диске',
22: '[Image]',
23: 'Hide trash',
24: 'Show trash',
25: 'Будет скрыт или показан мешающий поиску текст:\r\n• Заголовки сообщений (автор и время)\r\n• Заголовки цитат (... писал(а))\r\n• Вложения\r\n• Строки "Добавлено спустя"',
26: '^(.+) wrote:$',
27: 'View the latest post'
};
}
else
{
г_фРусскийЯзык = true;
г_обТекст =
{
0: 'Для вставки цитаты сначала выделите цитируемый текст.',
1: 'Размер: ',
2: 'Просмотр изображения',
3: 'Следующая',
4: 'Предыдущая',
5: 'Новые темы и сообщения',
6: 'Тематические форумы',
7: 'Общекомпьютерные форумы',
8: 'Прочие форумы',
9: 'Настройки дополнения',
10: 'Тема',
11: '[сообщения]',
12: 'Найти в этой теме все сообщения пользователя ',
13: 'Найти мои сообщения',
14: 'Найти в этой теме все мои сообщения',
15: '[цитировать]',
16: '[и перейти]',
17: 'Процитировать выделенный текст и перейти к форме быстрого ответа',
18: '[ответить]',
19: 'Просмотреть все сообщения',
20: 'Загрузить все сообщения этой темы для поиска или сохранения на диске',
22: '[Изображение]',
23: 'Скрыть мешающий поиску текст',
24: 'Показать мешающий поиску текст',
25: 'Будет скрыт или показан мешающий поиску текст:\r\n• Заголовки сообщений (автор и время)\r\n• Заголовки цитат (... писал(а))\r\n• Вложения\r\n• Строки "Добавлено спустя"',
26: '^(.+) писал\\(а\\):$',
27: 'Перейти к последнему сообщению'
};
}
}
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 ОбщиеИзмененияФорума()
{
ИзменитьЗначокФорума();
// Стили общие для всего форума.
ДобавитьСтиль('\
/* Ссылки в правом верхнем углу с правилами и ФАК-ами */\
.mainmenu, .mainmenu > a > span {\
font-weight: bold !important;\
text-decoration: none !important;\
color: #ef8f00 !important; /* Убрать красный цвет, чтобы не путать с ссылкой на непрочитанные личные сообщения */\
}\
/* Количество новых личных сообщений в шапке */\
.unreadpmcount {\
color: red !important;\
}\
/* В шапке снять выделение с ссылки на галерею */\
#login_menu a[href="./gallery/index.php"] {\
font-weight: normal !important;\
}\
/* В шапке выделить ссылку на настройки дополнения */\
.gm-for-settings {\
font-weight: bold !important;\
color: green !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] {\
vertical-align: text-top !important;\
margin: 0 1px 0 4px !important;\
/* Firefox: для отключенного масштабирования изображений */\
height: 1.15em !important;\
}\
/* Исправить расположение списка модераторов */\
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 1px #BBB !important;\
}\
.pagination {\
padding: 0 !important;\
white-space: nowrap !important;\
}\
/* Нижняя строка с ссылками для поиска тем и сообщений */\
#searchbarbottom {\
margin-top: .2em !important;\
margin-bottom: .8em !important;\
}\
/* Форма быстрого ответа не уезжает если перед ней не вставлена реклама */\
#searchbarbottom::after {\
content: " ";\
clear: both;\
display: block;\
}\
/* Расстояние между смайликами в форме редактирования */\
#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;\
}\
/*\
* Увеличить изображение для перехода к первому непрочитанному и последнему сообщению.\
* Модифицированные изображения из Tango Desktop Project (http://tango.freedesktop.org/Tango_Desktop_Project)\
*/\
.gm-for-unreadpost {\
/* 21x22 */\
background: no-repeat 0 center url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAWCAYAAAAvg9c4AAADDklEQVR42sWUWUhUYRTH/9e5s7RghaX2UiFEGyEU+VIvQhRBPvnUYwVCiDUFQgtZ2UJRIqKFOpq5RGQlWbnQXrQ8pBlNNZY1o9lmZU3qbHf7Onfmm+GqZUFFH/z5Dt8987v/c853R8A/WMJ/gc7Pww1NQUHnAVz6a9B5O8BSkq1B96fQdlc+Cv8atHzTcZQ17wx0eN7WzXFiQ0MD1D+GVm6phS/0FefvV4RudDy+bxtExsMiDP0SOjcPHwQVSaMSzAiWZ1fZrnY7sCh5FR64bsrnbl/rkUSkv9yNN2NCdUcVm08Me8iYCiYwaExD4/NDlGzC4umr0dvXrdW2NngVBctpgB1jQkvtpWjqKuJABsJBpdGr4V0iyVCZjNSkVUBIRHVLrc8fwJqn+3Dxp9CSnGJc6DoSe6gQkJFLjSlhuMykMFxWZSxIXIZk23xUN5f7+73Ic+1HwQ+hhdkFONu5B0OhAUha5NxCGRazCMQJ1AoFGp3LJElmmBk/E6kJK3DmusPX8xHHn+Vj4yjorvW5ONZ+mMrmKw4QLYDJTCHJZhZ0NuLoQkkKw6yJU5E6OQNnr1f5X/eh1bUHmaOg29bmwNFRHANaxkWgoo1gulkxks5UhoWTUjBDTENN4yn/l0FUuhJgRw60MaGiDTDrGi/AQlCTVXcccZo2aQksg4moqr/gH/iKrS8Ow0E/kUjDoGaCSjqUm9TvJ7mMg4kcmqix9R+LMYFesHTKSvR5vrGT9Xd8/Z1Y/+40blG6zKEhPY5CJ8zZAQ/Bpo28c9RPKd9utzR9KUF6Yiacj5zqxdZn/e5WrAu2ocsAiyoQhcaTqFhYuWIxVXB3r30TQsyLK7cuS/fa3rtflFH/vPjMIUEDUI+DvwXdnpWFMy3VktMZuuM5ioN07hsBMsb+WPkGoC4L3/VetydOgeR+gsreE6ijM5X3UOYgaQQ0Vr7I3ekws2EXZ+eibvAVaj40hAfC+IQVruiA9D3Aocz41ydwkDUK1OfEJXAxLpVLMbhURn2mI4fOb5bJIHCXmgGq8pcMW98BETBqM67/wk4AAAAASUVORK5CYII=) !important;\
}\
.gm-for-lastpost {\
/* 21x22 */\
background: no-repeat 0 center url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAWCAYAAAAvg9c4AAAC6UlEQVR42sWTXUgUURTH/7vuhx/QQyRFDw1E9GEQvgSBvQSFEWNp9VD5Zk9CiEZBGRhirRJpYT0EZUSsXxHGpttKYptlLhpikFliWUOisVmWuR/O7s50rnNnXV2zIKOBP+fOvXd+93/POWPAP3gM/wea63RDCVeifl/L0kGPNKtYsz2IEU8x7HsuLRm0rUxETiMCUwMuO8LBfDTsj/w19Em5iHE/UPwI02+6nB5E5CwCT/0emtvyCaq6Mm5HgjnYXpqZWN0N5GwC6l4i9LDVKVGed6A+e2RxKDlynxfnLEZU0DlaLHEDRtp9MA3oG4NS62j7RqnYibq9fYtCXaUiyju1V0XVJEc0aIiirGgxe4M2V93U44P/82HUis2/hDpKRJx9PNcpU1jR4Aw4zRQGdq0FNq4AbE0DfkwMl6Auq3JB6J0zIk60ARMBwB/SppNMQLJZu7ruOMgUUpC+yghxPXDO5fVh9PlNclwQB71cIKKwfpheVH6kkQplZcXSoiWFphJmltSwjC2rLTNQW6vXj7HeVurjA3FQW76I4rvvZoGmJFKiJgJHgaqC3euM5BSouEfX/y7V4OvbQjwoUBaHMqCZKRlGsxWJlAYzM046tJmWjaxQ3X78GD0leIqu0xeyJEmzUEEQzFLGVZlB9UkzmbJwMdhJyvXyZCAvHXjlhVp7v92H8cGjQv+FDtrOKiCTpgkc0qEpUsaV94RLXaD55RtFmRYbtdqxrUDTa0Q6251fID3NEz42DOmwGAV06DIKlDhYuaJjusGza8dFTNL2ix7I3l7HMPobC4XJrnEOCcYA2Tj4R9BySstp15SMQUcnem5VCMYh3zxQ7NgfvX4MkMnCI8t1L1LTZHxw1wgvyuzsn+A5DHGQPA8avb6Ju2Mwc0w0Sduq7JgcuS0MVHXwBmYVDnPpBWIxwKBUKDXaUgQ2cJBVB7IycRm4VK4IV1h3SbBw/G8a89ABDGSMgSbwJYVLh0aYs/nf/wS5MGanWXmrHwAAAABJRU5ErkJggg==) !important;\
}\
.gm-for-unreadpost > img,\
.gm-for-lastpost > img {\
display: none !important;\
}\
.gm-for-unreadpost,\
.gm-for-lastpost {\
float: left !important;\
width: 22px !important; /* Прибавлен 1px для анимации нажатия */\
height: 2.8em !important; /* Разместить в центре между двух строк */\
}\
.gm-for-unreadpost{\
margin-right: .2em !important;\
}\
.gm-for-unreadpost:active,\
.gm-for-lastpost:active {\
background-position: 1px calc(50% + 1px) !important;\
}\
/* Разместить значок в той же строке */\
.gm-for-unreadpost1 {\
float: none !important;\
/* Не прибавлена высота для анимации, чтобы сэкономить место по вертикали, если текст будет разбит\
на несколько строк. В самом низу только почти невидимая тень. */\
height: 22px !important;\
background-position: 0 !important;\
margin-right: 0 !important; /* Справа уже есть пробел */\
display: inline-block !important;\
vertical-align: middle !important;\
}\
.gm-for-unreadpost1:active {\
background-position: 1px 1px !important;\
}\
/* Перенести значок в левую часть ячейки. Центровка по вертикали. Работает вместе с .gm-for-lastpostcell */\
.gm-for-lastpost1 {\
position: absolute !important;\
left: 4px !important; /* Padding ячейки */\
top: 0 !important;\
bottom: 0 !important;\
height: auto !important;\
}\
.gm-for-lastpostcell {\
position: relative !important;\
padding-left: 28px !important; /* Padding ячейки + ширина значка + отступ */\
text-align: left !important;\
vertical-align: middle !important;\
}\
/* Ссылки справа от названия темы для перехода на последние страницы */\
.gm-for-topicpages {\
display: inline !important;\
margin: 0 !important;\
white-space: nowrap !important;\
}\
.gm-for-topicpages::before {\
content: " " !important;\
display: inline-block !important;\
width: 12px !important;\
height: 9px !important;\
background: url(./styles/ocss2/imageset/icon_post_target.gif) !important;\
}\
');
// Ячейка в шапке со ссылками Вход, Регистрация, FAQ.
var элСтрока1 = document.getElementById('search-box').previousElementSibling;
// Эти пробелы будут мешать.
элСтрока1.removeChild(элСтрока1.lastChild);
//
// Перенести ссылки на правила форума в правый верхний угол к ФАК-ам.
//
var а = document.getElementsByClassName('mainmenu')[0];
элСтрока1.firstChild.className = 'mainmenu';
ВставитьУзел(элСтрока1.firstChild, а); // Правила конференции.
ВставитьУзел(элСтрока1.firstChild, а); // |
элСтрока1.lastChild.className = 'mainmenu';
ВставитьУзел(элСтрока1.lastChild, а); // FAQ по рекламе.
ВставитьУзел(элСтрока1.lastChild, а); // |
//
// Заменить лишнюю ссылку на ФАК на вызов настроек дополнения.
//
а = элСтрока1.lastElementChild;
а.setAttribute('href', 'javascript:');
а.setAttribute('class', 'gm-for-settings');
а.firstChild.nodeValue = г_обТекст[9];
а.addEventListener('click', ПоказатьДиалогСНастройками, false);
// Выполнен вход на форум?
if (document.getElementById('login_form') == null)
{
г_стрМойНик = encodeURIComponent(элСтрока1.firstElementChild.firstElementChild.textContent.trim());
//
// Выделить в шапке количество новых личных сообщений.
//
а = document.querySelector('a[href="./ucp.php?i=pm&folder=inbox"]');
if (а.children.length == 1 && а.firstElementChild.textContent.trim() != '0')
{
а.className = 'unreadpmcount';
}
}
if ((г_фФлаги & ФЛ_НЕ_ИСКАТЬ_СТАРЫЕ_СООБЩЕНИЯ) == 0 && г_стрМойНик !== undefined)
{
// Ссылка "Ваши сообщения" перестанет искать темы, в которые пользователь не писал долгое время.
document.querySelector('a[href="./search.php?search_id=egosearch"]').setAttribute(
'href', './search.php?sk=t&sd=d&sr=topics&t=0&st=180&author=' + г_стрМойНик);
}
ИзменитьФормуБыстрогоПоиска();
}
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('https://yandex.ru/support/search/query-language/qlanguage.xml');
break;
case 'gm-for-s-google':
window.open('https://support.google.com/websearch/answer/2466433');
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', 'https://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 ИзменитьПодтверждениеДействия()
{
// Увеличить размер кнопок.
ДобавитьСтиль('\
.btnlite, .btnmain {\
font-size: 140% !important;\
margin-bottom: 1ex !important;\
padding: .5ex .5em !important;\
border-radius: 4px !important;\
background: -webkit-linear-gradient(#f4f4f4 40%, #e2e2e2) !important;\
background: -moz-linear-gradient(#f4f4f4 40%, #e2e2e2) !important;\
background: linear-gradient(#f4f4f4 40%, #e2e2e2) !important;\
}\
.btnlite:hover, .btnmain:hover {\
background: -webkit-linear-gradient(#fcfcfc 40%, #e8e8e8) !important;\
background: -moz-linear-gradient(#fcfcfc 40%, #e8e8e8) !important;\
background: linear-gradient(#fcfcfc 40%, #e8e8e8) !important;\
}\
.btnlite:active, .btnmain:active {\
background: -webkit-linear-gradient(#e2e2e2, #f4f4f4 40%) !important;\
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('a'));
элСсылкаНаПоследСообщ.setAttribute('class', 'ntap-replies');
var элХрень = элСсылкаНаПоследСообщ.appendChild(document.createElement('img'));
элХрень.setAttribute('width', '18');
элХрень.setAttribute('height', '9');
элХрень.setAttribute('src', './styles/ocss2/imageset/icon_topic_latest.gif');
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;
do
{
var сАдресНепрочитСообщ = элВыдернуть.getAttribute('href');
элСсылкаНаНепрочитСообщ.setAttribute('href', сАдресНепрочитСообщ);
элХрень = элВыдернуть.firstElementChild;
элСсылкаНаНепрочитСообщ.setAttribute('title', элХрень.getAttribute('title'));
элИзображениеНепрочитСообщ.setAttribute('src', элХрень.getAttribute('src'));
элВыдернуть = элВыдернуть.nextElementSibling;
// Какая-то хрень для модераторов, точно не помню.
if (элВыдернуть.nodeName != 'A')
{
элВыдернуть = элВыдернуть.nextElementSibling;
}
элСсылкаНаПервоеСообщ.setAttribute('href', элВыдернуть.getAttribute('href'));
элНазваниеТемы.nodeValue = элВыдернуть.getAttribute('title');
элКоличествоОтветов.nodeValue = элВыдернуть.nextSibling.nodeValue.slice(2, -1);
// В названиях тем квадратные скобки используются реже круглых.
элСсылкаНаПервоеСообщ.setAttribute('title', элНазваниеТемы.nodeValue + ' [' + элКоличествоОтветов.nodeValue + ']');
элВыдернуть = элВыдернуть.nextElementSibling;
var сАдресПоследСообщ = элВыдернуть.getAttribute('href');
if (сАдресПоследСообщ != сАдресНепрочитСообщ)
{
элСсылкаНаПоследСообщ.setAttribute('href', сАдресПоследСообщ);
элСсылкаНаПоследСообщ.setAttribute('title', г_обТекст[27]);
}
else
{
элСсылкаНаПоследСообщ.removeAttribute('href');
элСсылкаНаПоследСообщ.removeAttribute('title');
}
элВставитьВ.appendChild(элШаблон.cloneNode(true));
}
while (элВыдернуть = элВыдернуть.nextElementSibling.nextElementSibling);
}
ДобавитьСтиль('\
#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 .7em 0 .5em}\
.ntap-replies {color: #000 !important}\
.ntap-replies:not([href]) {color: #282828 !important}\
.ntap-replies:not([href]):hover {text-decoration: none !important}\
.ntap-replies:not([href]) > img {display: none}\
.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}\
');
ЗаменитьУзел(элНоваяТаблица, элСтараяТаблица);
// Не изменять значки в списке "Новые темы и сообщения".
// Ищем главную таблицу, обходя ипучую рекламу.
ЗаменитьЗначокПоследнегоСообщения(document.querySelector('#ntap-root ~ table[width="100%"][cellspacing="0"][border="0"]:not([class])'), false);
ПромотатьШапку('menubar', true);
}
function ИзменитьПодфорум()
{
ДобавитьСтиль('\
/* Скрыть бесполезную скрепку */\
img[src="./styles/ocss2/imageset/icon_topic_attach.gif"]\
{\
display: none !important;\
}\
/* Скрыть ссылку на первую страницу темы, эта ссылка уже есть в названии темы. */\
img[src="./styles/ocss2/imageset/icon_post_target.gif"] + a,\
img[src="./styles/ocss2/imageset/icon_post_target.gif"] + a + .page-dots,\
img[src="./styles/ocss2/imageset/icon_post_target.gif"] + a + .page-sep\
{\
display: none !important;\
}\
');
var элГлавнаяТаблица = document.getElementById('wrapcentre');
ЗаменитьЗначокНепрочитанногоСообщения(элГлавнаяТаблица, true);
ЗаменитьЗначокПоследнегоСообщения(элГлавнаяТаблица, true);
ИзменитьКнопкиЛистанияСтраниц(1);
ПромотатьШапку(КонецШапки(), true);
}
function ИзменитьСписокНайденныхТем()
{
var элФорма = document.querySelector('form:not([id]):not([name])[action^="./search.php?"]');
// Не найдено ни одной темы?
if (элФорма == null)
{
return;
}
var элТаблица = элФорма.lastElementChild;
// Для ускорения CSS. Тег TABLE.
элТаблица.setAttribute('id', 'gm-for-foundtopics');
// Уменьшить неправильно заданную ширину первой колонки заголовка (будет как в подфорумах). Тег TH.
элТаблица.firstElementChild.firstElementChild.firstElementChild.removeAttribute('width');
ЗаменитьЗначокНепрочитанногоСообщения(элТаблица, false);
ЗаменитьЗначокПоследнегоСообщения(элТаблица, true);
ДобавитьСтиль('\
/* Уменьшить ширину колонок */\
th {\
font-size: 100% !important;\
}\
/* Скрыть пустую вторую колоноку */\
#gm-for-foundtopics {\
border-spacing: 0 !important;\
}\
#gm-for-foundtopics > tbody > tr > td,\
#gm-for-foundtopics > tbody > tr > th {\
border: solid 1px #d4d4d4 !important;\
}\
#gm-for-foundtopics > tbody > tr > td:not(:first-child),\
#gm-for-foundtopics > tbody > tr > th:not(:first-child) {\
border-left: 0 !important;\
}\
#gm-for-foundtopics > tbody > tr > td {\
border-top: 0 !important;\
}\
#gm-for-foundtopics > tbody > tr > td:nth-child(2) {\
width: 0 !important;\
border: 0 !important;\
padding: 0 !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"] {\
white-space: nowrap !important;\
}\
/* Обрезать слишком длинные ники. TODO Перенести в ЗаменитьЗначокПоследнегоСообщения() */\
td[width="120"] > p:last-child > a:first-child {\
display: inline-block !important;\
max-width: 12em !important;\
overflow: hidden !important;\
text-overflow: ellipsis !important;\
}\
' + ((г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ) == 0 ? '' : '\
td[width="120"] img {\
vertical-align: text-top !important;\
}\
'));
// Скрыть темы из подфорумов, которые перечислены в г_обСкрытьПодфорумы.
// Не скрывать, если поиск идет не по всему форуму, а в подфоруме(ах) или теме.
// В г_обЗапрос нет нужных параметров если запрос отправлен методом post.
var лСкрытьПодфорумы = (г_фФлаги & ФЛ_НЕ_ИСКАТЬ_В_БАРАХОЛКЕ) == 0 && элФорма.getAttribute('action').search(/fid%5B%5D=|&t=[1-9]/) == -1;
if (лСкрытьПодфорумы)
{
var чСкрытоТем = 0;
var сэлТемы = элФорма.getElementsByClassName('topictitle');
for (var ы = 0, элТема; элТема = сэлТемы[ы]; ++ы)
{
if (лСкрытьПодфорумы && элТема.getAttribute('href').match(/f=(\d+)/)[1] in г_обСкрытьПодфорумы)
{
элТема.parentNode.parentNode.setAttribute('hidden', '');
++чСкрытоТем;
continue;
}
}
if (чСкрытоТем > 0)
{
элФорма.getElementsByClassName('titles')[0].textContent += ' | Скрыто тем барахолки: ' + чСкрытоТем;
}
}
ИзменитьКнопкиЛистанияСтраниц(2);
ПромотатьШапку(элФорма, true);
}
function ИзменитьСписокНайденныхСообщений()
{
var элФорма = document.querySelector('form:not([id]):not([name])');
// Не найдено ни одного сообщения?
if (элФорма == null)
{
return;
}
if ((г_фФлаги & ФЛ_НЕ_ИСКАТЬ_В_БАРАХОЛКЕ) == 0 && элФорма.getAttribute('action').search(/fid%5B%5D=|&t=[1-9]/) == -1)
{
var чСкрытоСообщений = 0;
var сэлСообщения = элФорма.getElementsByClassName('topictitle');
for (var ы = 0, элСообщение; элСообщение = сэлСообщения[ы]; ++ы)
{
if (элСообщение.lastElementChild.getAttribute('href').match(/f=(\d+)/)[1] in г_обСкрытьПодфорумы)
{
(элСообщение = элСообщение.parentNode.parentNode).setAttribute('hidden', '');
(элСообщение = элСообщение.nextElementSibling ).setAttribute('hidden', '');
(элСообщение = элСообщение.nextElementSibling ).setAttribute('hidden', '');
(элСообщение.nextElementSibling ).setAttribute('hidden', '');
++чСкрытоСообщений;
}
}
if (чСкрытоСообщений > 0)
{
элФорма.getElementsByClassName('titles')[0].textContent += ' | Скрыто сообщений барахолки: ' + чСкрытоСообщений;
}
}
ЗаменитьИзображенияСмайликов();
УдалитьПустыеСтрокиВСообщениях();
ИзменитьКнопкиЛистанияСтраниц(2);
ИзменитьСсылкиВСообщениях(true);
ПромотатьШапку(элФорма, false);
}
function ИзменитьРасширенныйПоиск()
{
// Увеличить высоту списка подфорумов.
document.getElementsByName('fid[]')[0].setAttribute('size', '10');
}
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)
{
//
// Удалить лишнюю ссылку [цитировать].
// TODO Оставить вариант с плавающей формой?
//
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, document.querySelectorAll('#pagecontent > table[width="100%"][cellspacing="1"] > tbody > tr:not([class]):only-child > .gensmall')[1].parentNode.parentNode.parentNode);
// Строка с ссылкой "Ваши сообщения".
Хрень = 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);
// 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=https://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 ИзменитьПодпискиИЗакладки()
{
ДобавитьСтиль('\
/* Скрыть бесполезную скрепку */\
img[src="./styles/ocss2/imageset/icon_topic_attach.gif"]\
{\
display: none !important;\
}\
/* Уменьшить изображение в левом столбце до стандартного размера, чтобы уменьшить ширину столбца */\
img[width="46"]\
{\
width: 33px !important;\
height: 18px !important;\
}\
');
var элГлавнаяТаблица = document.getElementById('ucp');
ЗаменитьЗначокНепрочитанногоСообщения(элГлавнаяТаблица, false);
ЗаменитьЗначокПоследнегоСообщения(элГлавнаяТаблица, true);
//
// Ссылки справа от названия темы для перехода на последние страницы.
//
var сэлСтраницы = элГлавнаяТаблица.querySelectorAll('.topictitle + .gensmall + .gensmall');
for (var ы = 0, элСтраницы; элСтраницы = сэлСтраницы[ы]; ++ы)
{
элСтраницы.firstChild.nodeValue = ''; // [ На страницу:
элСтраницы.removeChild(элСтраницы.firstElementChild); // 1
элСтраницы.removeChild(элСтраницы.firstElementChild); // ... ,
элСтраницы.lastChild.nodeValue = ''; // ]
элСтраницы.classList.add('gm-for-topicpages');
var элВставить = элСтраницы.previousElementSibling.previousElementSibling;
// Переносить на другую строку отдельно от названия темы. Страницы частями не переносятся (nowrap).
элВставить.appendChild(document.createTextNode('\u2003')); // Em space
элВставить.appendChild(элСтраницы);
}
}
function ИзменитьПапкуЛС()
{
ДобавитьСтиль('\
/* Скрыть вторую колонку если в ней нет значков */\
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.
// https://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 УдалитьУзел(узУзел)
{
if (узУзел && узУзел.parentNode)
{
узУзел.parentNode.removeChild(узУзел);
}
}
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() возвращает вставленный элемент.
{
var элСтиль = null;
var элВставить = document.head || document.documentElement;
if (элВставить)
{
элСтиль = document.createElement('style');
элСтиль.textContent = стрСтиль;
элВставить.appendChild(элСтиль);
}
return элСтиль;
}
function ДляРегВыр(стрТекст)
// Возвращает текст, который можно использовать в составе шаблона регулярных выражений.
// https://developer.mozilla.org/docs/Web/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)
{
обЗапрос[decodeURIComponent(б.substr(0, в))] = decodeURIComponent(б.substr(в + 1));
}
else if (в < 0)
{
обЗапрос[decodeURIComponent(б)] = '';
}
}
}
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 подсвечен, потому что после щелчка курсор смещается на один пиксель.
ДобавитьСтиль('\
#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;\
-webkit-transition: opacity .15s ease-out;\
-moz-transition: opacity .15s ease-out;\
transition: opacity .15s ease-out;\
}\
.gm-for-pm-popup-hide {\
-webkit-transition: opacity .15s ease-out, visibility 0s ease .15s;\
-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)
{
ДобавитьСтиль('\
.nav {\
/* Отделить блок с кнопками от таблицы */\
display: inline-block !important;\
margin-top: 5px !important;\
/* Убрать жирный шрифт */\
font-weight: inherit !important;\
}\
');
}
break;
case 3:
if (idxSpan == 0)
{
// Хромой разбивает кнопки на несколько строк из-за пары лишних атрибутов width в левой ячейке.
// Для исправления проще добавить еще один width, чем удалять лишние.
if (г_лБлинк)
{
emSpan.parentNode.setAttribute('width', '50%');
}
}
else
{
//
// Блок не умещается в ячейке на мониторах с низким разрешением.
// Перенести содержимое блока ниже, слева от ссылок "Отметить все" и "Снять выделение".
//
ДобавитьСтиль('\
#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);
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(элСледующий))
{
УдалитьУзел(элСледующий);
continue;
}
else if (элСледующий.nodeName == 'BR')
{
УдалитьУзел(элСледующий);
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;
}
// После поддержки :has() можно будет обойтись без цикла.
var сэлИзображения = элВЭлементе.querySelectorAll('img[src="./styles/ocss2/imageset/icon_topic_newest.gif"]');
for (var ы = 0, элИзображение; элИзображение = сэлИзображения[ы]; ++ы)
{
элИзображение.parentNode.setAttribute('class', лОднострочный ? 'gm-for-unreadpost gm-for-unreadpost1' : 'gm-for-unreadpost');
}
}
function ЗаменитьЗначокПоследнегоСообщения(элВЭлементе, лСправа)
// Увеличивает изображение для перехода к последнему сообщению.
{
if (г_фФлаги & ФЛ_КРУПНЫЕ_ЗНАЧКИ)
{
return;
}
var сэлИзображения = элВЭлементе.querySelectorAll('img[src="./styles/ocss2/imageset/icon_topic_latest.gif"]');
for (var ы = 0, элИзображение; элИзображение = сэлИзображения[ы]; ++ы)
{
var эл = элИзображение.parentNode;
эл.setAttribute('class', лСправа ? 'gm-for-lastpost gm-for-lastpost1' : 'gm-for-lastpost');
if (лСправа)
{
while ((эл = эл.parentNode).nodeName != 'TD') {}
эл.classList.add('gm-for-lastpostcell');
}
}
}
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 ИзменитьВставленноеВидео()
{
var сузВидео = document.querySelectorAll('.postbody .bbmedia');
for (var ы = 0, узВидео; узВидео = сузВидео[ы]; ++ы)
{
var сАдрес = узВидео.getAttribute('data-url');
if (сАдрес)
{
var мсЧасти, сАдресФрейма;
if ((мсЧасти = /^https?:\/\/(?:www\.)?youtube\.com\/watch\/?\?(?:.+&)?v=([^]+)/.exec(сАдрес))
|| (мсЧасти = /^https?:\/\/(?:www\.)?youtube\.com\/embed\/([^\/?]+)\/?(?:$|\?)/.exec(сАдрес))
|| (мсЧасти = /^https?:\/\/youtu.be\/([^\/?]+)\/?(?:$|\?)/.exec(сАдрес)))
{
сАдресФрейма = 'https://www.youtube.com/embed/' + мсЧасти[1];
}
else if ((мсЧасти = /^https?:\/\/(?:www\.)?vimeo\.com\/(?:channels\/staffpicks\/)?(\d+)\/?(?:$|\?)/.exec(сАдрес))
|| (мсЧасти = /^https?:\/\/player\.vimeo\.com\/video\/(\d+)\/?(?:$|\?)/.exec(сАдрес)))
{
сАдресФрейма = 'https://player.vimeo.com/video/' + мсЧасти[1];
}
else
{
continue;
}
var узФрейм = document.createElement('iframe');
узФрейм.setAttribute('width', '854'); // 640
узФрейм.setAttribute('height', '480'); // 360
узФрейм.setAttribute('allowfullscreen', '');
узФрейм.setAttribute('frameborder', '0');
узФрейм.setAttribute('src', сАдресФрейма);
узВидео.replaceChild(узФрейм, узВидео.firstElementChild /*