X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=feedlist.js;h=e0ffae7f18d835ba57d29c4f068c752b5ecc156e;hb=a299881140a256317dfa394489789bd1eea507d5;hp=b7d47b4a59763f8f9e480cea4bd6f2dfc1e28df0;hpb=5225d4209e52790af6bad454d7b6da6953551ace;p=tt-rss.git diff --git a/feedlist.js b/feedlist.js index b7d47b4a..e0ffae7f 100644 --- a/feedlist.js +++ b/feedlist.js @@ -1,633 +1,509 @@ -var _feed_cur_page = 0; var _infscroll_disable = 0; var _infscroll_request_sent = 0; -var feed_under_pointer = undefined; - -var mouse_is_down = false; -var mouse_y = 0; -var mouse_x = 0; +var _search_query = false; var counter_timeout_id = false; -var resize_enabled = false; -var selection_disabled = false; var counters_last_request = 0; -function toggle_sortable_feedlist(enabled) { - try { - - if (enabled) { - Sortable.create('feedList', {onChange: feedlist_dragsorted, only: "feedCat"}); - } else { - Sortable.destroy('feedList'); - } - - } catch (e) { - exception_error("toggle_sortable_feedlist", e); - } -} - function viewCategory(cat) { viewfeed(cat, '', true); return false; } -function render_feedlist(data) { +function loadMoreHeadlines() { try { + console.log("loadMoreHeadlines"); + + var offset = 0; + + var view_mode = document.forms["main_toolbar_form"].view_mode.value; + var num_unread = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length; + var num_all = $$("#headlines-frame > div[id*=RROW]").length; + + // TODO implement marked & published + + if (view_mode == "marked") { + console.warn("loadMoreHeadlines: marked is not implemented, falling back."); + offset = num_all; + } else if (view_mode == "published") { + console.warn("loadMoreHeadlines: published is not implemented, falling back."); + offset = num_all; + } else if (view_mode == "unread") { + offset = num_unread; + } else if (view_mode == "adaptive") { + if (num_unread > 0) + offset = num_unread; + else + offset = num_all; + } else { + offset = num_all; + } - var f = $("feeds-frame"); - f.innerHTML = data; -// cache_invalidate("FEEDLIST"); -// cache_inject("FEEDLIST", data, getInitParam("num_feeds")); - feedlist_init(); + viewfeed(getActiveFeedId(), '', activeFeedIsCat(), offset, false, true); } catch (e) { - exception_error("render_feedlist", e); + exception_error("viewNextFeedPage", e); } } -function viewNextFeedPage() { + +function viewfeed(feed, subop, is_cat, offset, background, infscroll_req) { try { - //if (!getActiveFeedId()) return; + if (is_cat == undefined) + is_cat = false; + else + is_cat = !!is_cat; - console.log("viewNextFeedPage: calling viewfeed(), p: " + parseInt(_feed_cur_page+1)); + if (subop == undefined) subop = ''; + if (offset == undefined) offset = 0; + if (background == undefined) background = false; + if (infscroll_req == undefined) infscroll_req = false; - viewfeed(getActiveFeedId(), undefined, activeFeedIsCat(), undefined, - undefined, parseInt(_feed_cur_page+1)); + last_requested_article = 0; - } catch (e) { - exception_error("viewNextFeedPage", e); - } -} + var cached_headlines = false; + if (feed == getActiveFeedId()) { + cache_delete("feed:" + feed + ":" + is_cat); + } else { + cached_headlines = cache_get("feed:" + feed + ":" + is_cat); -function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) { - try { + // switching to a different feed, we might as well catchup stuff visible + // in headlines buffer (if any) + if (!background && getInitParam("cdm_auto_catchup") == 1 && parseInt(getActiveFeedId()) > 0) { - if (offline_mode) return viewfeed_offline(feed, subop, is_cat, subop_param, - skip_history, offset); + $$("#headlines-frame > div[id*=RROW][class*=Unread]").each( + function(child) { + var hf = $("headlines-frame"); -// if (!offset) page_offset = 0; + if (hf.scrollTop + hf.offsetHeight >= + child.offsetTop + child.offsetHeight) { - last_requested_article = 0; - //counters_last_request = 0; + var id = child.id.replace("RROW-", ""); - if (feed == getActiveFeedId()) { - cache_invalidate("F:" + feed); - } + if (catchup_id_batch.indexOf(id) == -1) + catchup_id_batch.push(id); -/* if (getInitParam("theme") == "" || getInitParam("theme") == "compact") { - if (getInitParam("hide_feedlist") == 1) { - Element.hide("feeds-holder"); - } - } */ + } - var force_nocache = false; + if (catchup_id_batch.length > 0) { + window.clearTimeout(catchup_timeout_id); - var page_offset = 0; + if (!_infscroll_request_sent) { + catchup_timeout_id = window.setTimeout('catchupBatchedArticles()', + 2000); + } + } - if (offset > 0) { - page_offset = offset; - } else { - page_offset = 0; - _feed_cur_page = 0; - _infscroll_disable = 0; + }); + } } - if (getActiveFeedId() != feed) { - _feed_cur_page = 0; - active_post_id = 0; - _infscroll_disable = 0; - } + if (offset == 0 && !background) + dijit.byId("content-tabs").selectChild( + dijit.byId("content-tabs").getChildren()[0]); + + if (!background) { + if (getActiveFeedId() != feed || offset == 0) { + active_post_id = 0; + _infscroll_disable = 0; + } + + if (!offset && !subop && cached_headlines && !background) { + try { + render_local_headlines(feed, is_cat, JSON.parse(cached_headlines)); + return; + } catch (e) { + console.warn("render_local_headlines failed: " + e); + } + } - if (page_offset != 0 && !subop) { - var date = new Date(); - var timestamp = Math.round(date.getTime() / 1000); + if (offset != 0 && !subop) { + var date = new Date(); + var timestamp = Math.round(date.getTime() / 1000); - console.log(_infscroll_request_sent + " : " + timestamp); + if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) { + //console.log("infscroll request in progress, aborting"); + return; + } - if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) { - console.log("infscroll request in progress, aborting"); - return; + _infscroll_request_sent = timestamp; } - _infscroll_request_sent = timestamp; + hideAuxDlg(); } - enableHotkeys(); - hideAuxDlg(); - closeInfoBox(); - Form.enable("main_toolbar_form"); - var toolbar_form = document.forms["main_toolbar_form"]; var toolbar_query = Form.serialize("main_toolbar_form"); - if (toolbar_form.query) { - if (toolbar_form.query.value != "") { - force_nocache = true; - } - toolbar_form.query.value = ""; - } - var query = "?op=viewfeed&feed=" + feed + "&" + toolbar_query + "&subop=" + param_escape(subop); - if ($("search_form")) { - var search_query = Form.serialize("search_form"); - query = query + "&" + search_query; - $("search_form").query.value = ""; - closeInfoBox(true); - force_nocache = true; - } + if (!background) { + if (_search_query) { + force_nocache = true; + query = query + "&" + _search_query; + _search_query = false; + } -// console.log("IS_CAT_STORED: " + activeFeedIsCat() + ", IS_CAT: " + is_cat); + if (subop == "MarkAllRead") { - if (subop == "MarkAllRead") { + var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1"; - catchup_local_feed(feed, is_cat); + if (show_next_feed) { + var nuf = getNextUnreadFeed(feed, is_cat); - var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1"; + if (nuf) { + var cached_nuf = cache_get("feed:" + nuf + ":false"); - if (show_next_feed) { + if (cached_nuf) { - if (!activeFeedIsCat()) { - - var feedlist = $('feedList'); - - var next_unread_feed = getRelativeFeedId2(feed, false, - "next", true); + render_local_headlines(nuf, false, JSON.parse(cached_nuf)); - /* gRFI2 also returns categories which we don't really - * need here, so we skip them */ + var catchup_query = "?op=rpc&subop=catchupFeed&feed_id=" + + feed + "&is_cat=" + is_cat; - while (next_unread_feed && next_unread_feed.match("CAT:")) - next_unread_feed = getRelativeFeedId2( - next_unread_feed.replace("CAT:", ""), - true, "next", true); - - if (!next_unread_feed) { - next_unread_feed = getRelativeFeedId2(-3, true, - "next", true); - } - - if (next_unread_feed) { - query = query + "&nuf=" + param_escape(next_unread_feed); - //setActiveFeedId(next_unread_feed); - feed = next_unread_feed; - } - } else { - - var next_unread_feed = getNextUnreadCat(feed); + console.log(catchup_query); - /* we don't need to specify that our next feed is actually - a category, because we're in the is_cat mode by definition - already */ + new Ajax.Request("backend.php", { + parameters: catchup_query, + onComplete: function(transport) { + handle_rpc_json(transport); + } }); - if (next_unread_feed && show_next_feed) { - query = query + "&nuf=" + param_escape(next_unread_feed); - feed = next_unread_feed; + return; + } else { + query += "&nuf=" + param_escape(nuf); + } } - } } - } - - if (is_cat) { - query = query + "&cat=1"; - } - if (page_offset != 0) { - query = query + "&skip=" + page_offset; + if (offset != 0) { + query = query + "&skip=" + offset; - // to prevent duplicate feed titles when showing grouped vfeeds - if (vgroup_last_feed) { - query = query + "&vgrlf=" + param_escape(vgroup_last_feed); + // to prevent duplicate feed titles when showing grouped vfeeds + if (vgroup_last_feed) { + query = query + "&vgrlf=" + param_escape(vgroup_last_feed); + } } - } - Form.enable("main_toolbar_form"); + Form.enable("main_toolbar_form"); - // for piggybacked counters - - if (tagsAreDisplayed()) { - query = query + "&omode=lt"; - } else { - query = query + "&omode=flc"; + if (!offset) + if (!is_cat) { + if (!setFeedExpandoIcon(feed, is_cat, 'images/indicator_white.gif')) + notify_progress("Loading, please wait...", true); + } else { + notify_progress("Loading, please wait...", true); + } } - console.log(query); - - var container = $("headlinesInnerContainer"); + query += "&cat=" + is_cat; -/* if (container && page_offset == 0 && !isCdmMode()) { - new Effect.Fade(container, {duration: 1, to: 0.01, - queue: { position:'end', scope: 'FEEDL-' + feed, limit: 1 } } ); - } */ + console.log(query); - var unread_ctr = -1; - - if (!is_cat) unread_ctr = get_feed_unread(feed); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + setFeedExpandoIcon(feed, is_cat, 'images/blank_icon.gif'); + headlines_callback2(transport, offset, background, infscroll_req); + } }); - var cache_check = false; + } catch (e) { + exception_error("viewfeed", e); + } +} - if (unread_ctr != -1 && !page_offset && !force_nocache && !subop) { +function feedlist_init() { + try { + console.log("in feedlist init"); - var cache_prefix = ""; - - if (is_cat) { - cache_prefix = "C:"; - } else { - cache_prefix = "F:"; - } + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + document.onkeydown = hotkey_handler; + setTimeout("hotkey_prefix_timeout()", 5*1000); - cache_check = cache_check_param(cache_prefix + feed, unread_ctr); - console.log("headline cache check: " + cache_check); + if (!getActiveFeedId()) { + setTimeout("viewfeed(-3)", 100); } - if (cache_check) { - var f = $("headlines-frame"); - - clean_feed_selections(); - - setActiveFeedId(feed, is_cat); - - if (!is_cat) { - var feedr = $("FEEDR-" + feed); - if (feedr && !feedr.className.match("Selected")) { - feedr.className = feedr.className + "Selected"; - } - } else { - var feedr = $("FCAT-" + feed_id); - if (feedr && !feedr.className.match("Selected")) { - feedr.className = feedr.className + "Selected"; - } - } - - f.innerHTML = cache_find_param(cache_prefix + feed, unread_ctr); - - request_counters(); - remove_splash(); - - } else { - - if (!page_offset) { - var feedr; - - if (is_cat) { - feedr = $('FCAP-' + feed); - } else { - feedr = $('FEEDR-' + feed); - } + console.log("T:" + + getInitParam("cdm_auto_catchup") + " " + getFeedUnread(-3)); - if (feedr && !$('FLL-' + feed)) { + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); - var img = $('FIMG-' + feed); + setTimeout("timeout()", 5000); + setTimeout("precache_headlines_idle()", 3000); - if (!is_cat && img) { + } catch (e) { + exception_error("feedlist/init", e); + } +} - if (!img.src.match("indicator_white")) { - img.alt = img.src; - img.src = getInitParam("sign_progress"); - } +function request_counters_real() { + try { + console.log("requesting counters..."); - } else { + var query = "?op=rpc&subop=getAllCounters&seq=" + next_seq(); - if (!$('FLL-' + feed)) { - var ll = document.createElement('img'); + query = query + "&omode=flc"; - ll.src = getInitParam("sign_progress_tiny"); - ll.className = 'hlLoading'; - ll.id = 'FLL-' + feed; - - feedr.appendChild(ll); - } - } + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + try { + handle_rpc_json(transport); + } catch (e) { + exception_error("viewfeed/getcounters", e); } - } - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - headlines_callback2(transport, page_offset); - } }); - } + } }); } catch (e) { - exception_error("viewfeed", e); - } + exception_error("request_counters_real", e); + } } -function toggleCollapseCat_af(effect) { - //var caption = elem.id.replace("FCATLIST-", ""); + +function request_counters() { try { - var elem = effect.element; - var cat = elem.id.replace("FCATLIST-", ""); - var cap = $("FCAP-" + cat); + if (getInitParam("bw_limit") == "1") return; + + var date = new Date(); + var timestamp = Math.round(date.getTime() / 1000); + + if (timestamp - counters_last_request > 5) { + console.log("scheduling request of counters..."); + + window.clearTimeout(counter_timeout_id); + counter_timeout_id = window.setTimeout("request_counters_real()", 1000); - if (Element.visible(elem)) { - cap.innerHTML = cap.innerHTML.replace("…", ""); + counters_last_request = timestamp; } else { - if (cap.innerHTML.lastIndexOf("…") != cap.innerHTML.length-3) { - cap.innerHTML = cap.innerHTML + "…"; - } + console.log("request_counters: rate limit reached: " + (timestamp - counters_last_request)); } } catch (e) { - exception_error("toggleCollapseCat_af", e); + exception_error("request_counters", e); } } -function toggleCollapseCat(cat) { +function displayNewContentPrompt(id) { try { - - var cat_elem = $("FCAT-" + cat); - var cat_list = $("FCATLIST-" + cat).parentNode; - var caption = $("FCAP-" + cat); - - Effect.toggle('FCATLIST-' + cat, 'blind', { duration: 0.5, - afterFinish: toggleCollapseCat_af }); - new Ajax.Request("backend.php", - { parameters: "backend.php?op=feeds&subop=collapse&cid=" + - param_escape(cat) } ); + var msg = "" + + __("New articles available in this feed (click to show)") + ""; - local_collapse_cat(cat); + msg = msg.replace("%s", getFeedName(id)); + + $('auxDlg').innerHTML = msg; + + new Effect.Appear('auxDlg', {duration : 0.5}); } catch (e) { - exception_error("toggleCollapseCat", e); + exception_error("displayNewContentPrompt", e); } } -function feedlist_dragsorted(ctr) { +function parse_counters(elems, scheduled_call) { try { - var elem = $("feedList"); + for (var l = 0; l < elems.length; l++) { + + var id = elems[l].id; + var kind = elems[l].kind; + var ctr = parseInt(elems[l].counter); + var error = elems[l].error; + var has_img = elems[l].has_img; + var updated = elems[l].updated; + + if (id == "global-unread") { + global_unread = ctr; + updateTitle(); + continue; + } - var cats = elem.getElementsByTagName("LI"); - var ordered_cats = new Array(); + if (id == "subscribed-feeds") { + feeds_found = ctr; + continue; + } - for (var i = 0; i < cats.length; i++) { - if (cats[i].id && cats[i].id.match("FCAT-")) { - ordered_cats.push(cats[i].id.replace("FCAT-", "")); + // TODO: enable new content notification for categories + + if (!activeFeedIsCat() && id == getActiveFeedId() + && ctr > getFeedUnread(id) && scheduled_call) { + displayNewContentPrompt(id); } - } - if (ordered_cats.length > 0) { + if (getFeedUnread(id, (kind == "cat")) != ctr) + cache_delete("feed:" + id + ":" + (kind == "cat")); - var query = "?op=feeds&subop=catsort&corder=" + - param_escape(ordered_cats.toString()); + setFeedUnread(id, (kind == "cat"), ctr); - console.log(query); + if (kind != "cat") { + setFeedValue(id, false, 'error', error); + setFeedValue(id, false, 'updated', updated); - new Ajax.Request("backend.php", { parameters: query }); + if (id > 0) { + if (has_img) { + setFeedIcon(id, false, + getInitParam("icons_url") + "/" + id + ".ico"); + } else { + setFeedIcon(id, false, 'images/blank_icon.gif'); + } + } + } } + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + } catch (e) { - exception_error("feedlist_dragsorted", e); + exception_error("parse_counters", e); } } -function feedlist_init() { +function getFeedUnread(feed, is_cat) { try { - loading_set_progress(90); + var tree = dijit.byId("feedTree"); - console.log("in feedlist init"); - - hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); - document.onkeydown = hotkey_handler; - document.onmousemove = mouse_move_handler; - document.onmousedown = mouse_down_handler; - document.onmouseup = mouse_up_handler; + if (tree && tree.model) + return tree.model.getFeedUnread(feed, is_cat); - if (!offline_mode) setTimeout("timeout()", 1); + } catch (e) { + // + } - setTimeout("hotkey_prefix_timeout()", 5*1000); + return -1; +} - if (getActiveFeedId()) { - //console.log("some feed is open on feedlist refresh, reloading"); - //setTimeout("viewCurrentFeed()", 100); - } else { - if (getInitParam("cdm_auto_catchup") != 1 && get_feed_unread(-3) > 0) { - notify_silent_next(); - setTimeout("viewfeed(-3)", 100); - } else { - setTimeout("viewfeed(-5)", 100); - remove_splash(); - } - } +function resort_feedlist() { + console.warn("resort_feedlist: function not implemented"); +} - if (getInitParam("theme") == "" || - getInitParam("theme_options").match("hide_footer")) { - setTimeout("hide_footer()", 5000); - } +function hideOrShowFeeds(hide) { + var tree = dijit.byId("feedTree"); - init_collapsable_feedlist(getInitParam("theme")); + if (tree) + return tree.hideRead(hide, getInitParam("hide_read_shows_special")); +} - toggle_sortable_feedlist(isFeedlistSortable()); +function getFeedName(feed, is_cat) { + var tree = dijit.byId("feedTree"); - } catch (e) { - exception_error("feedlist/init", e); - } + if (tree && tree.model) + return tree.model.getFeedValue(feed, is_cat, 'name'); } -function hide_footer_af(effect) { +function getFeedValue(feed, is_cat, key) { try { - var c = $("content-frame"); - - if (c) { - c.style.bottom = "0px"; - - var ioa = $("inline_orig_article"); - - if (ioa) { - ioa.height = c.offsetHeight; - } - - } else { - var h = $("headlines-frame"); + var tree = dijit.byId("feedTree"); - if (h) { - h.style.bottom = "0px"; - } - } + if (tree && tree.model) + return tree.model.getFeedValue(feed, is_cat, key); } catch (e) { - exception_error("hide_footer_af", e); + // } + return ''; } -function hide_footer() { +function setFeedUnread(feed, is_cat, unread) { try { - if (Element.visible("footer")) { - new Effect.Fade("footer", { afterFinish: hide_footer_af }); - } + var tree = dijit.byId("feedTree"); + + if (tree && tree.model) + return tree.model.setFeedUnread(feed, is_cat, unread); + } catch (e) { - exception_error("hide_footer", e); + exception_error("setFeedUnread", e); } } -function init_collapsable_feedlist() { +function setFeedValue(feed, is_cat, key, value) { try { - console.log("init_collapsable_feedlist"); - - var theme = getInitParam("theme"); - var options = getInitParam("theme_options"); - - if (theme != "" && !options.match("collapse_feedlist")) return; + var tree = dijit.byId("feedTree"); - var fbtn = $("collapse_feeds_btn"); - - if (fbtn) Element.show(fbtn); - - if (getInitParam("collapsed_feedlist") == 1) { - collapse_feedlist(); - } + if (tree && tree.model) + return tree.model.setFeedValue(feed, is_cat, key, value); } catch (e) { - exception_error("init_hidden_feedlist", e); + // } - } -function mouse_move_handler(e) { +function selectFeed(feed, is_cat) { try { - var client_y; - var client_x; - - if (window.event) { - client_y = window.event.clientY; - client_x = window.event.clientX; - } else if (e) { - client_x = e.screenX; - client_y = e.screenY; - } - - if (mouse_is_down) { - - if (mouse_y == 0) mouse_y = client_y; - if (mouse_x == 0) mouse_x = client_x; + var tree = dijit.byId("feedTree"); - resize_headlines(mouse_x - client_x, mouse_y - client_y); - - mouse_y = client_y; - mouse_x = client_x; - - return false; - } + if (tree) return tree.selectFeed(feed, is_cat); } catch (e) { - exception_error("mouse_move_handler", e); + exception_error("selectFeed", e); } } -function enable_selection(b) { - selection_disabled = !b; -} - -function enable_resize(b) { - resize_enabled = b; -} - -function mouse_down_handler(e) { +function setFeedIcon(feed, is_cat, src) { try { + var tree = dijit.byId("feedTree"); - /* do not prevent right click */ - if (e && e.button && e.button == 2) return; - - if (resize_enabled) { - mouse_is_down = true; - mouse_x = 0; - mouse_y = 0; - document.onselectstart = function() { return false; }; - return false; - } - - if (selection_disabled) { - document.onselectstart = function() { return false; }; - return false; - } + if (tree) return tree.setFeedIcon(feed, is_cat, src); } catch (e) { - exception_error("mouse_down_handler", e); + exception_error("setFeedIcon", e); } } -function mouse_up_handler(e) { +function setFeedExpandoIcon(feed, is_cat, src) { try { - mouse_is_down = false; + var tree = dijit.byId("feedTree"); - if (!selection_disabled) { - document.onselectstart = null; - var e = $("headlineActionsBody"); - if (e) Element.hide(e); - - var e = $("offlineModeDrop"); - if (e) Element.hide(e); - - } + if (tree) return tree.setFeedExpandoIcon(feed, is_cat, src); } catch (e) { - exception_error("mouse_up_handler", e); + exception_error("setFeedIcon", e); } + return false; } -function request_counters_real() { - +function getNextUnreadFeed(feed, is_cat) { try { + var tree = dijit.byId("feedTree"); + var nuf = tree.model.getNextUnreadFeed(feed, is_cat); - if (offline_mode) return; - - console.log("requesting counters..."); - - var query = "?op=rpc&subop=getAllCounters"; - - if (tagsAreDisplayed()) { - query = query + "&omode=tl"; - } else { - query = query + "&omode=flc"; - } - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - try { - all_counters_callback2(transport); - } catch (e) { - exception_error("viewfeed/getcounters", e); - } - } }); + if (nuf) + return tree.model.store.getValue(nuf, 'bare_id'); } catch (e) { - exception_error("request_counters_real", e); + exception_error("getNextUnreadFeed", e); } } - -function request_counters() { - +function catchupFeed(feed, is_cat) { try { + var str = __("Mark all articles in %s as read?"); + var fn = getFeedName(getActiveFeedId(), activeFeedIsCat()); - if (getInitParam("bw_limit") == "1") return; + str = str.replace("%s", fn); - var date = new Date(); - var timestamp = Math.round(date.getTime() / 1000); + if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) { + return; + } - if (timestamp - counters_last_request > 10) { - console.log("scheduling request of counters..."); + var catchup_query = "?op=rpc&subop=catchupFeed&feed_id=" + + feed + "&is_cat=" + is_cat; - window.clearTimeout(counter_timeout_id); - counter_timeout_id = window.setTimeout("request_counters_real()", 1000); + notify_progress("Loading, please wait...", true); - counters_last_request = timestamp; - } else { - console.log("request_counters: rate limit reached: " + (timestamp - counters_last_request)); - } + new Ajax.Request("backend.php", { + parameters: catchup_query, + onComplete: function(transport) { + handle_rpc_json(transport); + notify(""); + } }); } catch (e) { - exception_error("request_counters", e); + exception_error("catchupFeed", e); } } - -