]> git.wh0rd.org Git - tt-rss.git/blob - feedlist.js
js schema version checking; misc fixes
[tt-rss.git] / feedlist.js
1 var _feed_cur_page = 0;
2 var _infscroll_disable = 0;
3 var _infscroll_request_sent = 0;
4 var feed_under_pointer = undefined;
5
6 var mouse_is_down = false;
7 var mouse_y = 0;
8 var mouse_x = 0;
9
10 var resize_enabled = false;
11 var selection_disabled = false;
12 var counters_last_request = 0;
13
14 function 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
28 function viewCategory(cat) {
29         viewfeed(cat, '', true);
30         return false;
31 }
32
33 function render_offline_feedlist() {
34         try {
35                 var tmp = "<ul class=\"feedList\" id=\"feedList\">";
36
37                 var rs = db.execute("SELECT id,title,has_icon FROM feeds ORDER BY title");
38
39                 while (rs.isValidRow()) {
40
41                         var id = rs.field(0);
42                         var title = rs.field(1);
43                         var has_icon = rs.field(2);
44
45                         var rs_u = db.execute("SELECT SUM(unread) FROM articles WHERE feed_id = ?",
46                                 [id]);
47                         var unread = 0;
48
49                         if (rs_u.isValidRow()) {
50                                 unread = rs_u.field(0);
51                                 if (!unread) unread = 0;
52                         }
53
54
55                         var feed_icon = "";
56
57                         if (has_icon) {
58                                 feed_icon = "<img id='FIMG-"+id+"' src='" + "icons/" + id + ".ico'>";
59                         } else {
60                                 feed_icon = "<img id='FIMG-"+id+"' src='images/blank_icon.gif'>";
61                         }
62
63                         var row_class = "feed";
64
65                         if (unread > 0) {
66                                 row_class += "Unread";
67                                 fctr_class = "feedCtrHasUnread";
68                         } else {
69                                 fctr_class = "feedCtrNoUnread";
70                         }
71
72                         var link = "<a title=\"FIXME\" id=\"FEEDL-"+id+"\""+
73                                 "href=\"javascript:viewfeed('"+id+"', '', false, '', false, 0);\">"+
74                                 title + "</a>";
75
76                         tmp += "<li id='FEEDR-"+id+"' class="+row_class+">" + feed_icon + 
77                                 "<span id=\"FEEDN-"+id+"\">" + link + "</span>";
78
79                         tmp += " <span class='"+fctr_class+"' id=\"FEEDCTR-"+id+"\">" +
80                    "(<span id=\"FEEDU-"+id+"\">"+unread+"</span>)</span>";
81                                 
82                         tmp += "</li>";
83
84                         rs.next();
85                 }
86
87                 tmp += "</ul>";
88
89                 render_feedlist(tmp);
90         } catch (e) {
91                 exception_error("render_offline_feedlist", e);
92         }
93 }
94
95 function render_feedlist(data) {
96         try {
97
98                 var f = document.getElementById("feeds-frame");
99                 f.innerHTML = data;
100                 cache_invalidate("FEEDLIST");
101                 cache_inject("FEEDLIST", data, getInitParam("num_feeds"));
102                 feedlist_init();
103
104         } catch (e) {
105                 exception_error("render_feedlist", e);
106         }
107 }
108
109 function feedlist_callback2(transport) {
110         try {
111                 debug("feedlist_callback2");
112                 if (!transport_error_check(transport)) return;
113                 render_feedlist(transport.responseText);
114         } catch (e) {
115                 exception_error("feedlist_callback2", e);
116         }
117 }
118
119 function viewNextFeedPage() {
120         try {
121                 //if (!getActiveFeedId()) return;
122
123                 debug("viewNextFeedPage: calling viewfeed(), p: " + _feed_cur_page+1);
124
125                 viewfeed(getActiveFeedId(), undefined, activeFeedIsCat(), undefined,
126                         undefined, _feed_cur_page+1);
127
128         } catch (e) {
129                 exception_error("viewNextFeedPage", e);
130         }
131 }
132
133 function viewfeed_offline(feed_id, subop, is_cat, subop_param, skip_history, offset) {
134         try {
135                 notify('');
136
137                 loading_set_progress(100);
138
139                 clean_feed_selections();
140         
141                 setActiveFeedId(feed_id, is_cat);
142
143                 if (!is_cat) {
144                         var feedr = document.getElementById("FEEDR-" + feed_id);
145                         if (feedr && !feedr.className.match("Selected")) {      
146                                 feedr.className = feedr.className + "Selected";
147                         } 
148                 } else {
149                         var feedr = document.getElementById("FCAT-" + feed_id);
150                         if (feedr && !feedr.className.match("Selected")) {      
151                                 feedr.className = feedr.className + "Selected";
152                         } 
153                 }
154
155                 disableContainerChildren("headlinesToolbar", false);
156                 Form.enable("main_toolbar_form");
157
158                 var f = document.getElementById("headlines-frame");
159                 try {
160                         if (reply.offset == 0) { 
161                                 debug("resetting headlines scrollTop");
162                                 f.scrollTop = 0; 
163                         }
164                 } catch (e) { };
165
166
167                 var container = document.getElementById("headlines-frame");
168
169                 var tmp = "";
170
171                 rs = db.execute("SELECT title FROM feeds WHERE id = ?", [feed_id]);
172
173                 if (rs.isValidRow()) {
174
175                         var feed_title = rs.field(0);
176
177                         if (offset == 0) {
178                                 tmp += "<div id=\"headlinesContainer\">";
179                 
180                                 tmp += "<div class=\"headlinesSubToolbar\">";
181                                 tmp += "<div id=\"subtoolbar_ftitle\">";
182                                 tmp += feed_title;
183                                 tmp += "</div>";
184
185                                 var sel_all_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, '', true)";
186                                 var sel_unread_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true)";
187                                 var sel_none_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false)";
188                                 var sel_inv_link = "javascript:invertHeadlineSelection()";
189
190                                 tmp += __('Select:')+
191                                         " <a href=\""+sel_all_link+"\">"+__('All')+"</a>, "+
192                                         "<a href=\""+sel_unread_link+"\">"+__('Unread')+"</a>, "+
193                                         "<a href=\""+sel_inv_link+"\">"+__('Invert')+"</a>, "+
194                                         "<a href=\""+sel_none_link+"\">"+__('None')+"</a>";
195         
196                                 tmp += "&nbsp;&nbsp;";
197         
198                                 tmp += "</div>";
199         
200                                 tmp += "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">";
201         
202                                 tmp += "<table class=\"headlinesList\" id=\"headlinesList\" cellspacing=\"0\">";
203                         
204                         }
205         
206                         var rs = db.execute("SELECT * FROM articles WHERE feed_id = ?", [feed_id]);
207
208                         var line_num = 0;
209
210                         while (rs.isValidRow()) {
211
212                                 var id = rs.fieldByName("id");
213                                 var feed_id = rs.fieldByName("feed_id");
214
215                                 var marked_pic;
216         
217                                 var row_class = (line_num % 2) ? "even" : "odd";
218
219                                 if (rs.fieldByName("unread") == "1") {
220                                         row_class += "Unread";
221                                 }
222         
223                                 if (rs.fieldByName("marked") == "1") {
224                                         marked_pic = "<img id=\"FMPIC-"+id+"\" "+
225                                                 "src=\"images/mark_set.png\" class=\"markedPic\""+
226                                                 "alt=\"Unstar article\" onclick='javascript:tMark("+id+")'>";
227                                 } else {
228                                         marked_pic = "<img id=\"FMPIC-"+id+"\" "+
229                                                 "src=\"images/mark_unset.png\" class=\"markedPic\""+
230                                                 "alt=\"Star article\" onclick='javascript:tMark("+id+")'>";
231                                 }
232
233                                 var mouseover_attrs = "onmouseover='postMouseIn($id)' "+
234                                         "onmouseout='postMouseOut($id)'";
235         
236                                 tmp += "<tr class='"+row_class+"' id='RROW-"+id+"' "+mouseover_attrs+">";
237                                 
238                                 tmp += "<td class='hlUpdPic'> </td>";
239
240                                 tmp += "<td class='hlSelectRow'>"+
241                                         "<input type=\"checkbox\" onclick=\"tSR(this)\" id=\"RCHK-"+id+"\"></td>";
242                                 
243                                 tmp += "<td class='hlMarkedPic'>"+marked_pic+"</td>";
244         
245                                 tmp += "<td onclick='view("+id+","+feed_id+")' "+
246                                         "class='hlContent' valign='middle'>";
247         
248                                 tmp += "<a target=\"_blank\" id=\"RTITLE-$id\" href=\"" + 
249                                         rs.fieldByName("link") + "\"" +
250                                         "onclick=\"return view("+id+","+feed_id+");\">"+
251                                         rs.fieldByName("title");
252
253                                 var content_preview = truncate_string(strip_tags(rs.fieldByName("content")), 
254                                         100);
255
256                                 tmp += "<span class=\"contentPreview\"> - "+content_preview+"</span>";
257
258                                 tmp += "</a>";
259
260                                 tmp += "</td>";
261         
262                                 tmp += "<td class=\"hlUpdated\" onclick='view("+id+","+feed_id+")'>"+
263                                         "<nobr>"+rs.fieldByName("updated").substring(0,16)+"</nobr></td>";
264
265                                 tmp += "</tr>";
266
267                                 rs.next();
268                                 line_num++;
269                         }
270         
271                         if (offset == 0) {
272                                 tmp += "</table>";
273                                 tmp += "</div></div>";
274                         }
275         
276                         if (offset == 0) {
277                                 container.innerHTML = tmp;
278                         } else {
279                                 var ids = getSelectedArticleIds2();
280                 
281                                 //container.innerHTML = container.innerHTML + tmp;
282         
283                                 for (var i = 0; i < ids.length; i++) {
284                                         markHeadline(ids[i]);
285                                 }
286                         }
287                 }
288
289                 remove_splash();
290
291
292         } catch (e) {
293                 exception_error("viewfeed_offline", e);
294         }
295 }
296
297 function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) {
298         try {
299
300                 if (offline_mode) return viewfeed_offline(feed, subop, is_cat, subop_param,
301                         skip_history, offset);
302
303 //              if (!offset) page_offset = 0;
304
305                 last_requested_article = 0;
306                 //counters_last_request = 0;
307
308                 if (feed == getActiveFeedId()) {
309                         cache_invalidate("F:" + feed);
310                 }
311
312 /*              if (getInitParam("theme") == "" || getInitParam("theme") == "compact") {
313                         if (getInitParam("hide_feedlist") == 1) {
314                                 Element.hide("feeds-holder");
315                         }               
316                 } */
317
318                 var force_nocache = false;
319
320                 var page_offset = 0;
321
322                 if (offset > 0) {
323                         page_offset = offset;
324                 } else {
325                         page_offset = 0;
326                         _feed_cur_page = 0;
327                         _infscroll_disable = 0;
328                 }
329
330                 if (getActiveFeedId() != feed) {
331                         _feed_cur_page = 0;
332                         active_post_id = 0;
333                         _infscroll_disable = 0;
334                 }
335
336                 if (page_offset != 0 && !subop) {
337                         var date = new Date();
338                         var timestamp = Math.round(date.getTime() / 1000);
339
340                         debug("<b>" + _infscroll_request_sent + " : " + timestamp + "</b>");
341
342                         if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) {
343                                 debug("infscroll request in progress, aborting");
344                                 return;
345                         }
346
347                         _infscroll_request_sent = timestamp;                    
348                 }
349
350                 enableHotkeys();
351
352                 closeInfoBox();
353
354                 Form.enable("main_toolbar_form");
355
356                 var toolbar_form = document.forms["main_toolbar_form"];
357                 var toolbar_query = Form.serialize("main_toolbar_form");
358
359                 if (toolbar_form.query) {
360                         if (toolbar_form.query.value != "") {
361                                 force_nocache = true;
362                         }
363                         toolbar_form.query.value = "";
364                 }
365
366                 var query = "backend.php?op=viewfeed&feed=" + feed + "&" +
367                         toolbar_query + "&subop=" + param_escape(subop);
368
369                 if (document.getElementById("search_form")) {
370                         var search_query = Form.serialize("search_form");
371                         query = query + "&" + search_query;
372                         closeInfoBox(true);
373                         force_nocache = true;
374                 }
375
376 //              debug("IS_CAT_STORED: " + activeFeedIsCat() + ", IS_CAT: " + is_cat);
377
378                 if (subop == "MarkAllRead") {
379
380                         var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
381
382                         if (show_next_feed) {
383
384                                 if (!activeFeedIsCat()) {
385         
386                                         var feedlist = document.getElementById('feedList');
387                                 
388                                         var next_unread_feed = getRelativeFeedId(feedlist,
389                                                         feed, "next", true);
390         
391                                         if (!next_unread_feed) {
392                                                 next_unread_feed = getRelativeFeedId(feedlist,
393                                                         -3, "next", true);
394                                         }
395                 
396                                         if (next_unread_feed) {
397                                                 query = query + "&nuf=" + param_escape(next_unread_feed);
398                                                 //setActiveFeedId(next_unread_feed);
399                                                 feed = next_unread_feed;
400                                         }
401                                 } else {
402         
403                                         var next_unread_feed = getNextUnreadCat(feed);
404
405                                         /* we don't need to specify that our next feed is actually
406                                         a category, because we're in the is_cat mode by definition
407                                         already */
408
409                                         if (next_unread_feed && show_next_feed) {
410                                                 query = query + "&nuf=" + param_escape(next_unread_feed);
411                                                 feed = next_unread_feed;
412                                         }
413
414                                 }
415                         }
416                 }
417
418                 if (is_cat) {
419                         query = query + "&cat=1";
420                 }
421
422                 if (page_offset != 0) {
423                         query = query + "&skip=" + page_offset;
424
425                         // to prevent duplicate feed titles when showing grouped vfeeds
426                         if (vgroup_last_feed) {
427                                 query = query + "&vgrlf=" + param_escape(vgroup_last_feed);
428                         }
429                 }
430
431                 var date = new Date();
432                 var timestamp = Math.round(date.getTime() / 1000);
433                 query = query + "&ts=" + timestamp
434                 
435                 disableContainerChildren("headlinesToolbar", false);
436                 Form.enable("main_toolbar_form");
437
438                 // for piggybacked counters
439
440                 if (tagsAreDisplayed()) {
441                         query = query + "&omode=lt";
442                 } else {
443                         query = query + "&omode=flc";
444                 }
445
446                 if (!async_counters_work) {
447                         query = query + "&csync=true";
448                 }
449
450                 debug(query);
451
452                 var container = document.getElementById("headlinesInnerContainer");
453
454 /*              if (container && page_offset == 0 && !isCdmMode()) {
455                         new Effect.Fade(container, {duration: 1, to: 0.01,
456                                 queue: { position:'end', scope: 'FEEDL-' + feed, limit: 1 } } );
457                 } */
458
459                 var unread_ctr = -1;
460                 
461                 if (!is_cat) unread_ctr = get_feed_unread(feed);
462
463                 var cache_check = false;
464
465                 if (unread_ctr != -1 && !page_offset && !force_nocache && !subop) {
466
467                         var cache_prefix = "";
468                                 
469                         if (is_cat) {
470                                 cache_prefix = "C:";
471                         } else {
472                                 cache_prefix = "F:";
473                         }
474
475                         cache_check = cache_check_param(cache_prefix + feed, unread_ctr);
476                         debug("headline cache check: " + cache_check);
477                 }
478
479                 if (cache_check) {
480                         var f = document.getElementById("headlines-frame");
481
482                         clean_feed_selections();
483
484                         setActiveFeedId(feed, is_cat);
485                 
486                         if (!is_cat) {
487                                 var feedr = document.getElementById("FEEDR-" + feed);
488                                 if (feedr && !feedr.className.match("Selected")) {      
489                                         feedr.className = feedr.className + "Selected";
490                                 } 
491                         } else {
492                                 var feedr = document.getElementById("FCAT-" + feed_id);
493                                 if (feedr && !feedr.className.match("Selected")) {      
494                                         feedr.className = feedr.className + "Selected";
495                                 } 
496                         }
497
498                         f.innerHTML = cache_find_param(cache_prefix + feed, unread_ctr);
499
500                         request_counters();
501                         remove_splash();
502
503                 } else {
504
505                         if (!page_offset) {
506                                 notify_progress("Loading, please wait...", true);
507                         }
508
509                         new Ajax.Request(query, {
510                                 onComplete: function(transport) { 
511                                         headlines_callback2(transport, page_offset); 
512                                 } });
513                 }
514
515         } catch (e) {
516                 exception_error("viewfeed", e);
517         }               
518 }
519
520 function toggleCollapseCat_af(effect) {
521         //var caption = elem.id.replace("FCATLIST-", "");
522
523         try {
524
525                 var elem = effect.element;
526                 var cat = elem.id.replace("FCATLIST-", "");
527                 var cap = document.getElementById("FCAP-" + cat);
528
529                 if (Element.visible(elem)) {
530                         cap.innerHTML = cap.innerHTML.replace("…", "");
531                 } else {
532                         if (cap.innerHTML.lastIndexOf("…") != cap.innerHTML.length-3) {
533                                 cap.innerHTML = cap.innerHTML + "…";
534                         }
535                 }
536
537         } catch (e) {
538                 exception_error("toggleCollapseCat_af", e);
539         }
540 }
541
542 function toggleCollapseCat(cat) {
543         try {
544         
545                 var cat_elem = document.getElementById("FCAT-" + cat);
546                 var cat_list = document.getElementById("FCATLIST-" + cat).parentNode;
547                 var caption = document.getElementById("FCAP-" + cat);
548                 
549 /*              if (cat_list.className.match("invisible")) {
550                         cat_list.className = "";
551                         caption.innerHTML = caption.innerHTML.replace("...", "");
552                         if (cat == 0) {
553                                 setCookie("ttrss_vf_uclps", "0");
554                         }
555                 } else {
556                         cat_list.className = "invisible";
557                         caption.innerHTML = caption.innerHTML + "...";
558                         if (cat == 0) {
559                                 setCookie("ttrss_vf_uclps", "1");
560                         } 
561
562                 } */
563
564                 if (cat == 0) {
565                         if (Element.visible("FCATLIST-" + cat)) {
566                                 setCookie("ttrss_vf_uclps", "1");
567                         } else {
568                                 setCookie("ttrss_vf_uclps", "0");
569                         }
570                 } 
571
572                 if (cat == -2) {
573                         if (Element.visible("FCATLIST-" + cat)) {
574                                 setCookie("ttrss_vf_lclps", "1");
575                         } else {
576                                 setCookie("ttrss_vf_lclps", "0");
577                         }
578                 } 
579
580                 if (cat == -1) {
581                         if (Element.visible("FCATLIST-" + cat)) {
582                                 setCookie("ttrss_vf_vclps", "1");
583                         } else {
584                                 setCookie("ttrss_vf_vclps", "0");
585                         }
586                 } 
587
588                 Effect.toggle('FCATLIST-' + cat, 'blind', { duration: 0.5,
589                         afterFinish: toggleCollapseCat_af });
590
591                 new Ajax.Request("backend.php?op=feeds&subop=collapse&cid=" + 
592                         param_escape(cat));
593
594         } catch (e) {
595                 exception_error("toggleCollapseCat", e);
596         }
597 }
598
599 function feedlist_dragsorted(ctr) {
600         try {
601                 var elem = document.getElementById("feedList");
602
603                 var cats = elem.getElementsByTagName("LI");
604                 var ordered_cats = new Array();
605
606                 for (var i = 0; i < cats.length; i++) {
607                         if (cats[i].id && cats[i].id.match("FCAT-")) {
608                                 ordered_cats.push(cats[i].id.replace("FCAT-", ""));
609                         }
610                 }
611
612                 if (ordered_cats.length > 0) {
613
614                         var query = "backend.php?op=feeds&subop=catsort&corder=" + 
615                                 param_escape(ordered_cats.toString());
616
617                         debug(query);
618
619                         new Ajax.Request(query);
620                 }
621
622         } catch (e) {
623                 exception_error("feedlist_dragsorted", e);
624         }
625 }
626
627 function feedlist_init() {
628         try {
629 //              if (arguments.callee.done) return;
630 //              arguments.callee.done = true;           
631                 
632                 loading_set_progress(90);
633
634                 debug("in feedlist init");
635                 
636                 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
637                 document.onkeydown = hotkey_handler;
638                 document.onmousemove = mouse_move_handler;
639                 document.onmousedown = mouse_down_handler;
640                 document.onmouseup = mouse_up_handler;
641
642                 setTimeout("timeout()", 1);
643
644                 if (typeof correctPNG != 'undefined') {
645                         correctPNG();
646                 }
647
648                 if (getActiveFeedId()) {
649                         //debug("some feed is open on feedlist refresh, reloading");
650                         //setTimeout("viewCurrentFeed()", 100);
651                 } else {
652                         if (getInitParam("cdm_auto_catchup") != 1 && get_feed_unread(-3) > 0) {
653                                 notify_silent_next();
654                                 setTimeout("viewfeed(-3)", 100);
655                         } else {
656                                 remove_splash();
657                         }
658                 }
659
660                 if (getInitParam("theme") == "") {
661                         setTimeout("hide_footer()", 5000);
662                 }
663
664                 init_collapsable_feedlist(getInitParam("theme"));
665
666                 toggle_sortable_feedlist(isFeedlistSortable());
667
668         } catch (e) {
669                 exception_error("feedlist/init", e);
670         }
671 }
672
673 function hide_footer_af(effect) {
674         try {
675                 var c = document.getElementById("content-frame");
676
677                 if (c) {
678                         c.style.bottom = "0px";
679
680                         var ioa = document.getElementById("inline_orig_article");
681
682                         if (ioa) {
683                                 ioa.height = c.offsetHeight;
684                         }
685
686                 } else {
687                         var h = document.getElementById("headlines-frame");
688
689                         if (h) {
690                                 h.style.bottom = "0px";
691                         }
692                 }
693
694         } catch (e) {
695                 exception_error("hide_footer_af", e);
696         }
697 }
698
699 function hide_footer() {
700         try {
701                 if (Element.visible("footer")) {
702                         new Effect.Fade("footer", { afterFinish: hide_footer_af });
703                 }
704         } catch (e) {
705                 exception_error("hide_footer", e);
706         }
707 }
708
709 /*
710 function init_hidden_feedlist(theme) {
711         try {
712                 debug("init_hidden_feedlist");
713
714                 if (theme != "" && theme != "compact") return;
715
716                 var fl = document.getElementById("feeds-holder");
717                 var fh = document.getElementById("headlines-frame");
718                 var fc = document.getElementById("content-frame");
719                 var ft = document.getElementById("toolbar");
720                 var ff = document.getElementById("footer");
721                 var fhdr = document.getElementById("header");
722
723                 var fbtn = document.getElementById("toggle_feeds_btn");
724
725                 if (fbtn) Element.show(fbtn);
726
727                 fl.style.top = fh.offsetTop + "px";
728                 fl.style.backgroundColor = "white"; //FIXME
729
730                 Element.hide(fl);
731                 
732                 fh.style.left = "0px";
733                 ft.style.left = "0px";
734                 if (fc) fc.style.left = "0px";
735                 if (ff) ff.style.left = "0px";
736
737                 if (theme == "compact") {
738                         fhdr.style.left = "10px";
739                         fl.style.top = (fh.offsetTop + 1) + "px";
740                 }
741
742         } catch (e) {
743                 exception_error("init_hidden_feedlist", e);
744         }
745 } */
746
747 function init_collapsable_feedlist(theme) {
748         try {
749                 debug("init_collapsable_feedlist");
750
751                 if (theme != "" && theme != "compact" && theme != "graycube" &&
752                                 theme != "compat") return;
753
754                 var fbtn = document.getElementById("collapse_feeds_btn");
755
756                 if (fbtn) Element.show(fbtn);
757
758                 if (getCookie("ttrss_vf_fclps") == 1) {
759                         collapse_feedlist();
760                 }
761
762         } catch (e) {
763                 exception_error("init_hidden_feedlist", e);
764         }
765
766 }
767
768 function mouse_move_handler(e) {
769         try {
770                 var client_y;
771                 var client_x;
772
773                 if (window.event) {
774                         client_y = window.event.clientY;
775                         client_x = window.event.clientX;
776                 } else if (e) {
777                         client_x = e.screenX;
778                         client_y = e.screenY;
779                 }
780
781                 if (mouse_is_down) {
782
783                         if (mouse_y == 0) mouse_y = client_y;
784                         if (mouse_x == 0) mouse_x = client_x;
785
786                         resize_headlines(mouse_x - client_x, mouse_y - client_y);
787
788                         mouse_y = client_y;
789                         mouse_x = client_x;
790
791                         return false;
792                 }
793
794         } catch (e) {
795                 exception_error("mouse_move_handler", e);
796         }
797 }
798
799 function enable_selection(b) {
800         selection_disabled = !b;
801 }
802
803 function enable_resize(b) {
804         resize_enabled = b;
805 }
806
807 function mouse_down_handler(e) {
808         try {
809
810                 /* do not prevent right click */
811                 if (e.button && e.button == 2) return;
812
813                 if (resize_enabled) { 
814                         mouse_is_down = true;
815                         mouse_x = 0;
816                         mouse_y = 0;
817                         document.onselectstart = function() { return false; };
818                         return false;
819                 }
820
821                 if (selection_disabled) {
822                         document.onselectstart = function() { return false; };
823                         return false;
824                 }
825
826         } catch (e) {
827                 exception_error("mouse_move_handler", e);
828         }
829 }
830
831 function mouse_up_handler(e) {
832         try {
833                 mouse_is_down = false;
834
835                 if (!selection_disabled) {
836                         document.onselectstart = null;
837                         var e = document.getElementById("headlineActionsBody");
838                         if (e) Element.hide(e);
839                 }
840
841         } catch (e) {
842                 exception_error("mouse_move_handler", e);
843         }
844 }
845
846 function request_counters_real() {
847
848         try {
849
850                 if (offline_mode) return;
851
852                 debug("requesting counters...");
853
854                 var query = "backend.php?op=rpc&subop=getAllCounters";
855
856                 if (tagsAreDisplayed()) {
857                         query = query + "&omode=tl";
858                 } else {
859                         query = query + "&omode=flc";
860                 }
861
862                 new Ajax.Request(query, {
863                         onComplete: function(transport) { 
864                                 try {
865                                         all_counters_callback2(transport, true);
866                                 } catch (e) {
867                                         exception_error("viewfeed/getcounters", e);
868                                 }
869                         } });
870
871         } catch (e) {
872                 exception_error("request_counters_real", e);
873         }
874 }
875
876
877 function request_counters() {
878
879         try {
880
881                 if (getInitParam("bw_limit") == "1") return;
882
883                 var date = new Date();
884                 var timestamp = Math.round(date.getTime() / 1000);
885
886 //              if (getInitParam("sync_counters") == "1" || 
887 //                              timestamp - counters_last_request > 10) {
888
889                 if (timestamp - counters_last_request > 15) {
890                         debug("scheduling request of counters...");
891                         window.setTimeout("request_counters_real()", 1000);
892                         counters_last_request = timestamp;
893                 } else {
894                         debug("request_counters: rate limit reached: " + (timestamp - counters_last_request));
895                 }
896
897         } catch (e) {
898                 exception_error("request_counters", e);
899         }
900 }