1 var _infscroll_disable = 0;
2 var _infscroll_request_sent = 0;
3 var _infscroll_tmp_disable = 0;
5 var _search_query = false;
6 var _viewfeed_last = 0;
7 var _viewfeed_timeout = false;
9 var counters_last_request = 0;
11 function viewCategory(cat) {
12 viewfeed(cat, '', true);
16 function loadMoreHeadlines() {
18 console.log("loadMoreHeadlines: " + _infscroll_tmp_disable);
20 if (_infscroll_tmp_disable) return;
24 var view_mode = document.forms["main_toolbar_form"].view_mode.value;
25 var unread_in_buffer = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length;
26 var num_all = $$("#headlines-frame > div[id*=RROW]").length;
27 var num_unread = getFeedUnread(getActiveFeedId(), activeFeedIsCat());
29 // TODO implement marked & published
31 if (view_mode == "marked") {
32 console.warn("loadMoreHeadlines: marked is not implemented, falling back.");
34 } else if (view_mode == "published") {
35 console.warn("loadMoreHeadlines: published is not implemented, falling back.");
37 } else if (view_mode == "unread") {
38 offset = unread_in_buffer;
39 } else if (_search_query) {
41 } else if (view_mode == "adaptive") {
42 offset = num_unread > 0 ? unread_in_buffer : num_all;
47 console.log("offset: " + offset);
49 viewfeed(getActiveFeedId(), '', activeFeedIsCat(), offset, false, true);
52 exception_error("viewNextFeedPage", e);
57 function viewfeed(feed, method, is_cat, offset, background, infscroll_req, can_wait) {
59 if (is_cat == undefined)
64 if (method == undefined) method = '';
65 if (offset == undefined) offset = 0;
66 if (background == undefined) background = false;
67 if (infscroll_req == undefined) infscroll_req = false;
69 last_requested_article = 0;
71 if (feed != getActiveFeedId() || activeFeedIsCat() != is_cat) {
72 if (!background && _search_query) _search_query = false;
76 _viewfeed_last = get_timestamp();
78 if (getActiveFeedId() != feed || offset == 0) {
79 setActiveArticleId(0);
80 _infscroll_disable = 0;
83 if (offset != 0 && !method) {
84 var timestamp = get_timestamp();
86 if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) {
87 //console.log("infscroll request in progress, aborting");
91 _infscroll_request_sent = timestamp;
95 Form.enable("main_toolbar_form");
97 var toolbar_query = Form.serialize("main_toolbar_form");
99 var query = "?op=feeds&method=view&feed=" + param_escape(feed) + "&" +
103 query = query + "&m=" + param_escape(method);
107 if (current_first_id) {
108 query = query + "&fid=" + param_escape(current_first_id);
114 force_nocache = true;
115 query = query + "&" + _search_query;
116 //_search_query = false;
120 query = query + "&skip=" + offset;
122 // to prevent duplicate feed titles when showing grouped vfeeds
123 if (vgroup_last_feed) {
124 query = query + "&vgrlf=" + param_escape(vgroup_last_feed);
127 if (!method && !is_cat && feed == getActiveFeedId()) {
128 query = query + "&m=ForceUpdate";
132 Form.enable("main_toolbar_form");
134 if (!setFeedExpandoIcon(feed, is_cat,
135 (is_cat) ? 'images/indicator_tiny.gif' : 'images/indicator_white.gif'))
136 notify_progress("Loading, please wait...", true);
139 query += "&cat=" + is_cat;
143 if (can_wait && _viewfeed_timeout) {
144 setFeedExpandoIcon(getActiveFeedId(), activeFeedIsCat(), 'images/blank_icon.gif');
145 clearTimeout(_viewfeed_timeout);
148 setActiveFeedId(feed, is_cat);
150 timeout_ms = can_wait ? 250 : 0;
151 _viewfeed_timeout = setTimeout(function() {
153 new Ajax.Request("backend.php", {
155 onComplete: function(transport) {
156 setFeedExpandoIcon(feed, is_cat, 'images/blank_icon.gif');
157 headlines_callback2(transport, offset, background, infscroll_req);
158 PluginHost.run(PluginHost.HOOK_FEED_LOADED, [feed, is_cat]);
160 }, timeout_ms); // Wait 250ms
163 exception_error("viewfeed", e);
167 function feedlist_init() {
169 console.log("in feedlist init");
171 loading_set_progress(50);
173 document.onkeydown = hotkey_handler;
174 setTimeout("hotkey_prefix_timeout()", 5*1000);
176 if (!getActiveFeedId()) {
179 viewfeed(getActiveFeedId(), '', activeFeedIsCat());
182 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
184 request_counters(true);
188 exception_error("feedlist/init", e);
193 function request_counters(force) {
195 var date = new Date();
196 var timestamp = Math.round(date.getTime() / 1000);
198 if (force || timestamp - counters_last_request > 5) {
199 console.log("scheduling request of counters...");
201 counters_last_request = timestamp;
203 var query = "?op=rpc&method=getAllCounters&seq=" + next_seq();
206 query = query + "&last_article_id=" + getInitParam("last_article_id");
210 new Ajax.Request("backend.php", {
212 onComplete: function(transport) {
214 handle_rpc_json(transport);
216 exception_error("request_counters", e);
221 console.log("request_counters: rate limit reached: " + (timestamp - counters_last_request));
225 exception_error("request_counters", e);
229 function parse_counters(elems, scheduled_call) {
231 for (var l = 0; l < elems.length; l++) {
233 var id = elems[l].id;
234 var kind = elems[l].kind;
235 var ctr = parseInt(elems[l].counter);
236 var error = elems[l].error;
237 var has_img = elems[l].has_img;
238 var updated = elems[l].updated;
239 var auxctr = parseInt(elems[l].auxcounter);
241 if (id == "global-unread") {
247 if (id == "subscribed-feeds") {
252 if (getFeedUnread(id, (kind == "cat")) != ctr ||
256 setFeedUnread(id, (kind == "cat"), ctr);
257 setFeedValue(id, (kind == "cat"), 'auxcounter', auxctr);
260 setFeedValue(id, false, 'error', error);
261 setFeedValue(id, false, 'updated', updated);
265 setFeedIcon(id, false,
266 getInitParam("icons_url") + "/" + id + ".ico");
268 setFeedIcon(id, false, 'images/blank_icon.gif');
274 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
277 exception_error("parse_counters", e);
281 function getFeedUnread(feed, is_cat) {
283 var tree = dijit.byId("feedTree");
285 if (tree && tree.model)
286 return tree.model.getFeedUnread(feed, is_cat);
295 function getFeedCategory(feed) {
297 var tree = dijit.byId("feedTree");
299 if (tree && tree.model)
300 return tree.getFeedCategory(feed);
309 function hideOrShowFeeds(hide) {
310 var tree = dijit.byId("feedTree");
313 return tree.hideRead(hide, getInitParam("hide_read_shows_special"));
316 function getFeedName(feed, is_cat) {
317 var tree = dijit.byId("feedTree");
319 if (tree && tree.model)
320 return tree.model.getFeedValue(feed, is_cat, 'name');
323 function getFeedValue(feed, is_cat, key) {
325 var tree = dijit.byId("feedTree");
327 if (tree && tree.model)
328 return tree.model.getFeedValue(feed, is_cat, key);
336 function setFeedUnread(feed, is_cat, unread) {
338 var tree = dijit.byId("feedTree");
340 if (tree && tree.model)
341 return tree.model.setFeedUnread(feed, is_cat, unread);
344 exception_error("setFeedUnread", e);
348 function setFeedValue(feed, is_cat, key, value) {
350 var tree = dijit.byId("feedTree");
352 if (tree && tree.model)
353 return tree.model.setFeedValue(feed, is_cat, key, value);
360 function selectFeed(feed, is_cat) {
362 var tree = dijit.byId("feedTree");
364 if (tree) return tree.selectFeed(feed, is_cat);
367 exception_error("selectFeed", e);
371 function setFeedIcon(feed, is_cat, src) {
373 var tree = dijit.byId("feedTree");
375 if (tree) return tree.setFeedIcon(feed, is_cat, src);
378 exception_error("setFeedIcon", e);
382 function setFeedExpandoIcon(feed, is_cat, src) {
384 var tree = dijit.byId("feedTree");
386 if (tree) return tree.setFeedExpandoIcon(feed, is_cat, src);
389 exception_error("setFeedIcon", e);
394 function getNextUnreadFeed(feed, is_cat) {
396 var tree = dijit.byId("feedTree");
397 var nuf = tree.model.getNextUnreadFeed(feed, is_cat);
400 return tree.model.store.getValue(nuf, 'bare_id');
403 exception_error("getNextUnreadFeed", e);
407 function catchupCurrentFeed(mode) {
408 catchupFeed(getActiveFeedId(), activeFeedIsCat(), mode);
411 function catchupFeedInGroup(id) {
414 var title = getFeedName(id);
416 var str = __("Mark all articles in %s as read?").replace("%s", title);
418 if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) {
419 return viewCurrentFeed('MarkAllReadGR:' + id);
423 exception_error("catchupFeedInGroup", e);
427 function catchupFeed(feed, is_cat, mode) {
429 if (is_cat == undefined) is_cat = false;
435 str = __("Mark all articles in %s older than 1 day as read?");
438 str = __("Mark all articles in %s older than 1 week as read?");
441 str = __("Mark all articles in %s older than 2 weeks as read?");
444 str = __("Mark all articles in %s as read?");
447 var fn = getFeedName(feed, is_cat);
449 str = str.replace("%s", fn);
451 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
455 var catchup_query = "?op=rpc&method=catchupFeed&feed_id=" +
456 feed + "&is_cat=" + is_cat + "&mode=" + mode;
458 console.log(catchup_query);
460 notify_progress("Loading, please wait...", true);
462 new Ajax.Request("backend.php", {
463 parameters: catchup_query,
464 onComplete: function(transport) {
465 handle_rpc_json(transport);
467 var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
469 if (show_next_feed) {
470 var nuf = getNextUnreadFeed(feed, is_cat);
473 viewfeed(nuf, '', is_cat);
476 if (feed == getActiveFeedId() && is_cat == activeFeedIsCat()) {
485 exception_error("catchupFeed", e);
489 function decrementFeedCounter(feed, is_cat) {
491 var ctr = getFeedUnread(feed, is_cat);
494 setFeedUnread(feed, is_cat, ctr - 1);
495 global_unread = global_unread - 1;
499 var cat = parseInt(getFeedCategory(feed));
502 ctr = getFeedUnread(cat, true);
505 setFeedUnread(cat, true, ctr - 1);
512 exception_error("decrement_feed_counter", e);