]> git.wh0rd.org - tt-rss.git/blame - feedlist.js
remove unused headlines-info.unread
[tt-rss.git] / feedlist.js
CommitLineData
71317973 1//var _feed_cur_page = 0;
29dfb258 2var _infscroll_disable = 0;
82764a41 3var _infscroll_request_sent = 0;
973fe3c6 4var _search_query = false;
ac541432 5
5225d420
AD
6var counter_timeout_id = false;
7
94047498 8var resize_enabled = false;
9922d56b 9var counters_last_request = 0;
91cdbe52 10
ff2c6e6a 11function viewCategory(cat) {
767e2486 12 viewfeed(cat, '', true);
0c3d1219 13 return false;
ff2c6e6a
AD
14}
15
71317973 16function loadMoreHeadlines() {
ac541432 17 try {
71317973
AD
18 var offset = 0;
19
20 var view_mode = document.forms["main_toolbar_form"].view_mode.value;
21 var num_unread = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length;
22 var num_all = $$("#headlines-frame > div[id*=RROW]").length;
23
24 // TODO implement marked & published
25
26 if (view_mode == "marked") {
27 console.warn("loadMoreHeadlines: marked is not implemented, falling back.");
28 offset = num_all;
29 } else if (view_mode == "published") {
30 console.warn("loadMoreHeadlines: published is not implemented, falling back.");
31 offset = num_all;
32 } else if (view_mode == "unread") {
33 offset = num_unread;
34 } else if (view_mode == "adaptive") {
35 if (num_unread > 0)
36 offset = num_unread;
37 else
38 offset = num_all;
39 } else {
40 offset = num_all;
41 }
2a8534a0 42
71317973 43 viewfeed(getActiveFeedId(), '', activeFeedIsCat(), offset);
ac541432
AD
44
45 } catch (e) {
8b365031 46 exception_error("viewNextFeedPage", e);
ac541432
AD
47 }
48}
49
6a2034f9 50
4169bb67 51function viewfeed(feed, subop, is_cat, offset) {
7719618b 52 try {
78b2c6ce
AD
53 if (is_cat == undefined)
54 is_cat = false;
55 else
56 is_cat = !!is_cat;
57
cd1bb36d 58 if (subop == undefined) subop = '';
71317973 59 if (offset == undefined) offset = 0;
c50e2b30 60
32f0c8b0
AD
61 last_requested_article = 0;
62
78b2c6ce
AD
63 var cached_headlines = false;
64
65 if (feed == getActiveFeedId())
66 cache_delete("feed:" + feed + ":" + is_cat);
67 else
68 cached_headlines = cache_get("feed:" + feed + ":" + is_cat);
b8e6acea 69
f92d7c2b
AD
70 dijit.byId("content-tabs").selectChild(
71 dijit.byId("content-tabs").getChildren()[0]);
72
52d7e7da
AD
73 var force_nocache = false;
74
71317973 75 if (getActiveFeedId() != feed || offset == 0) {
457c494a 76 active_post_id = 0;
29dfb258 77 _infscroll_disable = 0;
c50e2b30 78 }
203de776 79
78b2c6ce
AD
80 if (!offset && !subop && cached_headlines) {
81 try {
82 render_local_headlines(feed, is_cat, JSON.parse(cached_headlines));
83 return;
84 } catch (e) {
85 console.warn("render_local_headlines failed: " + e);
86 }
87 }
88
71317973 89 if (offset != 0 && !subop) {
82764a41
AD
90 var date = new Date();
91 var timestamp = Math.round(date.getTime() / 1000);
92
82764a41 93 if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) {
71317973 94 //console.log("infscroll request in progress, aborting");
82764a41
AD
95 return;
96 }
97
bd202c3f 98 _infscroll_request_sent = timestamp;
82764a41
AD
99 }
100
37e93d6c 101 hideAuxDlg();
0979b696 102
fd98576c
AD
103 Form.enable("main_toolbar_form");
104
6b4163cb 105 var toolbar_form = document.forms["main_toolbar_form"];
fd98576c 106 var toolbar_query = Form.serialize("main_toolbar_form");
86b682ce 107
4764c27e 108 if (toolbar_form.query) {
52d7e7da
AD
109 if (toolbar_form.query.value != "") {
110 force_nocache = true;
111 }
f31673f7 112 toolbar_form.query.value = "";
164f4738
AD
113 }
114
b4e75b2a 115 var query = "?op=viewfeed&feed=" + feed + "&" +
86b682ce
AD
116 toolbar_query + "&subop=" + param_escape(subop);
117
973fe3c6 118 if (_search_query) {
52d7e7da 119 force_nocache = true;
973fe3c6
AD
120 query = query + "&" + _search_query;
121 _search_query = false;
86b682ce
AD
122 }
123
7719618b 124 if (subop == "MarkAllRead") {
e0998414 125
9cb99906 126 var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
3ac2b520 127
f46192bb 128 if (show_next_feed) {
692de159
AD
129 var tree = dijit.byId("feedTree");
130 var nuf = tree.model.getNextUnreadFeed(feed, is_cat);
131
132 if (nuf) {
133 var nuf_id = tree.model.store.getValue(nuf, 'bare_id');
134
135 query = query + "&nuf=" + param_escape(nuf_id);
136 }
e0998414 137 }
7719618b 138 }
ff2c6e6a 139
6c3b0198 140 if (is_cat) {
ff2c6e6a
AD
141 query = query + "&cat=1";
142 }
99ff73f4 143
71317973
AD
144 if (offset != 0) {
145 query = query + "&skip=" + offset;
60d4df4d
AD
146
147 // to prevent duplicate feed titles when showing grouped vfeeds
148 if (vgroup_last_feed) {
149 query = query + "&vgrlf=" + param_escape(vgroup_last_feed);
150 }
203de776
AD
151 }
152
6b4163cb
AD
153 Form.enable("main_toolbar_form");
154
84c7b824 155 console.log(query);
081e527d 156
3205fab0
AD
157 if (!offset)
158 if (!is_cat) {
159 if (!setFeedExpandoIcon(feed, is_cat, 'images/indicator_white.gif'))
160 notify_progress("Loading, please wait...", true);
161 } else {
dba65980 162 notify_progress("Loading, please wait...", true);
3205fab0 163 }
e19c1824 164
71317973
AD
165 new Ajax.Request("backend.php", {
166 parameters: query,
167 onComplete: function(transport) {
168 setFeedExpandoIcon(feed, is_cat, 'images/blank_icon.gif');
169 headlines_callback2(transport, offset);
170 } });
6b4163cb 171
7719618b
AD
172 } catch (e) {
173 exception_error("viewfeed", e);
bd202c3f 174 }
1a66d16e
AD
175}
176
6b4163cb 177function feedlist_init() {
1b0809ae 178 try {
fcf70c51 179 console.log("in feedlist init");
bd202c3f 180
60ea2377 181 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
1b0809ae 182 document.onkeydown = hotkey_handler;
164469f9
AD
183 setTimeout("hotkey_prefix_timeout()", 5*1000);
184
6e88da82 185 if (!getActiveFeedId()) {
bd202c3f
AD
186 setTimeout("viewfeed(-3)", 100);
187 }
fcf70c51 188
bd202c3f 189 console.log("T:" +
6e88da82 190 getInitParam("cdm_auto_catchup") + " " + getFeedUnread(-3));
7086277c 191
a73e6b97 192 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
782ddd70 193
cd1bb36d
AD
194 setTimeout("timeout()", 5000);
195
1b0809ae 196 } catch (e) {
bbf4d0b2 197 exception_error("feedlist/init", e);
1b0809ae 198 }
3745788e 199}
22e06406 200
997d9d7c 201function request_counters_real() {
5aaf9b34 202 try {
84c7b824 203 console.log("requesting counters...");
06c88b8d 204
6237ea05 205 var query = "?op=rpc&subop=getAllCounters&seq=" + next_seq();
5aaf9b34 206
9c99281f 207 query = query + "&omode=flc";
5aaf9b34 208
b4e75b2a
AD
209 new Ajax.Request("backend.php", {
210 parameters: query,
bd202c3f 211 onComplete: function(transport) {
5aaf9b34 212 try {
563b9c78 213 handle_rpc_json(transport);
5aaf9b34
AD
214 } catch (e) {
215 exception_error("viewfeed/getcounters", e);
216 }
217 } });
218
997d9d7c
AD
219 } catch (e) {
220 exception_error("request_counters_real", e);
221 }
222}
223
997d9d7c
AD
224
225function request_counters() {
226
227 try {
228
a598370d
AD
229 if (getInitParam("bw_limit") == "1") return;
230
997d9d7c
AD
231 var date = new Date();
232 var timestamp = Math.round(date.getTime() / 1000);
233
b39b57ac 234 if (timestamp - counters_last_request > 5) {
84c7b824 235 console.log("scheduling request of counters...");
5225d420
AD
236
237 window.clearTimeout(counter_timeout_id);
238 counter_timeout_id = window.setTimeout("request_counters_real()", 1000);
239
997d9d7c
AD
240 counters_last_request = timestamp;
241 } else {
84c7b824 242 console.log("request_counters: rate limit reached: " + (timestamp - counters_last_request));
f55b0b12 243 }
997d9d7c 244
5aaf9b34
AD
245 } catch (e) {
246 exception_error("request_counters", e);
247 }
248}
a4b906ec 249
e69fb880
AD
250function displayNewContentPrompt(id) {
251 try {
252
a8328019 253 var msg = "<a href='#' onclick='viewCurrentFeed()'>" +
e69fb880
AD
254 __("New articles available in this feed (click to show)") + "</a>";
255
256 msg = msg.replace("%s", getFeedName(id));
257
258 $('auxDlg').innerHTML = msg;
259
260 new Effect.Appear('auxDlg', {duration : 0.5});
261
262 } catch (e) {
263 exception_error("displayNewContentPrompt", e);
264 }
265}
266
563b9c78 267function parse_counters(elems, scheduled_call) {
e69fb880
AD
268 try {
269
270 var feeds_found = 0;
271
e69fb880
AD
272 for (var l = 0; l < elems.length; l++) {
273
274 var id = elems[l].id
275 var kind = elems[l].kind;
276 var ctr = parseInt(elems[l].counter)
277 var error = elems[l].error;
278 var has_img = elems[l].has_img;
279 var updated = elems[l].updated;
280 var title = elems[l].title;
563b9c78 281
e69fb880 282 if (id == "global-unread") {
e69fb880
AD
283 global_unread = ctr;
284 updateTitle();
285 continue;
286 }
287
288 if (id == "subscribed-feeds") {
289 feeds_found = ctr;
290 continue;
291 }
13e785e0
AD
292
293 var treeItem;
294
179db4a0
AD
295 // TODO: enable new content notification for categories
296
bd202c3f 297 if (!activeFeedIsCat() && id == getActiveFeedId()
179db4a0 298 && ctr > getFeedUnread(id) && scheduled_call) {
6e88da82
AD
299 displayNewContentPrompt(id);
300 }
301
78b2c6ce
AD
302 if (getFeedUnread(id, (kind == "cat")) != ctr)
303 cache_delete("feed:" + id + ":" + (kind == "cat"));
304
13e785e0 305 setFeedUnread(id, (kind == "cat"), ctr);
e69fb880 306
fcf70c51 307 if (kind != "cat") {
700f1426 308 setFeedValue(id, false, 'error', error);
fcf70c51 309 setFeedValue(id, false, 'updated', updated);
2ef5c21f
AD
310
311 if (id > 0) {
312 if (has_img) {
bd202c3f 313 setFeedIcon(id, false,
2ef5c21f
AD
314 getInitParam("icons_url") + "/" + id + ".ico");
315 } else {
316 setFeedIcon(id, false, 'images/blank_icon.gif');
317 }
318 }
e69fb880 319 }
fcf70c51 320 }
bd202c3f 321
e69fb880
AD
322 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
323
e69fb880
AD
324 } catch (e) {
325 exception_error("parse_counters", e);
326 }
327}
328
6e88da82 329function getFeedUnread(feed, is_cat) {
e69fb880 330 try {
e032e2e7
AD
331 var tree = dijit.byId("feedTree");
332
bd202c3f 333 if (tree && tree.model)
e032e2e7
AD
334 return tree.model.getFeedUnread(feed, is_cat);
335
e69fb880 336 } catch (e) {
fcf70c51 337 //
e69fb880 338 }
fcf70c51
AD
339
340 return -1;
e69fb880
AD
341}
342
e69fb880 343function resort_feedlist() {
6e88da82 344 console.warn("resort_feedlist: function not implemented");
e69fb880
AD
345}
346
347function hideOrShowFeeds(hide) {
fcf70c51
AD
348 var tree = dijit.byId("feedTree");
349
05f224a3
AD
350 if (tree)
351 return tree.hideRead(hide, getInitParam("hide_read_shows_special"));
e69fb880
AD
352}
353
bd202c3f 354function getFeedName(feed, is_cat) {
e032e2e7
AD
355 var tree = dijit.byId("feedTree");
356
bd202c3f 357 if (tree && tree.model)
e032e2e7 358 return tree.model.getFeedValue(feed, is_cat, 'name');
fcf70c51 359}
e69fb880 360
bd202c3f 361function getFeedValue(feed, is_cat, key) {
fcf70c51 362 try {
e032e2e7 363 var tree = dijit.byId("feedTree");
fcf70c51 364
bd202c3f 365 if (tree && tree.model)
e032e2e7 366 return tree.model.getFeedValue(feed, is_cat, key);
bd202c3f 367
fcf70c51
AD
368 } catch (e) {
369 //
e69fb880 370 }
fcf70c51 371 return '';
e69fb880
AD
372}
373
13e785e0
AD
374function setFeedUnread(feed, is_cat, unread) {
375 try {
e032e2e7
AD
376 var tree = dijit.byId("feedTree");
377
bd202c3f 378 if (tree && tree.model)
e032e2e7
AD
379 return tree.model.setFeedUnread(feed, is_cat, unread);
380
fcf70c51
AD
381 } catch (e) {
382 exception_error("setFeedUnread", e);
383 }
384}
385
386function setFeedValue(feed, is_cat, key, value) {
387 try {
e032e2e7 388 var tree = dijit.byId("feedTree");
13e785e0 389
bd202c3f 390 if (tree && tree.model)
e032e2e7 391 return tree.model.setFeedValue(feed, is_cat, key, value);
c8a9fe5b 392
13e785e0 393 } catch (e) {
e032e2e7 394 //
fcf70c51
AD
395 }
396}
397
fcf70c51
AD
398function selectFeed(feed, is_cat) {
399 try {
400 var tree = dijit.byId("feedTree");
401
e032e2e7 402 if (tree) return tree.selectFeed(feed, is_cat);
fcf70c51
AD
403
404 } catch (e) {
405 exception_error("selectFeed", e);
13e785e0
AD
406 }
407}
2ef5c21f
AD
408
409function setFeedIcon(feed, is_cat, src) {
410 try {
411 var tree = dijit.byId("feedTree");
412
e032e2e7 413 if (tree) return tree.setFeedIcon(feed, is_cat, src);
2ef5c21f
AD
414
415 } catch (e) {
416 exception_error("setFeedIcon", e);
417 }
418}
9c99281f
AD
419
420function setFeedExpandoIcon(feed, is_cat, src) {
421 try {
422 var tree = dijit.byId("feedTree");
423
e032e2e7 424 if (tree) return tree.setFeedExpandoIcon(feed, is_cat, src);
9c99281f
AD
425
426 } catch (e) {
427 exception_error("setFeedIcon", e);
428 }
f92d7c2b 429 return false;
9c99281f 430}