NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Joyreactor advanced script
// @namespace http://joyreactor.cc/tag/jras
// @description comment tree collapse, remove/hide posts/comments by username/tag, remove share buttons and more on http://joyreactor.cc/tag/jras
// @author AntiUser
// @license MIT
// @copyright 2016+, AntiUser (http://joyreactor.cc/user/AntiUser)
// @homepage http://joyreactor.cc/tag/jras
// @homepageURL http://joyreactor.cc/tag/jras
// @supportURL https://github.com/mrAntiUser/JRAS/issues
// @include *reactor.cc*
// @include *joyreactor.cc*
// @include *jr-proxy.com*
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js
// @require https://code.jquery.com/ui/1.11.4/jquery-ui.min.js
// @version 2.4.3
// @grant GM.getValue
// @grant GM.setValue
// @grant GM.listValues
// @grant GM.deleteValue
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_listValues
// @grant GM_deleteValue
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @run-at document-end
// ==/UserScript==
const JRAS_CurrVersion = '2.4.3';
/* RELEASE NOTES
2.4.3
* fix "Звук видео в коментариях отключается в момент ухода видео с экрана" для видео в коментах на странице поста
* Поправлено расположение кнопки включения звука на reactor.cc. Точнее там поправлен блок со ссылками на gif
2.4.1
+ Звук видео в коментариях отключается в момент ухода видео с экрана
2.4.0 - https://old.reactor.cc/post/6247778
+ Управление звуком видео
+ Кнопка вкл/выкл звук
+ Опция надо ли вообще [true]
+ Опция при включении звука перематывать видео в начало [true]
+ Опция Выключать звук когда пост уходит с экрана [true]
+ Опция Выключать звук когда видео уходит с экрана [false]
+ Опция автоматически включать звук при 50% видимости видео [false]
+ Опция автоматически включать звук при средней точке экрана [true]
* Цитаты по-умолчанию отключены
2.3.0.1
* fix цитаты налезающие на элементы ниже
2.3.0
+ механизм выделения и цитирования коментариев
+ отображение пользователя при цитировании
+ вывод ссылок на гифки так же в коментариях
2.2.11
+ Сделал выделение цитат в коментах, если срока начинается с ">" то вся считается цитатой
2.2.10
* убрал тултип комента на ссылке в блоке самого комента
2.2.9
* Поправлено отображения прогресса звезды в тултипе юзера (Issue-95)
2.2.8
* Поправлен запрос размеров "гифок" для ссылок на...
2.2.7
* Исправлен предпросмотр постов и комментариев по наведению на ссылку
2.2.6
+ Поменял отображение ссылок на скачивание гифок. Теперь выводятся с размерами (Issue-92)
2.2.5.4
* Баг определения элемента для добавления размера
2.2.5.3
+ Размер в хинте для файлов webm, mp4 и gif
2.2.5.2
* Ссылки на видео в постах без гифок
2.2.5.1
* Баг ссылки на webm и mp4 вели на гифку
2.2.5 - https://old.reactor.cc/post/5511493
+ Ссылки на гифку как в новом дизижине. В разных форматах webm, mp4 и gif (Issue-85)
2.2.4
* Нет тултипа на фендомных тегах (Issue-78)
2.2.3
* При попытке найти дату последнего входа, если у юзера введен всякий шлак
типа интересов, дата не находилась. (Issue-76)
2.2.2 - http://old.reactor.cc/post/3732196
+ в тултип юзера выведена инфа о последнем входе (Issue-74)
* заминусованные коменты теперь открываются с задержкой (Issue-72)
2.2.0 - http://old.reactor.cc/post/3565867
+ переработка механизма сохранения настроек (Issue-59)
+ импорт/экспорт настроек (Issue-59)
+ корректировка размера страницы после окончательной ее загрузки (Issue-55)
+ корректировка ссылок на old (Issue-64)
+ превью внутренних ссылок реактора. Только ссылки на пост или комент (Issue-58)
1.9.1 - http://old.reactor.cc/post/3533506
* Поддержка нового движка FireFox и нового GreaseMonkey (Issue-51)
1.9.0 - http://old.reactor.cc/post/3375590
* кнопки перехода в начало и конец поста (Issue-48)
1.8.9
* перенос длинных ников в тултипе
1.8.8
* Центрование контента (изображения, гифки, фреймы) (Issue-46)
* поправлена ширина коментов с новыми стилями на не черном олде
+ Опция Центровать контент [true]
1.8.7
* Размер страницы (динамический стиль) теперь считается нормально при разворачивании разных элементов (Issue-43)
* В свете длинных тегов поправлены стили. Не в скрипте, а в JRAS styles
1.8.5
* Мелкие фиксы
1.8.4 - http://old.reactor.cc/post/3250349
+ Опция: мне нужны только динамические эффекты нового стиля [false]
+ Опции по поведению правого меню (Issue-39)
+ Устанавливать высоту страницы по высоте правого меню [true]
+ Показывать правое меню когда контент вышел за границы [true]
1.8.0 - http://reactor.cc/post/3249308
* Фикс определения цвета темы (Issue-13)
+ Опция скрывать шарные кнопки в БУП [false] (Issue-18.1)
* Корректировка даты поста (Issue-33)
+ Возможность скрыть правое меню и/или настроить ширину контента (Issue-36)
Опции
+ Корректировать дизайн и стиль сайта [false]
+ Скрывать правое меню [true]
+ Растягивать контент по границам экрана [true]
+ Растягивать контент на (%) [90]
1.7.16
* Исправлен баг даты комментария, которая пропадала или вообще не появлялась (Issue-29)
1.7.15 - http://old.reactor.cc/post/3247143
* Исправлен баг сохранения настроек (спасибо Silent John за тесты и терпение) (Issue-25)
* Исправлен баг добавления в избранное на новом дизайне (Issue-27)
+ Разная иконка для постов, которые уже в избранном и которые еще можно добавить (Issue-20)
+ Вывод даты комментария. Только в старом дизайне и только при включенной опции аватаров для старого дизайна (Issue-17)
+ Опция - "Показывать в коменте его дату" [true] в "Комментарии" > "Создавать аватары для старого дизайна"
+ Опции теперь чекаются при клике по label'у (Issue-11)
+ Опция - Анимировать перемещения блока' [true] (Issue-19)
+ Опция - Скорость перемещения при анимации (1-9) [2]
1.7.2
* Переделал иконки кнопок шары в блоке управления постом (Issue-12)
1.7.1
+ Тултип на юзере в блоке управления постом (Issue-7)
+ Опция показывать тултип на юзере в блоке управления [true]
1.7.0 - http://old.reactor.cc/post/3243856
+ Блок управления постом доступный в любом месте самого поста
+ Информация (автор, дата)
+ шары (все что было плюс добавил телеграм)
+ рейтинг
+ ссылки
Опции
+ Блок управления постом [true] (Issue-1)
+ Только в полном посте [false]
+ Скрывать блок шарных кнопок поста [false]
+ Скрывать блок рейтинга поста [false]
+ Верхний стопор для блока внутри поста (px) [10]
+ Нижний стопор для блока внутри поста (px) [10]
+ Верхняя позиция на экране (px) [30]
1.6.7 - http://old.reactor.cc/post/3235468
+ Показывать в правом баре для лучших коментов [true]
+ Загружать данные тега для Tooltip'а [true]
+ Показывать в ленте [true]
+ Показывать в полном посте [true]
+ Показывать в правом баре для трендов [true]
+ Показывать в правом баре для любимых тегов [true]
+ Показывать в правом баре для интересного [true]
1.6.0 - http://old.reactor.cc/post/3233487
+ Tooltip'ы для тегов
1.5.23
* fix таблиц с гифками на олде
+ версия скрипта в заголовке окна скрипта
1.5.21 - http://old.reactor.cc/post/3151778
+ fix таблиц на олде
* поправлено определение цветовой гаммы страницы
1.5.19
+ user tooltip на лучшем комменте
1.5.18
* исправлен регексп определения стиля страницы
1.5.17
* поддержка сайта old.jr-proxy.com
1.5.16
* опечатки
1.5.15 - http://old.reactor.cc/post/3079550
+ Скрывать комментарий без возможности просмотра [false]
+ Показывать в заблокированном комментрарии ник юзера [true]
+ Удалять пост из ленты полностью [false]
+ Скрывать пост без возможности просмотра [false]
+ Показывать в заблокированном посте ник юзера [true]
1.5.12
+ Определение логина юзера по ссылке, а не по тексту (в свете Soldat AntiUser)
1.5.11 - http://old.reactor.cc/post/2832945
+ В Tooltip'е юзера отметка о том Online ли он или нет (красный - нет, зеленый - да)
1.5.10
* Анимация показа/скрытия верхней панели
+ Опция удаление Share buttons [false]
1.5.8
+ Теперь работает на странице "Обсуждаемое"
1.5.7 - http://old.reactor.cc/post/2760618
+ Показывать аватары пользователей в комментариях [true] (ТОЛЬКО СТАРЫЙ ДИЗАЙН)
+ Показывать аватары только в полном посте [false] (ТОЛЬКО СТАРЫЙ ДИЗАЙН)
+ Размер показываемых аватаров в пикселях [35] (ТОЛЬКО СТАРЫЙ ДИЗАЙН)
+ Опция показывать сразу скрытые заминусованные коменты [false]
+ Опция отмечать раскрытые заминусованные коменты [true]
* Поменял жирноту в Tooltip'е юзера
* Вернул на гифки линк "Ссылка на гифку" в старом дизайне
* мелкие исправления
1.5.0 - http://old.reactor.cc/post/2611233
+ В Tooltip'е юзера информация модератор ли
+ В Tooltip'е юзера информация из блока "Профиль"
1.4.11
* разрешил уменьшение комментариев для хрома
* обработка редиректных ссылок везде, а не только в посте
1.4.10
* при сворачивании к паренту (collapseToParent) не учитывалось текущее состояние ветвей и
некотрые ветви разворачивались если были свернуты
1.4.9 - http://old.reactor.cc/post/2536817
+ добавлен новый адрес на котором работает скрипт - jr-proxy.com
+ свернуть/развернуть все комментарии
+ раскрытие редиректных ссылок. опция - [true]
+ опция уменьшать комментарии только в полном посте [false]
1.4.3
+ Уменьшение комментариев при раскрытии их в ленте (кроме хрома)
* мелкие исправления
1.4.0 - http://old.reactor.cc/post/2527831
+ Уменьшение больших комментариев (опционально)
+ Новые опции
- Уменьшать большие комментарии [true]
- Уменьшать если размер больше (px) [110]
- Уменьшать до (px) [72]
1.3.18
+ Диалог настроек закрывается при нажатии "сохранить"
1.3.17 - http://old.reactor.cc/post/2524192
+ опция "Убирать цветовую отметку донатера" в тултипах [false]
+ опция при каком количестве медальки скрывать [60] (0 - показывать все)
* опция сколько показывать, если скрывать [40]
* добавлены кнопки в GUI настроек
- Отправить мне персональное сообщение
- Удалить все сохраненные данные
- Настройки по умолчанию
* поправлены медальки в тултипе
+ дерево комментариев теперь строится также и в старом дизайне при разворачивании коментов в ленте
+ для комментариев маленькая кнопка collapseToParent при отсутствии большой collapseNode рисуется выше
* поправлена высота ника в тултипе
* мелкие исправления
1.3.6 - http://old.reactor.cc/post/2514832
+ сворачивание комментариев наверх к паренту
* не блокировался юзер в комментариях при раскрытии их в ленте в новом дизайне
1.3.2 - http://old.reactor.cc/post/2513114
+ отправка сообщения пользователю из tooltip'а
+ возможность ограничить количество сразу выводимых в tooltip'е медалек
+ плавающая верхняя панель в новой дизайне
+ автоматическая отметка комментариев как прочитанных при сворачивании ветки
+ настройки сохраняются для каждого пользователя реактора отдельно
+ добавлены опции для настройки работы скрипта
- создавать ли дерево комментариев [true]
- дерево комментариев только для полного поста (в ленте при раскрытии не будет создаваться) [false]
- когда ветка комментариев сворачивается все дочерние коменты помечаются прочитанными [true]
- загружать ли данные пользователя для Tooltip'а [true]
- сколько медалек показывать при загрузке [40] (0 - все)
- зафиксировать верхнюю панель наверху окна (только новый дизайн) [true]
- скрывать зафиксированную верхнюю панель (только новый дизайн) [true]
- показывать Tooltip'ы в ленте [true]
- показывать Tooltip'ы в комментариях [true]
- показывать Tooltip'ы на странице ПМ [true]
- показывать Tooltip'ы на странице Люди [true]
- показывать Tooltip'ы в правом баре для юзеров топа [true]
- показывать Tooltip'ы в правом баре для аватарок [true]
* мелкие исправления
1.2.3
- некоторый фунционал был удален
Если вы обнаружили его недостачу и он вам нужен - пишите ПМ
1.2.2
* добавиил tooltip'ы на:
- страница личных сообщений
- страница люди
- топы в правой колонке
- на авах в правой колонке
* мелкие исправления
1.2.0 - http://old.reactor.cc/post/2504300
+ просмотр информации по пользователю при наведении мыши на его ник
+ возможность добавить в друзья, заблокировать пользователя из tooltip'а
* мелкие исправления
1.1.3
* в хроме на новом дизайне не строилось дерево комментариев при раскрытии их в ленте
* по той же причине не блокировались комментарии пользователей
1.1.0 - http://old.reactor.cc/post/2497823
+ GUI для настройки JRAS
* не блокировались теги на новом дизайне
1.0.6
* в список заблокированных тегов, котрый выводится при блокировке поста
могло попасть содержимое поста, а не только теги
1.0.5
* в случае нахождения блокированного юзера в коментах, мог быть заблокирован пост
1.0.2
* Не работал в хроме из-за неверного определения адреса документа
1.0.0 - http://old.reactor.cc/post/2485300
+ release
*/
(function(win){
'use strict';
win.console.log(' ================ start JRAS');
if (location.host == 'json.joyreactor.cc'){
win.console.log(' ================ end JRAS - page is sexy runetki');
return;
}
const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
const gm3 = 'undefined' !== typeof GM_xmlhttpRequest;
const GMgetValue = (gm3) ? GM_getValue : GM.getValue;
const GMsetValue = (gm3) ? GM_setValue : GM.setValue;
const GMlistValues = (gm3) ? GM_listValues : GM.listValues;
const GMdeleteValue = (gm3) ? GM_deleteValue : GM.deleteValue;
const GMxmlhttpRequest = (gm3) ? GM_xmlhttpRequest : GM.xmlhttpRequest;
const defLoadTooltipSize = 212;
const defUserTooltipSize = 212;
const defTagTooltipSize = 270;
const lng = new LanguageData();
const page = new PageData();
const videoSoundStates = new WeakMap();
const videoSoundScrollStates = new WeakMap();
const videoSoundAutoChanges = new WeakMap();
let lastVideoVolume = loadVideoSoundVolume();
let videoSoundChangeToken = 0;
let videoSoundScrollObserver;
let videoSoundVideoScrollObserver;
let videoSoundCommentObserver;
let videoSoundHalfObserver;
let currentSoundVideo;
let videoSoundScreenMiddleRaf;
let currentScreenMiddleVideo;
const quoteData = {
$commentContainer: undefined,
$popupQuote: undefined,
quoteInsertData: undefined };
const userOptions = initOptions();
userOptions.loadUserData(page.currentUser);
try{
correctStyle();
correctPostDate();
addNewCSSClasses();
themeDependentCSS();
makePropElements();
makeAllUserTooltip();
makeAllTagTooltip();
makePostControls();
procTopbar();
removeRedirectLink();
removeShareButtons();
correctOldReactorLink();
previewReactorLink();
makeExtendedGifLinks();
setVideoSoundProc();
makeQuotes();
makePopuperQuote();
if (page.pageIs('post') || page.pageIs('discussion')){
showHiddenComments();
correctCommentSize();
makeTreeComments();
makeAvatarOnOldDesign();
}
userRemove(userOptions.data.BlockUsers);
tagRemove(userOptions.data.BlockTags, true);
subscribeShowComment();
subscribeVideoSoundObserver();
dynamicStyle();
}catch(err){
win.console.log("~~JRAS_ERROR: " + err + '\n' + err.stack)
}
win.console.log(' ================ end JRAS');
//=====================================================================================================
function initOptions(){
const retVal = {
data: {
language: { dt: null,
propData: function(){return{ def: 'ru', type: 'combobox'}},
values: function(){return lng.getLangs()}
},
correctRedirectLink: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
removeShareButtons: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
makeAvatarOnOldDesign: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
makeAvatarOnlyFullPost: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
avatarHeight: { dt: null,
propData: function(){return { def: 35, type: 'number', min: 5, max: 300}}
},
makeTreeComments: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
treeCommentsOnlyFullPost: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
whenCollapseMakeRead: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
isToBeLoadingUserData: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
hideUserAwardsWhen: { dt: null,
propData: function(){return { def: 60, type: 'combobox'}},
values: function(){const retVal = {}; for(let i = 0; i < 101; i += 5){ if (i != 0 && i < 20){continue} retVal[i] = i} return retVal}
},
minShowUserAwards: { dt: null,
propData: function(){return { def: 40, type: 'combobox'}},
values: function(){const retVal = {}; for(let i = 10; i < 101; i += 10){ retVal[i] = i} return retVal}
},
fixedTopbar: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
hideFixedTopbar: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnLine: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnComment: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnPrivateMess: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnPeople: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnSidebarTopUsers: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnTopComments: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnSidebarOnline: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showUTOnPostControl: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showHiddenComments: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
showHiddenCommentsMark: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
isToBeLoadingTagData: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showTTOnTrends: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showTTOnLikeTags: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showTTOnInteresting: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showTTOnLine: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
showTTFullPost: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
delUserComment: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
showUserNameDelComment: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
fullDelUserPost: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
delUserPost: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
showUserNameDelPost: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
chatlaneToPacaki: { dt: null,// Убирать цветовую отметку донатера
propData: function(){return { def: false, type: 'checkbox'}}
},
collapseComments: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
collapseCommentsOnlyFullPost: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
collapseCommentWhenSize: { dt: null,
propData: function(){return { def: 110, type: 'number', min: 20, max: 10000}}
},
collapseCommentToSize: { dt: null,
propData: function(){return { def: 72, type: 'number', min: 20, max: 10000}}
},
pcbShowPostControl: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
pcbShowInFullPost: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
pcbHideJRShareBlock: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
pcbHideJRRatingBlock: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
pcbTopBorder: { dt: null,
propData: function(){return { def: 10, type: 'number', min: 0, max: 200}}
},
pcbBottomBorder: { dt: null,
propData: function(){return { def: 10, type: 'number', min: 0, max: 200}}
},
pcbTopScreenPos: { dt: null,
propData: function(){return { def: 30, type: 'number', min: 0, max: 200}}
},
showCommentDate: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
pcbAnimateMove: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
pcbAnimateMoveSpeed: { dt: null,
propData: function(){return { def: 2, type: 'number', min: 1, max: 9}}
},
pcbHideShareButoons: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
stCorrectStyle: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
stHideSideBar: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
stStretchContent: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
stStretchSize: { dt: null,
propData: function(){return { def: 90, type: 'number', min: 60, max: 100}}
},
stSideBarSizeToPage: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
stShowSideBarOnHideContent: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
stUseDynStyleChanges: { dt: null,
propData: function(){return { def: false, type: 'checkbox'}}
},
stCenterContent: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
correctOldReactorLink: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
previewReactorLink: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
previewSizeX: { dt: null,
propData: function(){return { def: 50, type: 'number', min: 20, max: 80}}
},
previewSizeY: { dt: null,
propData: function(){return { def: 50, type: 'number', min: 20, max: 80}}
},
extendedGifLinks: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
videoSoundOptions: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
restartVideoOnUnmute: { dt: null,
propData: function(){return { def: true, type: 'checkbox'}}
},
videoSoundMuteOnPostScroll: { dt: null,
propData: function(){return { def: true, type: 'radio', group: 'videoSoundMuteOnScrollMode'}}
},
videoSoundMuteOnVideoScroll: { dt: null,
propData: function(){return { def: false, type: 'radio', group: 'videoSoundMuteOnScrollMode'}}
},
autoUnmuteVideoNone: { dt: null,
propData: function(){return { def: false, type: 'radio', group: 'autoUnmuteVideoMode'}}
},
autoUnmuteVideoOnHalfScreen: { dt: null,
propData: function(){return { def: false, type: 'radio', group: 'autoUnmuteVideoMode'}}
},
autoUnmuteVideoOnScreenMiddle: { dt: null,
propData: function(){return { def: true, type: 'radio', group: 'autoUnmuteVideoMode'}}
},
makeQuotesOnComments: { dt: null,
propData: function () { return { def: false, type: 'checkbox' } }
},
makeExtQuotes: { dt: null,
propData: function () { return { def: true, type: 'checkbox' } }
},
makeQuoteTool: { dt: null,
propData: function () { return { def: true, type: 'checkbox' } }
},
qTAddUserInfo: { dt: null,
propData: function () { return { def: true, type: 'checkbox' } }
},
qTInsertIntoShowingInput: { dt: null,
propData: function () { return { def: 'newAnswerAlways', type: 'combobox' } },
values: function () { return {
newAnswerAlways: lng.getVal('JRAS_GUI_NEWANSWERALWAYS'),
findOpenedForm: lng.getVal('JRAS_GUI_FINDOPENEDFORM'),
addCommentForm: lng.getVal('JRAS_GUI_ADDCOMMENTFORM')
}}
},
BlockUsers: [],
BlockTags: [],
init: function(prop){ if (!this[prop]){return} this[prop].dt = this[prop].propData().def },
validator: function (prop, val) { if (!this[prop]) { return } return (this[prop]['validator']) ? this[prop].validator() : $.isNumeric(val) && val >= this[prop].propData().min && val <= this[prop].propData().max },
guiDesc: function (prop) { if (!this[prop]) { return } return lng.getVal('JRAS_GUI_' + prop.toUpperCase()) }
},
each: function(func){
if (func === undefined){return}
for(let dItm in this.data){
if((dItm == undefined) || typeof(this.data[dItm]) == 'function'|| (dItm == 'BlockUsers') || (dItm == 'BlockTags')){continue}
func(this.data, dItm, this.data[dItm]);
}
},
val: function(option, value){
if(this.data[option]){
if(value === undefined){return this.data[option].dt}
else{
if (this.data[option].propData().type == 'number'){
if (this.data.validator(option, value)){
this.data[option].dt = value
}
}else{
this.data[option].dt = value
}
}
}
},
getGuiDesc: function(option){
return (this.data[option]) ? this.data.guiDesc(option) : option;
},
setDef: function(){
this.each(function(thd, optName){ thd.init(optName) });
this.data.BlockUsers = [];
this.data.BlockTags = [];
},
removeAllSavedData_old: function(){
this.removeSavedUserData_old();
},
correctUserName_old: function(str){
return str.replace(/[.*\W[\]\\]/g, '_');
},
removeSavedUserData_old: function (user) {
user = this.correctUserName_old(user);
let pref = (user === undefined) ? '' : user + '_';
let keys = GMlistValues();
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
if (key.match(new RegExp(pref + '.*'))) {
GMdeleteValue(key);
}
}
},
saveUserData_old: function(forUser){
forUser = this.correctUserName_old(forUser);
this.removeSavedUserData_old(forUser);
const pref = forUser + '_';
this.each(function(thd, optName, opt){
GMsetValue(pref + optName, opt.dt);
});
for(let i = 0; i < this.data.BlockUsers.length; i++){
GMsetValue(pref + 'BlockUsers_name_' + i, this.data.BlockUsers[i]);
}
for(let i = 0; i < this.data.BlockTags.length; i++){
GMsetValue(pref + 'BlockTags_name_' + i, this.data.BlockTags[i]);
}
},
loadUserDataFrom_old: function(prefix){
prefix = this.correctUserName_old(prefix);
let retVal = false;
const posf = '.*';
let keys = GMlistValues();
this.data.BlockUsers = [];
this.data.BlockTags = [];
for(let i = 0; i < keys.length; i++){
let key = keys[i];
if(!key.match(new RegExp(prefix + posf))){
continue
}
if(key.match(new RegExp(prefix + 'BlockUsers_name_' + posf))){
this.data.BlockUsers.push(GMgetValue(key, ''));
}else{
if(key.match(new RegExp(prefix + 'BlockTags_name_' + posf))){
this.data.BlockTags.push(GMgetValue(key, ''));
}else{
const rkey = key.replace(prefix, '');
if(this.data[rkey] === undefined){
continue
}
this.data[rkey].dt = GMgetValue(key, this.data[rkey]);
retVal = true;
}
}
}
this.data.BlockUsers.sort();
this.data.BlockTags.sort();
return retVal;
},
correctUserName: function (str) {
return 'user_' + b64encode(str);
},
loadOpt: function () {
return JSON.parse(win.localStorage.getItem('jras_options'));
},
saveOpt: function (jrasOptions) {
if (!jrasOptions) {return}
win.localStorage.setItem('jras_options', JSON.stringify(jrasOptions));
},
removeAllSavedData: function () {
this.removeSavedUserData();
this.removeAllSavedData_old();
},
removeSavedUserData: function (user, jrasOpt) {
user = this.correctUserName(user);
if (!user) {
win.localStorage.clear();
} else {
const jrasOptions = (jrasOpt) ? jrasOpt : this.loadOpt();
if (!jrasOptions && !jrasOptions[user]) {
return
}
delete jrasOptions[user];
if (jrasOpt) {
return jrasOptions;
} else {
this.saveOpt(jrasOptions);
}
}
},
setUserDataFrom: function (jrasOptUser) {
if (!jrasOptUser) { return }
for (const prop of Object.keys(jrasOptUser)) {
if (this.data[prop]) {
if (Array.isArray(this.data[prop])) {
this.data[prop] = jrasOptUser[prop];
} else {
this.data[prop].dt = jrasOptUser[prop].dt;
}
}
}
},
saveUserData: function (forUser) {
forUser = this.correctUserName(forUser);
const jrasOptions = this.loadOpt() || {};
jrasOptions[forUser] = this.data;
this.saveOpt(jrasOptions);
},
loadUserDataFrom: function (forUser) {
const user = this.correctUserName(forUser);
const jrasOptions = this.loadOpt();
if (!jrasOptions || !jrasOptions[user]){
forUser = this.correctUserName_old(forUser);
if (!this.loadUserDataFrom_old(forUser + '_')){
if (!this.loadUserDataFrom_old(forUser)){
return;
}
}
this.removeSavedUserData_old(forUser);
this.saveUserData(forUser);
return;
}
this.setUserDataFrom(jrasOptions[user]);
},
loadUserData: function(forUser){
this.loadUserDataFrom(forUser);
},
exportUserData: function (forUser) {
const user = this.correctUserName(forUser);
const jrasOptions = this.loadOpt();
if (!jrasOptions || !jrasOptions[user]) {
this.saveUserData(forUser);
let a = this.exportUserData(forUser);
if (!a){ a = 'no saved data'}
return a;
}
return b64encode(JSON.stringify(jrasOptions[user]));
},
importUserData: function (forUser, impData) {
const user = this.correctUserName(forUser);
const jrasOptions = this.loadOpt();
if (!jrasOptions) { return false}
jrasOptions[user] = JSON.parse(b64decode(impData));
this.saveOpt(jrasOptions);
this.setUserDataFrom(jrasOptions[user]);
return true;
}
};
retVal.setDef();
return retVal;
}
function b64encode(str){
return btoa(unescape(encodeURIComponent(str)));
}
function b64decode(str){
return decodeURIComponent(escape(atob(str)));
}
function removeRedirectLink($inElm){
if(!userOptions.val('correctRedirectLink')){
return;
}
const selector = 'a[href*="redirect?"]'
const $selElmts = (!$inElm) ? $(selector) : $inElm.find(selector);
$selElmts.each(function(){
const $currA = $(this);
const matches = /(?:\?|\&)([\w]+)(?:\=|\&?)([^&#]*)/g.exec($currA.attr('href'));
$.each(matches, function(index){
if (matches[index] == 'url'){
$currA.attr('href', decodeURIComponent(matches[index + 1]));
return false;
}
});
});
}
function correctOldReactorLink($inElm) {
if (!userOptions.val('correctOldReactorLink')) {
return;
}
const selector = 'a[href*="joyreactor"]:contains("old.reactor")';
const $selElmts = (!$inElm) ? $(selector) : $inElm.find(selector);
if ($selElmts.length == 0){return}
$selElmts.each(function(){
$(this).attr("href", $(this).attr("href").replace(/joyreactor/, "old.reactor"));
});
}
function removeShareButtons($inElm){
if(!userOptions.val('removeShareButtons')){
return;
}
const $selElmts = (!$inElm) ? $('body') : $inElm;
$selElmts.find('a.share_vk, a.share_fb, a.share_twitter, a.share_mail').remove();
}
function previewReactorLink($srcElm) {
if (!userOptions.val('previewReactorLink')) {
return;
}
const glob = !$srcElm;
const selectors = [
'a[href*="reactor.cc/post/"]:not(a[href*="redirect?"], div.image>a)',
'a[href^="/post/"]:not(a[href*="redirect?"], div.image>a, .csrfLink, .toggleComments, .link, [target="_blank"], span.reply-link>a)',
].map(s => glob ? `.post_content ${s}, .post_comment_list div.txt ${s}` : s).join(', ');
const $selElmts = glob
? $(selectors)
: $srcElm.find(selectors);
if ($selElmts.length == 0) { return }
makeAllPreviewTooltip($selElmts);
}
function makeAllTagTooltip(){
if(!userOptions.val('isToBeLoadingTagData')){
return;
}
let sel = [];
if(userOptions.val('showTTOnLine')){
sel.push('div.postContainer h2.taglist a');
}
if(userOptions.val('showTTFullPost')){
sel.push('div.postContainer strong.taglist a');
}
if(userOptions.val('showTTOnTrends')){
sel.push('div.sidebar_block.trends_wr > div.sidebarContent > div.blogs > table > tbody > tr > td:nth-child(2) > a');
}
if(userOptions.val('showTTOnLikeTags')){
sel.push('div.sidebarContent > div.blogs#blogs_alltime_content > table > tbody > tr > td:nth-child(2) > a');
sel.push('div.sidebarContent > div.blogs#blogs_week_content > table > tbody > tr > td:nth-child(2) > a');
sel.push('div.sidebarContent > div.blogs#blogs_2days_content > table > tbody > tr > td:nth-child(2) > a');
}
if(userOptions.val('showTTOnInteresting')){ //интересное
sel.push('div.sidebar_block.blogs_wr > div.sidebarContent > div.blogs > table > tbody > tr > td:nth-child(2) > a');
}
if(sel.length != 0){
makeTagTooltips(sel.join(', '));
}
}
function makeAllUserTooltip(){
if(!userOptions.val('isToBeLoadingUserData')){
return;
}
let sel = [];
sel.push('div.comments_bottom > span >a.comment_username');
if(userOptions.val('showUTOnLine')){
sel.push('div.uhead_nick > a');
}
if(userOptions.val('showUTOnComment')){
sel.push('span.reply-link > a:first-child');
}
if(userOptions.val('showUTOnPrivateMess')){
sel.push('div.mess_from > a');
}
if(userOptions.val('showUTOnPeople')){
sel.push('div.user > div.userblock > a');
}
if(userOptions.val('showUTOnSidebarTopUsers')){
sel.push('div.user.week_top > a');
}
if(userOptions.val('showUTOnSidebarOnline')){
sel.push('div.avatar_holder > a');
}
if(userOptions.val('showUTOnTopComments')){
sel.push('div.topComments small > a');
}
if(sel.length != 0){
makeUserTooltips(sel.join(', '));
}
}
function procTopbar(){
if (!page.isNewDesign){return}
if(userOptions.val('fixedTopbar')){
$('#topbar.topbar_wr').css({
'position': 'fixed',
'background': 'rgba(57, 47, 30, 0.85) none repeat scroll 0% 0%',
'box-shadow': '0px -6px 10px 9px rgb(0, 0, 0)'});
if(userOptions.val('hideFixedTopbar')){
const checkPos = function(){
let $topbar = $('#topbar.topbar_wr');
$topbar.find('.topbar_inner').css({'transition': 'top .4s cubic-bezier(.45,.05,.55,.95)', 'top': '-40px'});
$topbar.css({'transition': 'height .4s cubic-bezier(.45,.05,.55,.95)', 'height': '10px'});
$topbar.hover(function(e) {
let a = $(win).scrollTop() < 38 ? -$(window).scrollTop() : '-40px';
$(this).find('.topbar_inner').css('top', e.type === 'mouseenter' ? '0' : a);
a = $(win).scrollTop() < 38 ? 45 - $(window).scrollTop() : '10px';
$(this).css('height', e.type === 'mouseenter' ? '45px' : a);
});
if ($(win).scrollTop() < 38){
$topbar.mouseenter();
$topbar.mouseleave();
}
};
checkPos();
$(window).on('scroll', function(){
// $(win).scroll(function(){
checkPos();
});
}
}
}
function userRemove(userNameArr){
let currentUser;
const blockUsersAsFindStr = 'a:contains(' + userOptions.data.BlockUsers.join('), a:contains(') + ')';
$(blockUsersAsFindStr).parent('div.uhead_nick').closest('div.article').each(function(idx, elm){
currentUser = $(this).find(blockUsersAsFindStr).text();
if(userNameArr.indexOf(currentUser) != -1){
if (userOptions.val('fullDelUserPost')){
$(this).remove();
return;
}
elm.parentElement.style.paddingBottom = '40px';
makeBlockPostElements(elm, elm.parentElement.id, lng.getVal('JRAS_POSTBLOCKBYUSER'), currentUser, '', false);
// win.console.info(' user - ' + currentUser + ' : hide post - ' + elm.parentElement.id);
$(this).hide();
}
});
$(blockUsersAsFindStr).parent('span.reply-link').closest('div[id^=comment_txt_].txt').each(function(idx, elm){
currentUser = $(this).find(blockUsersAsFindStr).text();
if(userNameArr.indexOf(currentUser) != -1){
// $(this).remove(); // для просто удаления. Будет пустой комент
// return;
makeBlockCommElements(elm, elm.parentElement.id, lng.getVal('JRAS_COMMBLOCKBYUSER'), currentUser);
// win.console.info(' user - ' + currentUser + ' : hide comment - ' + elm.parentElement.id);
$(this).hide();
}
})
}
function tagRemove(tagNameArr, strictComp){
const findStr = 'a:contains(' + tagNameArr.join('), a:contains(') + ')';
// findStr = ':contains(Anime):not(:contains(Anime Coub))'; // тест варианта условной блокировки
$('.taglist ' + findStr).closest('div.article').each(function(idx, elm){
let foundTagStr = '';
let validTag = strictComp !== true;
$(this).find('.taglist').find(findStr).text(function(index, text){
if(strictComp === true){
validTag = validTag || tagNameArr.indexOf(text) != -1;
}
foundTagStr += ' "' + text + '"';
});
if(validTag){
// $(this).remove();
// return;
elm.parentElement.style.paddingBottom = '40px';
makeBlockPostElements(elm, elm.parentElement.id, lng.getVal('JRAS_POSTBLOCKBYTAG'), foundTagStr, '', true);
// win.console.info('hide post by tag - ' + foundTagStr);
$(this).hide();
}
})
}
function makeExtendedGifLinks($nodes){
if (!userOptions.val('extendedGifLinks')){
return;
}
let baseDiv;
const f = function(url){
const ext = url.split('.').pop();
const currItem = baseDiv.append(`
<div class="jras-ext-gif-cont">
<a href="${url}" class="ant-btn css-s2p5hg jras-ext-gif-box">
<span role="img" aria-label="download" class="anticon anticon-download">
<svg viewBox="64 64 896 896" focusable="false" data-icon="download" width="1em" height="1em" fill="currentColor" aria-hidden="true">
<path d="M505.7 661a8 8 0 0012.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V168c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"></path>
</svg>
</span>
<span>${ext}</span>
</a>
<span class="jras-ext-gif-box" ${!page.isSchemeLight()?'style="color :#7b7b7b;"':''} />
</div>`).children().last();
GMxmlhttpRequest({
method: "HEAD",
url: location.protocol + url,
headers: {
'Referer': location.origin
},
onload: function(response) {
const tmp = response.responseHeaders.match(/Content-Length:\s?(\d+)/i);
if (tmp){
currItem.find('a').attr('title', lng.getVal('JRAS_EXTGIFTITLESIZESTR') + tmp[1] + ' bytes');
currItem.find('>span').text(niceBytes(tmp[1]));
};
}
});
}
const $nds = $nodes ? $nodes : $('body');
$nds.find('div.image:not(:has(div.jras-ext-gif-cont)) span').filter('.video_gif_holder, .video_holder').each(function(idx, elm){
baseDiv = $(elm).append('<div class="gifbuttons"></div>').parent().find('div.gifbuttons');
$(elm).find('video source').each(function(videoId, videoElm) {
f($(videoElm).attr('src'));
});
const gifSrc = $(elm).find('a.video_gif_source');
if (gifSrc.length) {
f(gifSrc.attr('href'));
gifSrc.remove();
};
});
}
function setVideoSoundProc(){
if (!userOptions.val('videoSoundOptions')){
return;
}
initVideoSoundControls();
initCommentVideoSoundObserver($('div.post_comment_list'));
initVideoSoundScrollObserver();
initVideoSoundVideoScrollObserver();
initVideoSoundHalfObserver();
initVideoSoundScreenMiddleObserver();
}
function loadVideoSoundVolume(){
// сохраним это значение отдельно от опций, для быстрого доступа мимо настроек
const savedVolume = parseFloat(win.localStorage.getItem('jras_video_volume'));
if ($.isNumeric(savedVolume)){
return Math.min(1, Math.max(0, savedVolume));
}
return 1;
}
function saveVideoSoundVolume(volume){
if (!$.isNumeric(volume)){return}
const safeVolume = Math.min(1, Math.max(0, volume));
lastVideoVolume = safeVolume;
win.localStorage.setItem('jras_video_volume', safeVolume);
}
function getVideoSoundVolume(){
if (!$.isNumeric(lastVideoVolume)){
lastVideoVolume = loadVideoSoundVolume();
}
return lastVideoVolume;
}
function getTargetVideoSoundVolume(){
const savedVolume = getVideoSoundVolume();
return ($.isNumeric(savedVolume) && savedVolume > 0) ? savedVolume : 1;
}
function applyVideoSoundVolume(video){
const volume = getVideoSoundVolume();
if ($.isNumeric(volume)){
setVideoVolumeAuto(video, volume);
}
}
function addVideoSoundAutoChange(video, count){
const prev = videoSoundAutoChanges.get(video) || 0;
videoSoundAutoChanges.set(video, prev + (count || 1));
}
function consumeVideoSoundAutoChange(video){
const prev = videoSoundAutoChanges.get(video) || 0;
if (prev <= 1){
videoSoundAutoChanges.delete(video);
}else{
videoSoundAutoChanges.set(video, prev - 1);
}
return prev > 0;
}
function setVideoMutedAuto(video, muted){
addVideoSoundAutoChange(video);
video.muted = muted;
}
function setVideoVolumeAuto(video, volume){
if (!$.isNumeric(volume)){return}
addVideoSoundAutoChange(video);
video.volume = volume;
}
function getVideoSoundState(video){
if (!video){return 'unknown'}
if (typeof video.mozHasAudio !== 'undefined'){
return video.mozHasAudio ? 'yes' : 'unknown';
}
if (video.audioTracks && typeof video.audioTracks.length === 'number'){
return video.audioTracks.length ? 'yes' : 'unknown';
}
if (typeof video.webkitAudioDecodedByteCount !== 'undefined'){
return video.webkitAudioDecodedByteCount > 0 ? 'yes' : 'unknown';
}
return 'unknown';
}
function updateVideoSoundButton(video){
const $btn = $(video).data('jrasSoundBtn');
if (!$btn || !$btn.length){return}
const isMuted = video.muted || video.volume === 0;
$btn.toggleClass('jras-video-sound-muted', isMuted);
$btn.text(isMuted ? '🔇' : '🔊');
$btn.attr('title', isMuted ? lng.getVal('JRAS_VIDEO_SOUND_UNMUTE') : lng.getVal('JRAS_VIDEO_SOUND_MUTE'));
}
function toggleVideoMute(video){
if (!video){return}
if (video.muted || video.volume === 0){
if (userOptions.val('restartVideoOnUnmute')){
try{
video.currentTime = 0;
}catch(e){}
}
video.volume = getTargetVideoSoundVolume();
video.muted = false;
}else{
video.muted = true;
}
}
function createVideoSoundButton(video){
const $holder = $(video).closest('.video_holder');
if (!$holder.length){return}
if ($holder.find('.jras-video-sound-btn').length){return}
const $btn = $('<div class="jras-video-sound-btn" />');
$btn.on('click', function(e){
e.preventDefault();
e.stopPropagation();
toggleVideoMute(video);
});
$holder.append($btn);
$(video).data('jrasSoundBtn', $btn);
updateVideoSoundButton(video);
}
function handleVideoVolumeChange(video){
const wasAutoChange = consumeVideoSoundAutoChange(video);
const prevState = videoSoundStates.get(video) || { muted: video.muted, volume: video.volume };
const isMuted = video.muted;
const currentVolume = video.volume;
const savedVolume = getVideoSoundVolume();
if (!wasAutoChange && !isMuted && prevState.muted && currentVolume === prevState.volume){
if ($.isNumeric(savedVolume) && savedVolume !== currentVolume){
setVideoVolumeAuto(video, savedVolume);
}
}
if (!wasAutoChange && !isMuted && $.isNumeric(currentVolume) && currentVolume !== savedVolume){
saveVideoSoundVolume(currentVolume);
}
if (!wasAutoChange){
videoSoundChangeToken += 1;
if (!isMuted && currentVolume > 0){
currentSoundVideo = video;
}else if (currentSoundVideo === video){
currentSoundVideo = null;
}
}
videoSoundStates.set(video, { muted: isMuted, volume: currentVolume });
updateVideoSoundButton(video);
}
function tryAttachVideoSoundButton(video){
const state = getVideoSoundState(video);
if (state === 'yes'){
createVideoSoundButton(video);
if (video.dataset){
video.dataset.jrasSoundHasAudio = '1';
}
return true;
}
return false;
}
function bindVideoSoundLoadListeners(video){
const tryAttach = function(){
if (tryAttachVideoSoundButton(video)){
$(video).off('loadedmetadata.jrasSound loadeddata.jrasSound canplay.jrasSound play.jrasSound playing.jrasSound timeupdate.jrasSound durationchange.jrasSound');
}
};
$(video).on('loadedmetadata.jrasSound loadeddata.jrasSound canplay.jrasSound play.jrasSound playing.jrasSound timeupdate.jrasSound durationchange.jrasSound', tryAttach);
$(video).on('loadstart.jrasSound', function(){
if (video.dataset){
delete video.dataset.jrasSoundHasAudio;
}
});
}
function initVideoSoundControls($nodes){
if (!userOptions.val('videoSoundOptions')){return}
const $scope = $nodes ? $nodes : $('body');
const $videos = $scope.is('video') ? $scope : $scope.find('video');
$videos.each(function(){
const video = this;
if (video.dataset && video.dataset.jrasSoundInit){return}
if (video.dataset){
video.dataset.jrasSoundInit = '1';
}
applyVideoSoundVolume(video);
videoSoundStates.set(video, { muted: video.muted, volume: video.volume });
$(video).on('volumechange.jrasSound', function(){
handleVideoVolumeChange(video);
});
if (!tryAttachVideoSoundButton(video)){
bindVideoSoundLoadListeners(video);
}
observeVideoForAutoSound(video);
observeVideoForSoundScroll(video);
});
initCommentVideoSoundObserver($nodes);
handleScreenMiddleAutoSound();
}
function initCommentVideoSoundObserver($nodes){
if (!('IntersectionObserver' in window)){return}
if (!videoSoundCommentObserver){
videoSoundCommentObserver = new IntersectionObserver(function(entries){
entries.forEach(function(entry){
if (!entry.isIntersecting || entry.intersectionRatio <= 0){
const video = entry.target;
if (!video.muted){
setVideoMutedAuto(video, true);
}
}
});
}, { root: null, threshold: 0.1 });
}
const $scope = $nodes ? $nodes : $('body');
const $videos = $scope.is('video') ? $scope : $scope.find('video');
$videos.each(function(){
if ($(this).closest('div.post_comment_list').length === 0){return}
observeOnce(this, videoSoundCommentObserver, 'jrasSoundCommentObserved');
});
}
function findPostContainers($nodes){
if (!$nodes){
return $('div[id^=postContainer].postContainer').filter(function(){
return $(this).closest('div.post_comment_list').length === 0;
});
}
const $arr = $();
$nodes.each(function(){
const $node = $(this);
if ($node.is('div[id^=postContainer].postContainer')
&& $node.closest('div.post_comment_list').length === 0){
$arr.push(this);
}
$node.find('div[id^=postContainer].postContainer').each(function(){
if ($(this).closest('div.post_comment_list').length !== 0){return}
$arr.push(this);
});
});
return $arr;
}
function findPostVideos($post){
return $post.find('video').filter(function(){
return $(this).closest('div.post_comment_list').length === 0;
});
}
function setPostVisibilityState(post, isVisible){
if (!userOptions.val('videoSoundMuteOnPostScroll')){return}
const $videos = findPostVideos($(post));
if (!$videos.length){return}
$videos.each(function(){
applyVisibilitySoundState(this, isVisible);
});
}
function setVideoVisibilityState(video, isVisible){
if (!userOptions.val('videoSoundMuteOnVideoScroll')){return}
applyVisibilitySoundState(video, isVisible);
}
function applyVisibilitySoundState(video, isVisible){
if (!video){return}
if (isVisible){
const saved = videoSoundScrollStates.get(video);
if (!saved){return}
if (saved.token !== videoSoundChangeToken){
videoSoundScrollStates.delete(video);
return;
}
if ($.isNumeric(saved.volume) && saved.volume !== video.volume){
setVideoVolumeAuto(video, saved.volume);
}
if (saved.muted !== video.muted){
setVideoMutedAuto(video, saved.muted);
}
videoSoundScrollStates.delete(video);
}else{
if (!videoSoundScrollStates.has(video)){
videoSoundScrollStates.set(video, {
muted: video.muted,
volume: video.volume,
token: videoSoundChangeToken
});
}
if (!video.muted){
setVideoMutedAuto(video, true);
}
}
}
function observePostContainerForSound(post){
observeOnce(post, videoSoundScrollObserver, 'jrasSoundPostObserved');
}
function observeVideoForSoundScroll(video){
observeOnce(video, videoSoundVideoScrollObserver, 'jrasSoundVideoScrollObserved');
}
function observeOnce(element, observer, flagName){
if (!observer || !element){return}
if (element.dataset){
if (element.dataset[flagName]){return}
element.dataset[flagName] = '1';
}
observer.observe(element);
}
function createVisibilityObserver(callback){
if (!('IntersectionObserver' in window)){return null}
return new IntersectionObserver(function(entries){
entries.forEach(function(entry){
callback(entry);
});
}, { root: null, threshold: 0.1 });
}
function initVideoSoundScrollObserver(){
videoSoundScrollObserver = createVisibilityObserver(function(entry){
setPostVisibilityState(entry.target, entry.isIntersecting && entry.intersectionRatio > 0);
});
if (!videoSoundScrollObserver){return}
findPostContainers().each(function(){
observePostContainerForSound(this);
});
const postList = document.getElementById('post_list') || document.body;
const observer = new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
if (mutation.type !== 'childList' || !mutation.addedNodes.length){return}
const $posts = findPostContainers($(mutation.addedNodes));
$posts.each(function(){
observePostContainerForSound(this);
});
});
});
observer.observe(postList, { childList: true, subtree: true });
}
function initVideoSoundVideoScrollObserver(){
videoSoundVideoScrollObserver = createVisibilityObserver(function(entry){
setVideoVisibilityState(entry.target, entry.isIntersecting && entry.intersectionRatio > 0);
});
if (!videoSoundVideoScrollObserver){return}
$('video').each(function(){
observeVideoForSoundScroll(this);
});
}
function subscribeVideoSoundObserver(){
const observer = new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
if (mutation.type !== 'childList' || !mutation.addedNodes.length){return}
initVideoSoundControls($(mutation.addedNodes));
});
});
observer.observe(document.body, { childList: true, subtree: true });
}
function canAutoUnmuteVideo(video){
if (video.dataset && video.dataset.jrasSoundHasAudio === '1'){
return true;
}
const $btn = $(video).data('jrasSoundBtn');
if ($btn && $btn.length){
return true;
}
return getVideoSoundState(video) === 'yes';
}
function getOtherSoundedVideo(video){
if (currentSoundVideo && currentSoundVideo !== video && document.contains(currentSoundVideo)){
if (!currentSoundVideo.muted && currentSoundVideo.volume > 0){
return currentSoundVideo;
}
}
let otherVideo;
$('video').each(function(){
if (this === video){return}
if (!this.muted && this.volume > 0){
otherVideo = this;
return false;
}
});
return otherVideo;
}
function muteOtherVideos(activeVideo){
$('video').each(function(){
if (this === activeVideo){return}
if (!this.muted){
setVideoMutedAuto(this, true);
}
});
}
function ensureVideoSoundOn(video){
if ((userOptions.val('autoUnmuteVideoNone'))){return}
if (!video || !canAutoUnmuteVideo(video)){return}
if (!video.muted && video.volume > 0){
currentSoundVideo = video;
return;
}
const wasPlaying = !video.paused && !video.ended;
muteOtherVideos(video);
videoSoundChangeToken += 1;
const targetVolume = getTargetVideoSoundVolume();
if (video.volume !== targetVolume){
setVideoVolumeAuto(video, targetVolume);
}
if (video.muted){
setVideoMutedAuto(video, false);
}
const shouldRestart = userOptions.val('restartVideoOnUnmute');
if (shouldRestart){
video.currentTime = 0;
}
if (wasPlaying || shouldRestart){
video.play();
}
currentSoundVideo = video;
}
function observeVideoForAutoSound(video){
if (!videoSoundHalfObserver){return}
if (video.dataset && video.dataset.jrasSoundHalfObserved){return}
if (video.dataset){
video.dataset.jrasSoundHalfObserved = '1';
}
videoSoundHalfObserver.observe(video);
}
function initVideoSoundHalfObserver(){
if (!('IntersectionObserver' in window)){return}
videoSoundHalfObserver = new IntersectionObserver(function(entries){
entries.forEach(function(entry){
if (entry.isIntersecting && entry.intersectionRatio >= 0.5){
if (userOptions.val('autoUnmuteVideoOnHalfScreen')){
ensureVideoSoundOn(entry.target);
}
}
});
}, { root: null, threshold: [0.5] });
$('video').each(function(){
observeVideoForAutoSound(this);
});
}
function initVideoSoundScreenMiddleObserver(){
const onScroll = function(){
if (videoSoundScreenMiddleRaf){return}
videoSoundScreenMiddleRaf = win.requestAnimationFrame(function(){
videoSoundScreenMiddleRaf = null;
handleScreenMiddleAutoSound();
});
};
$(window).on('scroll', onScroll);
$(window).on('resize', onScroll);
onScroll();
}
function handleScreenMiddleAutoSound(){
if (!userOptions.val('autoUnmuteVideoOnScreenMiddle')){return}
const video = findVideoAtScreenMiddle();
if (!video){
currentScreenMiddleVideo = null;
return;
}
if (video === currentScreenMiddleVideo){return}
currentScreenMiddleVideo = video;
ensureVideoSoundOn(video);
}
function findVideoAtScreenMiddle(){
const midY = (win.innerHeight || document.documentElement.clientHeight || 0) / 2;
if (!midY){return null}
let target = null;
$('video').each(function(){
const rect = this.getBoundingClientRect ? this.getBoundingClientRect() : null;
if (!rect){return}
if (rect.bottom <= 0 || rect.top >= (win.innerHeight || document.documentElement.clientHeight || 0)){return}
if (rect.right <= 0 || rect.left >= (win.innerWidth || document.documentElement.clientWidth || 0)){return}
if (rect.top <= midY && rect.bottom >= midY){
target = this;
return false;
}
});
return target;
}
function showHiddenComments($inElm){
if (!userOptions.val('showHiddenComments')){
return;
}
const $selElmts = ($inElm === undefined)
? $('div[id^=comment].comment.hidden a.comment_show')
: $inElm.find('a.comment_show')
;
$selElmts.each(function(idx, elm){
setTimeout(function(){
elm.click();
if (userOptions.val('showHiddenCommentsMark')){
let $parElm = $(elm).parent('div[id^=comment].txt');
if (page.isNewDesign && userOptions.val('collapseComments')){
$parElm = $(elm).parent().parent('div[id^=comment].txt');
if (userOptions.val('collapseCommentsOnlyFullPost') && !page.pageIs('post')){
$parElm = $(elm).parent('div[id^=comment].txt');
}
}
$parElm.css({'color': 'rgb(255, 57, 57)'});
}
}, 500 * idx);
})
}
function correctCommentSize(){
if (!userOptions.val('collapseComments')){
return;
}
$('div[id^=comment].comment>div[id^=comment_txt_].txt').each(function(idx, elm){
makeCommentSizer(elm);
})
}
function makeCommentSizer(elm){
const makeBody = function($newCommBoy){
const origHeight = parseInt($newCommBoy.height());
if (origHeight < userOptions.val('collapseCommentWhenSize')){
return
}
$newCommBoy.attr('origheight', origHeight)
.after('<div id="jras-commSizer-sizer-all" title="' + lng.getVal('JRAS_COMMENTS_EXPANDCOLL_ALL') + '" class="jras-comment-expand-all jras-comment-expand-all-img"></div><div id="jras-commSizer-sizer" class="jras-comment-sizer"></div><br>')
.css({
'height': userOptions.val('collapseCommentToSize') + 'px',
'overflow': 'hidden'
});
$(elm).find('#jras-commSizer-sizer').click(function(e, option){
let opt = option;
if (!opt){
opt = {action:'', correctPos:true}
}
const $commBody = $(this).parent().find('#jras-commSizer-newBody');
let h = $commBody.attr('origheight');
const op = userOptions.val('collapseCommentToSize');
switch (opt.action) {
case 'open':
break;
case 'close':
h = op;
break;
default:
h = parseInt($commBody.height()) == h ? op : h ;
break;
}
$commBody.animate({ 'height': h }, {
duration: 300,
complete: function(){
correctPageHeight();
if (!opt.correctPos) {return}
const tmp = $(this).closest('div[id^=comment].comment').offset().top;
if(tmp < win.pageYOffset){
$('html, body')
.animate({
scrollTop: tmp - 20
}, 'slow');
}
}
});
});
$(elm).find('#jras-commSizer-sizer-all').click(function(){
const h = parseInt($(this).parent().find('#jras-commSizer-newBody').css('height'));
const action = (userOptions.val('collapseCommentToSize') == h) ? 'open' : 'close' ;
$('div#jras-commSizer-sizer.jras-comment-sizer').each(function(){
$(this).trigger('click', [{action: action, correctPos: false}]);
});
})
};
let selector;
if (page.isNewDesign){
selector = ':not(.comments_bottom)';
} else{
if (parseInt($(elm).height()) < userOptions.val('collapseCommentWhenSize')){
return;
}
selector = ':not(.reply-link)';
}
const $newDiv = $(elm).prepend('<div id="jras-commSizer-newBody" style="overflow: hidden;"></div>')
.find('#jras-commSizer-newBody');
let $child = $(elm).find(' > :first-child').next();
while($child.is(selector)){
$newDiv.append($child);
$child = $(elm).find(' > :first-child').next();
}
makeBody($newDiv);
}
function subscribeShowComment(){
const observer = new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
if (mutation.type === 'childList'){
setTimeout(function () {
if (userOptions.val('showUTOnComment')) {
makeUserTooltips($(mutation.addedNodes).find('span.reply-link > a:first-child'), 'a');
}
makeExtendedGifLinks($(mutation.addedNodes));
initVideoSoundControls($(mutation.addedNodes));
initCommentVideoSoundObserver($(mutation.addedNodes));
for (let i = 0; i < mutation.addedNodes.length; i++) {
const itm = mutation.addedNodes[i];
removeRedirectLink($(itm));
showHiddenComments($(itm));
correctOldReactorLink($(itm));
previewReactorLink($(itm));
if (userOptions.val('collapseComments')
&& !userOptions.val('collapseCommentsOnlyFullPost')
//&& !page.isChrome // в хроме не работает. Не хочу разбираться возвращает хз какой height
) {
$(itm).find('div[id^=comment].comment>div[id^=comment_txt_].txt').each(function (idx, elm) {
makeCommentSizer(elm);
})
}
if ($(itm).is('div[id^=comment_list_post].comment_list_post')) {
$(itm).find('div[id^=comment].comment').each(function (idx, elm) {
if (userOptions.val('makeQuotesOnComments')) {
makeQuotesNode($(elm), elm.id.replace('comment', ''));
}
if (userOptions.val('makeTreeComments') && !userOptions.val('treeCommentsOnlyFullPost')) {
makeTreeCommentNode(elm, elm.id.replace('comment', ''));
}
if (userOptions.val('makeAvatarOnOldDesign') && !userOptions.val('makeAvatarOnlyFullPost')) {
makeAvatarOnOldDesign(elm);
}
})
}
const blockUsersAsFindStr = 'a:contains(' + userOptions.data.BlockUsers.join('), a:contains(') + ')';
$(itm).find(blockUsersAsFindStr).closest('div[id^=comment_txt_].txt').each(function (idx, elm) {
const currUser = $.trim($(this).find(blockUsersAsFindStr).text());
if (userOptions.data.BlockUsers.indexOf(currUser) != -1) {
makeBlockCommElements(elm, elm.parentElement.id, lng.getVal('JRAS_COMMBLOCKBYUSER'), currUser);
$(this).hide();
}
})
}
correctPageHeight();
}, 10);
}
});
});
$('div.post_comment_list').each(function(idx, elm){
observer.observe(elm, {
characterData: true,
childList: true,
subtree: true
});
})
}
function makeTreeComments(){
if(userOptions.val('makeTreeComments')){
setTimeout(function(){
$('div[id^=comment].comment').each(function(idx, elm){
makeTreeCommentNode(elm, elm.id.replace('comment', ''));
})
}, 10
);
}
}
function blinkElement($element, count){
for(let i = 0; i < count; i++){
$element.fadeTo('fast', 0.3).fadeTo('fast', 1.0);
}
}
function makeTreeCommentNode(elm, commentID){
if($(elm).find('span#treeColl' + commentID)[0]){
return
}
const collapseToParent = function(design){
let retVal = null;
const $parentElm = $(elm).parent();
if($parentElm.prev().is('div[id^=comment].comment') && $(elm).is(':not(:first-child)')){
// если парент elm - div#comment???.comment и elm не первый чилд
const parentNodeID = $parentElm.prop('id');
const $newElm = $(elm).prepend(design.replace('##parentNodeID##', parentNodeID))
.find('div#jras-colltoparent-' + commentID);
$newElm.click(function(){
const $par = $('div#' + $(this).attr('parentNodeID'));
$par.prev().find('>div[id^=comment_txt_].txt>div#jras-commSizer-sizer').trigger('click', [{action: 'close', correctPos: false}]);
const currID = $(this).parent().prop('id');
let $child = $par.find('>:first-child');
while($child.prop('id') != currID){
// Сворачиваем ноды
$child.find('>div[id^=jras-treecomm]:first-child').trigger('click', [{action: 'close'}]);
// Сворачиваем большие коменты
$child.find('>div[id^=comment_txt_].txt>div#jras-commSizer-sizer').trigger('click', [{action: 'close', correctPos: false}]);
$child = $child.next();
}
// далее происходит следующее
// сдвигаем все вверх, так чтобы парент был на четверть экрана ниже верхней границы
// когда анимация закончится проверим виден ли основной комент
// если он находится ниже видимой области экрана,
// то сдвинем парент на самый верх экрана
// и помигаем :)
$('html, body')
.animate({
scrollTop: $par.prev().offset().top - (win.innerHeight / 4)
}, {
complete: function(){
if($(elm).offset().top > win.pageYOffset + win.innerHeight){
$('html, body')
.animate({
scrollTop: $(elm).parent().prev().offset().top - 20
}, 'slow');
}
for(let i = 0; i < 3; i++){
$(elm).parent().prev().fadeTo('fast', 0.3).fadeTo('fast', 1.0);
$(elm).fadeTo('fast', 0.3).fadeTo('fast', 1.0);
}
}
});
correctPageHeight();
});
retVal = $newElm;
}
return retVal;
};
let colTreeCSSForPlus;
let colTreeCSSForMinus;
const collapseTreeClick = function(e, option){
if (!option){
option = {action: ''};
}
const setPlus = function(elm){
elm.text('+');
elm.css(colTreeCSSForPlus);
if(userOptions.val('whenCollapseMakeRead')){
$toggleContainer.find('div.new').removeClass('new');
}
};
const setMinus = function(elm){
elm.text('-');
elm.css(colTreeCSSForMinus);
};
const slide = function(slideCont, act){
switch (act) {
case 'open':
setMinus($treeColl);
slideCont.slideDown('display');
break;
case 'close':
setPlus($treeColl);
slideCont.slideUp('display');
break;
default:
if(slideCont.css('display') == 'none'){
setMinus($treeColl);
}else{
setPlus($treeColl);
}
slideCont.slideToggle('display');
break;
}
};
const $toggleContainer = $('#comment_list_comment_' + commentID);
const $treeColl = $('span#treeColl' + commentID);
slide($toggleContainer, option.action);
};
let $collToPar;
const needCollTree = $(elm).next().children().length != 0;
if(page.isNewDesign){
$collToPar = collapseToParent(`<div id="jras-colltoparent-${commentID}" parentNodeID="##parentNodeID##" class="treeCross-new treeCross-new-toparent">
<t style="position: absolute;margin-left: 3px;margin-top: -5px;font-size: 11px;font-weight: bold;">^</t></div>`);
if(needCollTree){
colTreeCSSForPlus = {'margin-left': '-1px'};
colTreeCSSForMinus = {'margin-left': '1px'};
$(elm).prepend(`<div id="jras-treecomm-${commentID}" class="treeCross-new">
<span id="treeColl${commentID}" style="margin-left: 1px; margin-top: -10px;">-</span></div>
`).find('div#jras-treecomm-' + commentID)
.click(collapseTreeClick);
}
if($collToPar !== null || needCollTree){
$(elm).find('>div.txt').css('padding-left', '15px');
if($collToPar !== null && !needCollTree){
$collToPar.css('margin-top', '-3px')
}
}
}else{
$collToPar = collapseToParent(`<div id="jras-colltoparent-${commentID}" parentNodeID="##parentNodeID##" class="comment treeCross-old treeCross-old-toparent">
<t style="margin-left: -4px;margin-top: -3px;position: absolute;font-size: 8px;">^</t></div>`);
if(needCollTree){
colTreeCSSForPlus = {'margin-left': '-2px'};
colTreeCSSForMinus = {'margin-left': '0px'};
$(elm).prepend(`<div id="jras-treecomm-${commentID}" class="comment treeCross-old">
<span id="treeColl${commentID}" style="margin-left: 0;">-</span></div>
`).find('div#jras-treecomm-' + commentID)
.click(collapseTreeClick);
$(elm).find('>div.avatar')
.addClass('avatarCorrect')
.css('left', '-10px');
}
if($collToPar !== null || needCollTree){
$(elm).find('>div.avatar').addClass('avatarCorrect').css('left', '-10px');
if($collToPar !== null && !needCollTree){
$collToPar.css({'margin-top': '-3px', 'margin-left': '-36px'})
}
}
}
}
function makeQuotes() {
if (!userOptions.val('makeQuotesOnComments')) return;
$('div[id^=comment].comment:not(div[id^=comment].comment.quotes)').each(function (idx, elm) {
makeQuotesNode($(elm), elm.id.replace('comment', ''));
})
}
function makeQuotesNode($elm, commentID) {
if ($elm.hasClass('quotes')) return;
const $elmDivTxt = $elm.find('div.txt');
const $elmText = $elmDivTxt.find('span').first().text();
if (!$elmText) return;
const createQT = async ($e) => {
$e.contents().each((i, e) => {
if (e.nodeType === 1) createQT($(e))
else if (e.nodeType === 3 && $(e).text().trim()[0] === '>') {
let
qText = $(e).text().trim().substring(1).trim(),
qUser, qCommId;
const a = [...qText.matchAll(/ ::: _\[(.+):(\d+)]_/gm)].forEach((e)=>{
qUser = e[1];
qCommId = e[2];
qText = qText.substring(0, e.index);
});
e.nodeValue = qText;
const currQuoteId = `jras-quote-${i}-${commentID}`;
const $qt = $(`<div class="jras-qt"><div id="${currQuoteId}"></div></div>`);
$(e).wrap($qt)
if (userOptions.val('makeExtQuotes') && qUser){
$(e).wrap(`<div class="base-qt"><div class="qt-body"></div></div>`);
let linkToComment = '';
if (qCommId){
const s = $elmDivTxt[0].id.replace('comment_txt_', '');
linkToComment = ` <a qt-comment-link href="/post/${s.substring(0, s.search('_')) }#comment${qCommId}">#</a>`
}
$(e.parentNode)
.before(`<div class="qt-header${page.isNewDesign ? '' : ' qt-header-old'}"><a qt-user-link href="/user/${qUser}">${qUser}</a>${linkToComment}</div>`)
.addClass(page.isSchemeLight() ? 'qt-body-l' : 'qt-body-d')
.prev().addClass(page.isSchemeLight() ? 'qt-header-l' : 'qt-header-d');
makeUserTooltips($elmDivTxt.find('div.qt-header a[qt-user-link]'));
makeAllPreviewTooltip($elmDivTxt.find('div.qt-header a[qt-comment-link]'));
}
$elm.addClass('quotes');
}
});
}
createQT($elm);
// выдирание текста комента построчно
// const getText = ($e) => {
// let retText = $e.text() ? '' : '\n';
// $e.contents().each((i, e) => {
// if (e.nodeType === 1) retText += getText($(e))
// else retText += e.nodeType === 3 ? $(e).text() : '\n'
// });
// return retText;
// }
// const text = getText($elm.find('div.txt span').first()).trim();
// if (!text) return;
// [...text.matchAll(/>.+\n/gm)].forEach((e)=>{
// console.log(`Found ${e[0]}`);
// })
}
function makePopuperQuote(){
const $baseContainer = $('div#pageinner');//$('div[id^=postContainer].single_post.postContainer');
makePopupQuote($baseContainer);
$baseContainer.mouseup(function (event) {
if (event.button !== 0) return;
const selected = getSelectedText();
const selText = selected.toString().trim();
if (selText !== '') {
const $parDiv = $(selected.focusNode).parents('div.txt').parent();
const quoteUser = $parDiv.find('a.comment_username').text();
const commentId = $parDiv[0].id.replace('comment', '');
quoteData.$commentContainer = $parDiv;
// quoteData.quoteInsertData = '> ' + selText + `<font color=${page.commentBgColor()}> ::: _[${quoteUser}:${commentId}]_</font>`;
quoteData.quoteInsertData = `> ${selText}${userOptions.val('qTAddUserInfo') ? ` ::: _[${ quoteUser }:${ commentId }]_`: ''}\n`;
// event.stopPropagation();
const x = event.clientX - $baseContainer.offset().left + 5;
const y = event.pageY - $baseContainer.offset().top - 35;
quoteData.$popupQuote.css({ 'top': y + 'px', 'left': x + 'px' });
popupQuoteVisible(true);
} else {
popupQuoteVisible(false);
}
});
}
function sendToCommentTextArea(text) {
const $textArea = quoteData.$commentContainer.find('form.post_comment_form textarea.comment_text');
if ($textArea.length === 0) return;
const caretPos = $textArea[0].selectionStart;
const textAreaTxt = $textArea.val();
// if (textAreaTxt !== '' && text === quoteData.quoteInsertData) { text = '\n' + text }
$textArea.val(textAreaTxt.substring(0, caretPos) + text + textAreaTxt.substring(caretPos));
$textArea[0].selectionStart = caretPos + text.length;
$textArea[0].selectionEnd = $textArea[0].selectionStart;
$textArea[0].focus();
}
function getSelectedText() {
if (window.getSelection) {
return window.getSelection();
} else if (document.getSelection) {
return document.getSelection();
} else if (document.selection) {
return document.selection.createRange().text;
}
}
function clearSelectedText() {
(window.getSelection ? window.getSelection() : document.selection).empty();
}
function makePopupQuote($par) {
if (!userOptions.val('makeQuoteTool')) return;
if (quoteData.$popupQuote) { return }
quoteData.$popupQuote = $(`<div id="jras-qt-popup" title="${lng.getVal('JRAS_GUI_QUOTEPOPUPERHINT')}\n - ${lng.getVal('JRAS_GUI_NEWANSWERALWAYS')}\n - ${lng.getVal('JRAS_GUI_FINDOPENEDFORM')}\n - ${lng.getVal('JRAS_GUI_ADDCOMMENTFORM')}"></div>`)
.on("mousedown", ()=>clearSelectedText())
.click(function (e) {
popupQuoteVisible(false);
let $commentForm;
const f_newAnswerAlways = ()=>{
$commentForm = quoteData.$commentContainer.find('div.addcomment');
if ($commentForm.length === 0 || !$commentForm.is(':visible')) {
quoteData.$commentContainer.find('span.reply-link>a.response')[0].click();
}
}
const f_findOpenedForm = () => {
$commentForm = quoteData.$commentContainer.parents('div.comment_list_post').find('div.addcomment:visible');
if ($commentForm.length === 0) {
quoteData.$commentContainer.find('span.reply-link>a.response')[0].click();
} else {
quoteData.$commentContainer = $commentForm;
}
}
const f_addCommentForm = () => {
quoteData.$commentContainer = quoteData.$commentContainer.parents('div.post_comment_list').find('>div.addcomment');
}
if (e.ctrlKey || e.shiftKey){
if (e.ctrlKey && e.shiftKey){f_addCommentForm()}
else if (e.ctrlKey){f_newAnswerAlways()}
else if (e.shiftKey){f_findOpenedForm()};
}else{
switch (userOptions.val('qTInsertIntoShowingInput')) {
case 'newAnswerAlways':
f_newAnswerAlways();
break;
case 'findOpenedForm':
f_findOpenedForm();
break;
case 'addCommentForm':
f_addCommentForm();
break;
};
}
sendToCommentTextArea(quoteData.quoteInsertData);
}
);
$par.append(quoteData.$popupQuote);
}
function popupQuoteVisible(value) {
if (!quoteData.$popupQuote) { return }
if (value === undefined) {
quoteData.$popupQuote.toggleClass('show hide');
} else {
if (value) {
quoteData.$popupQuote.removeClass('hide');
quoteData.$popupQuote.addClass('show');
} else {
quoteData.$popupQuote.removeClass('show');
quoteData.$popupQuote.addClass('hide');
}
}
}
function makeAvatarOnOldDesign(elm){
if (page.isNewDesign){
return
}
if (elm === undefined){
if (!userOptions.val('makeAvatarOnOldDesign')){
return
}
$('div[id^=comment].comment').each(function(idx, elm){
makeAvatarOnOldDesign(elm, elm.id.replace('comment', ''));
})
}else{
const $elm = $(elm);
const $avaOldElm = $elm.find('>div.avatar');
let commDate = $avaOldElm.attr('title');
$avaOldElm.before(`<img class="avatarForOldDesign" src="/pics/avatar/user/${$elm.attr('userid')}" title="${commDate}">`);
const $avaNewElm = $elm.find('>img.avatarForOldDesign');
$avaNewElm.css({'height': userOptions.val('avatarHeight') + 'px'});
//if(!userOptions.val('makeTreeComments')){
// $avaNewElm.css({'margin-left': '-16px'});
//}
$elm.find('>div[id^=comment_txt_].txt>span:not([class]):first').after('<br>');
$avaOldElm.remove();
if (userOptions.val('showCommentDate')){
$(`<span style="font-size: 75%;opacity: 0.5;">${commDate} — </span>`).insertBefore($elm.find('span.reply-link'));
}
}
}
function correctPostDate($srcElm){
const $src = ($srcElm) ? $srcElm : $('body');
const $spanDate = $src.find('div.article.post-normal div.ufoot span.date');
const reconnect = function($th, observe){
observe.observe($th.get(0), {subtree: true, attributes: true, childList: true});
};
let obs = [];
$spanDate.each(function(idx){
const corrDate = function($th, observe){
if (observe != null){observe.disconnect()}
const $spanDateCurr = $($th).find('>span:first');
$spanDateCurr.children().remove();
$spanDateCurr.append(`<span style="margin-right: 20px;">${new Date(+$spanDateCurr.attr('data-time') * 1000).toLocaleString('ru', { weekday: 'short', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric'})}</span>`);
};
const $th = $(this);
corrDate($th, obs[idx]);
obs[idx] = new MutationObserver(function(){corrDate($th, obs[idx])});
reconnect($th, obs[idx]);
});
}
function getPostID(strPostID){
const ret = /[0-9]+(\d?\.\d+)?/g.exec(strPostID);
return (ret == undefined) ? '' : ret[0];
}
function makePostControls(){
if (!userOptions.val('pcbShowPostControl')) {return}
const step = 25;
const itmHeight = (page.isNewDesign) ? 24 : 16;
const itmContentPos = itmHeight + 5;
let st = (page.isNewDesign) ? 'new' : 'old';
if (st == 'old' && !page.isSchemeLight()){
st = st + '-dark';
}
const getFavData = function($container){
let ret = {};
if ($container.find('div.uhead_share span.favorite_link.favorite')[0]){
ret.Img = 'jras-pcShareFAV-exists-img';
ret.Title = lng.getVal('JRAS_REMOVEFAVORITE');
}else{
ret.Img = 'jras-pcShareFAV-img' ;
ret.Title = lng.getVal('JRAS_ADDFAVORITE');
}
return ret;
};
const makePostCtrl = function($th){
const $postContainer = $th;
const postID = getPostID($postContainer.attr('id'));
if (postID == ''){return}
$postContainer.find('div#jras-PostControlBlock').remove();
if (userOptions.val('pcbHideJRShareBlock')) {$postContainer.find('div.uhead_share').css('display', 'none')}
if (userOptions.val('pcbHideJRRatingBlock')) {$postContainer.find('div.ufoot span.post_rating').css('display', 'none')}
const favData = getFavData($postContainer);
setTimeout(function(){
const postUrl = location.protocol + '//' + location.hostname + '/post/' + postID;
const postUrlShare = postUrl + '?social=1';
const pcbShareButtons = (!userOptions.val('pcbHideShareButoons'))
? `<a href="https://t.me/share/url?url=${postUrlShare}" title="Telegram" class="jras-pcShareTEL-img" rel="nofollow" target="_blank"></a>
<a href="http://vkontakte.ru/share.php?url=${postUrlShare}" title="Vkontakte" class="jras-pcShareVK-img" rel="nofollow" target="_blank"></a>
<a href="http://connect.mail.ru/share?url=${postUrlShare}" title="Mail.ru" class="jras-pcShareMAIL-img" rel="nofollow" target="_blank"></a>
<a href="http://twitter.com/home?status=${postUrlShare}" title="Twitter" class="jras-pcShareTWIT-img" rel="nofollow" target="_blank"></a>
<a href="http://www.facebook.com/sharer.php?u=${postUrlShare}" title="Facebook" class="jras-pcShareFACE-img" rel="nofollow" target="_blank"></a>`
: '';
$postContainer.find('div.article').each(function(){
$(this).css({'overflow':'hidden'});
$(this).prepend(`
<div id="jras-PostControlBlock" postID="${postID}" class="jras-PostControlBlock-${st}" style="white-space: nowrap; height: ${step * 4}px;">
<sitm id="jras-PostControlInfo" class="jras-pcInfo-img" style="top:0; height: ${itmHeight}px; ${(page.isNewDesign)?'padding: 2px;':''}">
<a id="jras-pcInfoUser" href="#" style="margin-left: ${itmContentPos}px;"></a>
</sitm>
<sitm id="jras-PostControlShare" class="jras-pcShare-img" style="top:${step}px; height: ${itmHeight}px;">
<a id="jras-pcbShareFAV" href="#" title="${favData.Title}" class="${favData.Img}" style="margin-left: ${itmContentPos + 5}px;"></a>
${pcbShareButtons}
</sitm>
<sitm id="jras-PostControlRating" class="jras-pcRating-img" style="top:${step * 2}px; height: ${itmHeight}px; ${(page.isNewDesign)?'padding: 4px;':''}">
<span style="margin-left: ${itmContentPos}px;">
</sitm>
<sitm id="jras-PostControlLinks" class="jras-pcLinks-img" style="top:${step * 3}px; height: ${itmHeight}px; ${(page.isNewDesign)?'padding: 2px;':''}"></sitm>
</div>
`);
});
const $postBlock = $postContainer.find('div#jras-PostControlBlock');
if (userOptions.val('pcbAnimateMove')){
$postBlock.css('transition', `0.${10 - +userOptions.val('pcbAnimateMoveSpeed')}s cubic-bezier(0.76, -0.48, 0.27, 1.42)`);
}
const $infoUserA = $postContainer.find('div.uhead div.uhead_nick a');
const $infoUserDate = $postContainer.find('div.ufoot span.date > span');
const $pcInfoUser = $postContainer.find('sitm#jras-PostControlInfo');
$pcInfoUser.find('a#jras-pcInfoUser').attr('href', $infoUserA.attr('href')).text($infoUserA.text());
$pcInfoUser.append('<span> — </span>');
$pcInfoUser.append($infoUserDate.clone());
if (userOptions.val('showUTOnPostControl')){makeUserTooltips($pcInfoUser.find('a#jras-pcInfoUser'))}
postControlSlider($pcInfoUser, itmHeight + $infoUserA.width() + $infoUserDate.width(), itmHeight);
const $favA = $postBlock.find('a#jras-pcbShareFAV');
const $favLink = $postContainer.find('div.uhead_share span.favorite_link');
if (!$favLink.length == 0){
new MutationObserver(function(){
const favData = getFavData($postContainer);
$favA.removeClass();
$favA.addClass(favData.Img);
$favA.attr('title', favData.Title);
}).observe($postContainer.find('div.uhead_share span.favorite_link').get(0), {attributes: true});
}
postControlSlider($postContainer.find('sitm#jras-PostControlShare'), (pcbShareButtons == '') ? 40 : 132, itmHeight);
$favA.click(function(){ $postContainer.find('span.favorite_link').get(0).click(); return false; });
if (page.isUserLogon){
const $Rating = $postContainer.find('div.ufoot span.post_rating');
$Rating.find('div.vote-plus, div.vote-minus').removeClass('abyss');
const ratingStyle = function(){
const $pcRating = $postContainer.find('sitm#jras-PostControlRating');
$pcRating.children().remove();
$pcRating.append(`<span style="margin-left: ${itmContentPos}px;">`);
$pcRating.append($Rating.clone(true));
const $pcRatingPost = $pcRating.find('span.post_rating');
$pcRatingPost.css('display', '');
// $pcRatingPost.css('right', 'unset');
const $pcRatingPostPlus = $pcRatingPost.find('div.vote-plus');
$pcRatingPostPlus.removeClass('vote-plus').addClass('jras-PostControlRatingVote').click(function(){
$Rating.find('div.vote-plus').get(0).click()
});
const $pcRatingPostMinus = $pcRatingPost.find('div.vote-minus');
$pcRatingPostMinus.removeClass('vote-minus').addClass('jras-PostControlRatingVote').click(function(){
$Rating.find('div.vote-minus').get(0).click()
});
if (page.isNewDesign){
$pcRatingPost.find('span:first').css({
'font-size': '18px',
'top': '-9px',
'display': 'initial',
'position': 'relative'
});
$pcRatingPostPlus.addClass('jras-PostControlRatingVote-new').css({'background-position-y': '1px'});
$pcRatingPostMinus.addClass('jras-PostControlRatingVote-new').css({
'background-position': '-22px 1px',
'margin': '7px 0 0'
});
}else{
$pcRatingPostPlus.addClass('jras-pcVotePlus-img').css({'top': '5px', 'position': 'relative'});
$pcRatingPostMinus.addClass('jras-pcVoteMinus-img').css({'top': '5px', 'position': 'relative'});
}
postControlSlider($pcRating, itmHeight + 130, itmHeight);
};
ratingStyle();
new MutationObserver(function(){
ratingStyle()
})
.observe($Rating.get(0), {subtree: true, attributes: true, childList: true});
}
let $Links = $postContainer.find('div.ufoot span.manage');
const makeLinks = function(){
let itemW = 0;
const $pcLinks = $postContainer.find('sitm#jras-PostControlLinks');
$pcLinks.children().remove();
$pcLinks.append(`<span style="margin-left: ${itmContentPos}px;">`);
$pcLinks.append(`<s><div class="jras-pcToTop" ${(page.isNewDesign)?'style="margin-top: 2px; cursor: pointer;"':''}></div></s>`);
$pcLinks.find('div.jras-pcToTop').click(function(){
$('html, body').animate({ scrollTop: $postContainer.offset().top - 50}, 500);
});
$pcLinks.append(`<s><div class="jras-pcToDown" ${(page.isNewDesign)?'style="margin-top: 2px; cursor: pointer;"':''}></div></s>`);
$pcLinks.find('div.jras-pcToDown').click(function(){
$('html, body').animate({ scrollTop: $postContainer.offset().top + $postContainer.height() - win.innerHeight + 50}, 500);
});
if (page.isNewDesign){
$pcLinks.append($postContainer.find('div.ufoot span.link_wr').clone());
$pcLinks.append($postContainer.find('div.ufoot span.hidden_link').clone());
$Links.children().each(function(){
$pcLinks.append($(this).clone().css('display', $(this).css('display')));
});
$pcLinks.find('>span:gt(1):not(:last)').addClass('jras-pcLinksSepAfter');
$pcLinks.find('>span.hidden_link').addClass('jras-pcLinksSepBefore');
itemW = ($pcLinks.children().find(':visible').length > 3) ? 85: 95;
itemW += itmHeight + $Links.outerWidth();
}else{
$pcLinks.append($Links.children().clone());
$pcLinks.find('>span:not(:first):not(:last)').addClass('jras-pcLinksSepAfter');
$pcLinks.find('>span.hidden_link').addClass('jras-pcLinksSepBefore');
itemW = itmHeight + $Links.width() + $Links.children().find(':visible').length * 7;
}
itemW += 60;
$pcLinks.find('span.setTag a.link.setTagLink').click(function(){
const $tagEdit = $postContainer.find('div.ufoot span.post_add_tag');
const hidden = $tagEdit.css('display') == 'none';
$postContainer.find('div.ufoot span.setTag a.link.setTagLink').get(0).click();
if (hidden){
$('html, body').animate({ scrollTop: $tagEdit.offset().top - 150}, 500);
blinkElement($tagEdit, 5);
}
});
$pcLinks.find('span.setTag a.setHeaderLink').click(function(){
const $captionEdit = $postContainer.find('div.ufoot span.post_set_header');
const hidden = $captionEdit.css('display') == 'none';
$postContainer.find('div.ufoot a.setHeaderLink').get(0).click();
if (hidden){
$('html, body').animate({ scrollTop: $captionEdit.offset().top - 150}, 500);
blinkElement($captionEdit, 5);
}
});
postControlSlider($pcLinks, itemW, itmHeight);
};
makeLinks();
new MutationObserver(function(){ makeLinks()})
.observe($Links.get(0), {subtree: true, attributes: true, childList: true});
checkPostControlPos($th);
},10);
};
let selector = 'div[id^=postContainer].postContainer';
if (userOptions.val('pcbShowInFullPost')) {selector = 'div#pageinner div#contentinner > ' + selector}
$(selector).each(function(){
const $post = $(this);
makePostCtrl($post);
new MutationObserver(function(){ makePostCtrl($post) })
.observe($(this).get(0), {childList: true});
});
$(window).on('scroll', function(){
$('div[id^=postContainer].postContainer').each(function(){
checkPostControlPos($(this));
});
});
}
function postControlSlider($postContainerItem, itmWidth, itmHeight){
return $postContainerItem.css({'width': itmWidth + itmHeight + 'px', 'right': -itmWidth + 'px'})
.mouseenter(function(){$(this).css('right', '-4px')})
.mouseleave(function(){$(this).css('right', -itmWidth + 'px')});
}
function checkPostControlPos($PostContainer){
const pco = $PostContainer.offset();
const pch = $PostContainer.height();
const pcbp = pco.top + pch;
if (pco.top > win.pageYOffset + win.innerHeight){ return }
if (pcbp < win.pageYOffset){ return }
const $PostCrtlsBlock = $PostContainer.find('div#jras-PostControlBlock');
const pbh = $PostCrtlsBlock.height();
let newTop = win.pageYOffset - pco.top + +userOptions.val('pcbTopScreenPos');
const pcbTopStop = +userOptions.val('pcbTopBorder');
if (newTop + pbh + pcbTopStop > pch){
newTop = pch - pbh - +userOptions.val('pcbBottomBorder');
}
newTop = (newTop < pcbTopStop) ? pcbTopStop : newTop;
$PostCrtlsBlock.css({'top': newTop});
}
function HttpRequest(link, readyState, fonload){
GMxmlhttpRequest({
method: 'GET',
url: link,
onload: function(response) {
if (response.readyState != readyState){return}
fonload(response);
}
});
}
function actionTooltipButton($button, link, buttonTxtID){
$button.click({clickLink: link, updateContainer: $button}, function(eventObject){
const t = eventObject.data.updateContainer.find('#' + buttonTxtID);
const ct = t.text();
t.text(ct + ' : wait');
HttpRequest(eventObject.data.clickLink, 4, function(e){
if(e.target.status != 200){
t.text(ct + ' : error: ' + e.target.status);
}else{
t.text(ct + ' : ok');
}
eventObject.data.updateContainer
.css('cursor', '')
.removeClass('jras-tooltip-button')
.unbind(eventObject);
});
});
}
function makeTooltips(selector, openCallBack){
$(selector).tooltip({
items: 'a',
content: function(){
return '<div id="jras-tooltipcontainer"' +
' style="height: 30px; line-height: 30px; margin: 8px; color: rgb(120, 120, 120); text-align: center;">' +
lng.getVal('JRAS_LOADINGUSERDATA') + '</div>';
},
show: {effect: "fade", duration: 400},
track: true,
open: function(event, ui){
openCallBack(event, ui)
},
close: function(event, ui){
ui.tooltip.hover(function(){
$(this).stop(true).fadeTo(400, 1);
}, function(){
$(this).fadeOut('400', function(){
$(this).remove();
});
});
}
});
}
function clearContainer(container){
container.find('*').remove();
container.empty();
container.css({
'line-height': '',
'text-align': '',
'height': ''
});
}
function setTooltipBounds($tooltip, {left, width, height}){
if (width){
$tooltip.width(width + 'px');
}
if (height){
$tooltip.height(height + 'px');
}
if (left){
$tooltip.offset({ left: left});
}
}
function makeAllPreviewTooltip(selector) {
makeTooltips(selector, function (event, ui) {
const $item = $(event.target);
let prevLink = $item.attr('href');
const tempUrl = new URL(prevLink, location.href);
tempUrl.host = location.host;
prevLink = tempUrl.href;
const $tooltip = $(ui.tooltip);
$('div.ui-tooltip').not('#' + $tooltip.attr('id')).remove();
$tooltip.css({
'border-radius': '5px',
'z-index': '500',
'border': '1px solid rgb(102, 102, 102)',
'-webkit-box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'-moz-box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'word-break': 'break-all'
});
getPreviewData(prevLink, $tooltip, $tooltip.find('div#jras-tooltipcontainer'));
});
}
function getPreviewData(previewLink, $tooltip, $outContainer) {
setTooltipBounds($tooltip, { width: defLoadTooltipSize });
HttpRequest(previewLink, 4, function (e) {
if (e.status != 200) {
$outContainer.text('Loading error: ' + e.status);
} else {
const doc = document.implementation.createHTMLDocument("");
doc.documentElement.innerHTML = e.response;
clearContainer($outContainer);
let tmpW = win.innerWidth;
const w = tmpW / 100 * userOptions.val('previewSizeX');
const h = win.innerHeight / 100 * userOptions.val('previewSizeY');
if ($tooltip.position().left + w > tmpW) {
tmpW = tmpW - w - 30;
} else {
tmpW = null;
}
setTooltipBounds($tooltip, { left: tmpW, width: w});
$tooltip.css({'max-height': h});
$outContainer.append(`<div id="jras-preview-tooltip-container"></div>`);
const $jrasTTCont = $outContainer.find('div#jras-preview-tooltip-container')
.css({'width': '100%',
'overflow-y': 'auto',
'max-height': h - ($outContainer.css('margin-top').replace('px', '') * 2) + 'px'});
const commID = previewLink.match(/comment\d+$/g);
if (commID && commID[0]){
// is comment
const $arr = [];
const divCom = 'div#' + commID[0];
const $inCom = $(doc).find(divCom);
$arr.push($inCom.parent().prev().clone().appendTo($jrasTTCont).css({opacity: 0.5}));
$inCom.parent().clone().appendTo($jrasTTCont).children().not(divCom).remove();
$arr.push($jrasTTCont.find(divCom));
$inCom.next().clone().appendTo($arr[$arr.length - 1].parent())
.css({opacity: 0.5}).children().remove('div.comment_list')
.each(function(){$arr.push($(this))});
$jrasTTCont.find('div.image img').css({'max-width': $jrasTTCont.innerWidth()});
$arr.forEach(function(elm){
makeQuotes();
removeRedirectLink(elm);
showHiddenComments(elm);
correctOldReactorLink(elm);
makeAvatarOnOldDesign(elm);
});
}else{
// is post
let postID = previewLink.match(/post\/\d+$/g);
if (postID && postID[0]){
postID = postID[0].replace('post/', '');
const $post = $(doc).find('div#postContainer' + postID).clone().appendTo($jrasTTCont);
$post.find('div.post_comment_list').remove();
$post.find('div.image img').css({'max-width': $jrasTTCont.innerWidth()});
correctPostDate($post);
removeRedirectLink($post);
removeShareButtons($post);
}
}
}
});
}
function makeTagTooltips(selector){
makeTooltips(selector, function(event, ui){
const $item = $(event.target);
const TagName = $.trim($item.text());
const TagLink = $item.attr('href');
const $tooltip = $(ui.tooltip);
$('div.ui-tooltip').not('#' + $tooltip.attr('id')).remove();
$tooltip.css({
'border-radius': '5px',
'z-index': '500',
'border': '1px solid rgb(102, 102, 102)',
'-webkit-box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'-moz-box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'word-break': 'break-all'
});
getTagData(TagName, TagLink, $tooltip, $tooltip.find('div#jras-tooltipcontainer'));
});
}
function getTagData(tagName, tagLink, $tooltip, $outContainer){
setTooltipBounds($tooltip, {width: defLoadTooltipSize});
HttpRequest(tagLink, 4, function(e){
if(e.status != 200){
$outContainer.text('Loading error: ' + e.status);
}else{
const doc = document.implementation.createHTMLDocument("");
doc.documentElement.innerHTML = e.response;
clearContainer($outContainer);
let tmpW = win.innerWidth;
const w = defTagTooltipSize;//tmpW / 2 - 30;
if ($tooltip.position().left + w > tmpW){
tmpW = tmpW - w - 30;
} else {
tmpW = null;
}
setTooltipBounds($tooltip, {left: tmpW, width: w});
const $tagHeaderPathBlock = $('<div id="jras-tagHeaderPathBlock">')
.css({
'font-size': '10px',
'margin-top': '-6px',
'margin-bottom': '4px'
});
$outContainer.append($tagHeaderPathBlock);
const $tagDocHeaderSide = $(doc).find('div.sidebar_block div.sideheader.taginfo');
const $tagSideBar = $tagDocHeaderSide.closest('div#sidebar');
$tagDocHeaderSide.find('a').each(function(){
$(this).appendTo($tagHeaderPathBlock);
$tagHeaderPathBlock.append('<span> > </span>');
});
const $tagHeaderBlock = $('<div id="jras-tagHeaderBlock">').css({'line-height': '22px'});
$outContainer.append($tagHeaderBlock);
const $tagDocStats = $(doc).find('div.sidebar_block div.blog_stats');
$tagDocStats.closest('div.sidebarContent').find('img.blog_avatar').clone().appendTo($tagHeaderBlock);
$tagDocHeaderSide.find('span.fn').appendTo($tagHeaderBlock).addClass('jras-tooltip-caption');
makeTagModers($tagSideBar, $outContainer);
makeTagStatistics($tagDocStats, $outContainer);
const $mainBtnContainer = $('<div id="jras-tooltip-mainTagBtn" class="jras-tooltip-section-topborder"></div>').appendTo($outContainer);
if(page.isUserLogon){
const $tagDocHeader = $(doc).find('div#blogHeader');
let txtToTagAction;
let linkToTagAction;
if($tagDocHeader.find('div#blogFavroiteLinks > p').is('.add_to_fav')){
txtToTagAction = lng.getVal('JRAS_ADDTAGFAV');
linkToTagAction = $tagDocHeader.find('div#blogFavroiteLinks > p.add_to_fav > a.change_favorite_link').attr('href');
}else{
if($tagDocHeader.find('div#blogFavroiteLinks > p').is('.remove_from_fav')){
txtToTagAction = lng.getVal('JRAS_REMOVETAGFAV');
linkToTagAction = $tagDocHeader.find('div#blogFavroiteLinks > p.remove_from_fav > a.change_favorite_link').attr('href');
}
}
if(txtToTagAction){
const $favTagBtn = $mainBtnContainer.append(`
<div id="jras-tooltip-favtag" class="jras-tooltip-button" style="cursor: pointer;">
<i class="jras-tooltip-button-img jras-tooltip-favtag-img""></i>
<span id="jras-tooltip-favtag-txt" class="jras-tooltip-button-text">${txtToTagAction}</span>
</div>
`).find('#jras-tooltip-favtag');
actionTooltipButton($favTagBtn, linkToTagAction, 'jras-tooltip-favtag-txt');
}
if($tagDocHeader.find('div#blogFavroiteLinks > p').is('.add_to_unpopular')){
txtToTagAction = lng.getVal('JRAS_BLOCKTAG_JR');
linkToTagAction = $tagDocHeader.find('div#blogFavroiteLinks > p.add_to_unpopular > a.change_favorite_link').attr('href');
}else{
if($tagDocHeader.find('div#blogFavroiteLinks > p').is('.remove_from_unpopular')){
txtToTagAction = lng.getVal('JRAS_UNBLOCKTAG_JR');
linkToTagAction = $tagDocHeader.find('div#blogFavroiteLinks > p.remove_from_unpopular > a.change_favorite_link').attr('href');
}
}
if(txtToTagAction){
const $blockTagBtn = $mainBtnContainer.append(`
<div id="jras-tooltip-blocktag" class="jras-tooltip-button" style="cursor: pointer;">
<i class="jras-tooltip-button-img jras-tooltip-blockuser-img""></i>
<span id="jras-tooltip-blocktag-txt" class="jras-tooltip-button-text">${txtToTagAction}</span>
</div>
`).find('#jras-tooltip-blocktag');
actionTooltipButton($blockTagBtn, linkToTagAction, 'jras-tooltip-blocktag-txt');
}
}
makeJRASTagTooltipElm($mainBtnContainer, tagName);
}
});
}
function makeTagStatistics($tagDocStatsBlock, $container){
const $tagStatContainer = $('<div id="jras-tagStatContainer" class="jras-tooltip-section-topborder" style="line-height: 16px; font-size: 10px;"></div>')
.css({'margin-top': '6px'});
$container.append($tagStatContainer);
$tagDocStatsBlock.find('div').find('br').remove();
$tagDocStatsBlock.find('div').appendTo($tagStatContainer);
const a = $tagStatContainer.find('div:first > b')[0] ? '<br>' : '';
$tagStatContainer.find('div:first').prepend(`<b>${lng.getVal('JRAS_TOOLTIP_STATISTICS')}</b>` + a);
}
function makeTagModers($tagSideBar, $container){
if (!$tagSideBar || !$container) {
return
}
const $tagDocModCont = getSideBarSection($tagSideBar, 'Модераторы');
if (!$tagDocModCont[0]) {
return
}
const $modBlock = $container.append(`
<div style="line-height: 16px; font-size: 10px;" id="jras-tooltip-tagmoderators-block">
<div id="jras-tooltip-tagmoderators-header" style="margin-bottom: 3px; margin-top: 3px; cursor: pointer;">
<b>
${lng.getVal('JRAS_TOOLTIP_TAGMODERATORS')}
</b>
</div>
<div id="jras-tooltip-tagmoderators-tags" style="margin-bottom: 0; display: none;">
</div>
</div>
`).find('#jras-tooltip-tagmoderators-block');
const $modTags = $modBlock.find('#jras-tooltip-tagmoderators-tags');
$tagDocModCont.find('div').clone().appendTo($modTags);
$modTags.find('div').each(function(){
$(this).css({'margin-bottom': '3px'});
$('<span> </span>`').prependTo($(this));
$(this).find('img').css({'width': '22px', 'vertical-align': 'middle'}).prependTo($(this));
$(this).find('a').css({'vertical-align': 'middle'}).append(`<span>${$(this).attr('title')}</span>`);
});
$modBlock.find('#jras-tooltip-tagmoderators-header').click({updateContainer: $modTags}, function(eventObject){
eventObject.data.updateContainer.slideToggle('display');
});
return true;
}
function makeJRASTagTooltipElm($container, tagName){
const txtToTagAction = (userOptions.data.BlockTags.indexOf(tagName) == -1)
? lng.getVal('JRAS_BLOCKTAG_JRAS')
: lng.getVal('JRAS_UNBLOCKTAG_JRAS');
const $blockTagJRAS = $container.append(`
<div id="jras-tooltip-blocktag-jras" class="jras-tooltip-button" style="cursor: pointer;">
<i class="jras-tooltip-button-img jras-tooltip-blockuser-img" style="transform: scale(.7);"></i>
<span id="jras-tooltip-blocktag-jras-text" class="jras-tooltip-button-text">${txtToTagAction}</span>
</div>
`).find('#jras-tooltip-blocktag-jras');
$blockTagJRAS.click({dataTagName: tagName, updateContainer: $blockTagJRAS}, function(eventObject){
const t = eventObject.data.updateContainer.find('#jras-tooltip-blocktag-jras-text');
const iof = userOptions.data.BlockTags.indexOf(eventObject.data.dataTagName);
if(iof == -1){
t.text(lng.getVal('JRAS_UNBLOCKTAG_JRAS'));
userOptions.data.BlockTags.push(eventObject.data.dataTagName);
}else{
t.text(lng.getVal('JRAS_BLOCKTAG_JRAS'));
userOptions.data.BlockTags.splice(iof, 1);
}
userOptions.saveUserData(page.currentUser);
})
}
function makeUserTooltips(selector){
if(!userOptions.val('isToBeLoadingUserData')){ return }
makeTooltips(selector, function(event, ui){
const $item = $(event.target);
const UserName = $.trim($item.text());
const UserLink = $item.attr('href');
const $tooltip = $(ui.tooltip);
$('div.ui-tooltip').not('#' + $tooltip.attr('id')).remove();
$tooltip.css({
'border-radius': '5px',
'z-index': '500',
'border': '1px solid rgb(102, 102, 102)',
'-webkit-box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'-moz-box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'box-shadow': '6px 6px 8px 0px rgba(0, 0, 0, 0.5)',
'word-break': 'break-all'
});
getUserData(UserName, UserLink, $tooltip, $tooltip.find('div#jras-tooltipcontainer'));
});
}
function getUserData(userName, userLink, $tooltip, $outContainer){
let $mainBtnContainer;
const mainBtnContainer =
'<div id="jras-tooltip-mainBtnContainer" class="jras-tooltip-section-topborder"></div>';
if(userOptions.val('isToBeLoadingUserData')){
setTooltipBounds($tooltip, {width: defLoadTooltipSize});
HttpRequest(userLink, 4, function(e){
//win.console.log('Loading user data from "' + userLink + '" - ' + response.status);
if(e.status != 200){
$outContainer.text('Loading error: ' + e.status);
// win.console.log("Loading user data error: - " + response.status);
}else{
const doc = document.implementation.createHTMLDocument("");
doc.documentElement.innerHTML = e.response;
clearContainer($outContainer);
setTooltipBounds($tooltip, {width: defUserTooltipSize});
const $userSideBar = $(doc).find('div.user-awards').closest('div#sidebar');
const $userData = $(doc).find('div.user-awards').parent('div.sidebarContent');
$userData.find('div.user').clone().appendTo($outContainer).css({'line-height': '22px'})
.find('span').addClass('jras-tooltip-caption');
if (userOptions.val('chatlaneToPacaki')){
$outContainer.find('div.user > span').css('color', $outContainer.find('div.user').css('color'));
}
const colUserOnline = ($.trim($userData.find('span.userOnline').text()) == 'Оффлайн') ? 'rgb(255, 0, 0)' : 'rgb(0, 255, 0)';
$outContainer.find('div.user').prepend(
`<div style="background-color: ${colUserOnline}; height: 83%; margin-right: 4px; display: inline-block; width: 5px; border-radius: 10px;"></div>`
);
makeUserAwardsBlock($userData.find('div.user-awards'), $outContainer);
const $userStars = $userData.find('div.stars').clone().appendTo($outContainer);
$userStars.css('width', '100%');
$userStars.find('div[class*="star-row-"]')
.css({
'height': '15px',
'margin-left': '15px',
'transform': 'scale(0.7)'
});
let a = page.isNewDesign ? 'rgb(230, 230, 230)' : 'rgb(72, 72, 72)';
$userStars.find('.progress_bar')
.css({
'border': 0,
'margin-top': '3px',
'background-color': a,
'height': '4px'
});
a = makeModerElements($userSideBar, $outContainer) ? 'jras-tooltip-section-topborder' : '';
$userData.find('div#rating-text').clone().appendTo($outContainer)
.css('font-size', '10px')
.css('line-height', '16px')
.addClass(a);
makePostsElements($userSideBar, $outContainer);
const $mainBtnContainer = $outContainer.append(mainBtnContainer).find('#jras-tooltip-mainBtnContainer');
if(page.isUserLogon){ // если залоген
makeSendPMElements($mainBtnContainer, userName);
let txtToUserAction;
let linkToUserAction;
if($userData.find('div#friend_link > p').is('.add_tofr_lnk.user_icons')){
txtToUserAction = lng.getVal('JRAS_ADDFRIEND');
linkToUserAction = $userData.find('div#friend_link > p.add_tofr_lnk.user_icons > a[href]').attr('href');
}else{
if($userData.find('div#friend_link > p').is('.remove_fromfr_lnk.user_icons')){
txtToUserAction = lng.getVal('JRAS_REMOVEFRIEND');
linkToUserAction = $userData.find('div#friend_link > p.remove_fromfr_lnk.user_icons > a[href]').attr('href');
}
}
if(txtToUserAction){
const $friendUser = $mainBtnContainer.append(
'<div id="jras-tooltip-frienduser" class="jras-tooltip-button" style="cursor: pointer;">' +
'<i class="jras-tooltip-button-img jras-tooltip-frienduser-img"></i>' +
'<span id="jras-tooltip-frienduser-txt" class="jras-tooltip-button-text">' + txtToUserAction + '</span>' +
'</div>'
).find('#jras-tooltip-frienduser');
actionTooltipButton($friendUser, linkToUserAction, 'jras-tooltip-frienduser-txt');
}
txtToUserAction = null;
if($userData.find('div#friend_link > p').is('.add_toblock_lnk.user_icons')){
txtToUserAction = lng.getVal('JRAS_BLOCKUSER_JR');
linkToUserAction = $userData.find('div#friend_link > p.add_toblock_lnk.user_icons > a[href]').attr('href');
}else{
if($userData.find('div#friend_link > p').is('.remove_fromblock_lnk.user_icons')){
txtToUserAction = lng.getVal('JRAS_UNBLOCKUSER_JR');
linkToUserAction = $userData.find('div#friend_link > p.remove_fromblock_lnk.user_icons > a[href]').attr('href');
}
}
if(txtToUserAction){
const $blockUserJR = $mainBtnContainer.append(
'<div id="jras-tooltip-blockuser-jr" class="jras-tooltip-button" style="cursor: pointer;">' +
'<i class="jras-tooltip-button-img jras-tooltip-blockuser-img"></i>' +
'<span id="jras-tooltip-blockuser-jr-txt" class="jras-tooltip-button-text">' + txtToUserAction + '</span>' +
'</div>'
).find('#jras-tooltip-blockuser-jr');
actionTooltipButton($blockUserJR, linkToUserAction, 'jras-tooltip-blockuser-jr-txt');
}
}
makeJRASUserTooltipElm($mainBtnContainer, userName);
}
});
}else{
clearContainer($outContainer);
$mainBtnContainer = $outContainer.append(mainBtnContainer).find('#jras-tooltip-mainBtnContainer');
$mainBtnContainer.css({
'margin-top': '',
'border-top': '',
'padding-top': ''
});
makeJRASUserTooltipElm($mainBtnContainer, userName);
}
}
function getSideBarSection($sideBarUser, sectCaption){
return $sideBarUser.find('.sidebar_block>.sideheader:contains(' + sectCaption + ') + div.sidebarContent');
}
function makeModerElements($sideBarUser, $containerFor){
if (!$sideBarUser || !$containerFor) {
return false
}
const $userModCont = getSideBarSection($sideBarUser, 'Модерирует');
if (!$userModCont[0]) {
return false
}
const $modBlock = $containerFor.append(`
<div style="line-height: 16px; font-size: 10px;" id="jras-tooltip-moderator-block">
<div id="jras-tooltip-moderator-header" style="cursor: pointer;">
<b>
${lng.getVal('JRAS_TOOLTIP_MODERATOR')}
</b>
</div>
<div id="jras-tooltip-moderator-tags" style="margin-bottom: 0; display: none;">
</div>
</div>
`).find('#jras-tooltip-moderator-block');
const $modTags = $modBlock.find('#jras-tooltip-moderator-tags');
$modTags.append($userModCont.removeClass('sidebarContent').clone());
$modBlock.find('#jras-tooltip-moderator-header').click({updateContainer: $modTags}, function(eventObject){
eventObject.data.updateContainer.slideToggle('display');
});
return true;
}
function makePostsElements($sideBarUser, $containerFor){
if (!$sideBarUser || !$containerFor) {
return
}
const $userPostsCont = getSideBarSection($sideBarUser, 'Профиль');
if (!$userPostsCont[0]) {
return
}
let re = /(\d+)/gm;
let m, arr = [];
while ((m = re.exec($userPostsCont.find('>:first-child').text())) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
arr.push(m[0]);
}
re = /([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/gm;
const regDate = new Date(re.exec($userPostsCont.find('span[id^=usertime]').text())[0]);
let lastLogin = '';
let i = 4;
re = /^Последний раз заходил.+([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/gm;
while ((m = re.exec($userPostsCont.find('>:nth-child(' + i + ')').text())) == null && i < 50) {
i++;
}
if (m !== null){
lastLogin = new Date(m[1]).toLocaleDateString();
}
const $modBlock = $containerFor.append(`
<div class="jras-tooltip-section-topborder" style="line-height: 16px; font-size: 10px;" id="jras-tooltip-posts-block">
${lng.getVal('JRAS_TOOLTIP_POSTS')}<b>${arr[0] + ' (' + arr[1] + ' / ' + arr[2] + ')'}</b><br>
${lng.getVal('JRAS_TOOLTIP_COMMENTS')}<b> ${arr[3]}</b><br>
${lng.getVal('JRAS_TOOLTIP_REG')}<b>${regDate.toLocaleDateString()}</b><br>
${lng.getVal('JRAS_TOOLTIP_LASTLOGIN')}<b>${lastLogin}</b>
</div>
`).find('#jras-tooltip-posts-block');
}
function makeSendPMElements(containerFoElements, userName){
if(!page.isUserLogon || userName == 'anon' || userName == page.currentUser){
return
}
const $sendPM = containerFoElements.append(`
<div id="jras-tooltip-sendPM" class="jras-tooltip-button" style="cursor: pointer;">
<i class="jras-tooltip-button-img jras-tooltip-sendmess-img"></i>
<span class="jras-tooltip-button-text">${lng.getVal('JRAS_SENDPRIVMESS')}</span>
</div>
`).find('#jras-tooltip-sendPM');
$sendPM.click({user: userName}, function(eventObject){
sendPM(eventObject.data.user)
})
}
function makeJRASUserTooltipElm(containerFoElements, userName){
const txtToUserAction = (userOptions.data.BlockUsers.indexOf(userName) == -1)
? lng.getVal('JRAS_BLOCKUSER_JRAS')
: lng.getVal('JRAS_UNBLOCKUSER_JRAS');
const $blockUserJRAS = containerFoElements.append(
'<div id="jras-tooltip-blockuser-jras" class="jras-tooltip-button" style="cursor: pointer;">' +
'<i class="jras-tooltip-button-img jras-tooltip-blockuser-img" style="transform: scale(.7);"></i>' +
'<span id="jras-tooltip-blockuser-jras-text" class="jras-tooltip-button-text">' + txtToUserAction + '</span>' +
'</div>'
).find('#jras-tooltip-blockuser-jras');
$blockUserJRAS.click({dataUserName: userName, updateContainer: $blockUserJRAS}, function(eventObject){
const t = eventObject.data.updateContainer.find('#jras-tooltip-blockuser-jras-text');
const iof = userOptions.data.BlockUsers.indexOf(eventObject.data.dataUserName);
if(iof == -1){
t.text(lng.getVal('JRAS_UNBLOCKUSER_JRAS'));
userOptions.data.BlockUsers.push(eventObject.data.dataUserName);
}else{
t.text(lng.getVal('JRAS_BLOCKUSER_JRAS'));
userOptions.data.BlockUsers.splice(iof, 1);
}
userOptions.saveUserData(page.currentUser);
})
}
function makeUserAwardsBlock($userAwards, $containerFor){
let hideUserAwardsWhen = userOptions.val('hideUserAwardsWhen');
let minShowUserAwards = userOptions.val('minShowUserAwards');
if (hideUserAwardsWhen != 0 && hideUserAwardsWhen < minShowUserAwards){
hideUserAwardsWhen = +minShowUserAwards + 1;
}
if(hideUserAwardsWhen != 0 && $userAwards.children().length > hideUserAwardsWhen){
const $jrasTooltipUserAwards = $containerFor.append('<div id="jras-tooltip-user-awards" class="jras-user-awards-slice" style="-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;"></div>')
.find('#jras-tooltip-user-awards');
$jrasTooltipUserAwards.append($userAwards.children().slice(0, minShowUserAwards));
$jrasTooltipUserAwards.append('<div id="jras-tooltip-user-awards-hide" class="jras-user-awards-slice" style="display: none;"></div>')
.find('#jras-tooltip-user-awards-hide')
.append($userAwards.children().clone());
const $jrasTooltipUserAwardsHideBtn = $jrasTooltipUserAwards.append('<div id="jras-tooltip-user-awards-hide-btn"></div>')
.find('#jras-tooltip-user-awards-hide-btn')
.addClass('jras-tooltip-user-awards-hide-btn')
.addClass('jras-tooltip-user-awards-hide-btn-close');
const correctShadow = function(visible){
if(!page.isNewDesign && !page.isSchemeLight()){
return
}
$jrasTooltipUserAwardsHideBtn.css('background-color', '#C3C3C3');
$jrasTooltipUserAwardsHideBtn.hover(function(){
$(this).css('background-color', '#F0E400')
}, function(){
$(this).css('background-color', '#C3C3C3')
});
if(visible){
$jrasTooltipUserAwardsHideBtn.css('box-shadow', '0px -4px 8px 0px rgb(138, 138, 138)');
}else{
$jrasTooltipUserAwardsHideBtn.css('box-shadow', '');
}
};
correctShadow(true);
$jrasTooltipUserAwardsHideBtn.click(function(){
const $toggleContainer = $('#jras-tooltip-user-awards-hide');
if($toggleContainer.css('display') == 'none'){
$toggleContainer.slideToggle('display', function(){
$jrasTooltipUserAwardsHideBtn.toggleClass('jras-tooltip-user-awards-hide-btn-close');
correctShadow(false);
});
}else{
$jrasTooltipUserAwardsHideBtn.toggleClass('jras-tooltip-user-awards-hide-btn-close');
correctShadow(true);
$toggleContainer.slideToggle('display');
}
});
}else{
$userAwards.clone().appendTo($containerFor).addClass('jras-user-awards');
}
$containerFor.find('img').css('border', 'none')
}
function sendPM(userName){
let $pmDialog = $('body #jras-send-pm-dialog');
if(!$pmDialog[0]){
$pmDialog = $('body').append(`
<div id="jras-send-pm-dialog" title="" style="width: 100%;height: 100%;">
<form action="/private/create" method="POST" id="private_form" style="width: 100%;height: 100%;">
<div id="private_form_flash" style="display:none;"></div>
<input id="jras-send-pm-username" name="username" type="hidden" id="private_form_username" value="">
<textarea style="width: 100%;height: 70%;" id="private_form_text" name="text" rows="12" cols="76"></textarea>
<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" style="margin:0; padding:0;border: none;">
<div class="ui-dialog-buttonset">
<input type="submit" value="" id="jras-send-pm-sendbutton">
</div>
<div id="private_form_uploading" style="display: none;">
<img src="http://css.joyreactor.cc/images/jquery-ui/ui-anim_basic_16x16.gif" alt="uploading...">
<span id="jras-send-pm-sendmess"></span>
</div>
</div>
</form>
</div>
`).find('#jras-send-pm-dialog');
}
$pmDialog.attr('title', lng.getVal('JRAS_SENDPMDIALOG_HEADERCAPTION') + userName);
$pmDialog.find('input#jras-send-pm-username').attr('value', userName);
$pmDialog.find('input#jras-send-pm-sendbutton').attr('value', lng.getVal('JRAS_SENDPMDIALOG_SENDBUTTON'));
const $pmSendMess = $pmDialog.find('span#jras-send-pm-sendmess');
$pmSendMess.text(lng.getVal('JRAS_SENDPMDIALOG_SENDMESS'));
if(!page.isSchemeLight()){
$pmSendMess.css('color', 'rgb(172, 174, 173)');
}
$pmDialog.dialog({
resizable: false,
minWidth: 300,
minHeight: 200,
width: 550,
height: 300,
title: lng.getVal('JRAS_SENDPMDIALOG_HEADERCAPTION') + userName,
closeText: lng.getVal('JRAS_SENDPMDIALOG_CLOSEBUTTON'),
show: {
effect: "drop",
duration: 400
},
hide: {
effect: "scale",
duration: 300
},
open: function(){
let magicNumber = 40; //высота нижней панели
if(page.isNewDesign){
magicNumber = 55;
}
$('textarea#private_form_text').css({
width: $(this).width(),
height: $(this).height() - magicNumber
});
}
});
}
function closeSettingDialog(){
$('#jras-prop-gui-dialog').find('label.modal__close').click();
}
function newCssClass(cssClass){
const head = document.head || document.getElementsByTagName('head')[0];
const style = document.createElement('style');
style.type = 'text/css';
if(style.styleSheet){
style.styleSheet.cssText = cssClass;
}else{
style.appendChild(document.createTextNode(cssClass));
}
head.appendChild(style);
}
function themeDependentCSS(){
if (!page.isSchemeLight()){
newCssClass(`
.post_content table td {
border: 1px solid #474747;
}
`);
}
if (userOptions.val('extendedGifLinks')){
newCssClass(`
.video_gif_holder:hover .gifbuttons,
.video_holder:hover .gifbuttons{
display: block;
}
.gifbuttons {
position: absolute;
top: .1rem;
right: .1rem;
display: none;
background-color: hsla(0,0%,80%,.8);
}
:where(.css-s2p5hg).ant-btn {
padding: 2px 5px;
}
:where(.css-s2p5hg).ant-btn {
outline: none;
position: relative;
display: inline-block;
font-weight: 400;
white-space: nowrap;
text-align: center;
background-image: none;
background-color: transparent;
border: 0px solid transparent;
cursor: pointer;
transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
user-select: none;
touch-action: manipulation;
line-height: 1.5333333333333334;
color: unset;
}
`);
}else{
newCssClass(`
.video_gif_source{
top: 0;
right: 0;
}
.video_gif_holder:hover .video_gif_source{
display: block;
}
`);
}
}
function addNewCSSClasses(){
newCssClass(`
.video_gif_holder {
display: inline-block;
}
.video_holder{
display: inline-block;
position: relative;
}
.jras-video-sound-btn{
position: absolute;
top: 3.3em;
right: 5px;
padding: 5px 6px;
cursor: pointer;
user-select: none;
transform: scale(1.7);
opacity: .5;
}
.jras-ext-gif-cont {
display: flex;
justify-content: space-between;
align-items: baseline;
align-content: flex-start;
}
.jras-ext-gif-box {
margin: -2px 3px;
line-height: 1.5em !important;
height: unset !important;
}
.post_content p, .post_content div {
margin: 0;
}
/* для старого дизайна */
.treeCross-old{
float: left;
width: 13px;
margin-top: -8px;
margin-left: -34px;
font-weight: bold;
border-radius: 14px;
display: block;
position: absolute;
height: 20px;
padding: 0 1px 0 6px;
cursor: pointer;
}
.avatarCorrect{
background: url("../images/comments.png") no-repeat;
padding-left: 9px;
left: -10px;
}
.avatarForOldDesign{
float: left;
border-radius: 3px;
margin-left: -1.2em;
margin-right: 1em;
height: 35px;
}
.treeCross-old-toparent {
border-radius: 6px;
height: 10px;
width: 4px;
margin-left: -37px;
margin-top: 6px;
}
table img {
width: 100%;
height: 100%;
}
table video {
width: 100%;
height: 100%;
}
/* для нового дизайна */
.treeCross-new{
float: left;
width: 10px;
border-radius: 14px;
display: block;
position: absolute;
color: rgb(255, 255, 255);
border: 2px solid rgb(255, 255, 255);
margin-top: -8px;
margin-left: -16px;
background: #DFDFDF none repeat scroll 0 0;
font-weight: bold;
font-size: 18px;
height: 28px;
padding: 0 16px 0 8px;
cursor: pointer;
}
.treeCross-new-toparent {
margin-top: 10px;
border-radius: 8px;
height: 15px;
padding: 0 12px 0 0;
margin-left: -18px;
}
.treeCross-new:hover, .treeCross-new-toparent:hover {
background-color: rgb(254, 204, 101);
}
.jras-tooltip-caption {
font-size: large;
position: absolute;
overflow: hidden;
max-width: 75%;
word-wrap: break-word;
padding-left: 8px;
max-height: 20%;
}
.jras-comment-expand-all {
cursor: pointer;
width: 18px;
height: 10px;
display: inline-block;
opacity: 0.6;
margin-left: -1px;
}
.jras-comment-expand-all:hover {
border-left: 3px solid rgb(255, 0, 0);
margin-left: -3px;
border-radius: 4px;
}
.jras-comment-sizer {
display: inline-block;
cursor: pointer;
bottom: 0;
overflow: hidden;
height: 10px;
width: 97%;
background-image: linear-gradient(to right, rgba(244, 244, 240, 0.15), rgb(192, 192, 192), rgba(244, 244, 244, 0.15));
}
.jras-user-awards img {
width: 16px;
height: 16px;
}
.jras-user-awards-slice img {
height: 16px;
padding-left: 3px;
}
.jras-tooltip-button:hover span, .jras-tooltip-button:hover i {
color: #CC9622;
opacity: 1;
}
.jras-tooltip-button-img {
vertical-align: middle;
width: 16px;
height: 16px;
display: inline-block;
opacity: 0.7;
}
.jras-tooltip-button-text {
padding-left: 4px;
font-size: 10px;
vertical-align: middle;
display: inline-block;
line-height: 10px;
}
.jras-tooltip-favtag-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOUlEQVQ4T6WTu4oaURiAz5kzXmaxUUgR8AKivoGVRcSIQjqJ40SCiqKMRSTISiJGLDRVQFALHRPICAEtBLt0EgttUqdZQt5AXS/MrNHoTJhhV5TVbJFT/9/3Xw8E//ngQ3w+n3eLohgHADw7jOU47geGYe5/CrLZrBvDsB5JkoTFYsEPBblc7s9ms6mcFWQyGTdC6AhuNBq/FQqFGI/HiWKxyPM8f3VSkE6n3RBCGbZarXLm5XIJyuWyaDabV5FI5KJYLHLr9fr6niCVSt2DJcFwOASr1Qp4PB65k1KpxG23W+5IkEgk3DiO9wKBwD7zXd/tdhvY7XZgtVqlaoRKpfITQvh4L4jFYvLATsGShGEYQFEUQAgJLMuu5vN5QaVSFWRBOByWyz4HSzG1Wg0Eg0Gh3W6vFotFYb1eV3U63RQGAgF52hRFETab7WhVh2urVqtgt9txi8Ui3+12q9Fo9JFSqfwO/X7/8iF4NpsJnU4HG4/Hb3u93gdJnEwmXYIgvIY+n28ZCoUuTCYTOnWV0+lUaLVaNxqNZovjuL1er/+6FbwTBOEaer3e50qlkpV2azAYjiQSzLLsDcdxb4xG4xMI4VeGYb6QJIm0Wu0VAOCpPESXy0USBPE5HA4Ter1elkwmkz3c7/cbNE1Toii+lyAMw0KiKBqbzSa9X6PT6XyhVqs/RSIRQqVSwdvMl4PB4ONdazRNlwEArwAA3xBCZL1ePz4kh8PxkiAIBiEEeJ6/HI1Ge/jcr/0L5NPyr4kFGRcAAAAASUVORK5CYII=") no-repeat scroll 0 0;
}
.jras-tooltip-blockuser-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADEUlEQVQ4T2WTW08USRTH/1U91TUXdAoV54Ibh8tu4sZkmOyD8cFFgzEaHzaExMBb9zfAT6B8Anj3oTvx2YyYrGtMNsL6xG42uMZkBGYDYZhpEMRiYKB7ZrrbdCeMRCo5D5VT53cu9T8E352iEELhXPOAYRAiQrfvS5/SeXBujq6tyZMh5OTlRSo1qQrxKHvjhogkkwidrgu32UTr8BBbCwvySMqpUcuaOY7rAJ5fvGj0FArahUIBslSC22ig5TjwPQ8RRQHxfZzp78fnchm7q6vmWK2mB5AQEGQ+PzQ0fXZgAAfLy7D397FnWSal9D8KoO15+WgyqSXicRBKsVOrBVU9HLOsGRL0HEulVn+4d0/UP3yA327Ds2041ao+UqmYx6UWe3uHunK5N8muLlFfW4Pc35eKqvaRF+m0dun2baNVr6OxsQFVVQFC4DsOmtvbpyDZkZFFlEqwNjfhep5Ogt77x8a0g5UVfFpeNs/4/jw7d87wDg7QlhLEtvWRRqNTye/XrhmXMhmtMjcHO5EwyfN0+s1PExM3dxYX4arq1K3Xrx//wZhGFcVQFAWhUar/KmUIKQ4OTv58//70xtOn+BKPz4WAHx88uPlpYQHo7p669erV4+Dhn4lECAl+gEUiYIqi/7K5aQaA/Pj4dO3JE1iMhQDj8t27Wm12FnYs1vmeAPKXEJrKmMEYQ2iRiP5/T8/w1Xxeq758CQswSTGd1lKFgvHl7Vu0olH4nBdGq9V3x9P/N53WGOeGylg4YO/OHbD371Eul/HZ93VSzOUEV9XVrnhc1JeW4GYy7zzH0U9CSgMDGufciHIOns3isFLB31JKSmlfKKRiJjMp+vqmnY8fwYVA5MoV1Hd2zKNabTbwR3t7fxvM57ULS0tQWy38s7WF7Wbz4fj6+kxHys+yWcNvtzV1bw9JIdB9/TpIMgmFc8RcF6RcBt3dxcrRURBsjq+vf5Pycb/PMplJz/MeEdsWcQAxRQFXVRDG4BCCXUA2gakg86ll6kg2lxNeq6X5hAwDEH6wzYRIQsh8hNJT6/wV5lBT8JU2J8oAAAAASUVORK5CYII=") no-repeat scroll 0 0;
}
.jras-tooltip-sendmess-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB2UlEQVQ4T2NkoBAwUqifAWyAm5OdkwAveyoDEwMTUQb+Y/j34fPP2bv2HdrHGBPm0RAWYVlrZa3GxMREnIP+/fvPcOTwjf9rVh1vZCzNj7xTVumrzMxMnOUwF/7584+hvXnjfcbUAPdV0ooiof5RlgzyCiJE+eD+vdcMm5YfZ7h+4/EmxoxAj2WqonyRH/79ZVAxU2Tw9jdmwOUVkNM3rz/NcO/MQwYBJmaGmy8/rAAbYKYgHvn152+GD1+/MTCK8zIExdowSEjwo7jm2bP3DOuWHGNgevWZgZ+bi4GbnZXh1IOXy+EGgFT//vuP4eqz1wx/2VkYHLz0GZxcdcCG7N5xieHgjksMLD/+MujIiDKwQsMLxYB3X38wvPz0jUFehI/h379/DB++fWdgEuJm+AeKmHffGAQ4ORgYGRkZ7r/9yCDJx80gzM0JcUGqn+tKQW6OMEEuDgZxPi64s//8/cvw4/dfMJ+DlZmBhZkZLvf841eG999/MHz8/ns1Y4yX8x0HNWllJkbi0gDMlL///jMcuPnwHqOPg029gaxwnaIwPxPIicSA////M9x78/Hf5edvGsA6rM2MbHk5ONL///lLVGpiZGH+9+XnzxlHTp49QpyVeJxFsQEAvJ+vaZNelxMAAAAASUVORK5CYII=") no-repeat scroll 0 0;
}
.jras-tooltip-frienduser-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQUlEQVQ4T6WTaWxUZRSG32/u3O27M9y5s3SWdtqZ1rZDoB20LG0ADQSqVQoaKmltBGITFVH/WLZQhdSFRQlLgIAQHLcILSaAssRqQhNoaZMCAck4aiMtlU5S6D7MdjvXGOOE8lPPz3PyPsnJk5fgfw55OP9qZQmdkWPb7sj2zGW02JFlGwKHHr5ro0FLf2sjcVV+c+/ffRowt9BqZBITR0UkVjicDpisFrV/YOS1pvbQsd++qp0yNK41Sp6y5UPB84yaVDtyC7PWZi87djcNKHXQCobBuQxZgF6gUAmLnt5w89WB6IpTjZX1l6+FP86cosFiltE7nII/j25e0nD2ozSg5omsYrOFttVVzZFExYrhSBJfft3yycEfQ+u2VM8+evVWX92a1Qsxs6QA7207icec4oH6QMebacCNw8t9IzHdjTll01lWMkJLEfT83tPifWFPeUPVrO01S3wb8ktLwRqM6PypDa0Xr7+7/rMrH6QBt5pe5GSV/1xPhWqjokA0GlNEz9SR4s2BZ4tcG6sX5myrqq2AYJKxb/dJjEe1pQ2BS99NsnC6fnqxYjJ3ZrgsPMfTX7wv5U8jZGtqnsf0NmW1vZteLgKlPLZ+2tXn80/1725uH5wEOH74/TxzuLWTScXNdqsclGsCi91W65+lMtYXz/LveH3tSpiFOJq+b+t1S0NlNTsv/2Nh5a6zBQYD//y8Gd5XKrJiheLEfWiiGSGSd3swnmwe/+Id/2zuWrntyVUg9iKQByFgsCuo9gTfIqsOtNdyrLbf61ZMDqcBbpsJTipC1BOoiRgSIIiyInRdR1ASaYH2+BoQvQiE2xAPnTlDqvZ2XLQp/FNTvSa47CLsEg8H5eCQOKgpDaMJFcOqDt39d/BM5ARETzkgKEDoW8RvnrhJntt5qTvbTnN9XgVupwSHgYdNYGERWfz9X2wihdtjcfwxMILFQ4dgdeYCOorIuT0YG7v/K3n6w9ZQpl0q8OUoyHRR2GUBCsfCwDJgdASjcRXhaAJ370WT8oU3zutSkZFsTk0Md//c5831/kAWNF6YJiXH52cYtTJFZjxmEy9RjiMsAI0gOgHtjqoTOjXqvLJuUX77o+WdpPG/NPsvfmchq5NnMwsAAAAASUVORK5CYII=") no-repeat scroll 0 0;
}
.jras-comment-expand-all-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAnElEQVQ4T9XTOwoCQRCE4W/FVDyOiMcQxVv4yAUFQ0ExNjATwQuYi+eSgVkZDXYZVgM77v6nq7qm0LCKhvNSQBcjHHOgJSAM39DDGisMMK+A3bEvATOM0ccFO7QwrQA8cEglTHDmTVatmp8CsjwIq35KCH78kQeLeMaQgyu2aOfkoBODFHQvsYmZyPIgQIY41R4/afjqZ8p5+NX7BC5LHBGsTKWSAAAAAElFTkSuQmCC") no-repeat scroll 0 -3px;
}
.jras-tooltip-section-topborder {
margin-top: 4px;
border-top: 1px solid rgb(85, 85, 85);
padding-top: 3px;
}
.jras-PostControlBlock-new sitm{
right: -75px;
background-color: #fecc65;
}
.jras-PostControlBlock-old sitm{
right: -85px;
background-color: #fab728;
}
.jras-PostControlBlock-old-dark sitm{
right: -85px;
background-color: #7B7B7B;
}
.jras-pcInfo-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAYAAAArij59AAAAlUlEQVQoU72Q3Q3CMAyEfdkBxCYgZmjtwg6IlTpGnMyABKOUHairVv0LIuobfrEsf76zDRqD+XIl+tRtSwa4e4ze9y0sAL+J3G6smxD8IQGKghvn3D4LlGVVAVQPU7CbqsZEYbL6zvMOWYC5sl/NEPwwjE2gp0TkaIbnWmlWWP6QWv0bEJGzGR7rJQE7qeore+YEbwId8bxC57bEHC0AAAAASUVORK5CYII=") no-repeat scroll 8px 4px;
}
.jras-pcShare-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABUklEQVQ4T51TsUoDURCc3eMuWCgSFPELBD/DInCQt0mMacUmKf0EC1ttrEQrLdQixSV3nxBB/ALBWoLGQs4qBPJWTj1JTpFcXrszs292dgk5n0htG9AzwKqq06ScfIhUXwGsJDxr7SC3QLksfWZe/278kkvAmNqW6viGGSOAXSKd3UJKJnLqURTcptZn+kFKdhza6Xa7vcm5kTHmnpnHnuf57XY79n2/4LqFYwC7X0CNAC0RUT1LTqokUrkDaE3VFonQU2UlgsmkcxmGnb2/EvuxICKLqlwmwlUiPAlWtXEUhcv/CqRFkWoMYCkDfgvDTnEmAWMqJ0S0Pw22T47jlIIgeMiK/Eqh0Wh4w+HoSJU+h8iMCwCPAA4BHIRh53QqhVlXWUQ2AL5Wxbuq3WQG5b6FVqvl9vvPMTMvzH0LIjIAeHWuW0hIxtQqquNz5mRftPkB0mGAPwDQKeIAAAAASUVORK5CYII=") no-repeat scroll 4px 4px;
}
.jras-pcRating-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABcklEQVQ4T52TTUoDQRCFX3WbjaLukiuIezGoG92a7pngHcQT6Bn0CjmCyGR+IBtxmyhxL57An4UIEQKhq6RJIpmJmYiz66pXX1W/riGUfNaGDyJO0jTdXSSjMkCjEfa0Fo7jeG9GN60RH/sB+G7M4Cxr15dM9SgCTtP2Tg6woNscy9qgy0y+0X4OMKsMgmCbGVdEdAhARHAH6PM0vXkqEuc88MUi1AWwMSsW4U+gUi9CPCBnijFBRkTHAEVa42w4XJFKZdQCEDBTkmVRMAsma8OcKdaGXwBWtaZaFEVvXtxsNqvOySszD7IsWfcxa8M+ACZvCgCXJPHBJDEAsDYaVaqdzvX7OGZrgHrJA8Z1cx4YEyZEMABirenUOUciquVjRGjHcbuZu0LRVWNOtoBRj0htFnIfWlM9iqLnUoBPeogIXwLuyJ+1VrdK0cWkeOEm9kWcK9v7iUe/b6Ix5l4p5Qp7/79NnFb5p1o2Venf+JepvgFKmMR2kcNRhAAAAABJRU5ErkJggg==") no-repeat scroll 4px 4px;
}
.jras-pcLinks-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACEUlEQVQ4T52TvWtUQRTFz53Z1T8hH2h6BcHGUlFTiJt98zYLtlqJ2OqC2ugGK4topYilNoLI+xgWQcVEsBBWEoloqWlElIhW62bz3hyZ7Nu4LImgU87M/d0z95wR/MeqVE6Na73xlERH/lZvjJkE9AzAcRF+0Vq3sixzJBdE9D4Sb3YCiDG1OQBXAJQGTZxzPUB9VQp7AVkhs+ntAGKMuQ2o8865XGsVk/hA4rAIjhawT1rLoSiKvo8CtooBdABXTdN0of/m7gsvuwCsay1TURR9GwYMd/6lFGZ8cbPZVO3223daY39fNn6K8IgIzyRJcn8LEAThnIhcBdgVQZAkyXPfzQOWlpbfA9Ih8xNKlRokL5G8bG1yYxNQr9f39HrZRwBaRFWtjZ+MuOPv0e8FQa0lggqJ09bGDzYBYRieI+UuIFGaRvWdrA3DcJaUx865rginrLVrmwBjate8WgDXs6x8p1zuPXNO1qyNjw1gxhjjHB4ppXYBaKRpPO/PCsDsWYD3SCwC+VgRksUBYKR4Pk3jxgA8mMFEr5etFnQ4h2VyY7rVav3wsvOcD4uzm2kaXxx+YqHAjDmn2v2E+eVekvIKwEERqXilpNyyNrowOh8ZDkmeY1VrTADY/eciuySa3rLthitBUFsRwQEfEq1xfH29VC6VsgrASRF+Vkq1fOJ2ckaq1dprEWggP+lt+dff/Rtc5vxxeU5FtQAAAABJRU5ErkJggg==") no-repeat scroll 4px 4px;
}
.jras-pcShareFAV-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADGUlEQVRYR8WXW08TQRTH/zPb7hYoUC5CEIgxXqDBN4PcxAfUJwEjKvHF2yfwTb6CiC++m2jig1HACNWYKCFRICIYXxQBI4lRBI0CFWhpt7szZreB0LR0usvFSZpuds7ld87MObNDACDc/tirE/0GJ7SBAG7j3XYNBhakhPRLOr2utLWME8O5xtkwkUjWdjlNZJfrfNFBaDUJ3uzsAaHNO+l8zReHjwQ6upe2O+0bBccYAiTY0c3tRk+LcgCNgf3+a9cENgUgt9QCmg619+3OA9BCD5SLDabj8L0+sD+LtiBsZ0A+UwNpX5HpVJ/8AdVnLwu2AGiBB8qlaPSrw24WbAHIp6shHdgdA6BPTEN9OmJ5GSwD0PwsKFdOJHQUuvsSfG7JEoQ1AEIgNx2BdLA4oRMzC89GAZ56ZccDEALidoHkuEE9bvPffM7JAPG4AYkmj1DTwfwBcP8y+EL0xxYC0efllTjdGACSmwnlwjGQdMVSGlMV5oEQwg9em3CrIy4DtDgPytk6QHakajclOR6OQO0aApudj5FPuAdoUS7kc3UgijMl4yIhHopA7RwA++VPvgTrZ41OJ58/CuKSRfaTzvMVFeqjgQ3Pi6RVQHdlQ26tB0mzB8GD4ajzJG1aWIZG3ZsQFjemueEeDoDPJ+8LQgAjv5K3FPKpSktLofpGoE9OC3VSAnBUlcFZXyE0tl4g8uojtNHPQp2UAOTGSkjlpUJj6wX0sW9Qn78T6qQEoFw+DmNDWhlGyYXv9wtVxACUIu1ac+IWrOkAIRvOrdzuFZ4LQgCSlwnX1ZOxkTAO7cNXaG8mAErgrCmHdGhPFGbdCN15EdN2E6VDCCCVFUNuqlrT1ce/IzI0HmfYOEecdV5IZSVrsuqTYehfZpIugxDAWeuFo9YLfeontMEx4Rew8bXkqK+AtLcQkcFP0IYnNgfgOLwfbHYBbGZOuKFiWnlJPmhBNrT3U8kBljs6AxQ03ZL1LRKOXkxudfnASeMW2bRohvf8t8spGPNT8GqzbqLXc97OOBooRYbFMCyJG2mnlPdRxtpcba2T/wCSWmgLitIWxgAAAABJRU5ErkJggg==") no-repeat scroll 0px 0px;
}
.jras-pcShareFAV-exists-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM0OUVGMUYyQTAzNjExRTc4QUMyODg0QUZGQUI2RTc0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjM0OUVGMUYzQTAzNjExRTc4QUMyODg0QUZGQUI2RTc0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzQ5RUYxRjBBMDM2MTFFNzhBQzI4ODRBRkZBQjZFNzQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzQ5RUYxRjFBMDM2MTFFNzhBQzI4ODRBRkZBQjZFNzQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5H7LYwAAAD6klEQVR42sRX70+TVxR+7mlLu3aUX90maBSMOBmy8WFLzDZjJEHjB4dxGuZm1OAX/wJhkizLkm0sfF7CkiVjZmEfiJjFaDAQ4o8lLmaZZhkDGW7CHALjRwFbLPa9d+e+L5Ph20J5m8FN2t63vT3Pc55z7jn3CvB41NBWIslokKAKEngW/+OQkFGC6CKDTvvqDvYIDW4I+YMgEcQqDiXVtEvRDtKerza4HhpTCvUZadmxRkMCFZROzCk/B/RclmMCRAi4HUu48TbE7m85mBkQV96GGix3RsIxgQ2T/BZmC6MQ+VPOVXDsfXHHwvOLXeZ3q0dgvfZ+/D9Whh2rQM6877J/71CFlRPQnnLc7ZZYhRdmVkzAnarX1kSwp53J15V0QoxyTVPKqnYp7AwRbTynFgFpkOxZiFzO8CDH2j8GZDxYHPOUam0eMJcPREPAVB7URBAq7OPq44K6X5ZYAS2hKP1mxeVMjMWhnn9KTE3Yq188z+HHQn5pXj8fYwJJQqBGMiGeOQxsbl0e+JGCuyMC6o1ZPArciL+3dFVU/dVQY4HkSahjJu+FzIVLxm3SgKc5bIGTCygoBw3FOf7x5OB977D9XFte2HaBXmAu5D8kBB8z4P56CmKGtX/pLaDuHhDaMk9MJgbvfZdlz0mYlAl3gfjNA/fd70HtEmpzFLLMC7nJw2Flz89ychq86NUTwMEmoOUI8Mt5KD9BbbCbUz0M/iAr6Y6w/YNi3Zw7n84/GBDd/NEzDWOXH/RrzAJ/rQY49CXQWmOBBwjx41nm5yLw7qNmXi21HW0hoLk+a7L3DFB/F9jzAVtyw3U1CvE3oxe+wZ5/AXR9DPzYDOURiB8J2sAxsm9Z8IQKyIyt1uTyJ8AsV70DjcD6l1lqzokMPjoc5R3y+1Wg40NzmVHFIDkuu2V/OKVCZCfgLUUs730rDNc+BwLZQGU9cPIyEJ9lw7lA2yleaMB4xQdZ5Els2T9kFrblSCTsBRaJunklPrI8LnoTKK4EbrcA4/1mUhp7AsktuwbSa0bSux2PM6ush0u1Cz/caLJ+L/Gm0EREes0onnkYLs910J83gd6LQG4RwHMVckFuK4X6aSe7ICG2X2NLf9jxQw+hBtLshmrLOuDWEPDV/n/NQvrKIK9XPomvmPBbfYS7oW7LCwTG01PAlPp17mqZDHCf7zMjfgbfhLnYaWBQPFU9GVD3Ej4tia3t1nkxOJI+ARUphsGlVka4pc4sndFPiPzFx/UiPrTkDS+fJg8bWyME8q/JxUQiQvqiuFY3IyLVSfqWqi+Ka+B+mKRRS/qKrG+pfLK5oCVZDdk5W74jyB2+2uo7/wgwAKrre9ew1tbOAAAAAElFTkSuQmCC") no-repeat scroll 0px 0px;
}
.jras-pcShareTEL-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD5klEQVRYR8VXW0yTZxh+vq8HeuZYTqWyAroz06ATQp1KjDHZYpYtWeaF0TASLjaywwWYJSbOKzfjsiW7WbLsYsui7igBzXBGjBrnBcuC2SZgPQCjMCpSCm2hlP9b3p8UWlp6EApf0ov+//u+z/O87/u93/czAGg40/e0YPyEkFDHOQz0LF1LkiQfFOwyl0TzV29uus0InDF+UwCmdIHGissAjxBSNXvrrKOVAfvXEnwRi7Wx+tOOyXSnfXlxzMsazjrE+qifR10zAllaJTRKhpHJ2Qi9aSWg5AwvFOthLzPi2QIdBASOtA9g3B9cIJEWApZMNew2E6pLDTBkKCIUf3hhAK6pxSysGgGtimOb1QB7mQm2nIyYbeULSHjv3H2EN92KCWw0a2S1W60GqBVsAXhqZg5d/3qxq3xxvPw94sNnV4dX3gOZGgVqnjDKwAVGVZTaGw8m8VufGw3bC0DlCK3z/4zj3F+PHo8AZwyVxTrYbUY8X6QD/V+6Rqdm8W2XC25/EO/vLEaOThlh8sX1EXQ7vakRIIWklBST8lhrThL4tceN87fHsSErA007iqBX8yjTD1ofYHJmLjGBDCVHVYkeO8pMqMjTxJ1TjofTsmqnJyBnqLGmMKIXQs5jviCOtPdHxYpoQkrra5U52FlugkYZrSDc2z8r4adbY7h61yN3NZXm4FZzzNKQX9fgFL78/b/4BLK1ShzdWwLjkr271IuCnfnzISam59P58jPZePW5nLiZ+qF7DBd73fEJ0FuaXk/la7HZopd/4XV/5Aviuz9cuDXsm5/jDDiwJQ+7KzLjgtPLTzqHcMc1nZhAuAX1uS1Xgy0WPXZXmNDc1g/frCSbENGG6nxUlSS+v0gCaPr5HgJz0ede0oPoHXshOh0e0DChqfd2bSGezNcmVE4Gg+4Ajl8cjGmbNAHahhvzNPimyyUPmO2liZWHEK/d88h+sVbSBHQqjo/2WdHS3o/mOgvKc+Nvz3AwAicSKyJAzu++VISOHjcObTMjTz8/gqmu4WdALJBjHYMYmgisnAANJmuWGrU2kwxK2/DTK05YstQ4WGWWe2PpmglKaPrlPsQy966kS0CB6Ww/vs8qzwma96euOBduOGaDCo01BSjNjjyK+1x+nOx0LtusKREIlcGsV+Hza8MRF4vQ1ny9Mhd7Ni3OhY5eN37sHls9AsnsO7qGHX7RDINaIWepZ9S/tgQIjfqBjuPlmi/EKOUSJJOBVGxY/ek+L+dcl4rT6tkyL6v//k4bF+yV1QuafCTB0LpuH6cQklviymr5YkdfyGCKjwHUAUKfvIbHsWRewcQlAd7y9Rtlvf8DpDx2AbcgTJgAAAAASUVORK5CYII=") no-repeat scroll 0px 0px;
}
.jras-pcShareVK-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADo0lEQVRYR+1Xe0yNYRj/vd93zqmOIpHk0hWbFGYulTsZqzOTzV0mlsuykGs2xtwSYWQ2k402WaOcYrTcRqxIYrbchjT3ojpOdY5zvs/ej856+77SSszW8+fz/t7n+T2X93m+jwBA2PpT/YkoxosiJhDCOVJdW4lgRTVHxGsij/UXExYUk1/O8wCuY1s5VbYrVImEBBLdupN6gJv6d53/9CYAWSRs7UlDW6e9ieCMRLcuRfwX0df5bCfwf2bASWsHRweNVMZaswVfDTUtbiMmAx5uzgj07wWe48ARAkKAe8Vv8fRNmeSgg4MGu5dNgrd7Z8Zh6adKxBy4CItVsOm7OmsxbrA3yC87IJBs3npYgrefq2w4hkDIUF+snBnEGC+vrMbi3RmwCj8fi5uLI5JidbDXqBhcVPx5fPjyzaaLnR2M8UN8ZJlJOpeH7PwXygQ0Kh7Jm8Lh7GjPXNx/5g6uF7606XYuCcHAPt0ZTOSudJRVVEs6l44OSI4Lh4rnGEzlt1pE7dGjxvRdmQDVTh/rh8iwIczFd2UGRCdm2VIct2AMgv09GMz8bWdRaayVdMvDhyM0qJ8s+sTU27jx4BWjl70CO7UKx+OmybJw4sJ9ZNwsli5vmDcaowZ5Mobmbk2DodoML/fOOLgyFDxHmPObRa+x93SujJTiM6TsaRT1hXY7bbT35QZsj5qIwX3dZQRqTBYkrpgCn54uzBltutWHLjGprwMoEqDsD8fq0LtbJ8ZQyYcKHM24i80Lx0kvor4cyyyAv3c3BAewpTF/t0rO33yskEVPFY0OItpktNlaK2lXHyMlu6hRM01OwpgZQZg0zLdVHK4XvsL+M7dbRkBrr5Yayr2LU6tI6G89QfKFAogKe/e3u8CruzMSoifDwU7dJAmzxYoqowldO2kVcZfznuNIen7zXkFDVICvG7ZEjpdNv/o4OuGuFrzExogxGOHXS5FEas4jnM551PQcaCxMuifWzBkJnx7sHqjDL03Qgw4sjZrHjiUh6O/pKjNFS7A26RKelZbbzn5bgvpW6GIZOdADdGf4ebnaykIH0KJd6dJmpNLBXo1Vs4IROKA3Q4Luk32puch9WNIyAg1Dok1KSZnMFmYT1uGctBqoVby0yARBgMlsBe0VJqj2b8L2DITGphg5HsrTo1Xzr1mXjUS35lQWOKJrFvwPg0QQ/T/7ORWAChVBoPTZQv+QRZHs4YAJdI784UAbmjOKIFd4Im7ITIh4+gOHIWRqYeEoEAAAAABJRU5ErkJggg==") no-repeat scroll 0px 0px;
}
.jras-pcShareMAIL-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAF+klEQVRYR8VXaXBTVRg9772kSZpuSZt0QyzFyrSAFMrWAQYopayiLJZtGFCpAg4q4wIz8scNRaEMMyAjMIJOizBSoAUBleI4DlBls8NSyiJVaEqbrkmTJk3y4nz3NW2eTWh/CH6/3rvv3vude+75zr2PA4D4LVWpHpH/FKKYBZ4Po7ZHFSJEOwfhtIL3vFuzJqmCY8ndfBl4RDyqpAHnFWERFOJozrj572IAsx5r8o5kXi+OcsbPq6yPmvZgixMh2ogBb29XP9gYgpkpGoxMVCFFr0C0RgDHAU1tIv5sduOCyYmTd9pQdt+J3k7aKwBjnlDhvbFRyIgP6RXWW40ufH7WgpKb9h6BPBSARsHhk0k6LByolSV2eby42ehGi0MEOCBWK6BflAI8J8d36q4Dq082oLFNDAo8KACdmsf+uQakx3atuvimHYVXbDh334l2j5zkKDWP8X3VyBsWhhEJqs6EVc1uzD1oxn2LOyCIgABUCg4luUakx0nJq60eLD9Wj0s17bJJaMVeL2Q0EwnZyRpsnaJHtIZn/W83uTF9Xy1anN2ZCAjg44k6LB8q+RGtYOb+OpjtHvY+KlGFF4eEgXRh0AqwtXtxocaJgis2fH/LDrGDGKNWwL7ZMSDhUhy4bsPrJxu7sdANQJpBidNL4mhr4XR7MamgFiSqEIHDxkk6LBok14P/jGfvObHjohXbpulRVGHHpnMtKF0Sh/gwgXXLLqjFlTo5i90AbJuqxwtpUpKNZ1uQX2aBwAF7ZsVgSn8Na6+zeXDiThuqLR5EqHhMSFJjkEHJvhEBBJ72PGN3DaY/pWFjKfZfs+GNH+QsyACoFRwqViYiVMmhze3FkC9NbN9ezQjHB+Oj2CRHKu1Y82Mj7K4uEVJCAp2fo4OyoxR8AOj1zLJ4JOsUsDhFpO0wweXbJwLrb0SZfVQ4kmtkiaiG8441gECVv5IAUnlFvQuTC2tBZRgo8oaF46MJElAfAHp+f3wUVmSEs/YphbX4o7ZrG2QAlg0JY/tMsf7nZuy6bMXkZA0KnpcopJXvu2oLmJwaSSdXVyQgUsXLAMxLDcX2adFsHAmRBOkLGYC3MyPwTmYk+7aspB4nbrdh9YgIrB8ntY3d+4AJ8mFxcJ4B4/qqZQCyktT4do6BDfvw12ZsO2/tGcDCQ2acrnJg3ZhIrBklndRDd5lgskrlGCwKZxuQ3U8OwJ/FDWdasPU3S2AAL6eHYUOWtAU+uqnstuToWdtzB+pQVu0MmpzEeGF5PPpEKGQMLH0mDJ9lS/OuLW3C3vLWwACIOqKQgjpRZ6rhS3kJzOf3lLdiXWlTUAD+VPuLMH+yHosHS6WdW2TGL385AgPQKjlUrkqEUuBYrafvNIEET7a6YKCWPdPW+E/gm+nJSAWK5xs7TccHgDzkYl4Ca6fxA7ZXw9reZcndjIhMg8yDYuXxBhy6YWcl+NPiWPSNVMAtArsvW3H4hh2mVg8MoTxykjVYNTycmZIvfABmpGjw1bNSFZXedWDRYbOMwW4ARiaocHSB5AW1Ng8mfvMADW0iS07enqKXHC9QNDlEkB1TUpvLi5dK6pGfo0diuGTFc76rw5l7cg0FPIy+mBaNuamhbBCdgPMPmZmLkSmtzAgH+UVch79Tn9Z2L4pu2LDpnAVkZjtnSDXvH3Q2rDrR0K09IACi/PjCWPTXKdgAOk5fO97Q6WAkSLqAGEIFZtW3G92d9kpmVJxrxDC/2xOxsviIWWbfPiRBLyREedE8A6Oegsy3uNLOquP3aicTlH8Q6OHxIThvaofD48WCNC1SDUpcM7vYIRTMvh96JYsJFUCn48QktSwZqfi62QWzXWTl2SdCQFpMCBQ82KV0aXF9UJ38+0OPl1Iyl1lPh+KtzAgMiA4uQN/EwS4ewRD1CKBzr8iK40MwNVnDbsfJOiV0Gh5UeI0OkZ0RVGZfl7eyo7y3wcVsrrLx4CXJP+ZgPyaGzfeOcvDOfMy5WToRKP4/f06bRaUwmv1K0B+y28Nv9HJiFg8++K3zP6CJaAf4UxCEtfVvJlb+AzeJolL+5GMJAAAAAElFTkSuQmCC") no-repeat scroll 0px 0px;
}
.jras-pcShareTWIT-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACeUlEQVRYR+2Xy2sTURSHvzuZWpsmFR9orZKtVsSNVKLVLKqLClZFUET8E1y5qFDcuBAUF7ryD1DwudA+sFhrKfjGhailJVSp2IVGWmqTTprXzJWbWqEmM2byaBf1LGfmnt93zzn3zLkCZXdijXisS0AL4Ms+q5RZxBHWAJbezkn/iPgt/hqoq5Smjd8ophYU3J/uBA4vsvicnKRbAcScwh5c4+HABp1oWnJrPM1EUpaT1VAAth47tlZzcXv1H8EfSUlo0CAcs8oGYQsQ8GqMHfShiYVaPd8ytL2IVx6gbaNOV7M3RyiSkNT3qKyVx2wjcLRB58GeXIDJlGRd13+A5RwBU8KnGedjqM7117jFheEkLydNx2p1XYRuaj9hws6nMwxH7YErCqBgr4RTtH9M2HJXHODqaIqz75cIQNXL7gGDt1P2dVBUBIyM8w9JvR0zJB1DCVTrdjLXAMunE9r9jGIZSd3DReiEahB51VKbN337Bg2eTzg3mEL7hW0N+HTB1BE/+l/zgHL8xbCyM8GQQ4MpGUA56N3rpbVez+vLkjAUNYnZFHnSlPR+z3BtNIXToXEcyfav1+kP5c4Ehe5OfXd7PM2pN7PuO+H8ipu7ajgdqHKjmfPttr4ZRmzS5RgB5cnrEfSFvDSv9RQN0foszuNI/lz9E0Cp1uqCG00rObbJfSRSFgQexVCzZD4rCGB+4fHNVZxvXMGOVYVFQ0meeZfg+ueUQw3cnTbQcFVpW/waTas9NNQIqjRBnpPKrCl5EjH5MO3YLwzBvaluhHao6ASXslDSuXSXU4ufCBGci566nmvWZUT2ep6//5ay04VrDST9IM5xoi78C3TSNveIzXAyAAAAAElFTkSuQmCC") no-repeat scroll 0px 0px;
}
.jras-pcShareFACE-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACJ0lEQVRYR2NkYGBgsAifqsnMxNLxj+G/ExMDAw9IjGaA8d+3//+Y9v37/7fsxMrs64xgyxmYTzAwMfDRzFJsBv9j+PSX4a8Fo3XkzI0MDP/96Go51LJ///5tZrSMnPGZkmDn4WJjMNWVYZCV4GdgZ2Nh+PXnL8PXb78Yzl17xnDv8Tu8/vr3799XRuvIGf/J9X2kjz5DUpAxAycHK4YRs1efZli4/hxBo8l2QHyAEUNqmClOC2jqABFBbobVEyIZWFmZB8YBga7aDMWJNiiW//j5h+HMlScM3378BovvP3GP4fDZB7SJguIkW4ZAFy0Uw5Oq1zLcuv+GoIXoCshKAw05zgwuVipws758+8XgkTKfZMtBGshyQGOuC4OzpTLcwo9ffjB4py0cxg5QlhNmUJETgvswyE2bQVtFHM7//uM3Q8+8wyghcP7aM4ZX774SDBWioiAp2IQhKdiYoGHICtLq1jNcu/OKoB6aOcAnYyHDh08/BsYBoDLBJXEuQcuJzgWkRgGoEoorX009B4AqG+QKpzTZlsHWWAFuwacvPxliylbB+X/+/GUAiREDiEoD6AaNvHJgNARGQ2A0BIZ5CERN+8rwn4mLmGITpsbRXIlBUQbRPvj56w/D0s0XSDECrBbcMbGKmLGZkZHBh2Td1NDwn2HjgHVO//1j+MDE+s+CEeQRUA+ZkYGxk4GBwYmJiYmbGp7DZQYo2JkYmfYwsPwrP7ok6yYA8Y0pwEbg9PYAAAAASUVORK5CYII=") no-repeat scroll 0px 0px;
}
.jras-pcVotePlus-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAAD+klEQVQ4y32VTWwbRRTHfzO7Xu9ubCe2yUfrpFWaRC1CoajQD7USCKQGJBBRe+GABBVICKlSj6VUSMAFWgSXqkg5ABLiwoV+XEClqFBEoQ1wCFUbRL6aJlZpIOvEsb3eXe8OB7uWWgwzl9Gbef95b97//UfQYoxdG4j7YWlUqXBECm0niFx9Ry1EKhwXQjtvaImzrz4w493rK+41fHg194IfVo6krf77e5M7yLYNYcXSoKBSc3DK0yyujVNw5yYNzX734HD+s/8EPDHRdTymtx0e7nqOwcxe2mQXigiBrMfXWJejJaad81xd+pygVjl+aOvSkX8BnpjoOm4ZmcOPbnidPnsXHqsEVFokoYhhE6edhcpPfH/zGK7vNEFFI819Uhinnhh4m43mHtbIo4havUgTVCBJkmO++gMXZt4iUv7+g8P509rYtYGkFxRPbcsdSG9JPUOJW0TUiGFhkibEIyICQKJhk0UBIR4BJTr1LYRawMLK5e37DuU+kX5YejJj928aTO+lShFFhI5FMcgzuXIaL1pDI4ZEpxZVmVw5S8GfRcdEoahSZDA9Qtru3+SHpaekUuForn0HtuzEp4xAEifF4uoVvvzjDQruDQwSxLAp+bc5N3WUOecCBgkEEp8ybbKT3vbtKBWO6lLoD2WtoUYFBQqFxyp9Hbt5dsv7ZKx+fNZQQDLew9ObP6DD3NCw3fGJyFpDSKFv1YFeK5ZpUgOghkdC7yaTGqDKKiE1BKCJOIOpEQLKBLhNH4HEimUBevVW1ZPECPFxcRoOosnDuk2hYaCIUIR3IUhg0Q2cRvgagXKpKR+DBKBaUiZOiiAq40clBFr9omAZYFFGqjax7E4hGlNTBvMrl1j2pkiyHoMEOiY6FgYJkqxn2ZtirnARTRkIJALJsjtNpGoTuhDamfzqz89XOv/GkAl0aZI2N/JL/iPus4bozzyOpacBqNYKzDrfseReZ1vPi1haBxEhlegv8qvjCKGd1Q0tcc6pzMxNF873b8seYI0/6bEe5OF1L/HrrY+ZnfkWQ0sA4IclkvEeHln3Mt32MFWKJOnmeuE0TmVu1jIy5+603n4pjC/qrbebInniJAkJuF35jYJ7AyEk7fE+utuG0THxKJIix3z1Ry7MvNlsvXvEIXv4sQ1H6bV3UGWFiBAD+66SBFQQaJh0sFi5wsWb7+D6znuHti69BqDdOfjVWPmbva9I+2bx0p5IhHSYfVgi3aCN1uScjokXrXB9+RSX8yfxgmITrKXAnryaOxDUBXZzX2onWXsIM5YBFG7g4JSnWKgL7O+GZh87OJz/9H8VG2Ds2oDp10qjinBECn0XiPUNTuYjVbsihPa1oSXOtPoC/gE20blbeN5SvAAAAABJRU5ErkJggg==") no-repeat scroll 0px 0px;
}
.jras-pcVoteMinus-img {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAAD2klEQVQ4y32VS2hUZxiGn3OZxGacXCbeEiNpJJrEJFYtJelQqpZiC1kEJVIotHRjkS5LC3ZRuqzR7grGRRuwtmgVtFlqrBTTCnUhiEJUTGJ0wtiYmZPJxMzlXN4ujtZGox8c/sN3+J7/fJf//Q2WMCfRVK5crhff24Vld2EYawGQ7uN7V7DsYSMWG6q5PFF8NtZ41pHZVvex5ucO2M1tbZHEDuzWTswVq0AQzEzj3bqOe/kPvDujo8byym/jV1PHeZGlO+L9Tlej8kf6FUyOSYUFaWE+XP/3HkyOKX+kX05Xo9Id8YMvhu1olXvpvKRAmk1LybvS1OTiJ3k3/KZA7qVzcra3LIIaj9PcbZSVnYkd/gHrrXchlYTAB8NYOhUJLAvWNOCPDJP7ch9yS3viV1NnLSfRFNNs5kzF/i9qIns+ggdJ8FyoiEJ8JRQL4HshyLJhxWoQUMhDfh6zfQuG61K6NPzGVy1rB03Nz71nNbetL+/pg9kM+D68UkFwf4LSyUGUnYVIOdgRVFigdPoY/p3RcMMggFmH8p4+rOaW9Zqfe9/E83rLEjthVR0s5MA0oaoGd+R3svv244/fglglRKMEqSRzn31K6dwQLK8E0wpjVtdRlngHPK/Xxo5ssds6w7pghGvWIbJ9F9XH12I1t0EuCxJW/TqqBn/CatoQ+oLgvxi7tQPsyGs2htFg1q5a3IBCHrO+AbOlHZwMuG7oL19GpGcvPMrBwqMwGwDD4DGjwV6yi6YJxSIYOYjXhjVUEIKcmbDOT2DPmI2UDNLT1Zb0dCTsCNTE0fhtSmd/IZi6h1ERJbK1C6vr7XCk5rJPoRJBehqkpI3nXfNu3uiI9PSFsLIyWFZBcfB78scHwLQwTBMMg8KpY1ibNhP9+jvM1fWQdcJJNgy8WzfAc68Zmc21fea6ptNVA6egqhokiid+xB25QNnuD7E7X8esroFSCW9yjOLQCTSXpeLzbzBXrgn/Mpclu/8DguTEXpxEUyy9MTpeGDgkSfKvXVHx56PSgynJdyVnRppOSQ8fhGfZd1UaOqnSr4NS5qEkqTDQr/TG6JiTaIo9UZg9Tver8v68IHmeNPNPCFjqLKfuS86MgonbUuDL++uCnO5GZbbV7X5eHLa3yr18UZKkzMxLxCEjSXJHhp+IQ//SitMe73e6G5U/eljBvfEXyFdewb0x5QcOyeluVLp9Mex5gd265hM9yh2wN2xqiSR2Yrd1YtauDAU2/RDv5nXcvy7i3Rm9aSyvPBi/mjr2UiCA82bTMs3P9eL7u7DtbgyjHoBAU/je31jWeSNW+dtSV8C/Gxd0zlRsvhIAAAAASUVORK5CYII=") no-repeat scroll 0px 0px;
}
.jras-pcToTop{
width: 24px;
height: 18px;
display: inline-block;
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAA+0lEQVRIS+3UrU5DMRjG8d/AgEIjuQYEhqBx8zOAGTdAguIbMbMrAAR3gCWgp9Ek3MDsPJAXzknIcnbaJkwsWZOmafL0+ff9aDvmPDpz9rcEJDPclqIdbCYdfgVjjJq0bYAndDMBz9gvBWxhIxMwwUcpoEl/iS9cZYKL2jTMLyrjWK9zILnvoDb/5OdSMc9xk4LkAGrzB0Rd1vGOgxxIClCb36OPF6xhDwE8xBluZ0XSBjjFAHc4ror7WgF2sYIAH+EEw9Iu2kavOhydE+MvIPYBCeNHvJUCmvTTgFSNi9q0KYLFA8QHuDrrY/uPGiRTMi1IvYNiwyWgOGXf4uYlGUp2/rYAAAAASUVORK5CYII=") no-repeat scroll 3px -3px;
}
.jras-pcToDown{
width: 33px;
height: 18px;
display: inline-block;
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAA6ElEQVRIS+3TIU4EQRBG4W8xSBwOuRdAoBAEi+ECbELwBAkOFDgugAa9CZYEgSFcgQvguACBdFIknQV6qknWTasRVe/1/FU9seQzWTLfKBhMuDei7SA+DZKjoFfwGH07o6AksIkjHOMjIlmMaAXXuMXzb7G1ZnBSNc9CUgsK/AaHOMNVr6DUn+ISdzjAQ0B2K/gFzv8aemaLaskGPvEaN2/CizQjqP+kfBdB6RuE9wgWJSl4r+Bbshq3T721VkRTrKUovMdcfpS3BPfYSwrm2O9d0y2sJwVveOkVJNntsuya/ls2Cgaj+wJTFiUZUSeJ8gAAAABJRU5ErkJggg==") no-repeat scroll 3px -3px;
}
.jras-pcLinksSepAfter:after{
color: #535353;
content: " | ";
}
.jras-pcLinksSepBefore:before{
color: #535353;
content: " | ";
}
.jras-PostControlRatingVote {
width: 20px;
height: 21px;
cursor: pointer;
display: inline-block;
}
.jras-PostControlRatingVote-new {
line-height: 33px;
margin: 7px 0 0 14px;
background-image: url(../images/icon_smiles.png);
width: 22px;
height: 22px;
background-size: 42px;
vertical-align: top;
}
#jras-PostControlShare a{
height: 16px;
width: 16px;
display: inline-block;
}
#jras-PostControlShare a{
display: inline-block;
background-size: 16px 16px;
-o-transition: all 0.5s ease-in-out;
-moz-transition: all 0.5s ease-in-out;
-webkit-transition: all 0.5s ease-in-out;
transition: all 0.2s ease-in-out;
}
#jras-PostControlShare a:hover{
-o-transform: scale(2, 2);
-ms-transform: scale(2, 2);
-moz-transform: scale(2, 2);
-webkit-transform: scale(2, 2);
transform: scale(2, 2);
box-shadow: 0 0 4px 1px rgba(128, 128, 128, 0.53);
}
#jras-PostControlBlock{
position: absolute;
right: 0;
z-index: 1;
border-left: 1px solid rgba(0, 0, 0, 0.3);
}
#jras-PostControlBlock sitm {
position: absolute;
transition: 0.5s cubic-bezier(0.56, 1.35, 0.37, 0.97);
padding: 4px;
width: 100px;
border-radius: 4px 0px 0px 4px;
box-shadow: 1px 1px 4px 0px rgba(0,0,0, .5);
opacity: 0.6;
font-size: 12px;
display: inline-flex;
}
#jras-PostControlBlock sitm:hover {
opacity: 1;
}
.jras-gui-btn-newdesign {
border-radius: 3px;
padding-left: 3px;
padding-right: 3px;
width: 24px;
height: 22px;
}
.jras-gui-btn-pmme {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA/ElEQVQ4T63TTyvEQRwH4GddnLko+XNycZe2nJRyc5OUHPw5yMlhSzns5qo4uEi5Skk5SznsRl6BG0ki70CbNJnR9sPP2jXHaT7Pd+Y7MwVtjkKbeQEYRLFFqBaAGYzg8o/IGKoJqGAKN00iwzjFegK6MI9tHP2CzGIFh3hOQB0nKKMba3jNQJ3YwRM2MY16I3AcA5PYxTju41xo9AWWcRbnQu++BQawhyGsoiMe7RaLeMgDUngBL9jCG0rowT6WIvJlB9excgg//tDIvgYkXOPnEXoxgbxwMhNyjrvUxANs5FTObigg4SbmAtCP0SYfUHbZ1b98phaLf8TeAXUaOZJ+0HVlAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
background-position: center center;
border: medium none;
}
.jras-gui-btn-deleteall {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABV0lEQVQ4T4XTPUiXURTH8Y9D0NDkGCqNDb0NkRLS1GYQBL04+DJpQ1BQuJQiqIsGtQQlFASJgbS6pNAiKNJUBCJCQU0NbkHgG0fOH54uPv3v8jz3nN/93nPPS4v6dRoX0r2OraOkLWk8j9FC0Im2tH3H58I/jq8NwFk8/k80pWsfE/jWAITgAbqxh6cYwSccRxem0xbaJbyMnyrgWULCfhMLmMMJXEcv5jOUuH2sBDzMm+sAd/A+AcOYLQG3K4KjIqgCerBYAi5jJW9oBjiHLyWgAz9qANcwgHfpb8V2CTiGv5nYPrzOREYSozqRtBf4k4mNUv5Thdj/wkncywMfU3wGbzCFDUSXHq5qGWO/hkt4gn5EC0cE0ZHL2QfxvVoH+IAbWc4r2ExAQGIWhvAWg3WA57if72/H7wTsYBe3MFmdm/IJjzDTZCbu4lVdBKdwsQlgFT8bmgPWFkcRlMznyAAAAABJRU5ErkJggg==");
background-repeat: no-repeat;
background-position: center center;
border: medium none;
}
.jras-gui-btn-resetdef {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABF0lEQVQ4T6XTyypGURjG8d93A8pp4gIkp5AUIxegGMlhggsQkhswUJQBZaakMHO4DFPikwswxNRA9Grt7HZ2e5c12+t93/9+1rOe1fDP1SiZH8IMulP9GZe4K/YXAR04wAvO8ZgG+rCIqK/hNQPlAZ04wzoeSpQNYBcLeIuePOAC27m/lrkziA0s5QEjmMNWTU8ncIvPUDCVzveUzv8jrcbqCq8CEG5f4QQr+KoxHH07GMs8mMUNPmoMt+MIozguy0EVZxyToSID9CdXN6smU/0wqWjmFZxiD/cVkGGsYrmYg7YUpLjKMkhEPMybx3sREN+t2E/FSGUkMlRmUW5JIfoZ/guQ7fdiGj1pIzJyjWbVY6rp4W/bN3aAMKpdgLqNAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
background-position: center center;
border: medium none;
}
.jras-tooltip-user-awards-hide-btn-close{
position: relative;
box-shadow: 0 -4px 8px 0 rgb(0, 0, 0);
margin-bottom: -6px;
}
.jras-tooltip-user-awards-hide-btn{
background-color: rgb(80, 80, 80);
height: 5px;
width: 105%;
margin-left: -5px;
top: -4px;
border-radius: 0 0 10px 10px;
}
.jras-tooltip-user-awards-hide-btn:hover{
background-color: rgb(0, 135, 21);
}
.jras-prop-gui-content, .jras-prop-gui-contentTop, .jras-prop-gui-contentBottom{
background-color: #2F2E2E;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 30px;
overflow: hidden;
}
.jras-prop-gui-contentTop{
margin-bottom: 5px;
}
.jras-prop-gui-contentBottom{
top: auto;
bottom: 0;
height: 30px;
overflow: hidden;
margin-top: 5px;
}
.jras-prop-gui-contentMain{
position: absolute;
top: 30px;
left: 0;
right: 0;
bottom: 30px;
overflow: auto;
background-color: #262626;
}
.jras-prop-gui-section{
margin-top: 5px;
margin-bottom: 14px;
}
.jras-prop-gui-subsection{
margin-left: 20px;
margin-top: -10px;
}
.jras-prop-gui-small-section{
margin-top: -10px;
}
.jras-prop-gui-radio-group{
margin: 5px 0;
border-left: 1px solid #515151;
padding: 2px 3px;
display: block;
background-image: linear-gradient(to top, #515151 1px, rgba(255,255,255,0) 1px), linear-gradient(to bottom, #515151 0.1rem, rgba(255,255,255,0) 1px);
background-size: 13px 100%;
background-repeat: no-repeat;
}
.jras-prop-gui-button-right{
padding-left: 20px;
right: 0px;
padding-right: 20px;
margin-right: 5px;
position: absolute;
margin-top: 4px;
height: 22px;
}
.jras-prop-gui-button-left{
left: 0px;
margin-left: 5px;
margin-top: 4px;
cursor: pointer;
}
.jras-tabs-panel-content {padding: 6px 10px;}
#jras-prop-gui-dialog{
border: 0;
width: 100%;
}
#jras-prop-gui-dialog .jras-tabs-nav{
margin-left: 6px;
margin-top: 6px;
float: left;
width: 25%;
border: 0;
background: none;
}
#jras-prop-gui-dialog .jras-tabs-nav li{
height: 30px;
clear: left;
width: 100%;
margin: 0 0 5px 0;
background: #2d2d2d none repeat scroll 0 0;
border: 0 none;
padding: 0 0 3px 5px;
font-weight: normal;
border-radius: 3px;
}
#jras-prop-gui-dialog .jras-tabs-nav li.ui-tabs-active{
background-color: #3e7a35;
}
#jras-prop-gui-dialog .jras-tabs-nav li.ui-state-focus{
background-color: #2b5326;
}
#jras-prop-gui-dialog .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited{
line-height: 30px;
color: #818181;
text-decoration: none;
}
#jras-prop-gui-dialog .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited{
color: #d4d4d4;
font-weight: bold;
text-decoration: none;
line-height: 30px;
}
#jras-prop-gui-dialog .jras-tabs-panel{
box-shadow: -1px 0 20px 0 #000000;
border: 0;
left: 25%;
height: 100%;
overflow: auto;
position: absolute;
float: right;
right: 0;
width: 75%;
}
.jras-qt {
opacity: 0.6;
font-style: italic;
font-size: 105%;
/* display: inline-block; */
margin-bottom: 0.5em;
padding-left: 0.8em;
}
.jras-qt:last-of-type{
margin-bottom: -1em;
}
.jras-qt>div{
margin-top: -0.8em;
margin-left: 1.8em;
}
.jras-qt div.base-qt{
margin-left: 1.2em;
margin-top: -1.2em;
padding-bottom: 0.4em;
}
.jras-qt div.qt-header{
/* font-weight: 600; */
font-style: normal;
padding-left: 0.7em;
font-size: 90%;
}
.jras-qt div.qt-header-old{
padding-bottom: 0.2em;
}
.jras-qt div.qt-header-l{
background: linear-gradient(90deg, lightgray 0%, rgba(255, 254, 254, 0) 100%);
}
.jras-qt div.qt-header-d{
background: linear-gradient(90deg, rgb(80, 80, 80) 0%, rgba(255, 254, 254, 0) 100%);
}
.jras-qt div.qt-body{
padding-left: 0.4em;
}
.jras-qt div.qt-body-l{
border-left: solid 1px lightgray;
}
.jras-qt div.qt-body-d{
border-left: solid 1px rgb(80, 80, 80);
}
.jras-qt>div::before {
content: ',,';
font-size: 4.3em;
margin-left: -0.2em;
margin-right: 0.2em;
position: relative;
color: #9f9f9f;
font-family: times-new-roman;
letter-spacing: -0.07em;
font-style: normal;
top: -0.13em;
}
#jras-qt-popup {
position: absolute;
top: -1000px;
left: -1000px;
height: 24px;
width: 28px;
z-index: 1;
-webkit-box-shadow: 3px 3px 3px 0px rgba(0,0,0,0.2);
-moz-box-shadow: 3px 3px 3px 0px rgba(0,0,0,0.2);
box-shadow: 3px 3px 3px 0px rgba(0,0,0,0.2);
border: 1px solid lightgray;
border-radius: 4px;
background: #3cff00 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACISURBVEhL7ZVLDoAgDES5ndH7b/ydRdvEMaQFBUpgw0veYgp2dugGqSzkQV6PpeB73sU7X04ShzUK2J0HwLpYovY1L0DOFcgcvZArkFkPjPQvQE4xhDqTA+QUQ6izr8sl9C9AzhXIHL2QK5BZD4y0L/D/BZYif8fKAzCT/H7XKtjIiQeDH5y7Abh/oWWhH+N/AAAAAElFTkSuQmCC") no-repeat scroll 2px 0px;
animation: simple-translate-showButton 200ms;
opacity: 0.3;
}
#jras-qt-popup:hover {
opacity: 1;
background-color: yellow;
transition: .2s;
}
#jras-qt-popup.show {
display: block;
}
#jras-qt-popup.hide {
display: none;
}
/* Окно настроек */
.modal {
z-index: 1000;
opacity: 0;
visibility: hidden;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
text-align: left;
background: rgba(0,0,0, .9);
transition: opacity .25s ease;
}
.modal__bg {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
cursor: pointer;
}
.modal-state {
display: none;
}
.modal-state:checked + .modal {
opacity: 1;
visibility: visible;
}
.modal-state:checked + .modal .modal__inner {
top: 0;
}
.modal__inner {
transition: top .25s ease;
position: absolute;
top: -20%;
width: 55%;
margin-left: 42%;
margin-top: 20px;
overflow: auto;
background: #fff;
border-radius: 5px;
height: 55%;
}
.modal__close {
position: absolute;
right: 8px;
top: 8px;
width: 1.1em;
height: 1.1em;
cursor: pointer;
}
.modal__close:after,
.modal__close:before {
content: "";
position: absolute;
width: 2px;
height: 1.5em;
background: #ccc;
display: block;
transform: rotate(45deg);
left: 50%;
margin: -3px 0 0 -1px;
top: 0;
}
.modal__close:hover:after,
.modal__close:hover:before {
background: #aaa;
}
.modal__close:before {
transform: rotate(-45deg);
}
@media screen and (max-width: 768px) {
.modal__inner {
width: 93%;
height: 93%;
margin-left: 3%;
box-sizing: border-box;
}
}
@media screen and (max-height: 600px) {
.modal__inner {
height: 75%;
box-sizing: border-box;
}
}
@media screen and (max-height: 400px) {
.modal__inner {
height: 91%;
box-sizing: border-box;
}
}
`);
}
function correctStyle(){
if (!userOptions.val('stCorrectStyle')){
return;
}
const stretchContent = (userOptions.val('stStretchContent'))
? `div#header{width: ${userOptions.val('stStretchSize')}%;} div#page{width: ${userOptions.val('stStretchSize')}%;}`
: '';
let sideBarHover = '';
let divContainer = '';
let sideBar = '';
let divContent = '';
let commentListLine = '';
if (userOptions.val('stHideSideBar')){
divContent = 'div#content{width: 100%;}';
if (page.isNewDesign){
sideBar = 'right: -310px; width: 320px; border-left: 2px solid lightgray; border-bottom: 2px solid lightgray; background-color: white;';
sideBarHover = 'right: 0;';
divContainer = 'width: 100%;';
}else{
sideBar = 'right: -285px; width: 259px; padding-right: 26px; margin-top: 1px; padding-top: 10px; background-color: ';
sideBar += (page.isSchemeLight()) ? 'white;' : '#3B3B3B;';
sideBarHover = 'right: -15px;';
divContainer = 'width: 98%;';
commentListLine = `.comment_list { border-left: 1px solid ${(page.isSchemeLight())?'#f4f4f4':'#2b2b2c'} ; }
.comment_list:hover { border-left: 1px dashed ${(page.isSchemeLight())?'#d5d5d5':'#3F6B36'}; }`;
}
sideBar = `div#sidebar{${sideBar} transition: 0.2s; position: absolute;padding-left: 10px; z-index: 10;}`;
}
const form_addPost = (!page.isNewDesign && !page.isSchemeLight())
? 'form#add_post{ background-size: 100% !important;}'
: '';
const centerContent = (userOptions.val('stCenterContent'))
? '.image { text-align: center !important; }'
: '';
const style = `
${stretchContent}
${divContent}
div#tagArticle{width: 100%;}
${sideBar}
div#sidebar:hover, div#sidebar.hovered { ${sideBarHover} box-shadow: -6px 0px 20px -5px rgba(0, 0, 0, 0.47);}
div#contentinner { ${divContainer} }
div#showCreatePost { width: 100%; }
div#add_post_holder { width: 100%; }
div[id^=postContainer]{ box-shadow: 10px 0px 20px -10px rgba(0, 0, 0, 0.4); }
div#navcontainer { background-size: 100%; }
div#searchBar { background-size: 100%; }
div.blogs a img { width: 100%; }
div#searchBar{ display: flex; }
form#searchform{ float: right; }
div#submenu{ width: 75%; }
div#blogName{ max-width: 85%; }
div.tagname{ max-width: 60%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;}
div#searchmenu{ width: 25%; }
textarea#add_post_text { width: 99%; border: 1px ${(page.isSchemeLight()) ? 'solid #bbbbbb; background: none;' : 'border-color: #444 !important;'} }
input[name="tag"], input[name="header"] { width: 99% !important; margin-top: -6px !important; }
.article .ufoot { width: 100% !important; }
${centerContent}
${form_addPost}
.post_content table { margin: 0 auto; }
.post_content_expand{ width: 100% !important; }
${commentListLine}
`;
newCssClass(style);
if (!userOptions.val('stHideSideBar')){
newCssClass(`div#content{width: ${$('div#page').width() - $('div#sidebar').width()}px;}`);
}
}
function dynamicStyle(){
if (!(userOptions.val('stCorrectStyle') || (!userOptions.val('stCorrectStyle') && userOptions.val('stUseDynStyleChanges')))){
return;
}
if (userOptions.val('stSideBarSizeToPage')){
if (!userOptions.val('stCorrectStyle')){
newCssClass(`div#sidebar.hovered { ${(page.isNewDesign)?'right: 0;':'right: -15px;'} box-shadow: -6px 0px 20px -5px rgba(0, 0, 0, 0.47);}`);
}
correctPageHeight();
$('div.post_content_expand').each(function(){
new MutationObserver(function(){ correctPageHeight() }).observe(this, {attributes: true});
});
}
}
function correctPageHeight(){
if (!(userOptions.val('stCorrectStyle') || (!userOptions.val('stCorrectStyle') && userOptions.val('stUseDynStyleChanges')))){
return;
}
if (userOptions.val('stSideBarSizeToPage')){
const $divSideBar = $('div#sidebar');
const sbh = $divSideBar.height();
const $divPageInner = $('div#pageinner');
$divPageInner.css('height', 'auto');
if ($divPageInner.height() < sbh){
$divPageInner.height(sbh);
const $contentBlock = $('div#content');
if (userOptions.val('stShowSideBarOnHideContent')){
$(window).on('scroll', function(){
if ($contentBlock.offset().top + $contentBlock.height() < win.pageYOffset){
$divSideBar.addClass('hovered');
}else{
$divSideBar.removeClass('hovered');
}
})
}
}
}
}
function makeBlockPostElements(forElm, parentID, blockMess, blockMessBold, blockMessDesc, fromTag){
// буээээ
if($('#togglebutton' + parentID)[0]){
return
}
let newElement;
if (!userOptions.val('delUserPost') || fromTag){
newElement = document.createElement("input");
newElement.style.marginRight = '30px';
newElement.style.paddingLeft = '20px';
newElement.style.paddingRight = '20px';
newElement.id = 'togglebutton' + parentID;
newElement.type = 'button';
newElement.value = lng.getVal('JRAS_TOGGLEBUTTONCAPTIONSHOW');
newElement.onclick = function(){
const toggleContainer = $('#' + parentID + ' > div');
const buttonCaption = toggleContainer.css('display') != 'none'
? lng.getVal('JRAS_TOGGLEBUTTONCAPTIONHIDE')
: lng.getVal('JRAS_TOGGLEBUTTONCAPTIONSHOW');
toggleContainer.slideToggle('display', function(){
correctPageHeight();
});
$('#togglebutton' + parentID).attr("value", buttonCaption);
};
forElm.parentElement.insertBefore(newElement, forElm);
}
const newDIV = document.createElement("div");
newDIV.style.display = 'inline';
forElm.parentElement.insertBefore(newDIV, forElm);
newElement = document.createElement("span");
newElement.textContent = blockMess;
newDIV.appendChild(newElement);
newElement = document.createElement("span");
newElement.style.fontWeight = 'bold';
if (userOptions.val('showUserNameDelPost') || fromTag){
newElement.textContent = blockMessBold;
}else{
newElement.textContent = '---';
}
newDIV.appendChild(newElement);
newElement = document.createElement("span");
newElement.textContent = blockMessDesc;
newDIV.appendChild(newElement);
}
function makeBlockCommElements(forElm, parentID, blockMess, blockMessBold, blockMessDesc){
// древние копролиты
if($('#newToggle_' + parentID)[0]){
return
}
const newDIV = document.createElement("div");
newDIV.id = 'newToggle_' + parentID;
newDIV.style.display = 'inline';
forElm.parentElement.insertBefore(newDIV, forElm);
let newElement = document.createElement("span");
newElement.textContent = blockMess;
newElement.style.color = 'rgb(242, 119, 119)';
// newElement.className = 'comment_show';
if(page.isNewDesign){
newElement.style.paddingLeft = '20px';
}
if (!userOptions.val('delUserComment')){
newElement.style.cursor = 'pointer';
newElement.onclick = function(){
$('#' + parentID + ' > div.txt').slideToggle('display', function(){
correctPageHeight();
});
};
}
newDIV.appendChild(newElement);
newElement = document.createElement("span");
newElement.style.fontWeight = 'bold';
if (userOptions.val('showUserNameDelComment')){
newElement.textContent = blockMessBold;
}else{
newElement.textContent = '---';
if (userOptions.val('makeAvatarOnOldDesign') && !page.isNewDesign){
$(forElm).parent().find('>img.avatarForOldDesign').css('display', 'none');
}
}
newDIV.appendChild(newElement);
newElement = document.createElement("span");
newElement.textContent = blockMessDesc;
newDIV.appendChild(newElement);
}
function getPropID(prop){
return 'jras-gui-' + prop;
}
function makePropElements(){
const getHTMLProp = function(prop, styleFor, style){
let retVal = '';
if (prop === undefined){return}
const propObj = userOptions.data[prop];
if (propObj === undefined){return}
const propID = getPropID(prop);
const propData = propObj.propData();
switch(propData.type) {
case 'checkbox':
retVal = `<input id="${propID}Val" type="${propData.type}" style="vertical-align: middle;"/>
<label id="${propID}Caption" for="${prop}" style="cursor: pointer;vertical-align: middle;"/>`;
break;
case 'radio':
retVal = `<input id="${propID}Val" type="${propData.type}" name="${propData.group || prop}" value="${propData.value || prop}" style="vertical-align: middle;"/>
<label id="${propID}Caption" for="${propID}Val" style="cursor: pointer;vertical-align: middle;"/>`;
break;
case 'combobox':
retVal = `<span id="${propID}Caption" style="vertical-align: middle;"/>
<select id="${propID}Val" name="jras-${prop}" style="vertical-align: middle;">`;
const values = propObj.values();
for (let a in values){ retVal += '<option value="' + a + '">' + values[a] + '</option>'}
retVal += '</select>';
break;
case 'number':
retVal = `<span id="${propID}Caption" style="vertical-align: middle;margin-left: 3px;line-height: 28px;"/>
<input id="${propID}Val" type="${propData.type}" min="${propData.min}" max="${propData.max}" style="width: 50px; vertical-align: middle;"/>`;
break;
}
if (styleFor !== undefined){ $(retVal).find('#' + propID + styleFor).css(style) }
return retVal;
};
if(page.isNewDesign){
$('div.topbar_right:first div.lang_select').after(
'<label id="jras_prop-button" style="cursor: pointer;" class="lang_select" for="modal-1">JRAS</label>'
);
$('label#jras_prop-button').click(openProp);
}else{
$('div#header:first div.lang_select').after(`
<label id="navcontainer" class="lang_select" for="modal-1"
style="cursor: pointer; right: 39px; padding: 1px 2px 2px;
font-size: 9px; border-radius: 0 0 5px 5px; height: 17px;
${ (!page.isSchemeLight()) ? "background: transparent url('../images/mainmenu_active_bg1.png') repeat-x scroll 0 0;" : 'background-position-x: -4px; background-position-y: -2px;'}">
JRAS
</label>
`);
$('div#header:first div.lang_select + label').click(openProp);
}
$('body').append(`
<div id="jras-prop-gui-dialog">
<input class="modal-state" id="modal-1" type="checkbox" />
<div class="modal">
<label class="modal__bg" for="modal-1"></label>
<div class="modal__inner">
<div class="jras-prop-gui-contentTop">
<span style="color: #8B857B;font-weight: bold; line-height: 27px; padding-left: 8px;">
JRAS - JoyReactor Advanced Script v.${JRAS_CurrVersion}
</span>
<label class="modal__close" for="modal-1"></label>
</div>
<div class="jras-prop-gui-contentMain">
<div id="jras-prop-gui-tabs" style="border: 0 none;">
<ul class="jras-tabs-nav">
<li id="jras-tabs-nav-0"><a href="#jras-prop-gui-tab-1"></a></li>
<li id="jras-tabs-nav-1"><a href="#jras-prop-gui-tab-2"></a></li>
<li id="jras-tabs-nav-2"><a href="#jras-prop-gui-tab-3"></a></li>
<li id="jras-tabs-nav-3"><a href="#jras-prop-gui-tab-4"></a></li>
<li id="jras-tabs-nav-4"><a href="#jras-prop-gui-tab-5"></a></li>
<li id="jras-tabs-nav-5"><a href="#jras-prop-gui-tab-6"></a></li>
</ul>
<div id="jras-prop-gui-tab-1" class="jras-tabs-panel">
<div class="jras-tabs-panel-content">
<section class="jras-prop-gui-section"> ${getHTMLProp('language', 'Val', {'width': '30%'})} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('removeShareButtons')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('fixedTopbar')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection"> ${getHTMLProp('hideFixedTopbar')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('correctRedirectLink')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('correctOldReactorLink')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('showHiddenComments')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection"> ${getHTMLProp('showHiddenCommentsMark')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('extendedGifLinks')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('videoSoundOptions')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('restartVideoOnUnmute')} <br>
<div class="jras-prop-gui-radio-group">
${getHTMLProp('videoSoundMuteOnPostScroll')} <br>
${getHTMLProp('videoSoundMuteOnVideoScroll')}
</div>
<div class="jras-prop-gui-radio-group">
${getHTMLProp('autoUnmuteVideoNone')} <br>
${getHTMLProp('autoUnmuteVideoOnHalfScreen')} <br>
${getHTMLProp('autoUnmuteVideoOnScreenMiddle')}
</div>
</section>
<section class="jras-prop-gui-section"> ${getHTMLProp('pcbShowPostControl')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('pcbShowInFullPost')} <br>
${getHTMLProp('pcbHideShareButoons')} <br>
${getHTMLProp('pcbHideJRShareBlock')} <br>
${getHTMLProp('pcbHideJRRatingBlock')}<br>
${getHTMLProp('pcbAnimateMove')} <br>
${getHTMLProp('pcbAnimateMoveSpeed')}<br>
${getHTMLProp('pcbTopScreenPos')} <br>
${getHTMLProp('pcbTopBorder')} <br>
${getHTMLProp('pcbBottomBorder')}
</section>
</div>
</div>
<div id="jras-prop-gui-tab-2" class="jras-tabs-panel">
<div class="jras-tabs-panel-content">
<section class="jras-prop-gui-section"> ${getHTMLProp('delUserComment')} </section>
<section class="jras-prop-gui-section jras-prop-gui-small-section"> ${getHTMLProp('showUserNameDelComment')} </section>
<section class="jras-prop-gui-section jras-prop-gui-small-section"> ${getHTMLProp('fullDelUserPost')} </section>
<section class="jras-prop-gui-section jras-prop-gui-small-section"> ${getHTMLProp('delUserPost')} </section>
<section class="jras-prop-gui-section jras-prop-gui-small-section"> ${getHTMLProp('showUserNameDelPost')} </section>
<span id="jras-guiBlockUserListCaption"></span>
<textarea id="jras-guiBlockUserList" style="width: 98%; border: 1px solid rgb(216, 216, 216); height: 139px;">
</textarea>
<span id="jras-guiBlockTagListCaption"></span>
<textarea id="jras-guiBlockTagList" style="width: 98%; border: 1px solid rgb(216, 216, 216); height: 139px;">
</textarea>
</div>
</div>
<div id="jras-prop-gui-tab-3" class="jras-tabs-panel">
<div class="jras-tabs-panel-content">
<section class="jras-prop-gui-section"> ${getHTMLProp('isToBeLoadingUserData')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('showUTOnLine')} <br>
${getHTMLProp('showUTOnComment')}<br>
${getHTMLProp('showUTOnPrivateMess')} <br>
${getHTMLProp('showUTOnPeople')} <br>
${getHTMLProp('showUTOnSidebarTopUsers')} <br>
${getHTMLProp('showUTOnSidebarOnline')} <br>
${getHTMLProp('showUTOnPostControl')} <br>
${getHTMLProp('hideUserAwardsWhen', 'Val', {'width': '60px'})}
${getHTMLProp('minShowUserAwards', 'Val', {'width': '60px'})} <br>
${getHTMLProp('chatlaneToPacaki')} <br>
${getHTMLProp('showUTOnTopComments')} </section>
<section class="jras-prop-gui-section jras-prop-gui-small-section"> ${getHTMLProp('isToBeLoadingTagData')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('showTTOnLine')} <br>
${getHTMLProp('showTTFullPost')} <br>
${getHTMLProp('showTTOnTrends')} <br>
${getHTMLProp('showTTOnLikeTags')} <br>
${getHTMLProp('showTTOnInteresting')} </section>
<section class="jras-prop-gui-section jras-prop-gui-small-section"> ${getHTMLProp('previewReactorLink')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('previewSizeX')} <br>
${getHTMLProp('previewSizeY')} </section>
</div>
</div>
<div id="jras-prop-gui-tab-4" class="jras-tabs-panel">
<div class="jras-tabs-panel-content">
<section class="jras-prop-gui-section"> ${getHTMLProp('makeTreeComments')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('treeCommentsOnlyFullPost')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('makeAvatarOnOldDesign')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('makeAvatarOnlyFullPost')} <br>
${getHTMLProp('showCommentDate')} <br>
${getHTMLProp('avatarHeight')}</section>
<section class="jras-prop-gui-section"> ${getHTMLProp('whenCollapseMakeRead')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('collapseComments')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('collapseCommentsOnlyFullPost')} <br>
${getHTMLProp('collapseCommentWhenSize')} <br>
${getHTMLProp('collapseCommentToSize')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('makeQuotesOnComments')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('makeExtQuotes')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('makeQuoteTool')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('qTAddUserInfo')} <br>
${getHTMLProp('qTInsertIntoShowingInput')} </section>
</div>
</div>
<div id="jras-prop-gui-tab-5" class="jras-tabs-panel">
<div class="jras-tabs-panel-content">
<section class="jras-prop-gui-section"> ${getHTMLProp('stCorrectStyle')} </section>
<section class="jras-prop-gui-section jras-prop-gui-subsection">
${getHTMLProp('stHideSideBar')} <br>
${getHTMLProp('stStretchContent')} <br>
${getHTMLProp('stCenterContent')} <br>
${getHTMLProp('stStretchSize')}
</section>
<section class="jras-prop-gui-section"> ${getHTMLProp('stUseDynStyleChanges')} </section>
<section class="jras-prop-gui-section"> ${getHTMLProp('stSideBarSizeToPage')}
<section class="jras-prop-gui-section" style="margin-left: 20px;">${getHTMLProp('stShowSideBarOnHideContent')} </section>
</section>
<div style="opacity: .7; line-height: 12px; font-size: 80%; padding: 15px; border-top: 1px dashed; width: 90%;">
* JRAS style так же можно найти в виде стилей для Stylish и подобных. Мне кажется что использовать их отдельно от скрипта удобнее, хотя и настроить сложно.<br>
Они доступны по ссылкам<br>
- Для нового дизайна - <a href="https://userstyles.org/styles/148705/jras-style-for-new-reactor-cc" target="_blank" rel="nofollow">ссылка</a><br>
- Для старого дизайна - <a href="https://userstyles.org/styles/148704/jras-style-for-old-reactor-cc" target="_blank" rel="nofollow">ссылка</a><br>
- Для старого со стилем Steam - <a href="https://userstyles.org/styles/148702/jras-style-for-old-black-reactor-cc-steam" target="_blank" rel="nofollow">ссылка</a> (Сам стиль Steam доступен <a href="https://userstyles.org/styles/102457/joyreactor-old-steam" target="_blank" rel="nofollow">здесь</a>)
</div>
</div>
</div>
<div id="jras-prop-gui-tab-6" class="jras-tabs-panel">
<div class="jras-tabs-panel-content">
<span id="jras-gui-ExpImpCaption"></span>
<textarea id="jras-gui-ExpImpData" needClick="true" style="width: 98%; border: 1px solid rgb(216, 216, 216); height: 30vh; margin-top: 5px;"></textarea>
<input id="jras-gui-Import" needClick="true" style="padding-left: 20px;padding-right: 20px;height: 22px;right: 0px;padding-right: 20px;margin-right: 5px;" value="Импорт" type="button">
</div>
</div>
</div>
</div>
<div id="jras-prop-gui-bottomCcontent" class="jras-prop-gui-contentBottom">
<input id="jras-gui-SaveSettings" needClick="true" style="padding-left: 20px; padding-right: 20px; height: 22px;" class="jras-prop-gui-button-right" value="" type="button">
</div>
</div>
</div>
</div>
`);
$(`body label[id*=${getPropID('')}]`).click(function(){
$(this).parent().find('input#' + getPropID($(this).attr('for')) + 'Val').get(0).click();
});
const $propDialog = $('#jras-prop-gui-dialog');
if(page.isSchemeLight()){$propDialog.find('[id*=jras-prop-gui-tab]').css('color', '#686868');
}else{$propDialog.find('[id*=jras-prop-gui-tab]').css('color', '#BBBBBB');}
if(!page.isNewDesign){$propDialog.find('ul.jras-tabs-nav li a').css('padding-top', '11px');}
makeServiceGUIButton();
updateGuiLocalize();
propDlgTabsClick($propDialog);
propDlgItemsNeedClick($propDialog);
}
function propDlgTabsClick($propDialog){
$propDialog.find('[id*=jras-tabs-nav-]').click(function () {
const currTabNum = $(this).attr('id').replace('jras-tabs-nav-', '');
switch (currTabNum) {
case '5':
updateUserOptions();
$propDialog.find('#jras-gui-ExpImpData').val(userOptions.exportUserData(page.currentUser));
break;
}
$propDialog.find('#jras-prop-gui-tabs').tabs({ active: currTabNum });
});
}
function propDlgItemsNeedClick($propDialog) {
$propDialog.find('[needClick="true"]').click(function () {
switch ($(this).attr('id')) {
case 'jras-gui-ExpImpData':
$(this).focus();
$(this).select();
break;
case 'jras-gui-Import':
userOptions.importUserData(page.currentUser, $propDialog.find('textarea#jras-gui-ExpImpData').val());
closeSettingDialog();
break;
case 'jras-gui-SaveSettings':
updateUserOptions();
userOptions.saveUserData(page.currentUser);
updateGuiLocalize();
closeSettingDialog();
break;
case 'jras-gui-sendPMforMe':
closeSettingDialog();
sendPM('AntiUser');
break;
case 'jras-gui-DeleteAllSavedSettings':
closeSettingDialog();
userOptions.removeAllSavedData();
break;
case 'jras-gui-ResetSettings':
closeSettingDialog();
userOptions.setDef();
break;
}
});
}
function openProp(){
const $propDialog = $('#jras-prop-gui-dialog');
userOptions.each(function(thd, optName, opt){
switch(opt.propData().type) {
case 'checkbox':
$propDialog.find('#' + getPropID(optName) + 'Val').prop('checked', userOptions.val(optName));
break;
case 'radio':
$propDialog.find('#' + getPropID(optName) + 'Val').prop('checked', userOptions.val(optName));
break;
case 'combobox':
case 'number':
$propDialog.find('#' + getPropID(optName) + 'Val').val(userOptions.val(optName));
break;
}
});
$propDialog.find('#jras-guiBlockUserList').val(userOptions.data.BlockUsers.join("\n"));
$propDialog.find('#jras-guiBlockTagList').val(userOptions.data.BlockTags.join("\n"));
$propDialog.find('#jras-prop-gui-tabs').tabs({active: 0});
$propDialog.find('#jras-prop-gui-tabs').tabs({selected: 0});
$propDialog.find('#jras-prop-gui-tabs').tabs({focused: 0});
}
function updateGuiLocalize(){
const $propDialog = $('#jras-prop-gui-dialog');
$propDialog.find('#jras-gui-Import').attr('value', lng.getVal('JRAS_GUI_BTNIMPORT'));
$propDialog.find('#jras-gui-SaveSettings').attr('value', lng.getVal('JRAS_GUI_BTNSAVE'));
$propDialog.find('#jras-gui-sendPMforMe').attr('title', lng.getVal('JRAS_GUI_BTNSENDPMME'));
$propDialog.find('#jras-gui-DeleteAllSavedSettings').attr('title', lng.getVal('JRAS_GUI_BTNDELETESETT'));
$propDialog.find('#jras-gui-ResetSettings').attr('title', lng.getVal('JRAS_GUI_BTNRESETSETT'));
$propDialog.find('#jras-tabs-nav-0 a').text(lng.getVal('JRAS_GUI_TABMAIN'));
$propDialog.find('#jras-tabs-nav-1 a').text(lng.getVal('JRAS_GUI_TABBLOCK'));
$propDialog.find('#jras-tabs-nav-2 a').text(lng.getVal('JRAS_GUI_TABTOOLTIP'));
$propDialog.find('#jras-tabs-nav-3 a').text(lng.getVal('JRAS_GUI_TABCOMMENTS'));
$propDialog.find('#jras-tabs-nav-4 a').text(lng.getVal('JRAS_GUI_TABSTYLE'));
$propDialog.find('#jras-tabs-nav-5 a').text(lng.getVal('JRAS_GUI_TABEXPIMP'));
$propDialog.find('#jras-guiBlockUserListCaption').text(lng.getVal('JRAS_GUI_BLOCKUSERLIST'));
$propDialog.find('#jras-guiBlockTagListCaption').text(lng.getVal('JRAS_GUI_BLOCKTAGLIST'));
$propDialog.find('#jras-gui-ExpImpCaption').text(lng.getVal('JRAS_GUI_EXPIMP'));
userOptions.each(function(thd, optName){
$propDialog.find('#' + getPropID(optName) + 'Caption').text(userOptions.getGuiDesc(optName));
});
}
function makeServiceGUIButton(){
const $propDialog = $('#jras-prop-gui-dialog');
if(page.isNewDesign){
$propDialog.find('#jras-gui-SaveSettings').css('border-radius', '3px');
$propDialog.find('#jras-prop-gui-bottomCcontent').prepend(`
<div id="jras-gui-sendPMforMe" needClick="true" class="big_button jras-gui-btn-newdesign jras-prop-gui-button-left jras-gui-btn-pmme" title=""> </div>
<div id="jras-gui-DeleteAllSavedSettings" needClick="true" class="big_button jras-gui-btn-newdesign jras-prop-gui-button-left jras-gui-btn-deleteall" title="" > </div>
<div id="jras-gui-ResetSettings" needClick="true" class="big_button jras-gui-btn-newdesign jras-prop-gui-button-left jras-gui-btn-resetdef" title="" > </div>
`);
}else{
$propDialog.find('#jras-prop-gui-bottomCcontent').prepend(`
<input id="jras-gui-sendPMforMe" needClick="true" style="padding-left: 3px;padding-right: 3px;width: 24px;height: 22px;" class="jras-prop-gui-button-left jras-gui-btn-pmme" title="" value="" type="button">
<input id="jras-gui-DeleteAllSavedSettings" needClick="true" style="padding-left: 3px; padding-right: 3px; width: 24px; height: 22px;" class="jras-prop-gui-button-left jras-gui-btn-deleteall" title="" value="" type="button">
<input id="jras-gui-ResetSettings" needClick="true" style="padding-left: 3px; padding-right: 3px; width: 24px; height: 22px;" class="jras-prop-gui-button-left jras-gui-btn-resetdef" title="" value="" type="button">
`);
}
}
function updateUserOptions() {
const $propDialog = $('#jras-prop-gui-dialog');
userOptions.each(function(thd, optName, opt){
switch(opt.propData().type) {
case 'checkbox':
userOptions.val(optName, $propDialog.find('#' + getPropID(optName) + 'Val').prop('checked'));
break;
case 'radio':
userOptions.val(optName, $propDialog.find('#' + getPropID(optName) + 'Val').prop('checked'));
break;
case 'combobox':
case 'number':
userOptions.val(optName, $propDialog.find('#' + getPropID(optName) + 'Val').val());
break;
}
});
userOptions.data.BlockUsers = $propDialog.find('#jras-guiBlockUserList').val().split('\n');
userOptions.data.BlockTags = $propDialog.find('#jras-guiBlockTagList').val().split('\n');
}
function PageData(){
const getColorSchema = function(){ // light or dark
let c = window.getComputedStyle($('body')[0], null).getPropertyValue('background-color');
if (!c){c = $('body').css('background-color')}
const rgb = (/^#[0-9A-F]{6}$/i.test(c)) ? c : c.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)/);
const mono = (rgb !== null)
? parseInt((0.2125 * rgb[1]) + (0.7154 * rgb[2]) + (0.0721 * rgb[3]), 10)
: 0;
return (mono <= 128) ? 'dark' : 'light';
};
// Opera 8.0+
this.isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Firefox 1.0+
this.isFirefox = typeof InstallTrigger !== 'undefined';
// At least Safari 3+: "[object HTMLElementConstructor]"
this.isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// Internet Explorer 6-11
this.isIE = /*@cc_on!@*/false || !!document.documentMode;
// Edge 20+
this.isEdge = !this.isIE && !!window.StyleMedia;
// Chrome 1+
this.isChrome = !!window.chrome && !!window.chrome.webstore;
// Blink engine detection
this.isBlink = (this.isChrome || this.isOpera) && !!window.CSS;
let regEx;
let matches;
this.currentPage = win.location.href;
this.isUserLogon = $('li.login.lastitem a').is('#logout');
this.currentUser = this.isUserLogon ? $('li.login a#settings').attr('href') : 'Anonymous';
if (this.currentUser != 'Anonymous'){
regEx = /(^.user.)(.+)/g;
matches = regEx.exec(this.currentUser);
this.currentUser = matches[2];
if (this.currentUser === undefined || this.currentUser == ''){
this.currentUser = 'Anonymous';
}
}
this.isSchemeLight = function(){
return getColorSchema() == 'light'
};
this.isNewDesignFunc = function(){
regEx = /^((https?:)(\/\/\/?)([\w]*(?::[\w]*)?@)?([\d\w\.-]+)(?::(\d+))?)?([\/\\\w\.()-]*)?(?:([?][^#]*)?(#.*)?)*/gmi;
matches = regEx.exec(this.currentPage);
if (matches[5] == undefined){
return false
}
return (matches[5] != 'old.reactor.cc') && (matches[5] != 'old.jr-proxy.com');
};
this.isNewDesign = this.isNewDesignFunc();
this.pageIs = function(page){
let retVal = false;
const regEx = /^((https?:)(\/\/\/?)([\w]*(?::[\w]*)?@)?([\d\w\.-]+)(?::(\d+))?)?([\/\\\w\.()-]*)?(?:([?][^#]*)?(#.*)?)*/gmi;
const matches = regEx.exec(this.currentPage);
if (matches[7] !== undefined){
if (matches[7].match(new RegExp('.*(' + page + ').*'))){
retVal = true;
}
}
return retVal;
};
this.rgb2hex = (rgb) => `#${rgb?.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/)?.slice(1).map(n => parseInt(n, 10).toString(16).padStart(2, '0')).join('')}`;
this.commentBgColor = () => this.rgb2hex($('.comment').css('background-color'));
}
function niceBytes(a){let b=0,c=parseInt(a,10)||0;for(;1024<=c&&++b;)c/=1024;return c.toFixed(10>c&&0<b?1:0)+" "+["bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][b]}
function LanguageData(){
this.getVal = function(val){
if (this[val] === undefined){return val}
const cl = userOptions.val('language');
if(!this[val][cl]){
return this[val]['ru'];
}
return this[val][cl];
};
this.getLangs = function(){
let retVal = {};
for(let a in this.JRAS_LANGLIST){
retVal[a] = this.JRAS_LANGLIST[a];
}
return retVal;
};
this.JRAS_LANGLIST = {
ru: 'Русский',
en: 'English'
};
this.JRAS_POSTBLOCKBYUSER = {
ru: 'Пост заблокированного пользователя: '
};
this.JRAS_TOGGLEBUTTONCAPTIONHIDE = {
ru: 'Скрыть'
};
this.JRAS_TOGGLEBUTTONCAPTIONSHOW = {
ru: 'Показать'
};
this.JRAS_EXTGIFTITLESIZESTR = {
ru: 'Размер: '
};
this.JRAS_POSTBLOCKBYTAG = {
ru: 'Пост заблокированый по тегам: '
};
this.JRAS_COMMBLOCKBYUSER = {
ru: 'Комментарий заблокированного пользователя: '
};
this.JRAS_GUI_LANGUAGE = {
ru: 'Язык интерфейса: '
};
this.JRAS_GUI_MAKEAVATARONOLDDESIGN = {
ru: ' Создавать аватары для старого дизайна'
};
this.JRAS_GUI_MAKEAVATARONLYFULLPOST = {
ru: ' Создавать аватары только для полного поста'
};
this.JRAS_GUI_AVATARHEIGHT = {
ru: ' Размер аватара (px)'
};
this.JRAS_GUI_MAKETREECOMMENTS = {
ru: ' Создавать дерево комментариев'
};
this.JRAS_GUI_CORRECTREDIRECTLINK = {
ru: ' Раскрывать ссылки из редиректа'
};
this.JRAS_GUI_REMOVESHAREBUTTONS = {
ru: ' Удалить кнопки "Поделиться..." (vk, fb, twitter и т.п.)'
};
this.JRAS_GUI_TREECOMMENTSONLYFULLPOST = {
ru: ' Дерево комментариев только для полного поста'
};
this.JRAS_GUI_WHENCOLLAPSEMAKEREAD = {
ru: ' При сворачивании ветки комментариев все дочерние помечаются прочитанными'
};
this.JRAS_GUI_FIXEDTOPBAR = {
ru: ' Зафиксировать верхнюю панель наверху окна'
};
this.JRAS_GUI_HIDEFIXEDTOPBAR = {
ru: ' Скрывать зафиксированную верхнюю панель'
};
this.JRAS_GUI_ISTOBELOADINGUSERDATA = {
ru: ' Загружать данные пользователя для Tooltip\u0027а'
};
this.JRAS_GUI_HIDEUSERAWARDSWHEN = {
ru: ' Если медалек больше чем: '
};
this.JRAS_GUI_MINSHOWUSERAWARDS = {
ru: ' то показывать первые: '
};
this.JRAS_GUI_SHOWUTONLINE = {
ru: ' Показывать в ленте'
};
this.JRAS_GUI_SHOWUTONCOMMENT = {
ru: ' Показывать в комментариях'
};
this.JRAS_GUI_SHOWUTONPRIVATEMESS = {
ru: ' Показывать на странице ПМ'
};
this.JRAS_GUI_SHOWUTONPEOPLE = {
ru: ' Показывать на странице Люди'
};
this.JRAS_GUI_SHOWUTONSIDEBARTOPUSERS = {
ru: ' Показывать в правом баре для юзеров топа'
};
this.JRAS_GUI_SHOWUTONSIDEBARONLINE = {
ru: ' Показывать в правом баре для аватарок'
};
this.JRAS_GUI_SHOWUTONPOSTCONTROL = {
ru: ' Показывать на авторе в блоке управления постом'
};
this.JRAS_GUI_SHOWHIDDENCOMMENTS = {
ru: 'Загружать скрытые заминусованные коменты сразу'
};
this.JRAS_GUI_SHOWHIDDENCOMMENTSMARK = {
ru: 'Отмечать загруженные коменты'
};
this.JRAS_GUI_EXTENDEDGIFLINKS = {
ru: 'Ссылка на гифку как в новом дизижине'
};
this.JRAS_GUI_SHOWUTONTOPCOMMENTS = {
ru: ' Показывать в правом баре для лучших коментов'
};
this.JRAS_GUI_ISTOBELOADINGTAGDATA = {
ru: 'Загружать данные тега для Tooltip\u0027а'
};
this.JRAS_GUI_SHOWTTONLINE = {
ru: 'Показывать в ленте'
};
this.JRAS_GUI_SHOWTTFULLPOST = {
ru: 'Показывать в полном посте'
};
this.JRAS_GUI_SHOWTTONTRENDS = {
ru: ' Показывать в правом баре для трендов'
};
this.JRAS_GUI_SHOWTTONLIKETAGS = {
ru: ' Показывать в правом баре для любимых тегов'
};
this.JRAS_GUI_SHOWTTONINTERESTING = {
ru: ' Показывать в правом баре для интересного'
};
this.JRAS_GUI_CHATLANETOPACAKI = {
ru: ' Убирать цветовую отметку донатера'
};
this.JRAS_GUI_DELUSERCOMMENT = {
ru: 'Скрывать комментарий без возможности просмотра'
};
this.JRAS_GUI_SHOWUSERNAMEDELCOMMENT = {
ru: 'Показывать в заблокированном комментарии ник юзера'
};
this.JRAS_GUI_FULLDELUSERPOST = {
ru: 'Удалять пост из ленты полностью'
};
this.JRAS_GUI_DELUSERPOST = {
ru: 'Скрывать пост без возможности просмотра'
};
this.JRAS_GUI_SHOWUSERNAMEDELPOST = {
ru: 'Показывать в заблокированном посте ник юзера'
};
this.JRAS_GUI_BLOCKUSERLIST = {
ru: 'Заблокированные пользователи'
};
this.JRAS_GUI_BLOCKTAGLIST = {
ru: 'Заблокированные теги'
};
this.JRAS_GUI_COLLAPSECOMMENTS = {
ru: 'Уменьшать большие комментарии'
};
this.JRAS_GUI_COLLAPSECOMMENTSONLYFULLPOST = {
ru: 'Уменьшать большие комментарии только в полном посте'
};
this.JRAS_GUI_COLLAPSECOMMENTWHENSIZE = {
ru: 'Уменьшать если размер больше (px)'
};
this.JRAS_GUI_COLLAPSECOMMENTTOSIZE = {
ru: 'Уменьшать до (px)'
};
this.JRAS_GUI_BTNSAVE = {
ru: 'Сохранить'
};
this.JRAS_GUI_BTNSENDPMME = {
ru: 'Отправить мне персональное сообщение'
};
this.JRAS_GUI_BTNDELETESETT = {
ru: 'Удалить все сохраненные данные'
};
this.JRAS_GUI_BTNRESETSETT = {
ru: 'Настройки по умолчанию'
};
this.JRAS_GUI_TABMAIN = {
ru: 'Общие'
};
this.JRAS_GUI_TABBLOCK = {
ru: 'Блокировки'
};
this.JRAS_GUI_TABTOOLTIP = {
ru: 'Tooltip\u0027ы'
};
this.JRAS_GUI_TABCOMMENTS = {
ru: 'Комментарии'
};
this.JRAS_GUI_TABSTYLE = {
ru: 'Стиль'
};
this.JRAS_GUI_TABEXPIMP = {
ru: 'Экспорт/Импорт'
};
this.JRAS_LOADINGUSERDATA = {
ru: 'Загрузка данных...'
};
this.JRAS_SENDPRIVMESS = {
ru: 'Отправить сообщение'
};
this.JRAS_ADDFRIEND = {
ru: 'Добавить в друзья'
};
this.JRAS_REMOVEFRIEND = {
ru: 'Удалить из друзей'
};
this.JRAS_ADDTAGFAV = {
ru: 'Подписаться на тег'
};
this.JRAS_REMOVETAGFAV = {
ru: 'Отписаться от тега'
};
this.JRAS_TOOLTIP_MODERATOR = {
ru: 'Модератор...'
};
this.JRAS_TOOLTIP_TAGMODERATORS = {
ru: 'Модераторы...'
};
this.JRAS_TOOLTIP_STATISTICS = {
ru: 'Статистика: '
};
this.JRAS_TOOLTIP_POSTS = {
ru: 'Постов (х/л): '
};
this.JRAS_TOOLTIP_COMMENTS = {
ru: 'Комментариев:'
};
this.JRAS_TOOLTIP_REG = {
ru: 'Регистрация: '
};
this.JRAS_TOOLTIP_LASTLOGIN = {
ru: 'Посл. раз был: '
};
this.JRAS_BLOCKUSER_JR = {
ru: 'Блокировать юзера (JR)'
};
this.JRAS_UNBLOCKUSER_JR = {
ru: 'Разблокировать юзера (JR)'
};
this.JRAS_BLOCKUSER_JRAS = {
ru: 'Блокировать юзера (JRAS)'
};
this.JRAS_UNBLOCKUSER_JRAS = {
ru: 'Разблокировать юзера (JRAS)'
};
this.JRAS_BLOCKTAG_JR = {
ru: 'Блокировать тег (JR)'
};
this.JRAS_UNBLOCKTAG_JR = {
ru: 'Разблокировать тег (JR)'
};
this.JRAS_BLOCKTAG_JRAS = {
ru: 'Блокировать тег (JRAS)'
};
this.JRAS_UNBLOCKTAG_JRAS = {
ru: 'Разблокировать тег (JRAS)'
};
this.JRAS_COMMENTS_EXPANDCOLL_ALL = {
ru: 'Свернуть/развернуть всё'
};
this.JRAS_SENDPMDIALOG_SENDBUTTON = {
ru: 'Отправить'
};
this.JRAS_SENDPMDIALOG_CLOSEBUTTON = {
ru: 'Закрыть'
};
this.JRAS_SENDPMDIALOG_HEADERCAPTION = {
ru: 'Отправка сообщения для '
};
this.JRAS_SENDPMDIALOG_SENDMESS = {
ru: 'Отправка данных...'
};
this.JRAS_GUI_PCBSHOWPOSTCONTROL = {
ru: 'Блок управления постом'
};
this.JRAS_GUI_PCBSHOWINFULLPOST = {
ru: 'Только в полном посте'
};
this.JRAS_GUI_PCBHIDEJRSHAREBLOCK = {
ru: 'Скрывать блок шарных кнопок поста'
};
this.JRAS_GUI_PCBHIDEJRRATINGBLOCK = {
ru: 'Скрывать блок рейтинга поста'
};
this.JRAS_GUI_PCBTOPBORDER = {
ru: 'Верхний стопор для блока внутри поста (px)'
};
this.JRAS_GUI_PCBBOTTOMBORDER = {
ru: 'Нижний стопор для блока внутри поста (px)'
};
this.JRAS_GUI_PCBTOPSCREENPOS = {
ru: 'Верхняя позиция на экране (px)'
};
this.JRAS_ADDFAVORITE = {
ru: 'Добавить в избранное'
};
this.JRAS_REMOVEFAVORITE = {
ru: 'Удалить из избранного'
};
this.JRAS_GUI_SHOWCOMMENTDATE = {
ru: 'Показывать в коменте его дату'
};
this.JRAS_GUI_PCBANIMATEMOVE = {
ru: 'Анимировать перемещения блока'
};
this.JRAS_GUI_PCBANIMATEMOVESPEED = {
ru: 'Скорость перемещения при анимации (1-9)'
};
this.JRAS_GUI_PCBHIDESHAREBUTOONS = {
ru: 'Скрыть кнопки шары оставить только избранное'
};
this.JRAS_GUI_STCORRECTSTYLE = {
ru: 'Корректировать дизайн и стиль сайта'
};
this.JRAS_GUI_STHIDESIDEBAR = {
ru: 'Скрывать правое меню'
};
this.JRAS_GUI_STSTRETCHCONTENT = {
ru: 'Растягивать контент по границам экрана'
};
this.JRAS_GUI_STSTRETCHSIZE = {
ru: 'Растягивать контент на (%)'
};
this.JRAS_GUI_STSIDEBARSIZETOPAGE = {
ru: 'Устанавливать высоту страницы по высоте правого меню'
};
this.JRAS_GUI_STSHOWSIDEBARONHIDECONTENT = {
ru: 'Показывать правое меню когда контент вышел за границы'
};
this.JRAS_GUI_STUSEDYNSTYLECHANGES = {
ru: 'Мне нужны только динамические эффекты нового стиля (я использую JRAS style)'
};
this.JRAS_GUI_STCENTERCONTENT = {
ru: 'Центровать контент'
};
this.JRAS_GUI_EXPIMP = {
ru: 'Данные экпорта/импорта'
};
this.JRAS_GUI_BTNIMPORT = {
ru: 'Импортировать данные'
};
this.JRAS_GUI_CORRECTOLDREACTORLINK = {
ru: 'Поправить ссылки на old.reactor'
};
this.JRAS_GUI_PREVIEWREACTORLINK = {
ru: 'Превью для внутренних ссылок на посты и коменты'
};
this.JRAS_GUI_PREVIEWSIZEX = {
ru: 'Размер тултипа превью по горизонтали. % от окна страницы'
};
this.JRAS_GUI_PREVIEWSIZEY = {
ru: 'Размер тултипа превью по ветрикали. % от окна страницы'
};
this.JRAS_GUI_MAKEQUOTESONCOMMENTS = {
ru: 'Цитаты из строк начинающихся с символа ">"'
};
this.JRAS_GUI_QUOTEPOPUPERHINT = {
ru: 'Процитировать выделенный текст.\n Можно использовать хоткеи (перекрывает настройки)'
};
this.JRAS_GUI_MAKEEXTQUOTES = {
ru: 'Расширенная цитата (заголовок + текст)'
};
this.JRAS_GUI_MAKEQUOTETOOL = {
ru: 'Инструмент цитирования'
};
this.JRAS_GUI_QTADDUSERINFO = {
ru: 'При цитировании добавлять информацию о пользователе, которого цитируют'
};
this.JRAS_GUI_QTINSERTINTOSHOWINGINPUT = {
ru: 'Вставлять цитату в:'
};
this.JRAS_GUI_NEWANSWERALWAYS = {
ru: 'открывать форму ответа на цитируемое сообщение [ctrl]'
};
this.JRAS_GUI_FINDOPENEDFORM = {
ru: 'найти уже открытую форму ответа [shift]'
};
this.JRAS_GUI_ADDCOMMENTFORM = {
ru: 'форму создания нового коментария [ctrl+shift]'
};
this.JRAS_GUI_VIDEOSOUNDOPTIONS = {
ru: 'Управлять звуком на видео'
};
this.JRAS_VIDEO_SOUND_MUTE = {
ru: 'Выключить звук'
};
this.JRAS_VIDEO_SOUND_UNMUTE = {
ru: 'Включить звук'
};
this.JRAS_GUI_RESTARTVIDEOONUNMUTE = {
ru: 'При включении звука начинать видео сначала'
};
this.JRAS_GUI_VIDEOSOUNDMUTEONPOSTSCROLL = {
ru: 'Выключать звук когда пост уходит с экрана'
};
this.JRAS_GUI_VIDEOSOUNDMUTEONVIDEOSCROLL = {
ru: 'Выключать звук когда видео уходит с экрана'
};
this.JRAS_GUI_AUTOUNMUTEVIDEONONE = {
ru: 'Не включать звук автоматически'
};
this.JRAS_GUI_AUTOUNMUTEVIDEOONHALFSCREEN = {
ru: 'Автоматически включать звук при 50% видимости видео'
};
this.JRAS_GUI_AUTOUNMUTEVIDEOONSCREENMIDDLE = {
ru: 'Автоматически включать звук при пересечении середины экрана'
};
}
$(window).on('load', function () {
correctPageHeight();
});
}(typeof unsafeWindow != undefined ? unsafeWindow : window));