summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/FeedTree.js19
-rw-r--r--js/feedlist.js10
-rw-r--r--js/functions.js66
-rw-r--r--js/prefs.js7
-rw-r--r--js/tt-rss.js20
-rw-r--r--js/viewfeed.js116
6 files changed, 206 insertions, 32 deletions
diff --git a/js/FeedTree.js b/js/FeedTree.js
index 0b75629f0..2e686c156 100644
--- a/js/FeedTree.js
+++ b/js/FeedTree.js
@@ -162,6 +162,14 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
tnode._menu = menu;
}
+ if (id.match("CAT:")) {
+ loading = dojo.doc.createElement('img');
+ loading.className = 'loadingNode';
+ loading.src = 'images/blank_icon.gif';
+ dojo.place(loading, tnode.labelNode, 'after');
+ tnode.loadingNode = loading;
+ }
+
if (id.match("CAT:") && bare_id == -1) {
var menu = new dijit.Menu();
menu.row_id = bare_id;
@@ -243,8 +251,15 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
if (treeNode) {
treeNode = treeNode[0];
- treeNode.expandoNode.src = src;
- return true;
+ if (is_cat) {
+ if (treeNode.loadingNode) {
+ treeNode.loadingNode.src = src;
+ return true;
+ }
+ } else {
+ treeNode.expandoNode.src = src;
+ return true;
+ }
}
return false;
diff --git a/js/feedlist.js b/js/feedlist.js
index 4dc8b503e..ae4c3a2fb 100644
--- a/js/feedlist.js
+++ b/js/feedlist.js
@@ -125,13 +125,11 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) {
Form.enable("main_toolbar_form");
- if (!offset)
- if (!is_cat) {
- if (!setFeedExpandoIcon(feed, is_cat, 'images/indicator_white.gif'))
- notify_progress("Loading, please wait...", true);
- } else {
+ if (!offset) {
+ if (!setFeedExpandoIcon(feed, is_cat,
+ (is_cat) ? 'images/indicator_tiny.gif' : 'images/indicator_white.gif'))
notify_progress("Loading, please wait...", true);
- }
+ }
}
query += "&cat=" + is_cat;
diff --git a/js/functions.js b/js/functions.js
index be78294df..4840bcbe1 100644
--- a/js/functions.js
+++ b/js/functions.js
@@ -1746,7 +1746,7 @@ function feedBrowser() {
} });
},
removeFromArchive: function() {
- var selected = this.getSelectedFeeds();
+ var selected = this.getSelectedFeedIds();
if (selected.length > 0) {
@@ -1755,7 +1755,7 @@ function feedBrowser() {
if (confirm(pr)) {
Element.show('feed_browser_spinner');
- var query = "?op=rpc&method=remarchived&ids=" +
+ var query = "?op=rpc&method=remarchive&ids=" +
param_escape(selected.toString());;
new Ajax.Request("backend.php", {
@@ -1913,3 +1913,65 @@ function helpDialog(topic) {
}
}
+function htmlspecialchars_decode (string, quote_style) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Mirek Slugen
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Mateusz "loonquawl" Zalega
+ // + input by: ReverseSyntax
+ // + input by: Slawomir Kaniecki
+ // + input by: Scott Cariss
+ // + input by: Francois
+ // + bugfixed by: Onno Marsman
+ // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Brett Zamir (http://brett-zamir.me)
+ // + input by: Ratheous
+ // + input by: Mailfaker (http://www.weedem.fr/)
+ // + reimplemented by: Brett Zamir (http://brett-zamir.me)
+ // + bugfixed by: Brett Zamir (http://brett-zamir.me)
+ // * example 1: htmlspecialchars_decode("<p>this -&gt; &quot;</p>", 'ENT_NOQUOTES');
+ // * returns 1: '<p>this -> &quot;</p>'
+ // * example 2: htmlspecialchars_decode("&amp;quot;");
+ // * returns 2: '&quot;'
+ var optTemp = 0,
+ i = 0,
+ noquotes = false;
+ if (typeof quote_style === 'undefined') {
+ quote_style = 2;
+ }
+ string = string.toString().replace(/&lt;/g, '<').replace(/&gt;/g, '>');
+ var OPTS = {
+ 'ENT_NOQUOTES': 0,
+ 'ENT_HTML_QUOTE_SINGLE': 1,
+ 'ENT_HTML_QUOTE_DOUBLE': 2,
+ 'ENT_COMPAT': 2,
+ 'ENT_QUOTES': 3,
+ 'ENT_IGNORE': 4
+ };
+ if (quote_style === 0) {
+ noquotes = true;
+ }
+ if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
+ quote_style = [].concat(quote_style);
+ for (i = 0; i < quote_style.length; i++) {
+ // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4
+ if (OPTS[quote_style[i]] === 0) {
+ noquotes = true;
+ } else if (OPTS[quote_style[i]]) {
+ optTemp = optTemp | OPTS[quote_style[i]];
+ }
+ }
+ quote_style = optTemp;
+ }
+ if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
+ string = string.replace(/&#0*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should
+ // string = string.replace(/&apos;|&#x0*27;/g, "'"); // This would also be useful here, but not a part of PHP
+ }
+ if (!noquotes) {
+ string = string.replace(/&quot;/g, '"');
+ }
+ // Put this in last place to avoid escape being double-decoded
+ string = string.replace(/&amp;/g, '&');
+
+ return string;
+}
diff --git a/js/prefs.js b/js/prefs.js
index e6257e1fb..082f62679 100644
--- a/js/prefs.js
+++ b/js/prefs.js
@@ -722,6 +722,13 @@ function editSelectedFeeds() {
}
} catch (e) { }
+ try {
+ if (!query.match("&hide_images=") &&
+ this.getChildByName('hide_images').attr('disabled') == false) {
+ query = query + "&hide_images=false";
+ }
+ } catch (e) { }
+
if (!query.match("&include_in_digest=") &&
this.getChildByName('include_in_digest').attr('disabled') == false) {
query = query + "&include_in_digest=false";
diff --git a/js/tt-rss.js b/js/tt-rss.js
index 357e07780..bced92674 100644
--- a/js/tt-rss.js
+++ b/js/tt-rss.js
@@ -659,17 +659,31 @@ function hotkey_handler(e) {
catchupRelativeToArticle(0);
return false;
case "article_scroll_down":
- scrollArticle(50);
+ var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame");
+
+ scrollArticle(ctr.offsetHeight/3);
return false;
case "article_scroll_up":
- scrollArticle(-50);
+ var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame");
+
+ scrollArticle(-ctr.offsetHeight/3);
return false;
case "close_article":
- closeArticlePanel();
+ if (isCdmMode()) {
+ if (!getInitParam("cdm_expanded")) {
+ cdmCollapseArticle(false, getActiveArticleId());
+ } else {
+ dismissArticle(getActiveArticleId());
+ }
+ } else {
+ closeArticlePanel();
+ }
return false;
case "email_article":
if (typeof emailArticle != "undefined") {
emailArticle();
+ } else if (typeof mailtoArticle != "undefined") {
+ mailtoArticle();
} else {
alert(__("Please enable mail plugin first."));
}
diff --git a/js/viewfeed.js b/js/viewfeed.js
index 622a8109f..5567c717a 100644
--- a/js/viewfeed.js
+++ b/js/viewfeed.js
@@ -205,6 +205,8 @@ function headlines_callback2(transport, offset, background, infscroll_req) {
_infscroll_request_sent = 0;
+ headlines_scroll_handler($("headlines-frame"));
+
notify("");
} catch (e) {
@@ -541,7 +543,7 @@ function moveToPost(mode, noscroll) {
} else if (next_id) {
cdmExpandArticle(next_id);
- cdmScrollToArticleId(next_id, noscroll);
+ cdmScrollToArticleId(next_id, true);
}
} else if (next_id) {
@@ -559,16 +561,28 @@ function moveToPost(mode, noscroll) {
var prev_article = $("RROW-" + prev_id);
var ctr = $("headlines-frame");
- if (!noscroll && article && article.offsetTop < ctr.scrollTop) {
- scrollArticle(-ctr.offsetHeight/2);
- } else if (!noscroll && prev_article &&
- prev_article.offsetTop < ctr.scrollTop) {
- cdmExpandArticle(prev_id);
- scrollArticle(-ctr.offsetHeight/2);
- } else if (prev_id) {
- cdmExpandArticle(prev_id);
- cdmScrollToArticleId(prev_id, noscroll);
+ if (!getInitParam("cdm_expanded")) {
+
+ if (!noscroll && article.offsetTop < ctr.scrollTop) {
+ scrollArticle(-ctr.offsetHeight/3);
+ } else {
+ cdmExpandArticle(prev_id);
+ cdmScrollToArticleId(prev_id, true);
+ }
+ } else {
+
+ if (!noscroll && article && article.offsetTop < ctr.scrollTop) {
+ scrollArticle(-ctr.offsetHeight/3);
+ } else if (!noscroll && prev_article &&
+ prev_article.offsetTop < ctr.scrollTop) {
+ cdmExpandArticle(prev_id);
+ scrollArticle(-ctr.offsetHeight/3);
+ } else if (prev_id) {
+ cdmExpandArticle(prev_id);
+ cdmScrollToArticleId(prev_id, noscroll);
+ }
}
+
} else if (prev_id) {
correctHeadlinesOffset(prev_id);
view(prev_id, getActiveFeedId());
@@ -1164,6 +1178,23 @@ function headlines_scroll_handler(e) {
try {
var hsp = $("headlines-spacer");
+ $$("#headlines-frame > div[id*=RROW]").each(
+ function(child) {
+ if (child.offsetTop <= $("headlines-frame").scrollTop +
+ $("headlines-frame").offsetHeight) {
+
+ var cencw = $("CENCW-" + child.id.replace("RROW-", ""));
+
+ if (cencw) {
+ cencw.innerHTML = htmlspecialchars_decode(cencw.innerHTML);
+ cencw.setAttribute('id', '');
+ Element.show(cencw);
+ }
+ }
+ }
+ );
+
+
if (!_infscroll_disable) {
if ((hsp && e.scrollTop + e.offsetHeight >= hsp.offsetTop - hsp.offsetHeight) ||
(e.scrollHeight != 0 &&
@@ -1185,7 +1216,7 @@ function headlines_scroll_handler(e) {
$$("#headlines-frame > div[id*=RROW][class*=Unread]").each(
function(child) {
- if ($("headlines-frame").scrollTop >
+ if (child.hasClassName("Unread") && $("headlines-frame").scrollTop >
(child.offsetTop + child.offsetHeight/2)) {
var id = child.id.replace("RROW-", "");
@@ -1312,8 +1343,36 @@ function catchupRelativeToArticle(below, id) {
}
}
+function cdmCollapseArticle(event, id) {
+ try {
+ var row = $("RROW-" + id);
+ var elem = $("CICD-" + id);
+
+ if (elem && row) {
+ var collapse = $$("div#RROW-" + id +
+ " span[class='collapseBtn']")[0];
+
+ Element.hide(elem);
+ Element.show("CEXC-" + id);
+ Element.hide(collapse);
+
+ markHeadline(id, false);
+
+ if (id == getActiveArticleId()) {
+ setActiveArticleId(0);
+ }
+
+ if (event) Event.stop(event);
+ }
+
+ } catch (e) {
+ exception_error("cdmCollapseArticle", e);
+ }
+}
+
function cdmExpandArticle(id) {
try {
+ console.log("cdmExpandArticle " + id);
hideAuxDlg();
@@ -1327,25 +1386,39 @@ function cdmExpandArticle(id) {
var old_offset = $("RROW-" + id).offsetTop;
if (getActiveArticleId() && elem && !getInitParam("cdm_expanded")) {
+ var collapse = $$("div#RROW-" + getActiveArticleId() +
+ " span[class='collapseBtn']")[0];
+
Element.hide(elem);
Element.show("CEXC-" + getActiveArticleId());
+ Element.hide(collapse);
}
setActiveArticleId(id);
elem = $("CICD-" + id);
+ var collapse = $$("div#RROW-" + id +
+ " span[class='collapseBtn']")[0];
+
+ var cencw = $("CENCW-" + id);
+
if (!Element.visible(elem)) {
+ if (cencw) {
+ cencw.innerHTML = htmlspecialchars_decode(cencw.innerHTML);
+ cencw.setAttribute('id', '');
+ Element.show(cencw);
+ }
+
Element.show(elem);
Element.hide("CEXC-" + id);
+ Element.show(collapse);
}
- /* var new_offset = $("RROW-" + id).offsetTop;
+ var new_offset = $("RROW-" + id).offsetTop;
- $("headlines-frame").scrollTop += (new_offset-old_offset);
-
- if ($("RROW-" + id).offsetTop != old_offset)
- $("headlines-frame").scrollTop = new_offset; */
+ if (old_offset > new_offset)
+ $("headlines-frame").scrollTop -= (old_offset-new_offset);
toggleUnread(id, 0, true);
toggleSelected(id);
@@ -1609,16 +1682,21 @@ function isCdmMode() {
return getInitParam("combined_display_mode");
}
-function markHeadline(id) {
+function markHeadline(id, marked) {
+ if (marked == undefined) marked = true;
+
var row = $("RROW-" + id);
if (row) {
var check = dijit.byId("RCHK-" + id);
if (check) {
- check.attr("checked", true);
+ check.attr("checked", marked);
}
- row.addClassName("Selected");
+ if (marked)
+ row.addClassName("Selected");
+ else
+ row.removeClassName("Selected");
}
}