|
|
|
@@ -1,4 +1,7 @@
|
|
|
|
|
"use strict";
|
|
|
|
|
/* globals context, i18n, shortcut, shortcuts, url */
|
|
|
|
|
/* jshint globalstrict: true */
|
|
|
|
|
|
|
|
|
|
var $stream = null,
|
|
|
|
|
isCollapsed = true,
|
|
|
|
|
shares = 0,
|
|
|
|
@@ -49,9 +52,7 @@ function numberFormat(nStr) {
|
|
|
|
|
|
|
|
|
|
function incLabel(p, inc, spaceAfter) {
|
|
|
|
|
var i = str2int(p) + inc;
|
|
|
|
|
return i > 0
|
|
|
|
|
? ((spaceAfter ? '' : ' ') + '(' + numberFormat(i) + ')' + (spaceAfter ? ' ' : ''))
|
|
|
|
|
: '';
|
|
|
|
|
return i > 0 ? ((spaceAfter ? '' : ' ') + '(' + numberFormat(i) + ')' + (spaceAfter ? ' ' : '')) : '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function incUnreadsFeed(article, feed_id, nb) {
|
|
|
|
@@ -217,7 +218,7 @@ function toggleContent(new_active, old_active) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (context['does_lazyload']) {
|
|
|
|
|
if (context.does_lazyload) {
|
|
|
|
|
new_active.find('img[data-original], iframe[data-original]').each(function () {
|
|
|
|
|
this.setAttribute('src', this.getAttribute('data-original'));
|
|
|
|
|
this.removeAttribute('data-original');
|
|
|
|
@@ -230,17 +231,17 @@ function toggleContent(new_active, old_active) {
|
|
|
|
|
}
|
|
|
|
|
old_active.removeClass("active current");
|
|
|
|
|
new_active.addClass("current");
|
|
|
|
|
if (context['auto_remove_article'] && !old_active.hasClass('not_read')) {
|
|
|
|
|
if (context.auto_remove_article && !old_active.hasClass('not_read')) {
|
|
|
|
|
auto_remove(old_active);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
new_active.toggleClass('active');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var relative_move = context['current_view'] === 'global',
|
|
|
|
|
var relative_move = context.current_view === 'global',
|
|
|
|
|
box_to_move = $(relative_move ? "#panel" : "html,body");
|
|
|
|
|
|
|
|
|
|
if (context['sticky_post']) {
|
|
|
|
|
if (context.sticky_post) {
|
|
|
|
|
var prev_article = new_active.prevAll('.flux'),
|
|
|
|
|
new_pos = new_active.offset().top,
|
|
|
|
|
old_scroll = box_to_move.scrollTop();
|
|
|
|
@@ -252,7 +253,7 @@ function toggleContent(new_active, old_active) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (context['hide_posts']) {
|
|
|
|
|
if (context.hide_posts) {
|
|
|
|
|
if (relative_move) {
|
|
|
|
|
new_pos += old_scroll;
|
|
|
|
|
}
|
|
|
|
@@ -271,7 +272,7 @@ function toggleContent(new_active, old_active) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (context['auto_mark_article'] && new_active.hasClass('active')) {
|
|
|
|
|
if (context.auto_mark_article && new_active.hasClass('active')) {
|
|
|
|
|
mark_read(new_active, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -381,7 +382,7 @@ function collapse_entry() {
|
|
|
|
|
|
|
|
|
|
var flux_current = $(".flux.current");
|
|
|
|
|
flux_current.toggleClass("active");
|
|
|
|
|
if (isCollapsed && context['auto_mark_article']) {
|
|
|
|
|
if (isCollapsed && context.auto_mark_article) {
|
|
|
|
|
mark_read(flux_current, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -456,11 +457,11 @@ function inMarkViewport(flux, box_to_follow) {
|
|
|
|
|
|
|
|
|
|
function init_posts() {
|
|
|
|
|
var box_to_follow = $(window);
|
|
|
|
|
if (context['current_view'] === 'global') {
|
|
|
|
|
if (context.current_view === 'global') {
|
|
|
|
|
box_to_follow = $("#panel");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (context['auto_mark_scroll']) {
|
|
|
|
|
if (context.auto_mark_scroll) {
|
|
|
|
|
box_to_follow.scroll(function () {
|
|
|
|
|
$('.not_read:visible').each(function () {
|
|
|
|
|
if ($(this).children(".flux_content").is(':visible') && inMarkViewport($(this), box_to_follow)) {
|
|
|
|
@@ -470,7 +471,7 @@ function init_posts() {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (context['auto_load_more']) {
|
|
|
|
|
if (context.auto_load_more) {
|
|
|
|
|
box_to_follow.scroll(function () {
|
|
|
|
|
var load_more = $("#load_more");
|
|
|
|
|
if (!load_more.is(':visible')) {
|
|
|
|
@@ -487,7 +488,7 @@ function init_posts() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function init_column_categories() {
|
|
|
|
|
if (context['current_view'] !== 'normal') {
|
|
|
|
|
if (context.current_view !== 'normal') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -559,14 +560,16 @@ function init_shortcuts() {
|
|
|
|
|
}, {
|
|
|
|
|
'disable_in_input': true
|
|
|
|
|
});
|
|
|
|
|
for(var i = 1; i < 10; i++){
|
|
|
|
|
shortcut.add(i.toString(), function (e) {
|
|
|
|
|
if ($('#dropdown-query').siblings('.dropdown-menu').is(':visible')) {
|
|
|
|
|
user_filter(String.fromCharCode(e.keyCode));
|
|
|
|
|
} else {
|
|
|
|
|
auto_share(String.fromCharCode(e.keyCode));
|
|
|
|
|
}
|
|
|
|
|
}, {
|
|
|
|
|
|
|
|
|
|
function addShortcut(evt) {
|
|
|
|
|
if ($('#dropdown-query').siblings('.dropdown-menu').is(':visible')) {
|
|
|
|
|
user_filter(String.fromCharCode(evt.keyCode));
|
|
|
|
|
} else {
|
|
|
|
|
auto_share(String.fromCharCode(evt.keyCode));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for(var i = 1; i < 10; i++) {
|
|
|
|
|
shortcut.add(i.toString(), addShortcut, {
|
|
|
|
|
'disable_in_input': true
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
@@ -628,7 +631,7 @@ function init_shortcuts() {
|
|
|
|
|
shortcut.add(shortcuts.go_website, function () {
|
|
|
|
|
var url_website = $('.flux.current > .flux_header > .title > a').attr("href");
|
|
|
|
|
|
|
|
|
|
if (context['auto_mark_site']) {
|
|
|
|
|
if (context.auto_mark_site) {
|
|
|
|
|
$(".flux.current").each(function () {
|
|
|
|
|
mark_read($(this), true);
|
|
|
|
|
});
|
|
|
|
@@ -652,7 +655,7 @@ function init_shortcuts() {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
shortcut.add(shortcuts.help, function () {
|
|
|
|
|
redirect(url['help'], true);
|
|
|
|
|
redirect(url.help, true);
|
|
|
|
|
}, {
|
|
|
|
|
'disable_in_input': true
|
|
|
|
|
});
|
|
|
|
@@ -674,7 +677,7 @@ function init_stream(divStream) {
|
|
|
|
|
new_active = $(this).parent();
|
|
|
|
|
isCollapsed = true;
|
|
|
|
|
if (e.target.tagName.toUpperCase() === 'A') { //Leave real links alone
|
|
|
|
|
if (context['auto_mark_article']) {
|
|
|
|
|
if (context.auto_mark_article) {
|
|
|
|
|
mark_read(new_active, true);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
@@ -684,7 +687,7 @@ function init_stream(divStream) {
|
|
|
|
|
|
|
|
|
|
divStream.on('click', '.flux a.read', function () {
|
|
|
|
|
var active = $(this).parents(".flux");
|
|
|
|
|
if (context['auto_remove_article'] && active.hasClass('not_read')) {
|
|
|
|
|
if (context.auto_remove_article && active.hasClass('not_read')) {
|
|
|
|
|
auto_remove(active);
|
|
|
|
|
}
|
|
|
|
|
mark_read(active, false);
|
|
|
|
@@ -710,9 +713,9 @@ function init_stream(divStream) {
|
|
|
|
|
|
|
|
|
|
if (e.which == 2) {
|
|
|
|
|
// If middle click, we want same behaviour as CTRL+click.
|
|
|
|
|
var e = jQuery.Event("click");
|
|
|
|
|
e.ctrlKey = true;
|
|
|
|
|
$(this).trigger(e);
|
|
|
|
|
var ev = jQuery.Event("click");
|
|
|
|
|
ev.ctrlKey = true;
|
|
|
|
|
$(this).trigger(ev);
|
|
|
|
|
} else if(e.which == 1) {
|
|
|
|
|
// Normal click, just toggle article.
|
|
|
|
|
$(this).parent().click();
|
|
|
|
@@ -723,7 +726,7 @@ function init_stream(divStream) {
|
|
|
|
|
$(this).attr('target', '_blank');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (context['auto_mark_site']) {
|
|
|
|
|
if (context.auto_mark_site) {
|
|
|
|
|
// catch mouseup instead of click so we can have the correct behaviour
|
|
|
|
|
// with middle button click (scroll button).
|
|
|
|
|
divStream.on('mouseup', '.flux .link > a', function (e) {
|
|
|
|
@@ -765,17 +768,17 @@ var feed_processed = 0;
|
|
|
|
|
|
|
|
|
|
function updateFeed(feeds, feeds_count) {
|
|
|
|
|
var feed = feeds.pop();
|
|
|
|
|
if (feed == undefined) {
|
|
|
|
|
if (!feed) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
type: 'POST',
|
|
|
|
|
url: feed['url'],
|
|
|
|
|
url: feed.url,
|
|
|
|
|
}).complete(function (data) {
|
|
|
|
|
feed_processed++;
|
|
|
|
|
$("#actualizeProgress .progress").html(feed_processed + " / " + feeds_count);
|
|
|
|
|
$("#actualizeProgress .title").html(feed['title']);
|
|
|
|
|
$("#actualizeProgress .title").html(feed.title);
|
|
|
|
|
|
|
|
|
|
if (feed_processed === feeds_count) {
|
|
|
|
|
window.location.reload();
|
|
|
|
@@ -819,7 +822,7 @@ function init_actualize() {
|
|
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (context['auto_actualize_feeds']) {
|
|
|
|
|
if (context.auto_actualize_feeds) {
|
|
|
|
|
auto = true;
|
|
|
|
|
$("#actualize").click();
|
|
|
|
|
}
|
|
|
|
@@ -887,12 +890,12 @@ function notifs_html5_ask_permission() {
|
|
|
|
|
|
|
|
|
|
function notifs_html5_show(nb) {
|
|
|
|
|
if (notifs_html5_permission !== "granted") {
|
|
|
|
|
return
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var notification = new window.Notification(i18n['notif_title_articles'], {
|
|
|
|
|
var notification = new window.Notification(i18n.notif_title_articles, {
|
|
|
|
|
icon: "../themes/icons/favicon-256.png",
|
|
|
|
|
body: i18n['notif_body_articles'].replace('%d', nb),
|
|
|
|
|
body: i18n.notif_body_articles.replace('%d', nb),
|
|
|
|
|
tag: "freshRssNewArticles"
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@@ -900,10 +903,10 @@ function notifs_html5_show(nb) {
|
|
|
|
|
window.location.reload();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (context['html5_notif_timeout'] !== 0) {
|
|
|
|
|
if (context.html5_notif_timeout !== 0) {
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
notification.close();
|
|
|
|
|
}, context['html5_notif_timeout'] * 1000);
|
|
|
|
|
}, context.html5_notif_timeout * 1000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -930,7 +933,7 @@ function refreshUnreads() {
|
|
|
|
|
(nbUnreads - feed_unreads > 0)) {
|
|
|
|
|
$('#new-article').attr('aria-hidden', 'false').show();
|
|
|
|
|
new_articles = true;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var nb_unreads = str2int($('.category.all .title').attr('data-unread'));
|
|
|
|
@@ -957,7 +960,7 @@ function load_more_posts() {
|
|
|
|
|
$.get(url_load_more, function (data) {
|
|
|
|
|
box_load_more.children('.flux:last').after($('#stream', data).children('.flux, .day'));
|
|
|
|
|
$('.pagination').replaceWith($('.pagination', data));
|
|
|
|
|
if (context['display_order'] === 'ASC') {
|
|
|
|
|
if (context.display_order === 'ASC') {
|
|
|
|
|
$('#nav_menu_read_all > .read_all').attr(
|
|
|
|
|
'formaction', $('#bigMarkAsRead').attr('formaction')
|
|
|
|
|
);
|
|
|
|
@@ -988,7 +991,7 @@ function focus_search() {
|
|
|
|
|
function init_load_more(box) {
|
|
|
|
|
box_load_more = box;
|
|
|
|
|
|
|
|
|
|
if (!context['does_lazyload']) {
|
|
|
|
|
if (!context.does_lazyload) {
|
|
|
|
|
$('img[postpone], audio[postpone], iframe[postpone], video[postpone]').each(function () {
|
|
|
|
|
this.removeAttribute('postpone');
|
|
|
|
|
});
|
|
|
|
@@ -1027,6 +1030,7 @@ function poormanSalt() { //If crypto.getRandomValues is not available
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function init_crypto_form() {
|
|
|
|
|
/* globals dcodeIO */
|
|
|
|
|
var $crypto_form = $('#crypto-form');
|
|
|
|
|
if ($crypto_form.length === 0) {
|
|
|
|
|
return;
|
|
|
|
@@ -1050,7 +1054,7 @@ function init_crypto_form() {
|
|
|
|
|
dataType: 'json',
|
|
|
|
|
async: false
|
|
|
|
|
}).done(function (data) {
|
|
|
|
|
if (data.salt1 == '' || data.nonce == '') {
|
|
|
|
|
if (!data.salt1 || !data.nonce) {
|
|
|
|
|
openNotification('Invalid user!', 'bad');
|
|
|
|
|
} else {
|
|
|
|
|
try {
|
|
|
|
@@ -1058,7 +1062,7 @@ function init_crypto_form() {
|
|
|
|
|
s = dcodeIO.bcrypt.hashSync($('#passwordPlain').val(), data.salt1),
|
|
|
|
|
c = dcodeIO.bcrypt.hashSync(data.nonce + s, strong ? dcodeIO.bcrypt.genSaltSync(4) : poormanSalt());
|
|
|
|
|
$('#challenge').val(c);
|
|
|
|
|
if (s == '' || c == '') {
|
|
|
|
|
if (!s || !c) {
|
|
|
|
|
openNotification('Crypto error!', 'bad');
|
|
|
|
|
} else {
|
|
|
|
|
success = true;
|
|
|
|
@@ -1083,7 +1087,7 @@ function init_confirm_action() {
|
|
|
|
|
$('body').on('click', '.confirm', function () {
|
|
|
|
|
var str_confirmation = $(this).attr('data-str-confirm');
|
|
|
|
|
if (!str_confirmation) {
|
|
|
|
|
str_confirmation = i18n['confirmation_default'];
|
|
|
|
|
str_confirmation = i18n.confirmation_default;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return confirm(str_confirmation);
|
|
|
|
@@ -1092,13 +1096,13 @@ function init_confirm_action() {
|
|
|
|
|
|
|
|
|
|
function init_print_action() {
|
|
|
|
|
$('.item.share > a[href="#"]').click(function () {
|
|
|
|
|
var content = "<html><head><style>"
|
|
|
|
|
+ "body { font-family: Serif; text-align: justify; }"
|
|
|
|
|
+ "a { color: #000; text-decoration: none; }"
|
|
|
|
|
+ "a:after { content: ' [' attr(href) ']'}"
|
|
|
|
|
+ "</style></head><body>"
|
|
|
|
|
+ $(".flux.current .content").html()
|
|
|
|
|
+ "</body></html>";
|
|
|
|
|
var content = "<html><head><style>" +
|
|
|
|
|
"body { font-family: Serif; text-align: justify; }" +
|
|
|
|
|
"a { color: #000; text-decoration: none; }" +
|
|
|
|
|
"a:after { content: ' [' attr(href) ']'}" +
|
|
|
|
|
"</style></head><body>" +
|
|
|
|
|
$(".flux.current .content").html() +
|
|
|
|
|
"</body></html>";
|
|
|
|
|
|
|
|
|
|
var tmp_window = window.open();
|
|
|
|
|
tmp_window.document.writeln(content);
|
|
|
|
@@ -1291,6 +1295,22 @@ function parseJsonVars() {
|
|
|
|
|
window.icons = json.icons;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function init_normal() {
|
|
|
|
|
$stream = $('#stream');
|
|
|
|
|
if ($stream.length < 1) {
|
|
|
|
|
if (window.console) {
|
|
|
|
|
console.log('FreshRSS waiting for content…');
|
|
|
|
|
}
|
|
|
|
|
window.setTimeout(init_normal, 50);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
init_column_categories();
|
|
|
|
|
init_stream($stream);
|
|
|
|
|
init_shortcuts();
|
|
|
|
|
init_actualize();
|
|
|
|
|
faviconNbUnread();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function init_beforeDOM() {
|
|
|
|
|
if (!window.$) {
|
|
|
|
|
if (window.console) {
|
|
|
|
@@ -1300,20 +1320,8 @@ function init_beforeDOM() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
init_confirm_action();
|
|
|
|
|
if (['normal', 'reader', 'global'].indexOf(context['current_view']) >= 0) {
|
|
|
|
|
$stream = $('#stream');
|
|
|
|
|
if ($stream.length < 1) {
|
|
|
|
|
if (window.console) {
|
|
|
|
|
console.log('FreshRSS waiting for content…');
|
|
|
|
|
}
|
|
|
|
|
window.setTimeout(init_beforeDOM, 50);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
init_column_categories();
|
|
|
|
|
init_stream($stream);
|
|
|
|
|
init_shortcuts();
|
|
|
|
|
init_actualize();
|
|
|
|
|
faviconNbUnread();
|
|
|
|
|
if (['normal', 'reader', 'global'].indexOf(context.current_view) >= 0) {
|
|
|
|
|
init_normal();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|