AntiUser / Joyreactor advanced script

// ==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.2.0
// @grant       GM.getValue
// @grant       GM.setValue
// @grant       GM.listValues
// @grant       GM.deleteValue
// @grant       GM.xmlhttpRequest
// @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.2.0';

/* RELEASE NOTES
 2.2.0
   + переработка механизма сохранения настроек (Issue-59)
   + импорт/экспорт настроек (Issue-59)
   + корректировка размера страницы после окончательной ее загрузки (Issue-55)
   + корректировка ссылок на old (Issue-64)
   + превью внутренних ссылок реактора. Только ссылки на пост или комент (Issue-58)
 1.9.1
   * Поддержка нового движка FireFox и нового GreaseMonkey (Issue-51)
 1.9.0
   * кнопки перехода в начало и конец поста (Issue-48)
 1.8.9
   * перенос длинных ников в тултипе
 1.8.8
   * Центрование контента (изображения, гифки, фреймы) (Issue-46)
   * поправлена ширина коментов с новыми стилями на не черном олде
   + Опция Центровать контент [true]
 1.8.7
   * Размер страницы (динамический стиль) теперь считается нормально при разворачивании разных эледементов (Issue-43)
   * В свете длинных тегов поправлены стили. Не в скрипте, а в JRAS styles
 1.8.5
   * Мелкие фиксы
 1.8.4
   + Опция: мне нужны только динамические эффекты нового стиля [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 defLoadTooltipSize = 212;
  const defUserTooltipSize = 212;
  const defTagTooltipSize = 270;

  const lng = new LanguageData();
  const page = new PageData();

  const userOptions = initOptions();
  userOptions.loadUserData(page.currentUser);
  try{
    correctStyle();
    correctPostDate();
    addNewCSSClasses();
    themeDependentCSS();
    makePropElements();
    makeAllUserTooltip();
    makeAllTagTooltip();
    makePostControls();
    procTopbar();
    removeRedirectLink();
    removeShareButtons();
    correctOldReactorLink();
    previewReactorLink();

    if (page.pageIs('post') || page.pageIs('discussion')){
      showHiddenComments();
      correctCommentSize();
      makeTreeComments();
      makeAvatarOnOldDesign();
    }

    userRemove(userOptions.data.BlockUsers);
    tagRemove(userOptions.data.BlockTags, true);

    subscribeShowComment();

    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}}
        },

        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 selector = 'a[href*="reactor.cc/post/"]:not(a[href*="redirect?"], div.image>a)';
    const $selElmts = (!$srcElm)
      ? $(`.post_content ${selector}, .post_comment_list div.txt ${selector}`)
      : $srcElm.find(selector);
    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 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){
      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)'});
      }
    })
  }

  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');
              }
              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('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 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, onload){
    const xhr = new XMLHttpRequest();
    // xhr.withCredentials = true;
    xhr.open("GET", link, true);
    xhr.onreadystatechange = function(e){
      if (this.readyState != readyState){return}
      onload(e);
    };
    xhr.send();
  }

  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');
      prevLink = prevLink.replace(getDomain(prevLink, true), location.host);
      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.target.status != 200) {
        $outContainer.text('Loading error: ' + e.target.status);
      } else {
        const doc = document.implementation.createHTMLDocument("");
        doc.documentElement.innerHTML = e.target.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){
            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.target.status != 200){
        $outContainer.text('Loading error: ' + e.target.status);
      }else{
        const doc = document.implementation.createHTMLDocument("");
        doc.documentElement.innerHTML = e.target.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>&nbsp&gt&nbsp;</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.target.status != 200){
          $outContainer.text('Loading error: ' + e.target.status);
          // win.console.log("Loading user data error:  - " + response.status);
        }else{
          const doc = document.implementation.createHTMLDocument("");
          doc.documentElement.innerHTML = e.target.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:not([class])').not('[style*="border: black solid 1px"]').remove();
          $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('[style*="border: black solid 1px"]')
            .css({
              'border': '',
              '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
    }

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

    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><span id="jras-tooltip-posts-regdate"></b></span>
      </div>
    `).find('#jras-tooltip-posts-block');

    $modBlock.find('#jras-tooltip-posts-regdate').append($userPostsCont.find('span[id^=usertime]').clone());
  }

  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 themeDependentCSS(){
    if (!page.isSchemeLight()){
      newCssClass(`
        .post_content table td {
           border: 1px solid #474747;
        }
      `);
    }
  }

  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 addNewCSSClasses(){
    newCssClass(`

    	.video_gif_source{
        top: 0;
        right: 0;
      }
      .video_gif_holder {
        display: inline-block;
      }
      .video_gif_holder:hover .video_gif_source{
        display: block;
      }

     /* для старого дизайна */
      .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: -15px;
        margin-right: 6px;
        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-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;
     }

      /* Окно настроек  */
      .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 '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" style="margin-left: 20px; margin-top: -10px;"> ${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" style="margin-left: 20px; margin-top: -10px;"> ${getHTMLProp('showHiddenCommentsMark')} </section>
                    <section class="jras-prop-gui-section""> ${getHTMLProp('pcbShowPostControl')} </section>
                    <section class="jras-prop-gui-section" style="margin-left: 20px; margin-top: -10px;">
                      ${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" style="margin-top: -10px;"> ${getHTMLProp('showUserNameDelComment')} </section>
                    <section class="jras-prop-gui-section" style="margin-top: -10px;"> ${getHTMLProp('fullDelUserPost')} </section>
                    <section class="jras-prop-gui-section" style="margin-top: -10px;"> ${getHTMLProp('delUserPost')} </section>
                    <section class="jras-prop-gui-section" style="margin-top: -10px;"> ${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" style="margin-left: 20px; margin-top: -10px;">
                      ${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" style="margin-top: -10px;"> ${getHTMLProp('isToBeLoadingTagData')} </section>
                    <section class="jras-prop-gui-section" style="margin-left: 20px; margin-top: -10px;">
                      ${getHTMLProp('showTTOnLine')} <br>
                      ${getHTMLProp('showTTFullPost')} <br>
                      ${getHTMLProp('showTTOnTrends')} <br>
                      ${getHTMLProp('showTTOnLikeTags')} <br>
                      ${getHTMLProp('showTTOnInteresting')} </section>
                    <section class="jras-prop-gui-section" style="margin-top: -10px;"> ${getHTMLProp('previewReactorLink')} </section>  
                    <section class="jras-prop-gui-section" style="margin-left: 20px; margin-top: -10px;">
                      ${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" style="margin-left: 20px; margin-top: -10px;">
                      ${getHTMLProp('treeCommentsOnlyFullPost')} </section>
                    <section class="jras-prop-gui-section"> ${getHTMLProp('makeAvatarOnOldDesign')} </section>
                    <section class="jras-prop-gui-section" style="margin-left: 20px; margin-top: -10px;">
                      ${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" style="margin-left: 20px; margin-top: -10px;">
                      ${getHTMLProp('collapseCommentsOnlyFullPost')} <br>
                      ${getHTMLProp('collapseCommentWhenSize')} <br>
                      ${getHTMLProp('collapseCommentToSize')} </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" style="margin-left: 20px; margin-top: -10px;">
                      ${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 '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 '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 = $('#background').css('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.scheme = getColorSchema();
    this.isSchemeLight = function(){
      return this.scheme == '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;
    }
  }

  function getDomain(url, subdomain) {
    subdomain = subdomain || false;
    url = url.replace(/(https?:\/\/)?(www.)?/i, '');
    if (!subdomain) {
      url = url.split('.');
      url = url.slice(url.length - 2).join('.');
    }
    if (url.indexOf('/') !== -1) {
      return url.split('/')[0];
    }
    return url;
  }

  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_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_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_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: 'Размер тултипа превью по ветрикали. % от окна страницы'
    };
  }

  $(window).on('load', function () {
    correctPageHeight();
  });

}(typeof unsafeWindow != undefined ? unsafeWindow : window));