]> git.wh0rd.org - tt-rss.git/blame_incremental - feedlist.js
viewfeed_offline: fix for undefined offset parameter
[tt-rss.git] / feedlist.js
... / ...
CommitLineData
1var _feed_cur_page = 0;
2var _infscroll_disable = 0;
3var _infscroll_request_sent = 0;
4var feed_under_pointer = undefined;
5
6var mouse_is_down = false;
7var mouse_y = 0;
8var mouse_x = 0;
9
10var resize_enabled = false;
11var selection_disabled = false;
12var counters_last_request = 0;
13
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
28function viewCategory(cat) {
29 viewfeed(cat, '', true);
30 return false;
31}
32
33function printFeedEntry(id, title, row_class, unread, icon) {
34
35 var tmp = "";
36 var fctr_class = "";
37 var feed_icon = "";
38
39 if (unread > 0) {
40 row_class += "Unread";
41 fctr_class = "feedCtrHasUnread";
42 } else {
43 fctr_class = "feedCtrNoUnread";
44 }
45
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 }
51
52 var link = "<a title=\"FIXME\" id=\"FEEDL-"+id+"\""+
53 "href=\"javascript:viewfeed('"+id+"', '', false, '', false, 0);\">"+
54 title + "</a>";
55
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");
75 } else {
76 rs = db.execute("SELECT SUM(unread) FROM articles WHERE feed_id = ?", [id]);
77 }
78
79 if (rs.isValidRow()) {
80 return rs.field(0);
81 } else {
82 return 0;
83 }
84
85 } catch (e) {
86 exception_error("get_local_feed_unread", e);
87 }
88}
89
90function render_offline_feedlist() {
91 try {
92 var tmp = "<ul class=\"feedList\" id=\"feedList\">";
93
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");
106
107 tmp += "<li><hr/></li>";
108
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");
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);
119 var unread = rs.field(3);
120
121 var icon = "";
122
123 if (has_icon) {
124 icon = "icons/" + id + ".ico";
125 }
126
127
128 var feed_icon = "";
129
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
139 tmp += printFeedEntry(id, title, "feed", unread, icon);
140
141 rs.next();
142 }
143
144 tmp += "</ul>";
145
146 render_feedlist(tmp);
147 } catch (e) {
148 exception_error("render_offline_feedlist", e);
149 }
150}
151
152function render_feedlist(data) {
153 try {
154
155 var f = document.getElementById("feeds-frame");
156 f.innerHTML = data;
157 cache_invalidate("FEEDLIST");
158 cache_inject("FEEDLIST", data, getInitParam("num_feeds"));
159 feedlist_init();
160
161 } catch (e) {
162 exception_error("render_feedlist", e);
163 }
164}
165
166function feedlist_callback2(transport) {
167 try {
168 debug("feedlist_callback2");
169 if (!transport_error_check(transport)) return;
170 render_feedlist(transport.responseText);
171 } catch (e) {
172 exception_error("feedlist_callback2", e);
173 }
174}
175
176function viewNextFeedPage() {
177 try {
178 //if (!getActiveFeedId()) return;
179
180 debug("viewNextFeedPage: calling viewfeed(), p: " + _feed_cur_page+1);
181
182 viewfeed(getActiveFeedId(), undefined, activeFeedIsCat(), undefined,
183 undefined, _feed_cur_page+1);
184
185 } catch (e) {
186 exception_error("viewNextFeedPage", e);
187 }
188}
189
190function viewfeed_offline(feed_id, subop, is_cat, subop_param, skip_history, offset) {
191 try {
192 notify('');
193
194 if (!offset) offset = 0;
195
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
214 disableContainerChildren("headlinesToolbar", false);
215 Form.enable("main_toolbar_form");
216
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
232 if (rs.isValidRow() || feed_id == -1 || feed_id == -4) {
233
234 feed_title = rs.field(0);
235
236 if (feed_id == -1) {
237 feed_title = __("Starred articles");
238 }
239
240 if (feed_id == -4) {
241 feed_title = __("All articles");
242 }
243
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
273 var rs;
274
275 var limit = 30;
276
277 var toolbar_form = document.forms["main_toolbar_form"];
278
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;
288 }
289
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
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
362 tmp += "<a target=\"_blank\" id=\"RTITLE-$id\" href=\"" +
363 rs.fieldByName("link") + "\"" +
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();
404
405
406 } catch (e) {
407 exception_error("viewfeed_offline", e);
408 }
409}
410
411function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) {
412 try {
413
414 if (offline_mode) return viewfeed_offline(feed, subop, is_cat, subop_param,
415 skip_history, offset);
416
417// if (!offset) page_offset = 0;
418
419 last_requested_article = 0;
420 //counters_last_request = 0;
421
422 if (feed == getActiveFeedId()) {
423 cache_invalidate("F:" + feed);
424 }
425
426/* if (getInitParam("theme") == "" || getInitParam("theme") == "compact") {
427 if (getInitParam("hide_feedlist") == 1) {
428 Element.hide("feeds-holder");
429 }
430 } */
431
432 var force_nocache = false;
433
434 var page_offset = 0;
435
436 if (offset > 0) {
437 page_offset = offset;
438 } else {
439 page_offset = 0;
440 _feed_cur_page = 0;
441 _infscroll_disable = 0;
442 }
443
444 if (getActiveFeedId() != feed) {
445 _feed_cur_page = 0;
446 active_post_id = 0;
447 _infscroll_disable = 0;
448 }
449
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
464 enableHotkeys();
465
466 closeInfoBox();
467
468 Form.enable("main_toolbar_form");
469
470 var toolbar_form = document.forms["main_toolbar_form"];
471 var toolbar_query = Form.serialize("main_toolbar_form");
472
473 if (toolbar_form.query) {
474 if (toolbar_form.query.value != "") {
475 force_nocache = true;
476 }
477 toolbar_form.query.value = "";
478 }
479
480 var query = "backend.php?op=viewfeed&feed=" + feed + "&" +
481 toolbar_query + "&subop=" + param_escape(subop);
482
483 if (document.getElementById("search_form")) {
484 var search_query = Form.serialize("search_form");
485 query = query + "&" + search_query;
486 closeInfoBox(true);
487 force_nocache = true;
488 }
489
490// debug("IS_CAT_STORED: " + activeFeedIsCat() + ", IS_CAT: " + is_cat);
491
492 if (subop == "MarkAllRead") {
493
494 var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
495
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 }
529 }
530 }
531
532 if (is_cat) {
533 query = query + "&cat=1";
534 }
535
536 if (page_offset != 0) {
537 query = query + "&skip=" + page_offset;
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 }
543 }
544
545 var date = new Date();
546 var timestamp = Math.round(date.getTime() / 1000);
547 query = query + "&ts=" + timestamp
548
549 disableContainerChildren("headlinesToolbar", false);
550 Form.enable("main_toolbar_form");
551
552 // for piggybacked counters
553
554 if (tagsAreDisplayed()) {
555 query = query + "&omode=lt";
556 } else {
557 query = query + "&omode=flc";
558 }
559
560 if (!async_counters_work) {
561 query = query + "&csync=true";
562 }
563
564 debug(query);
565
566 var container = document.getElementById("headlinesInnerContainer");
567
568/* if (container && page_offset == 0 && !isCdmMode()) {
569 new Effect.Fade(container, {duration: 1, to: 0.01,
570 queue: { position:'end', scope: 'FEEDL-' + feed, limit: 1 } } );
571 } */
572
573 var unread_ctr = -1;
574
575 if (!is_cat) unread_ctr = get_feed_unread(feed);
576
577 var cache_check = false;
578
579 if (unread_ctr != -1 && !page_offset && !force_nocache && !subop) {
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);
591 }
592
593 if (cache_check) {
594 var f = document.getElementById("headlines-frame");
595
596 clean_feed_selections();
597
598 setActiveFeedId(feed, is_cat);
599
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 }
605 } else {
606 var feedr = document.getElementById("FCAT-" + feed_id);
607 if (feedr && !feedr.className.match("Selected")) {
608 feedr.className = feedr.className + "Selected";
609 }
610 }
611
612 f.innerHTML = cache_find_param(cache_prefix + feed, unread_ctr);
613
614 request_counters();
615 remove_splash();
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) {
625 headlines_callback2(transport, page_offset);
626 } });
627 }
628
629 } catch (e) {
630 exception_error("viewfeed", e);
631 }
632}
633
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);
642
643 if (Element.visible(elem)) {
644 cap.innerHTML = cap.innerHTML.replace("…", "");
645 } else {
646 if (cap.innerHTML.lastIndexOf("…") != cap.innerHTML.length-3) {
647 cap.innerHTML = cap.innerHTML + "…";
648 }
649 }
650
651 } catch (e) {
652 exception_error("toggleCollapseCat_af", e);
653 }
654}
655
656function toggleCollapseCat(cat) {
657 try {
658
659 var cat_elem = document.getElementById("FCAT-" + cat);
660 var cat_list = document.getElementById("FCATLIST-" + cat).parentNode;
661 var caption = document.getElementById("FCAP-" + cat);
662
663/* if (cat_list.className.match("invisible")) {
664 cat_list.className = "";
665 caption.innerHTML = caption.innerHTML.replace("...", "");
666 if (cat == 0) {
667 setCookie("ttrss_vf_uclps", "0");
668 }
669 } else {
670 cat_list.className = "invisible";
671 caption.innerHTML = caption.innerHTML + "...";
672 if (cat == 0) {
673 setCookie("ttrss_vf_uclps", "1");
674 }
675
676 } */
677
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
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
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
702 Effect.toggle('FCATLIST-' + cat, 'blind', { duration: 0.5,
703 afterFinish: toggleCollapseCat_af });
704
705 new Ajax.Request("backend.php?op=feeds&subop=collapse&cid=" +
706 param_escape(cat));
707
708 } catch (e) {
709 exception_error("toggleCollapseCat", e);
710 }
711}
712
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) {
737 exception_error("feedlist_dragsorted", e);
738 }
739}
740
741function feedlist_init() {
742 try {
743// if (arguments.callee.done) return;
744// arguments.callee.done = true;
745
746 loading_set_progress(90);
747
748 debug("in feedlist init");
749
750 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
751 document.onkeydown = hotkey_handler;
752 document.onmousemove = mouse_move_handler;
753 document.onmousedown = mouse_down_handler;
754 document.onmouseup = mouse_up_handler;
755
756 if (!offline_mode) setTimeout("timeout()", 1);
757
758 if (typeof correctPNG != 'undefined') {
759 correctPNG();
760 }
761
762 if (getActiveFeedId()) {
763 //debug("some feed is open on feedlist refresh, reloading");
764 //setTimeout("viewCurrentFeed()", 100);
765 } else {
766 if (getInitParam("cdm_auto_catchup") != 1 && get_feed_unread(-3) > 0) {
767 notify_silent_next();
768 setTimeout("viewfeed(-3)", 100);
769 } else {
770 remove_splash();
771 }
772 }
773
774 if (getInitParam("theme") == "") {
775 setTimeout("hide_footer()", 5000);
776 }
777
778 init_collapsable_feedlist(getInitParam("theme"));
779
780 toggle_sortable_feedlist(isFeedlistSortable());
781
782 } catch (e) {
783 exception_error("feedlist/init", e);
784 }
785}
786
787function hide_footer_af(effect) {
788 try {
789 var c = document.getElementById("content-frame");
790
791 if (c) {
792 c.style.bottom = "0px";
793
794 var ioa = document.getElementById("inline_orig_article");
795
796 if (ioa) {
797 ioa.height = c.offsetHeight;
798 }
799
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}
822
823/*
824function init_hidden_feedlist(theme) {
825 try {
826 debug("init_hidden_feedlist");
827
828 if (theme != "" && theme != "compact") return;
829
830 var fl = document.getElementById("feeds-holder");
831 var fh = document.getElementById("headlines-frame");
832 var fc = document.getElementById("content-frame");
833 var ft = document.getElementById("toolbar");
834 var ff = document.getElementById("footer");
835 var fhdr = document.getElementById("header");
836
837 var fbtn = document.getElementById("toggle_feeds_btn");
838
839 if (fbtn) Element.show(fbtn);
840
841 fl.style.top = fh.offsetTop + "px";
842 fl.style.backgroundColor = "white"; //FIXME
843
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";
850
851 if (theme == "compact") {
852 fhdr.style.left = "10px";
853 fl.style.top = (fh.offsetTop + 1) + "px";
854 }
855
856 } catch (e) {
857 exception_error("init_hidden_feedlist", e);
858 }
859} */
860
861function init_collapsable_feedlist(theme) {
862 try {
863 debug("init_collapsable_feedlist");
864
865 if (theme != "" && theme != "compact" && theme != "graycube" &&
866 theme != "compat") return;
867
868 var fbtn = document.getElementById("collapse_feeds_btn");
869
870 if (fbtn) Element.show(fbtn);
871
872 if (getCookie("ttrss_vf_fclps") == 1) {
873 collapse_feedlist();
874 }
875
876 } catch (e) {
877 exception_error("init_hidden_feedlist", e);
878 }
879
880}
881
882function mouse_move_handler(e) {
883 try {
884 var client_y;
885 var client_x;
886
887 if (window.event) {
888 client_y = window.event.clientY;
889 client_x = window.event.clientX;
890 } else if (e) {
891 client_x = e.screenX;
892 client_y = e.screenY;
893 }
894
895 if (mouse_is_down) {
896
897 if (mouse_y == 0) mouse_y = client_y;
898 if (mouse_x == 0) mouse_x = client_x;
899
900 resize_headlines(mouse_x - client_x, mouse_y - client_y);
901
902 mouse_y = client_y;
903 mouse_x = client_x;
904
905 return false;
906 }
907
908 } catch (e) {
909 exception_error("mouse_move_handler", e);
910 }
911}
912
913function enable_selection(b) {
914 selection_disabled = !b;
915}
916
917function enable_resize(b) {
918 resize_enabled = b;
919}
920
921function mouse_down_handler(e) {
922 try {
923
924 /* do not prevent right click */
925 if (e.button && e.button == 2) return;
926
927 if (resize_enabled) {
928 mouse_is_down = true;
929 mouse_x = 0;
930 mouse_y = 0;
931 document.onselectstart = function() { return false; };
932 return false;
933 }
934
935 if (selection_disabled) {
936 document.onselectstart = function() { return false; };
937 return false;
938 }
939
940 } catch (e) {
941 exception_error("mouse_move_handler", e);
942 }
943}
944
945function mouse_up_handler(e) {
946 try {
947 mouse_is_down = false;
948
949 if (!selection_disabled) {
950 document.onselectstart = null;
951 var e = document.getElementById("headlineActionsBody");
952 if (e) Element.hide(e);
953 }
954
955 } catch (e) {
956 exception_error("mouse_move_handler", e);
957 }
958}
959
960function request_counters_real() {
961
962 try {
963
964 if (offline_mode) return;
965
966 debug("requesting counters...");
967
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 {
979 all_counters_callback2(transport, true);
980 } catch (e) {
981 exception_error("viewfeed/getcounters", e);
982 }
983 } });
984
985 } catch (e) {
986 exception_error("request_counters_real", e);
987 }
988}
989
990
991function request_counters() {
992
993 try {
994
995 if (getInitParam("bw_limit") == "1") return;
996
997 var date = new Date();
998 var timestamp = Math.round(date.getTime() / 1000);
999
1000// if (getInitParam("sync_counters") == "1" ||
1001// timestamp - counters_last_request > 10) {
1002
1003 if (timestamp - counters_last_request > 15) {
1004 debug("scheduling request of counters...");
1005 window.setTimeout("request_counters_real()", 1000);
1006 counters_last_request = timestamp;
1007 } else {
1008 debug("request_counters: rate limit reached: " + (timestamp - counters_last_request));
1009 }
1010
1011 } catch (e) {
1012 exception_error("request_counters", e);
1013 }
1014}
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
1067 global_unread = get_local_feed_unread(-4);
1068 updateTitle();
1069
1070 } catch (e) {
1071 exception_error("update_feedlist_counters", e);
1072 }
1073}