NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name TJournal Unread Comments Navigator
// @description This script adds navigation buttons for unread comments
// @copyright 2016, Shara (https://tjournal.ru/users/6146)
// @license MIT License
// @namespace tj
// @include https://tjournal.ru/*
// @version 0.2
// @grant none
// ==/UserScript==
// ==OpenUserJS==
// @author imShara
// ==/OpenUserJS==
// ver 0.2 - Works after ajax comment refresh
// ver 0.1 - Initial version
let options = {
animate: true, // scrolling animation
animationSpeed: 250, // scrolling animation speed in milliseconds
circular: false, // circular switching between comments
position: 20, // comment position in percentage from bottom of window
scrollOver: true // swith between comments with scrolling over navigation buttons
}
let css = `
#unread-navigation {
position: fixed;
right: 0;
top: 50%;
width: 40px;
margin-top: 50px;
z-index: 10001;
background-color: #aaa;
text-align: center;
border-radius: 5px 0 0 5px;
font-size: 10px;
line-height: 10px;
font-weight: 400;
overflow: hidden;
}
#unread-navigation a {
color: #eee;
width: 40px;
display: block;
cursor: pointer;
}
#unread-navigation a.disabled {
color: #bbb;
}
#unread-navigation a:hover {
background-color: #999;
}
#unread-navigation #un-prev {
padding: 6px 0 8px 0;
}
#unread-navigation #un-prev:after {
}
#unread-navigation #un-next {
padding: 6px 0 8px 0;
}
.b-comment.unread-current {
background-color: #e1e7eb;
}`;
let html = `
<div id="unread-navigation">
<a id="un-prev" class="disabled">
<i class="icon-up-open"></i>
</a>
<a id="un-next" class="disabled">
<i class="icon-down-open"></i>
</a>
</div>`;
function initUI() {
// Init CSS
$('style').html(css).appendTo('head');
// Init HTML
unEl = $(html).appendTo('body');
prevEl = $('#un-prev');
nextEl = $('#un-next');
// Init Events
nextEl.on('click', next);
prevEl.on('click', prev);
if (options.scrollOver) {
unEl.on('wheel', scrollOver);
}
}
function updateUI() {
if (position <= 0 && !options.circular) {
prevEl.addClass('disabled');
nextEl.removeClass('disabled');
} else if (position == unreadEl.length - 1 && !options.circular) {
nextEl.addClass('disabled');
prevEl.removeClass('disabled');
} else {
prevEl.removeClass('disabled');
nextEl.removeClass('disabled');
}
}
function replaceRefreshCommentsFunction() {
if (!$('.b-comments-refresh a').length) return;
$('body').off('click', '.b-comments-refresh a');
$('body').on('click', '.b-comments-refresh a', function(e) {
e.preventDefault();
e.stopImmediatePropagation();
var commentsSort = $('.commentsSort .active > a').attr('data-type');
loadComments(paperId, commentsSort, function(){
if (supportsHtml5Storage()) {
if (typeof localStorage["commentText"+paperId] != 'undefined' && localStorage["commentText"+paperId].length > 0) {
$('#commentMessage').val(localStorage["commentText"+paperId]);
}
// REPLACED CODE
unreadEl = $('.unread');
if (unreadEl.length) {
position = 0;
if (!unEl) {
initUI();
}
updateUI();
scrollToUnread(position);
}
// REPLACED CODE
}
});
});
// Popping up event in stack
let stack = $._data($('body')[0], 'events')['click'];
let event = stack.pop();
stack.splice(0, 0, event);
}
function prev() {
if (prevEl.hasClass('disabled')) return;
if (position > 0) {
position--;
} else {
if (options.circular) {
position = unreadEl.length - 1;
}
}
updateUI();
scrollToUnread(position);
}
function next() {
if (nextEl.hasClass('disabled')) return;
if (position < unreadEl.length - 1) {
position++;
} else {
if (options.circular) {
position = 0;
}
}
updateUI();
scrollToUnread(position);
}
function scrollOver(event) {
if (event.originalEvent.deltaY > 0) {
next();
} else {
prev();
}
return false;
}
function scrollToUnread(number) {
let comment = unreadEl.eq(number);
let commentOffset = comment.offset();
let commentHeight = comment.outerHeight();
let windowHeight = $(window).height();
let scrollPos = commentOffset.top + commentHeight -
windowHeight + windowHeight / 100 * options.position;
$('.unread-current').removeClass('unread-current');
comment.addClass('unread-current');
if (options.animate) {
pageRoot.stop().animate({
scrollTop: scrollPos
}, options.animationSpeed);
} else {
$(window).scrollTop(scrollPos);
}
}
function start() {
replaceRefreshCommentsFunction();
unreadEl = $('.unread');
if (!unreadEl.length) return;
initUI();
updateUI();
}
// Runtime
let position = -1;
let unEl, prevEl, nextEl, unreadEl;
// Wait for comment builder script
setTimeout(start, 100);