diff --git a/feedlist.js b/feedlist.js
index a359e5ebd..d61ebfc23 100644
--- a/feedlist.js
+++ b/feedlist.js
@@ -30,71 +30,103 @@ function viewCategory(cat) {
return false;
}
-function render_offline_feedlist() {
- try {
- var tmp = "
";
+function printFeedEntry(id, title, row_class, unread, icon) {
- var rs = db.execute("SELECT SUM(unread) FROM articles WHERE marked = 1");
+ var tmp = "";
+ var fctr_class = "";
+ var feed_icon = "";
- var unread = 0;
+ if (unread > 0) {
+ row_class += "Unread";
+ fctr_class = "feedCtrHasUnread";
+ } else {
+ fctr_class = "feedCtrNoUnread";
+ }
- if (rs.isValidRow()) {
- unread = rs.field(0);
- }
+ if (icon) {
+ feed_icon = "";
+ } else {
+ feed_icon = "";
+ }
- var id = -1;
- var title = __("Starred articles");
- var row_class = "feed";
+ var link = ""+
+ title + "";
- if (unread > 0) {
- row_class += "Unread";
- fctr_class = "feedCtrHasUnread";
+ tmp += "- " + feed_icon +
+ "" + link + "";
+
+ tmp += " " +
+ "("+unread+")";
+
+ tmp += "
";
+
+ return tmp;
+}
+
+function get_local_feed_unread(id) {
+ try {
+ var rs;
+
+ if (id == -4) {
+ rs = db.execute("SELECT SUM(unread) FROM articles");
+ } else if (id == -1) {
+ rs = db.execute("SELECT SUM(unread) FROM articles WHERE marked = 1");
} else {
- fctr_class = "feedCtrNoUnread";
+ rs = db.execute("SELECT SUM(unread) FROM articles WHERE feed_id = ?", [id]);
}
- var link = ""+
- title + "";
+ if (rs.isValidRow()) {
+ return rs.field(0);
+ } else {
+ return 0;
+ }
- feed_icon = "";
+ } catch (e) {
+ exception_error("get_local_feed_unread", e);
+ }
+}
- tmp += "- " + feed_icon +
- "" + link + "";
+function render_offline_feedlist() {
+ try {
+ var tmp = "
";
- tmp += " " +
- "("+unread+")";
-
- tmp += "
";
+ var unread = get_local_feed_unread(-4);
+
+ global_unread = unread;
+ updateTitle();
+
+ tmp += printFeedEntry(-4, __("All articles"), "feed", unread,
+ "images/tag.png");
+
+ var unread = get_local_feed_unread(-1);
+
+ tmp += printFeedEntry(-1, __("Starred articles"), "feed", unread,
+ "images/mark_set.png");
tmp += "
";
- var rs = db.execute("SELECT id,title,has_icon FROM feeds ORDER BY title");
+ var rs = db.execute("SELECT feeds.id,feeds.title,has_icon,COUNT(articles.id) "+
+ "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+
+ "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+
+ "ORDER BY feeds.title");
while (rs.isValidRow()) {
var id = rs.field(0);
var title = rs.field(1);
var has_icon = rs.field(2);
+ var unread = rs.field(3);
- var rs_u = db.execute("SELECT SUM(unread) FROM articles WHERE feed_id = ?",
- [id]);
- var unread = 0;
+ var icon = "";
- if (rs_u.isValidRow()) {
- unread = rs_u.field(0);
- if (!unread) unread = 0;
+ if (has_icon) {
+ icon = "icons/" + id + ".ico";
}
var feed_icon = "";
- if (has_icon) {
- feed_icon = "";
- } else {
- feed_icon = "";
- }
-
var row_class = "feed";
if (unread > 0) {
@@ -104,17 +136,7 @@ function render_offline_feedlist() {
fctr_class = "feedCtrNoUnread";
}
- var link = ""+
- title + "";
-
- tmp += "- " + feed_icon +
- "" + link + "";
-
- tmp += " " +
- "("+unread+")";
-
- tmp += "
";
+ tmp += printFeedEntry(id, title, "feed", unread, icon);
rs.next();
}
@@ -686,7 +708,7 @@ function feedlist_init() {
document.onmousedown = mouse_down_handler;
document.onmouseup = mouse_up_handler;
- setTimeout("timeout()", 1);
+ if (!offline_mode) setTimeout("timeout()", 1);
if (typeof correctPNG != 'undefined') {
correctPNG();
@@ -945,3 +967,64 @@ function request_counters() {
exception_error("request_counters", e);
}
}
+
+function update_feedlist_counters() {
+ try {
+ var rs = db.execute("SELECT feeds.id,COUNT(articles.id) "+
+ "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+
+ "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+
+ "ORDER BY feeds.title");
+
+ while (rs.isValidRow()) {
+ var id = rs.field(0);
+ var ctr = rs.field(1);
+
+ var feedctr = document.getElementById("FEEDCTR-" + id);
+ var feedu = document.getElementById("FEEDU-" + id);
+ var feedr = document.getElementById("FEEDR-" + id);
+
+ if (feedctr && feedu && feedr) {
+
+ var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML));
+
+ feedu.innerHTML = ctr;
+
+ if (ctr > 0) {
+ feedctr.className = "feedCtrHasUnread";
+ if (!feedr.className.match("Unread")) {
+ var is_selected = feedr.className.match("Selected");
+
+ feedr.className = feedr.className.replace("Selected", "");
+ feedr.className = feedr.className.replace("Unread", "");
+
+ feedr.className = feedr.className + "Unread";
+
+ if (is_selected) {
+ feedr.className = feedr.className + "Selected";
+ }
+
+ }
+
+ if (row_needs_hl) {
+ new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5",
+ queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } );
+ }
+ } else {
+ feedctr.className = "feedCtrNoUnread";
+ feedr.className = feedr.className.replace("Unread", "");
+ }
+ }
+ rs.next();
+ }
+
+ hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
+
+ var unread = get_local_feed_unread(-4);
+
+ global_unread = unread;
+ updateTitle();
+
+ } catch (e) {
+ exception_error("update_feedlist_counters", e);
+ }
+}
diff --git a/viewfeed.js b/viewfeed.js
index 019d29229..3c9b30641 100644
--- a/viewfeed.js
+++ b/viewfeed.js
@@ -396,6 +396,7 @@ function view_offline(id, feed_id) {
}
render_article("FIXME");
+ update_feedlist_counters();
return false;