]> git.wh0rd.org - tt-rss.git/blame - feedlist.js
viewfeed_offline: fix for undefined offset parameter
[tt-rss.git] / feedlist.js
CommitLineData
a49f5e05 1var _feed_cur_page = 0;
29dfb258 2var _infscroll_disable = 0;
82764a41 3var _infscroll_request_sent = 0;
3a40e8a2 4var feed_under_pointer = undefined;
ac541432 5
cfd58e50
AD
6var mouse_is_down = false;
7var mouse_y = 0;
8var mouse_x = 0;
9
94047498 10var resize_enabled = false;
bf3c9838 11var selection_disabled = false;
9922d56b 12var counters_last_request = 0;
91cdbe52 13
a5550322
AD
14function toggle_sortable_feedlist(enabled) {
15 try {
16
17 if (enabled) {
18 Sortable.create('feedList', {onChange: feedlist_dragsorted, only: "feedCat"});
19 } else {
20 Sortable.destroy('feedList');
21 }
22
23 } catch (e) {
24 exception_error("toggle_sortable_feedlist", e);
25 }
26}
27
ff2c6e6a 28function viewCategory(cat) {
767e2486 29 viewfeed(cat, '', true);
0c3d1219 30 return false;
ff2c6e6a
AD
31}
32
a4b906ec 33function printFeedEntry(id, title, row_class, unread, icon) {
36f78797 34
a4b906ec
AD
35 var tmp = "";
36 var fctr_class = "";
37 var feed_icon = "";
005f8e6d 38
a4b906ec
AD
39 if (unread > 0) {
40 row_class += "Unread";
41 fctr_class = "feedCtrHasUnread";
42 } else {
43 fctr_class = "feedCtrNoUnread";
44 }
005f8e6d 45
a4b906ec
AD
46 if (icon) {
47 feed_icon = "<img id='FIMG-"+id+"' src='" + icon + "'>";
48 } else {
49 feed_icon = "<img id='FIMG-"+id+"' src='images/blank_icon.gif'>";
50 }
005f8e6d 51
a4b906ec
AD
52 var link = "<a title=\"FIXME\" id=\"FEEDL-"+id+"\""+
53 "href=\"javascript:viewfeed('"+id+"', '', false, '', false, 0);\">"+
54 title + "</a>";
005f8e6d 55
a4b906ec
AD
56 tmp += "<li id='FEEDR-"+id+"' class="+row_class+">" + feed_icon +
57 "<span id=\"FEEDN-"+id+"\">" + link + "</span>";
58
59 tmp += " <span class='"+fctr_class+"' id=\"FEEDCTR-"+id+"\">" +
60 "(<span id=\"FEEDU-"+id+"\">"+unread+"</span>)</span>";
61
62 tmp += "</li>";
63
64 return tmp;
65}
66
67function get_local_feed_unread(id) {
68 try {
69 var rs;
70
71 if (id == -4) {
72 rs = db.execute("SELECT SUM(unread) FROM articles");
73 } else if (id == -1) {
74 rs = db.execute("SELECT SUM(unread) FROM articles WHERE marked = 1");
005f8e6d 75 } else {
a4b906ec 76 rs = db.execute("SELECT SUM(unread) FROM articles WHERE feed_id = ?", [id]);
005f8e6d
AD
77 }
78
a4b906ec
AD
79 if (rs.isValidRow()) {
80 return rs.field(0);
81 } else {
82 return 0;
83 }
005f8e6d 84
a4b906ec
AD
85 } catch (e) {
86 exception_error("get_local_feed_unread", e);
87 }
88}
005f8e6d 89
a4b906ec
AD
90function render_offline_feedlist() {
91 try {
92 var tmp = "<ul class=\"feedList\" id=\"feedList\">";
005f8e6d 93
a4b906ec
AD
94 var unread = get_local_feed_unread(-4);
95
96 global_unread = unread;
97 updateTitle();
98
99 tmp += printFeedEntry(-4, __("All articles"), "feed", unread,
100 "images/tag.png");
101
102 var unread = get_local_feed_unread(-1);
103
104 tmp += printFeedEntry(-1, __("Starred articles"), "feed", unread,
105 "images/mark_set.png");
005f8e6d
AD
106
107 tmp += "<li><hr/></li>";
108
a4b906ec
AD
109 var rs = db.execute("SELECT feeds.id,feeds.title,has_icon,COUNT(articles.id) "+
110 "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+
111 "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+
112 "ORDER BY feeds.title");
36f78797
AD
113
114 while (rs.isValidRow()) {
115
116 var id = rs.field(0);
117 var title = rs.field(1);
118 var has_icon = rs.field(2);
a4b906ec 119 var unread = rs.field(3);
36f78797 120
a4b906ec 121 var icon = "";
36f78797 122
a4b906ec
AD
123 if (has_icon) {
124 icon = "icons/" + id + ".ico";
36f78797
AD
125 }
126
42932651 127
36f78797
AD
128 var feed_icon = "";
129
36f78797
AD
130 var row_class = "feed";
131
132 if (unread > 0) {
133 row_class += "Unread";
134 fctr_class = "feedCtrHasUnread";
135 } else {
136 fctr_class = "feedCtrNoUnread";
137 }
138
a4b906ec 139 tmp += printFeedEntry(id, title, "feed", unread, icon);
36f78797
AD
140
141 rs.next();
142 }
143
144 tmp += "</ul>";
145
146 render_feedlist(tmp);
87b16a0a
AD
147 } catch (e) {
148 exception_error("render_offline_feedlist", e);
149 }
150}
151
31234407
AD
152function render_feedlist(data) {
153 try {
154
155 var f = document.getElementById("feeds-frame");
156 f.innerHTML = data;
157 cache_invalidate("FEEDLIST");
9b7ecc0a 158 cache_inject("FEEDLIST", data, getInitParam("num_feeds"));
31234407
AD
159 feedlist_init();
160
161 } catch (e) {
162 exception_error("render_feedlist", e);
163 }
164}
165
0df398da
AD
166function feedlist_callback2(transport) {
167 try {
168 debug("feedlist_callback2");
2184738a 169 if (!transport_error_check(transport)) return;
31234407 170 render_feedlist(transport.responseText);
0df398da
AD
171 } catch (e) {
172 exception_error("feedlist_callback2", e);
6b4163cb
AD
173 }
174}
175
ac541432
AD
176function viewNextFeedPage() {
177 try {
2a8534a0 178 //if (!getActiveFeedId()) return;
ac541432 179
2a8534a0
AD
180 debug("viewNextFeedPage: calling viewfeed(), p: " + _feed_cur_page+1);
181
182 viewfeed(getActiveFeedId(), undefined, activeFeedIsCat(), undefined,
29dfb258 183 undefined, _feed_cur_page+1);
ac541432
AD
184
185 } catch (e) {
8b365031 186 exception_error("viewNextFeedPage", e);
ac541432
AD
187 }
188}
189
261b88b3 190function viewfeed_offline(feed_id, subop, is_cat, subop_param, skip_history, offset) {
6a2034f9 191 try {
261b88b3
AD
192 notify('');
193
2a0dc5f9
AD
194 if (!offset) offset = 0;
195
261b88b3
AD
196 loading_set_progress(100);
197
198 clean_feed_selections();
199
200 setActiveFeedId(feed_id, is_cat);
201
202 if (!is_cat) {
203 var feedr = document.getElementById("FEEDR-" + feed_id);
204 if (feedr && !feedr.className.match("Selected")) {
205 feedr.className = feedr.className + "Selected";
206 }
207 } else {
208 var feedr = document.getElementById("FCAT-" + feed_id);
209 if (feedr && !feedr.className.match("Selected")) {
210 feedr.className = feedr.className + "Selected";
211 }
212 }
213
45a6446d
AD
214 disableContainerChildren("headlinesToolbar", false);
215 Form.enable("main_toolbar_form");
216
261b88b3
AD
217 var f = document.getElementById("headlines-frame");
218 try {
219 if (reply.offset == 0) {
220 debug("resetting headlines scrollTop");
221 f.scrollTop = 0;
222 }
223 } catch (e) { };
224
225
226 var container = document.getElementById("headlines-frame");
227
228 var tmp = "";
229
230 rs = db.execute("SELECT title FROM feeds WHERE id = ?", [feed_id]);
231
6a4a39b9 232 if (rs.isValidRow() || feed_id == -1 || feed_id == -4) {
005f8e6d
AD
233
234 feed_title = rs.field(0);
261b88b3 235
005f8e6d
AD
236 if (feed_id == -1) {
237 feed_title = __("Starred articles");
238 }
261b88b3 239
6a4a39b9
AD
240 if (feed_id == -4) {
241 feed_title = __("All articles");
242 }
243
261b88b3
AD
244 if (offset == 0) {
245 tmp += "<div id=\"headlinesContainer\">";
246
247 tmp += "<div class=\"headlinesSubToolbar\">";
248 tmp += "<div id=\"subtoolbar_ftitle\">";
249 tmp += feed_title;
250 tmp += "</div>";
251
252 var sel_all_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, '', true)";
253 var sel_unread_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true)";
254 var sel_none_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false)";
255 var sel_inv_link = "javascript:invertHeadlineSelection()";
256
257 tmp += __('Select:')+
258 " <a href=\""+sel_all_link+"\">"+__('All')+"</a>, "+
259 "<a href=\""+sel_unread_link+"\">"+__('Unread')+"</a>, "+
260 "<a href=\""+sel_inv_link+"\">"+__('Invert')+"</a>, "+
261 "<a href=\""+sel_none_link+"\">"+__('None')+"</a>";
262
263 tmp += "&nbsp;&nbsp;";
264
265 tmp += "</div>";
266
267 tmp += "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">";
268
269 tmp += "<table class=\"headlinesList\" id=\"headlinesList\" cellspacing=\"0\">";
270
271 }
272
005f8e6d 273 var rs;
6a4a39b9
AD
274
275 var limit = 30;
276
277 var toolbar_form = document.forms["main_toolbar_form"];
005f8e6d 278
6a4a39b9
AD
279 var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex].value;
280 var view_mode = toolbar_form.view_mode[toolbar_form.view_mode.selectedIndex].value;
281
282 var limit_qpart = "";
283 var strategy_qpart = "";
284 var mode_qpart = "";
285
286 if (limit != 0) {
287 limit_qpart = "LIMIT " + limit;
005f8e6d 288 }
261b88b3 289
6a4a39b9
AD
290 if (view_mode == "all_articles") {
291 mode_qpart = "1";
292 } else if (view_mode == "adaptive") {
293 if (get_local_feed_unread(feed_id) > 0) {
294 mode_qpart = "unread = 1";
295 } else {
296 mode_qpart = "1";
297 }
298 } else if (view_mode == "marked") {
299 mode_qpart = "marked = 1";
300 } else if (view_mode == "unread") {
301 mode_qpart = "unread = 1";
302 } else {
303 mode_qpart = "1";
304 }
305
306 if (feed_id > 0) {
307 strategy_qpart = "feed_id = " + feed_id;
308 } else if (feed_id == -1) {
309 strategy_qpart = "marked = 1";
310 } else if (feed_id == -4) {
311 strategy_qpart = "1";
312 }
313
314 var query = "SELECT * FROM articles WHERE " +
315 strategy_qpart +
316 " AND " + mode_qpart +
317 " ORDER BY updated DESC "+
318 limit_qpart;
319
320 var rs = db.execute(query);
321
261b88b3
AD
322 var line_num = 0;
323
324 while (rs.isValidRow()) {
325
326 var id = rs.fieldByName("id");
327 var feed_id = rs.fieldByName("feed_id");
328
329 var marked_pic;
330
331 var row_class = (line_num % 2) ? "even" : "odd";
332
333 if (rs.fieldByName("unread") == "1") {
334 row_class += "Unread";
335 }
336
337 if (rs.fieldByName("marked") == "1") {
338 marked_pic = "<img id=\"FMPIC-"+id+"\" "+
339 "src=\"images/mark_set.png\" class=\"markedPic\""+
340 "alt=\"Unstar article\" onclick='javascript:tMark("+id+")'>";
341 } else {
342 marked_pic = "<img id=\"FMPIC-"+id+"\" "+
343 "src=\"images/mark_unset.png\" class=\"markedPic\""+
344 "alt=\"Star article\" onclick='javascript:tMark("+id+")'>";
345 }
346
347 var mouseover_attrs = "onmouseover='postMouseIn($id)' "+
348 "onmouseout='postMouseOut($id)'";
349
350 tmp += "<tr class='"+row_class+"' id='RROW-"+id+"' "+mouseover_attrs+">";
351
352 tmp += "<td class='hlUpdPic'> </td>";
353
354 tmp += "<td class='hlSelectRow'>"+
355 "<input type=\"checkbox\" onclick=\"tSR(this)\" id=\"RCHK-"+id+"\"></td>";
356
357 tmp += "<td class='hlMarkedPic'>"+marked_pic+"</td>";
358
359 tmp += "<td onclick='view("+id+","+feed_id+")' "+
360 "class='hlContent' valign='middle'>";
361
45a6446d
AD
362 tmp += "<a target=\"_blank\" id=\"RTITLE-$id\" href=\"" +
363 rs.fieldByName("link") + "\"" +
261b88b3
AD
364 "onclick=\"return view("+id+","+feed_id+");\">"+
365 rs.fieldByName("title");
366
367 var content_preview = truncate_string(strip_tags(rs.fieldByName("content")),
368 100);
369
370 tmp += "<span class=\"contentPreview\"> - "+content_preview+"</span>";
371
372 tmp += "</a>";
373
374 tmp += "</td>";
375
376 tmp += "<td class=\"hlUpdated\" onclick='view("+id+","+feed_id+")'>"+
377 "<nobr>"+rs.fieldByName("updated").substring(0,16)+"</nobr></td>";
378
379 tmp += "</tr>";
380
381 rs.next();
382 line_num++;
383 }
384
385 if (offset == 0) {
386 tmp += "</table>";
387 tmp += "</div></div>";
388 }
389
390 if (offset == 0) {
391 container.innerHTML = tmp;
392 } else {
393 var ids = getSelectedArticleIds2();
394
395 //container.innerHTML = container.innerHTML + tmp;
396
397 for (var i = 0; i < ids.length; i++) {
398 markHeadline(ids[i]);
399 }
400 }
401 }
402
403 remove_splash();
6a2034f9
AD
404
405
406 } catch (e) {
407 exception_error("viewfeed_offline", e);
408 }
409}
410
203de776 411function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) {
7719618b 412 try {
6b4163cb 413
6a2034f9
AD
414 if (offline_mode) return viewfeed_offline(feed, subop, is_cat, subop_param,
415 skip_history, offset);
416
ac541432 417// if (!offset) page_offset = 0;
c50e2b30 418
32f0c8b0 419 last_requested_article = 0;
e07aec92 420 //counters_last_request = 0;
32f0c8b0 421
b8e6acea
AD
422 if (feed == getActiveFeedId()) {
423 cache_invalidate("F:" + feed);
424 }
425
0b6cffa8 426/* if (getInitParam("theme") == "" || getInitParam("theme") == "compact") {
d6918e1d
AD
427 if (getInitParam("hide_feedlist") == 1) {
428 Element.hide("feeds-holder");
429 }
0b6cffa8 430 } */
24c1e1c1 431
52d7e7da
AD
432 var force_nocache = false;
433
b3c67a48
AD
434 var page_offset = 0;
435
ac541432 436 if (offset > 0) {
c50e2b30 437 page_offset = offset;
ac541432
AD
438 } else {
439 page_offset = 0;
a49f5e05 440 _feed_cur_page = 0;
29dfb258 441 _infscroll_disable = 0;
ac541432
AD
442 }
443
444 if (getActiveFeedId() != feed) {
a49f5e05 445 _feed_cur_page = 0;
457c494a 446 active_post_id = 0;
29dfb258 447 _infscroll_disable = 0;
c50e2b30 448 }
203de776 449
82764a41
AD
450 if (page_offset != 0 && !subop) {
451 var date = new Date();
452 var timestamp = Math.round(date.getTime() / 1000);
453
454 debug("<b>" + _infscroll_request_sent + " : " + timestamp + "</b>");
455
456 if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) {
457 debug("infscroll request in progress, aborting");
458 return;
459 }
460
461 _infscroll_request_sent = timestamp;
462 }
463
7719618b 464 enableHotkeys();
0a6c4846 465
0979b696
AD
466 closeInfoBox();
467
fd98576c
AD
468 Form.enable("main_toolbar_form");
469
6b4163cb 470 var toolbar_form = document.forms["main_toolbar_form"];
fd98576c 471 var toolbar_query = Form.serialize("main_toolbar_form");
86b682ce 472
4764c27e 473 if (toolbar_form.query) {
52d7e7da
AD
474 if (toolbar_form.query.value != "") {
475 force_nocache = true;
476 }
f31673f7 477 toolbar_form.query.value = "";
164f4738
AD
478 }
479
86b682ce
AD
480 var query = "backend.php?op=viewfeed&feed=" + feed + "&" +
481 toolbar_query + "&subop=" + param_escape(subop);
482
9cb99906
AD
483 if (document.getElementById("search_form")) {
484 var search_query = Form.serialize("search_form");
86b682ce 485 query = query + "&" + search_query;
9cb99906 486 closeInfoBox(true);
52d7e7da 487 force_nocache = true;
86b682ce
AD
488 }
489
6c3b0198 490// debug("IS_CAT_STORED: " + activeFeedIsCat() + ", IS_CAT: " + is_cat);
0a6c4846 491
7719618b 492 if (subop == "MarkAllRead") {
e0998414 493
9cb99906 494 var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
3ac2b520 495
f46192bb
AD
496 if (show_next_feed) {
497
498 if (!activeFeedIsCat()) {
499
500 var feedlist = document.getElementById('feedList');
501
502 var next_unread_feed = getRelativeFeedId(feedlist,
503 feed, "next", true);
504
505 if (!next_unread_feed) {
506 next_unread_feed = getRelativeFeedId(feedlist,
507 -3, "next", true);
508 }
509
510 if (next_unread_feed) {
511 query = query + "&nuf=" + param_escape(next_unread_feed);
512 //setActiveFeedId(next_unread_feed);
513 feed = next_unread_feed;
514 }
515 } else {
516
517 var next_unread_feed = getNextUnreadCat(feed);
518
519 /* we don't need to specify that our next feed is actually
520 a category, because we're in the is_cat mode by definition
521 already */
522
523 if (next_unread_feed && show_next_feed) {
524 query = query + "&nuf=" + param_escape(next_unread_feed);
525 feed = next_unread_feed;
526 }
527
528 }
e0998414 529 }
7719618b 530 }
ff2c6e6a 531
6c3b0198 532 if (is_cat) {
ff2c6e6a
AD
533 query = query + "&cat=1";
534 }
99ff73f4 535
c50e2b30
AD
536 if (page_offset != 0) {
537 query = query + "&skip=" + page_offset;
60d4df4d
AD
538
539 // to prevent duplicate feed titles when showing grouped vfeeds
540 if (vgroup_last_feed) {
541 query = query + "&vgrlf=" + param_escape(vgroup_last_feed);
542 }
203de776
AD
543 }
544
a51193e2
AD
545 var date = new Date();
546 var timestamp = Math.round(date.getTime() / 1000);
547 query = query + "&ts=" + timestamp
7719618b 548
6b4163cb
AD
549 disableContainerChildren("headlinesToolbar", false);
550 Form.enable("main_toolbar_form");
551
3de0261a
AD
552 // for piggybacked counters
553
554 if (tagsAreDisplayed()) {
555 query = query + "&omode=lt";
556 } else {
557 query = query + "&omode=flc";
558 }
559
6cc1fab3
AD
560 if (!async_counters_work) {
561 query = query + "&csync=true";
562 }
563
081e527d
AD
564 debug(query);
565
19815594 566 var container = document.getElementById("headlinesInnerContainer");
59cc876c 567
f60cc761 568/* if (container && page_offset == 0 && !isCdmMode()) {
19815594 569 new Effect.Fade(container, {duration: 1, to: 0.01,
df2b1e26 570 queue: { position:'end', scope: 'FEEDL-' + feed, limit: 1 } } );
f60cc761 571 } */
a49f5e05 572
73241803
AD
573 var unread_ctr = -1;
574
575 if (!is_cat) unread_ctr = get_feed_unread(feed);
576
e19c1824
AD
577 var cache_check = false;
578
8e9dd206 579 if (unread_ctr != -1 && !page_offset && !force_nocache && !subop) {
dd5865d4
AD
580
581 var cache_prefix = "";
582
583 if (is_cat) {
584 cache_prefix = "C:";
585 } else {
586 cache_prefix = "F:";
587 }
588
589 cache_check = cache_check_param(cache_prefix + feed, unread_ctr);
590 debug("headline cache check: " + cache_check);
e19c1824
AD
591 }
592
593 if (cache_check) {
594 var f = document.getElementById("headlines-frame");
595
596 clean_feed_selections();
597
3d72bbdb 598 setActiveFeedId(feed, is_cat);
e19c1824 599
e19c1824
AD
600 if (!is_cat) {
601 var feedr = document.getElementById("FEEDR-" + feed);
602 if (feedr && !feedr.className.match("Selected")) {
603 feedr.className = feedr.className + "Selected";
604 }
3d72bbdb
AD
605 } else {
606 var feedr = document.getElementById("FCAT-" + feed_id);
607 if (feedr && !feedr.className.match("Selected")) {
608 feedr.className = feedr.className + "Selected";
609 }
e19c1824
AD
610 }
611
dd5865d4 612 f.innerHTML = cache_find_param(cache_prefix + feed, unread_ctr);
e19c1824 613
5aaf9b34 614 request_counters();
31234407 615 remove_splash();
e19c1824
AD
616
617 } else {
618
619 if (!page_offset) {
620 notify_progress("Loading, please wait...", true);
621 }
622
623 new Ajax.Request(query, {
624 onComplete: function(transport) {
3d72bbdb 625 headlines_callback2(transport, page_offset);
e19c1824
AD
626 } });
627 }
6b4163cb 628
7719618b
AD
629 } catch (e) {
630 exception_error("viewfeed", e);
631 }
1a66d16e
AD
632}
633
1d5e9fb9
AD
634function toggleCollapseCat_af(effect) {
635 //var caption = elem.id.replace("FCATLIST-", "");
636
637 try {
638
639 var elem = effect.element;
640 var cat = elem.id.replace("FCATLIST-", "");
641 var cap = document.getElementById("FCAP-" + cat);
66a251f9 642
1d5e9fb9 643 if (Element.visible(elem)) {
66a251f9 644 cap.innerHTML = cap.innerHTML.replace("…", "");
1d5e9fb9 645 } else {
66a251f9
AD
646 if (cap.innerHTML.lastIndexOf("…") != cap.innerHTML.length-3) {
647 cap.innerHTML = cap.innerHTML + "…";
1d5e9fb9
AD
648 }
649 }
650
651 } catch (e) {
652 exception_error("toggleCollapseCat_af", e);
653 }
654}
655
fe14aeb8
AD
656function toggleCollapseCat(cat) {
657 try {
fe14aeb8
AD
658
659 var cat_elem = document.getElementById("FCAT-" + cat);
96737ce9 660 var cat_list = document.getElementById("FCATLIST-" + cat).parentNode;
99ff73f4 661 var caption = document.getElementById("FCAP-" + cat);
fe14aeb8 662
225ec0d4 663/* if (cat_list.className.match("invisible")) {
fe14aeb8
AD
664 cat_list.className = "";
665 caption.innerHTML = caption.innerHTML.replace("...", "");
65f85814
AD
666 if (cat == 0) {
667 setCookie("ttrss_vf_uclps", "0");
668 }
fe14aeb8
AD
669 } else {
670 cat_list.className = "invisible";
671 caption.innerHTML = caption.innerHTML + "...";
65f85814
AD
672 if (cat == 0) {
673 setCookie("ttrss_vf_uclps", "1");
225ec0d4
AD
674 }
675
676 } */
677
731b05f4
AD
678 if (cat == 0) {
679 if (Element.visible("FCATLIST-" + cat)) {
680 setCookie("ttrss_vf_uclps", "1");
681 } else {
682 setCookie("ttrss_vf_uclps", "0");
683 }
684 }
685
bd64489f
AD
686 if (cat == -2) {
687 if (Element.visible("FCATLIST-" + cat)) {
688 setCookie("ttrss_vf_lclps", "1");
689 } else {
690 setCookie("ttrss_vf_lclps", "0");
691 }
692 }
693
3b086176
AD
694 if (cat == -1) {
695 if (Element.visible("FCATLIST-" + cat)) {
696 setCookie("ttrss_vf_vclps", "1");
697 } else {
698 setCookie("ttrss_vf_vclps", "0");
699 }
700 }
701
1d5e9fb9
AD
702 Effect.toggle('FCATLIST-' + cat, 'blind', { duration: 0.5,
703 afterFinish: toggleCollapseCat_af });
fe14aeb8 704
e8bd0da9
AD
705 new Ajax.Request("backend.php?op=feeds&subop=collapse&cid=" +
706 param_escape(cat));
fe14aeb8
AD
707
708 } catch (e) {
83f043bb 709 exception_error("toggleCollapseCat", e);
fe14aeb8
AD
710 }
711}
712
9d393c84
AD
713function feedlist_dragsorted(ctr) {
714 try {
715 var elem = document.getElementById("feedList");
716
717 var cats = elem.getElementsByTagName("LI");
718 var ordered_cats = new Array();
719
720 for (var i = 0; i < cats.length; i++) {
721 if (cats[i].id && cats[i].id.match("FCAT-")) {
722 ordered_cats.push(cats[i].id.replace("FCAT-", ""));
723 }
724 }
725
726 if (ordered_cats.length > 0) {
727
728 var query = "backend.php?op=feeds&subop=catsort&corder=" +
729 param_escape(ordered_cats.toString());
730
731 debug(query);
732
733 new Ajax.Request(query);
734 }
735
736 } catch (e) {
4fdb0476 737 exception_error("feedlist_dragsorted", e);
9d393c84
AD
738 }
739}
740
6b4163cb 741function feedlist_init() {
1b0809ae 742 try {
6e0c9275
AD
743// if (arguments.callee.done) return;
744// arguments.callee.done = true;
a38f09cf 745
99509451 746 loading_set_progress(90);
730dbf19 747
80e4dc34 748 debug("in feedlist init");
a38f09cf 749
60ea2377 750 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
1b0809ae 751 document.onkeydown = hotkey_handler;
f3169d7e
AD
752 document.onmousemove = mouse_move_handler;
753 document.onmousedown = mouse_down_handler;
754 document.onmouseup = mouse_up_handler;
a06d0e5a 755
a4b906ec 756 if (!offline_mode) setTimeout("timeout()", 1);
2055d4a6 757
935f235d
AD
758 if (typeof correctPNG != 'undefined') {
759 correctPNG();
760 }
761
7086277c 762 if (getActiveFeedId()) {
18bcd715
AD
763 //debug("some feed is open on feedlist refresh, reloading");
764 //setTimeout("viewCurrentFeed()", 100);
2d24f032 765 } else {
99509451 766 if (getInitParam("cdm_auto_catchup") != 1 && get_feed_unread(-3) > 0) {
730dbf19 767 notify_silent_next();
e1dfd280 768 setTimeout("viewfeed(-3)", 100);
730dbf19
AD
769 } else {
770 remove_splash();
e1dfd280 771 }
2d24f032 772 }
7086277c 773
22e06406 774 if (getInitParam("theme") == "") {
af9964d3 775 setTimeout("hide_footer()", 5000);
58daed52 776 }
22e06406 777
0b6cffa8 778 init_collapsable_feedlist(getInitParam("theme"));
37b29ac9 779
a5550322 780 toggle_sortable_feedlist(isFeedlistSortable());
782ddd70 781
1b0809ae 782 } catch (e) {
bbf4d0b2 783 exception_error("feedlist/init", e);
1b0809ae 784 }
3745788e 785}
22e06406
AD
786
787function hide_footer_af(effect) {
788 try {
789 var c = document.getElementById("content-frame");
790
791 if (c) {
792 c.style.bottom = "0px";
4710e3dc
AD
793
794 var ioa = document.getElementById("inline_orig_article");
795
796 if (ioa) {
797 ioa.height = c.offsetHeight;
798 }
799
22e06406
AD
800 } else {
801 var h = document.getElementById("headlines-frame");
802
803 if (h) {
804 h.style.bottom = "0px";
805 }
806 }
807
808 } catch (e) {
809 exception_error("hide_footer_af", e);
810 }
811}
812
813function hide_footer() {
814 try {
815 if (Element.visible("footer")) {
816 new Effect.Fade("footer", { afterFinish: hide_footer_af });
817 }
818 } catch (e) {
819 exception_error("hide_footer", e);
820 }
821}
37b29ac9 822
0b6cffa8 823/*
58daed52 824function init_hidden_feedlist(theme) {
37b29ac9 825 try {
24c1e1c1
AD
826 debug("init_hidden_feedlist");
827
d6918e1d 828 if (theme != "" && theme != "compact") return;
58daed52 829
37b29ac9
AD
830 var fl = document.getElementById("feeds-holder");
831 var fh = document.getElementById("headlines-frame");
24c1e1c1
AD
832 var fc = document.getElementById("content-frame");
833 var ft = document.getElementById("toolbar");
834 var ff = document.getElementById("footer");
d6918e1d
AD
835 var fhdr = document.getElementById("header");
836
24c1e1c1 837 var fbtn = document.getElementById("toggle_feeds_btn");
37b29ac9 838
24c1e1c1
AD
839 if (fbtn) Element.show(fbtn);
840
841 fl.style.top = fh.offsetTop + "px";
842 fl.style.backgroundColor = "white"; //FIXME
37b29ac9 843
24c1e1c1
AD
844 Element.hide(fl);
845
846 fh.style.left = "0px";
847 ft.style.left = "0px";
848 if (fc) fc.style.left = "0px";
849 if (ff) ff.style.left = "0px";
37b29ac9 850
d6918e1d
AD
851 if (theme == "compact") {
852 fhdr.style.left = "10px";
853 fl.style.top = (fh.offsetTop + 1) + "px";
854 }
855
37b29ac9
AD
856 } catch (e) {
857 exception_error("init_hidden_feedlist", e);
858 }
0b6cffa8 859} */
8389b150 860
58daed52 861function init_collapsable_feedlist(theme) {
8389b150
AD
862 try {
863 debug("init_collapsable_feedlist");
864
33aeea94
AD
865 if (theme != "" && theme != "compact" && theme != "graycube" &&
866 theme != "compat") return;
58daed52 867
8389b150
AD
868 var fbtn = document.getElementById("collapse_feeds_btn");
869
870 if (fbtn) Element.show(fbtn);
871
22936abb
AD
872 if (getCookie("ttrss_vf_fclps") == 1) {
873 collapse_feedlist();
874 }
875
8389b150
AD
876 } catch (e) {
877 exception_error("init_hidden_feedlist", e);
878 }
879
880}
730dbf19 881
f3169d7e
AD
882function mouse_move_handler(e) {
883 try {
884 var client_y;
dee4a409 885 var client_x;
f3169d7e
AD
886
887 if (window.event) {
888 client_y = window.event.clientY;
dee4a409 889 client_x = window.event.clientX;
f3169d7e 890 } else if (e) {
0fb6ae04
AD
891 client_x = e.screenX;
892 client_y = e.screenY;
f3169d7e
AD
893 }
894
43dbb07f 895 if (mouse_is_down) {
f3169d7e 896
dee4a409
AD
897 if (mouse_y == 0) mouse_y = client_y;
898 if (mouse_x == 0) mouse_x = client_x;
f3169d7e 899
dee4a409 900 resize_headlines(mouse_x - client_x, mouse_y - client_y);
a3f762ae
AD
901
902 mouse_y = client_y;
903 mouse_x = client_x;
904
f3169d7e
AD
905 return false;
906 }
907
908 } catch (e) {
909 exception_error("mouse_move_handler", e);
910 }
911}
912
bf3c9838 913function enable_selection(b) {
ee4ee3e3 914 selection_disabled = !b;
bf3c9838
AD
915}
916
94047498
AD
917function enable_resize(b) {
918 resize_enabled = b;
91cdbe52
AD
919}
920
f3169d7e
AD
921function mouse_down_handler(e) {
922 try {
a4724aa3
AD
923
924 /* do not prevent right click */
925 if (e.button && e.button == 2) return;
926
94047498 927 if (resize_enabled) {
a3f762ae
AD
928 mouse_is_down = true;
929 mouse_x = 0;
930 mouse_y = 0;
a2be67cd 931 document.onselectstart = function() { return false; };
17042fc0 932 return false;
a3f762ae 933 }
bf3c9838
AD
934
935 if (selection_disabled) {
936 document.onselectstart = function() { return false; };
937 return false;
938 }
939
f3169d7e
AD
940 } catch (e) {
941 exception_error("mouse_move_handler", e);
942 }
943}
944
945function mouse_up_handler(e) {
946 try {
f3169d7e 947 mouse_is_down = false;
bf3c9838 948
ee4ee3e3 949 if (!selection_disabled) {
bf3c9838
AD
950 document.onselectstart = null;
951 var e = document.getElementById("headlineActionsBody");
952 if (e) Element.hide(e);
953 }
954
f3169d7e
AD
955 } catch (e) {
956 exception_error("mouse_move_handler", e);
957 }
958}
5aaf9b34 959
997d9d7c 960function request_counters_real() {
5aaf9b34
AD
961
962 try {
06c88b8d 963
2f4eb720
AD
964 if (offline_mode) return;
965
06c88b8d
AD
966 debug("requesting counters...");
967
5aaf9b34
AD
968 var query = "backend.php?op=rpc&subop=getAllCounters";
969
970 if (tagsAreDisplayed()) {
971 query = query + "&omode=tl";
972 } else {
973 query = query + "&omode=flc";
974 }
975
976 new Ajax.Request(query, {
977 onComplete: function(transport) {
978 try {
6cc1fab3 979 all_counters_callback2(transport, true);
5aaf9b34
AD
980 } catch (e) {
981 exception_error("viewfeed/getcounters", e);
982 }
983 } });
984
997d9d7c
AD
985 } catch (e) {
986 exception_error("request_counters_real", e);
987 }
988}
989
997d9d7c
AD
990
991function request_counters() {
992
993 try {
994
a598370d
AD
995 if (getInitParam("bw_limit") == "1") return;
996
997d9d7c
AD
997 var date = new Date();
998 var timestamp = Math.round(date.getTime() / 1000);
999
d234a2e3
AD
1000// if (getInitParam("sync_counters") == "1" ||
1001// timestamp - counters_last_request > 10) {
1002
e07aec92 1003 if (timestamp - counters_last_request > 15) {
997d9d7c 1004 debug("scheduling request of counters...");
06c88b8d 1005 window.setTimeout("request_counters_real()", 1000);
997d9d7c
AD
1006 counters_last_request = timestamp;
1007 } else {
1008 debug("request_counters: rate limit reached: " + (timestamp - counters_last_request));
f55b0b12 1009 }
997d9d7c 1010
5aaf9b34
AD
1011 } catch (e) {
1012 exception_error("request_counters", e);
1013 }
1014}
a4b906ec
AD
1015
1016function update_feedlist_counters() {
1017 try {
1018 var rs = db.execute("SELECT feeds.id,COUNT(articles.id) "+
1019 "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+
1020 "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+
1021 "ORDER BY feeds.title");
1022
1023 while (rs.isValidRow()) {
1024 var id = rs.field(0);
1025 var ctr = rs.field(1);
1026
1027 var feedctr = document.getElementById("FEEDCTR-" + id);
1028 var feedu = document.getElementById("FEEDU-" + id);
1029 var feedr = document.getElementById("FEEDR-" + id);
1030
1031 if (feedctr && feedu && feedr) {
1032
1033 var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML));
1034
1035 feedu.innerHTML = ctr;
1036
1037 if (ctr > 0) {
1038 feedctr.className = "feedCtrHasUnread";
1039 if (!feedr.className.match("Unread")) {
1040 var is_selected = feedr.className.match("Selected");
1041
1042 feedr.className = feedr.className.replace("Selected", "");
1043 feedr.className = feedr.className.replace("Unread", "");
1044
1045 feedr.className = feedr.className + "Unread";
1046
1047 if (is_selected) {
1048 feedr.className = feedr.className + "Selected";
1049 }
1050
1051 }
1052
1053 if (row_needs_hl) {
1054 new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5",
1055 queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } );
1056 }
1057 } else {
1058 feedctr.className = "feedCtrNoUnread";
1059 feedr.className = feedr.className.replace("Unread", "");
1060 }
1061 }
1062 rs.next();
1063 }
1064
1065 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
1066
b5483543 1067 global_unread = get_local_feed_unread(-4);
a4b906ec
AD
1068 updateTitle();
1069
1070 } catch (e) {
1071 exception_error("update_feedlist_counters", e);
1072 }
1073}