]> git.wh0rd.org Git - tt-rss.git/blob - feedlist.js
adjust rate limits on automatic update of offline info
[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 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
67 function 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
90 function 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
152 function 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
166 function 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
176 function 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
190 function viewfeed_offline(feed_id, subop, is_cat, subop_param, skip_history, offset) {
191         try {
192                 notify('');
193
194                 loading_set_progress(100);
195
196                 clean_feed_selections();
197         
198                 setActiveFeedId(feed_id, is_cat);
199
200                 if (!is_cat) {
201                         var feedr = document.getElementById("FEEDR-" + feed_id);
202                         if (feedr && !feedr.className.match("Selected")) {      
203                                 feedr.className = feedr.className + "Selected";
204                         } 
205                 } else {
206                         var feedr = document.getElementById("FCAT-" + feed_id);
207                         if (feedr && !feedr.className.match("Selected")) {      
208                                 feedr.className = feedr.className + "Selected";
209                         } 
210                 }
211
212                 disableContainerChildren("headlinesToolbar", false);
213                 Form.enable("main_toolbar_form");
214
215                 var f = document.getElementById("headlines-frame");
216                 try {
217                         if (reply.offset == 0) { 
218                                 debug("resetting headlines scrollTop");
219                                 f.scrollTop = 0; 
220                         }
221                 } catch (e) { };
222
223
224                 var container = document.getElementById("headlines-frame");
225
226                 var tmp = "";
227
228                 rs = db.execute("SELECT title FROM feeds WHERE id = ?", [feed_id]);
229
230                 if (rs.isValidRow() || feed_id == -1) {
231
232                         feed_title = rs.field(0);
233
234                         if (feed_id == -1) {
235                                 feed_title = __("Starred articles");
236                         }
237
238                         if (offset == 0) {
239                                 tmp += "<div id=\"headlinesContainer\">";
240                 
241                                 tmp += "<div class=\"headlinesSubToolbar\">";
242                                 tmp += "<div id=\"subtoolbar_ftitle\">";
243                                 tmp += feed_title;
244                                 tmp += "</div>";
245
246                                 var sel_all_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, '', true)";
247                                 var sel_unread_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true)";
248                                 var sel_none_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false)";
249                                 var sel_inv_link = "javascript:invertHeadlineSelection()";
250
251                                 tmp += __('Select:')+
252                                         " <a href=\""+sel_all_link+"\">"+__('All')+"</a>, "+
253                                         "<a href=\""+sel_unread_link+"\">"+__('Unread')+"</a>, "+
254                                         "<a href=\""+sel_inv_link+"\">"+__('Invert')+"</a>, "+
255                                         "<a href=\""+sel_none_link+"\">"+__('None')+"</a>";
256         
257                                 tmp += "&nbsp;&nbsp;";
258         
259                                 tmp += "</div>";
260         
261                                 tmp += "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">";
262         
263                                 tmp += "<table class=\"headlinesList\" id=\"headlinesList\" cellspacing=\"0\">";
264                         
265                         }
266         
267                         var rs;
268                         
269                         if (feed_id > 0) {
270                                 rs = db.execute("SELECT * FROM articles WHERE feed_id = ? "+
271                                         "ORDER BY updated DESC", [feed_id]);
272                         } else if (feed_id = -1) {
273                                 rs = db.execute("SELECT * FROM articles WHERE marked = 1 "+
274                                         "ORDER BY updated DESC");
275                         }
276
277                         var line_num = 0;
278
279                         while (rs.isValidRow()) {
280
281                                 var id = rs.fieldByName("id");
282                                 var feed_id = rs.fieldByName("feed_id");
283
284                                 var marked_pic;
285         
286                                 var row_class = (line_num % 2) ? "even" : "odd";
287
288                                 if (rs.fieldByName("unread") == "1") {
289                                         row_class += "Unread";
290                                 }
291         
292                                 if (rs.fieldByName("marked") == "1") {
293                                         marked_pic = "<img id=\"FMPIC-"+id+"\" "+
294                                                 "src=\"images/mark_set.png\" class=\"markedPic\""+
295                                                 "alt=\"Unstar article\" onclick='javascript:tMark("+id+")'>";
296                                 } else {
297                                         marked_pic = "<img id=\"FMPIC-"+id+"\" "+
298                                                 "src=\"images/mark_unset.png\" class=\"markedPic\""+
299                                                 "alt=\"Star article\" onclick='javascript:tMark("+id+")'>";
300                                 }
301
302                                 var mouseover_attrs = "onmouseover='postMouseIn($id)' "+
303                                         "onmouseout='postMouseOut($id)'";
304         
305                                 tmp += "<tr class='"+row_class+"' id='RROW-"+id+"' "+mouseover_attrs+">";
306                                 
307                                 tmp += "<td class='hlUpdPic'> </td>";
308
309                                 tmp += "<td class='hlSelectRow'>"+
310                                         "<input type=\"checkbox\" onclick=\"tSR(this)\" id=\"RCHK-"+id+"\"></td>";
311                                 
312                                 tmp += "<td class='hlMarkedPic'>"+marked_pic+"</td>";
313         
314                                 tmp += "<td onclick='view("+id+","+feed_id+")' "+
315                                         "class='hlContent' valign='middle'>";
316         
317                                 tmp += "<a target=\"_blank\" id=\"RTITLE-$id\" href=\"" + 
318                                         rs.fieldByName("link") + "\"" +
319                                         "onclick=\"return view("+id+","+feed_id+");\">"+
320                                         rs.fieldByName("title");
321
322                                 var content_preview = truncate_string(strip_tags(rs.fieldByName("content")), 
323                                         100);
324
325                                 tmp += "<span class=\"contentPreview\"> - "+content_preview+"</span>";
326
327                                 tmp += "</a>";
328
329                                 tmp += "</td>";
330         
331                                 tmp += "<td class=\"hlUpdated\" onclick='view("+id+","+feed_id+")'>"+
332                                         "<nobr>"+rs.fieldByName("updated").substring(0,16)+"</nobr></td>";
333
334                                 tmp += "</tr>";
335
336                                 rs.next();
337                                 line_num++;
338                         }
339         
340                         if (offset == 0) {
341                                 tmp += "</table>";
342                                 tmp += "</div></div>";
343                         }
344         
345                         if (offset == 0) {
346                                 container.innerHTML = tmp;
347                         } else {
348                                 var ids = getSelectedArticleIds2();
349                 
350                                 //container.innerHTML = container.innerHTML + tmp;
351         
352                                 for (var i = 0; i < ids.length; i++) {
353                                         markHeadline(ids[i]);
354                                 }
355                         }
356                 }
357
358                 remove_splash();
359
360
361         } catch (e) {
362                 exception_error("viewfeed_offline", e);
363         }
364 }
365
366 function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) {
367         try {
368
369                 if (offline_mode) return viewfeed_offline(feed, subop, is_cat, subop_param,
370                         skip_history, offset);
371
372 //              if (!offset) page_offset = 0;
373
374                 last_requested_article = 0;
375                 //counters_last_request = 0;
376
377                 if (feed == getActiveFeedId()) {
378                         cache_invalidate("F:" + feed);
379                 }
380
381 /*              if (getInitParam("theme") == "" || getInitParam("theme") == "compact") {
382                         if (getInitParam("hide_feedlist") == 1) {
383                                 Element.hide("feeds-holder");
384                         }               
385                 } */
386
387                 var force_nocache = false;
388
389                 var page_offset = 0;
390
391                 if (offset > 0) {
392                         page_offset = offset;
393                 } else {
394                         page_offset = 0;
395                         _feed_cur_page = 0;
396                         _infscroll_disable = 0;
397                 }
398
399                 if (getActiveFeedId() != feed) {
400                         _feed_cur_page = 0;
401                         active_post_id = 0;
402                         _infscroll_disable = 0;
403                 }
404
405                 if (page_offset != 0 && !subop) {
406                         var date = new Date();
407                         var timestamp = Math.round(date.getTime() / 1000);
408
409                         debug("<b>" + _infscroll_request_sent + " : " + timestamp + "</b>");
410
411                         if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) {
412                                 debug("infscroll request in progress, aborting");
413                                 return;
414                         }
415
416                         _infscroll_request_sent = timestamp;                    
417                 }
418
419                 enableHotkeys();
420
421                 closeInfoBox();
422
423                 Form.enable("main_toolbar_form");
424
425                 var toolbar_form = document.forms["main_toolbar_form"];
426                 var toolbar_query = Form.serialize("main_toolbar_form");
427
428                 if (toolbar_form.query) {
429                         if (toolbar_form.query.value != "") {
430                                 force_nocache = true;
431                         }
432                         toolbar_form.query.value = "";
433                 }
434
435                 var query = "backend.php?op=viewfeed&feed=" + feed + "&" +
436                         toolbar_query + "&subop=" + param_escape(subop);
437
438                 if (document.getElementById("search_form")) {
439                         var search_query = Form.serialize("search_form");
440                         query = query + "&" + search_query;
441                         closeInfoBox(true);
442                         force_nocache = true;
443                 }
444
445 //              debug("IS_CAT_STORED: " + activeFeedIsCat() + ", IS_CAT: " + is_cat);
446
447                 if (subop == "MarkAllRead") {
448
449                         var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
450
451                         if (show_next_feed) {
452
453                                 if (!activeFeedIsCat()) {
454         
455                                         var feedlist = document.getElementById('feedList');
456                                 
457                                         var next_unread_feed = getRelativeFeedId(feedlist,
458                                                         feed, "next", true);
459         
460                                         if (!next_unread_feed) {
461                                                 next_unread_feed = getRelativeFeedId(feedlist,
462                                                         -3, "next", true);
463                                         }
464                 
465                                         if (next_unread_feed) {
466                                                 query = query + "&nuf=" + param_escape(next_unread_feed);
467                                                 //setActiveFeedId(next_unread_feed);
468                                                 feed = next_unread_feed;
469                                         }
470                                 } else {
471         
472                                         var next_unread_feed = getNextUnreadCat(feed);
473
474                                         /* we don't need to specify that our next feed is actually
475                                         a category, because we're in the is_cat mode by definition
476                                         already */
477
478                                         if (next_unread_feed && show_next_feed) {
479                                                 query = query + "&nuf=" + param_escape(next_unread_feed);
480                                                 feed = next_unread_feed;
481                                         }
482
483                                 }
484                         }
485                 }
486
487                 if (is_cat) {
488                         query = query + "&cat=1";
489                 }
490
491                 if (page_offset != 0) {
492                         query = query + "&skip=" + page_offset;
493
494                         // to prevent duplicate feed titles when showing grouped vfeeds
495                         if (vgroup_last_feed) {
496                                 query = query + "&vgrlf=" + param_escape(vgroup_last_feed);
497                         }
498                 }
499
500                 var date = new Date();
501                 var timestamp = Math.round(date.getTime() / 1000);
502                 query = query + "&ts=" + timestamp
503                 
504                 disableContainerChildren("headlinesToolbar", false);
505                 Form.enable("main_toolbar_form");
506
507                 // for piggybacked counters
508
509                 if (tagsAreDisplayed()) {
510                         query = query + "&omode=lt";
511                 } else {
512                         query = query + "&omode=flc";
513                 }
514
515                 if (!async_counters_work) {
516                         query = query + "&csync=true";
517                 }
518
519                 debug(query);
520
521                 var container = document.getElementById("headlinesInnerContainer");
522
523 /*              if (container && page_offset == 0 && !isCdmMode()) {
524                         new Effect.Fade(container, {duration: 1, to: 0.01,
525                                 queue: { position:'end', scope: 'FEEDL-' + feed, limit: 1 } } );
526                 } */
527
528                 var unread_ctr = -1;
529                 
530                 if (!is_cat) unread_ctr = get_feed_unread(feed);
531
532                 var cache_check = false;
533
534                 if (unread_ctr != -1 && !page_offset && !force_nocache && !subop) {
535
536                         var cache_prefix = "";
537                                 
538                         if (is_cat) {
539                                 cache_prefix = "C:";
540                         } else {
541                                 cache_prefix = "F:";
542                         }
543
544                         cache_check = cache_check_param(cache_prefix + feed, unread_ctr);
545                         debug("headline cache check: " + cache_check);
546                 }
547
548                 if (cache_check) {
549                         var f = document.getElementById("headlines-frame");
550
551                         clean_feed_selections();
552
553                         setActiveFeedId(feed, is_cat);
554                 
555                         if (!is_cat) {
556                                 var feedr = document.getElementById("FEEDR-" + feed);
557                                 if (feedr && !feedr.className.match("Selected")) {      
558                                         feedr.className = feedr.className + "Selected";
559                                 } 
560                         } else {
561                                 var feedr = document.getElementById("FCAT-" + feed_id);
562                                 if (feedr && !feedr.className.match("Selected")) {      
563                                         feedr.className = feedr.className + "Selected";
564                                 } 
565                         }
566
567                         f.innerHTML = cache_find_param(cache_prefix + feed, unread_ctr);
568
569                         request_counters();
570                         remove_splash();
571
572                 } else {
573
574                         if (!page_offset) {
575                                 notify_progress("Loading, please wait...", true);
576                         }
577
578                         new Ajax.Request(query, {
579                                 onComplete: function(transport) { 
580                                         headlines_callback2(transport, page_offset); 
581                                 } });
582                 }
583
584         } catch (e) {
585                 exception_error("viewfeed", e);
586         }               
587 }
588
589 function toggleCollapseCat_af(effect) {
590         //var caption = elem.id.replace("FCATLIST-", "");
591
592         try {
593
594                 var elem = effect.element;
595                 var cat = elem.id.replace("FCATLIST-", "");
596                 var cap = document.getElementById("FCAP-" + cat);
597
598                 if (Element.visible(elem)) {
599                         cap.innerHTML = cap.innerHTML.replace("…", "");
600                 } else {
601                         if (cap.innerHTML.lastIndexOf("…") != cap.innerHTML.length-3) {
602                                 cap.innerHTML = cap.innerHTML + "…";
603                         }
604                 }
605
606         } catch (e) {
607                 exception_error("toggleCollapseCat_af", e);
608         }
609 }
610
611 function toggleCollapseCat(cat) {
612         try {
613         
614                 var cat_elem = document.getElementById("FCAT-" + cat);
615                 var cat_list = document.getElementById("FCATLIST-" + cat).parentNode;
616                 var caption = document.getElementById("FCAP-" + cat);
617                 
618 /*              if (cat_list.className.match("invisible")) {
619                         cat_list.className = "";
620                         caption.innerHTML = caption.innerHTML.replace("...", "");
621                         if (cat == 0) {
622                                 setCookie("ttrss_vf_uclps", "0");
623                         }
624                 } else {
625                         cat_list.className = "invisible";
626                         caption.innerHTML = caption.innerHTML + "...";
627                         if (cat == 0) {
628                                 setCookie("ttrss_vf_uclps", "1");
629                         } 
630
631                 } */
632
633                 if (cat == 0) {
634                         if (Element.visible("FCATLIST-" + cat)) {
635                                 setCookie("ttrss_vf_uclps", "1");
636                         } else {
637                                 setCookie("ttrss_vf_uclps", "0");
638                         }
639                 } 
640
641                 if (cat == -2) {
642                         if (Element.visible("FCATLIST-" + cat)) {
643                                 setCookie("ttrss_vf_lclps", "1");
644                         } else {
645                                 setCookie("ttrss_vf_lclps", "0");
646                         }
647                 } 
648
649                 if (cat == -1) {
650                         if (Element.visible("FCATLIST-" + cat)) {
651                                 setCookie("ttrss_vf_vclps", "1");
652                         } else {
653                                 setCookie("ttrss_vf_vclps", "0");
654                         }
655                 } 
656
657                 Effect.toggle('FCATLIST-' + cat, 'blind', { duration: 0.5,
658                         afterFinish: toggleCollapseCat_af });
659
660                 new Ajax.Request("backend.php?op=feeds&subop=collapse&cid=" + 
661                         param_escape(cat));
662
663         } catch (e) {
664                 exception_error("toggleCollapseCat", e);
665         }
666 }
667
668 function feedlist_dragsorted(ctr) {
669         try {
670                 var elem = document.getElementById("feedList");
671
672                 var cats = elem.getElementsByTagName("LI");
673                 var ordered_cats = new Array();
674
675                 for (var i = 0; i < cats.length; i++) {
676                         if (cats[i].id && cats[i].id.match("FCAT-")) {
677                                 ordered_cats.push(cats[i].id.replace("FCAT-", ""));
678                         }
679                 }
680
681                 if (ordered_cats.length > 0) {
682
683                         var query = "backend.php?op=feeds&subop=catsort&corder=" + 
684                                 param_escape(ordered_cats.toString());
685
686                         debug(query);
687
688                         new Ajax.Request(query);
689                 }
690
691         } catch (e) {
692                 exception_error("feedlist_dragsorted", e);
693         }
694 }
695
696 function feedlist_init() {
697         try {
698 //              if (arguments.callee.done) return;
699 //              arguments.callee.done = true;           
700                 
701                 loading_set_progress(90);
702
703                 debug("in feedlist init");
704                 
705                 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
706                 document.onkeydown = hotkey_handler;
707                 document.onmousemove = mouse_move_handler;
708                 document.onmousedown = mouse_down_handler;
709                 document.onmouseup = mouse_up_handler;
710
711                 if (!offline_mode) setTimeout("timeout()", 1);
712
713                 if (typeof correctPNG != 'undefined') {
714                         correctPNG();
715                 }
716
717                 if (getActiveFeedId()) {
718                         //debug("some feed is open on feedlist refresh, reloading");
719                         //setTimeout("viewCurrentFeed()", 100);
720                 } else {
721                         if (getInitParam("cdm_auto_catchup") != 1 && get_feed_unread(-3) > 0) {
722                                 notify_silent_next();
723                                 setTimeout("viewfeed(-3)", 100);
724                         } else {
725                                 remove_splash();
726                         }
727                 }
728
729                 if (getInitParam("theme") == "") {
730                         setTimeout("hide_footer()", 5000);
731                 }
732
733                 init_collapsable_feedlist(getInitParam("theme"));
734
735                 toggle_sortable_feedlist(isFeedlistSortable());
736
737         } catch (e) {
738                 exception_error("feedlist/init", e);
739         }
740 }
741
742 function hide_footer_af(effect) {
743         try {
744                 var c = document.getElementById("content-frame");
745
746                 if (c) {
747                         c.style.bottom = "0px";
748
749                         var ioa = document.getElementById("inline_orig_article");
750
751                         if (ioa) {
752                                 ioa.height = c.offsetHeight;
753                         }
754
755                 } else {
756                         var h = document.getElementById("headlines-frame");
757
758                         if (h) {
759                                 h.style.bottom = "0px";
760                         }
761                 }
762
763         } catch (e) {
764                 exception_error("hide_footer_af", e);
765         }
766 }
767
768 function hide_footer() {
769         try {
770                 if (Element.visible("footer")) {
771                         new Effect.Fade("footer", { afterFinish: hide_footer_af });
772                 }
773         } catch (e) {
774                 exception_error("hide_footer", e);
775         }
776 }
777
778 /*
779 function init_hidden_feedlist(theme) {
780         try {
781                 debug("init_hidden_feedlist");
782
783                 if (theme != "" && theme != "compact") return;
784
785                 var fl = document.getElementById("feeds-holder");
786                 var fh = document.getElementById("headlines-frame");
787                 var fc = document.getElementById("content-frame");
788                 var ft = document.getElementById("toolbar");
789                 var ff = document.getElementById("footer");
790                 var fhdr = document.getElementById("header");
791
792                 var fbtn = document.getElementById("toggle_feeds_btn");
793
794                 if (fbtn) Element.show(fbtn);
795
796                 fl.style.top = fh.offsetTop + "px";
797                 fl.style.backgroundColor = "white"; //FIXME
798
799                 Element.hide(fl);
800                 
801                 fh.style.left = "0px";
802                 ft.style.left = "0px";
803                 if (fc) fc.style.left = "0px";
804                 if (ff) ff.style.left = "0px";
805
806                 if (theme == "compact") {
807                         fhdr.style.left = "10px";
808                         fl.style.top = (fh.offsetTop + 1) + "px";
809                 }
810
811         } catch (e) {
812                 exception_error("init_hidden_feedlist", e);
813         }
814 } */
815
816 function init_collapsable_feedlist(theme) {
817         try {
818                 debug("init_collapsable_feedlist");
819
820                 if (theme != "" && theme != "compact" && theme != "graycube" &&
821                                 theme != "compat") return;
822
823                 var fbtn = document.getElementById("collapse_feeds_btn");
824
825                 if (fbtn) Element.show(fbtn);
826
827                 if (getCookie("ttrss_vf_fclps") == 1) {
828                         collapse_feedlist();
829                 }
830
831         } catch (e) {
832                 exception_error("init_hidden_feedlist", e);
833         }
834
835 }
836
837 function mouse_move_handler(e) {
838         try {
839                 var client_y;
840                 var client_x;
841
842                 if (window.event) {
843                         client_y = window.event.clientY;
844                         client_x = window.event.clientX;
845                 } else if (e) {
846                         client_x = e.screenX;
847                         client_y = e.screenY;
848                 }
849
850                 if (mouse_is_down) {
851
852                         if (mouse_y == 0) mouse_y = client_y;
853                         if (mouse_x == 0) mouse_x = client_x;
854
855                         resize_headlines(mouse_x - client_x, mouse_y - client_y);
856
857                         mouse_y = client_y;
858                         mouse_x = client_x;
859
860                         return false;
861                 }
862
863         } catch (e) {
864                 exception_error("mouse_move_handler", e);
865         }
866 }
867
868 function enable_selection(b) {
869         selection_disabled = !b;
870 }
871
872 function enable_resize(b) {
873         resize_enabled = b;
874 }
875
876 function mouse_down_handler(e) {
877         try {
878
879                 /* do not prevent right click */
880                 if (e.button && e.button == 2) return;
881
882                 if (resize_enabled) { 
883                         mouse_is_down = true;
884                         mouse_x = 0;
885                         mouse_y = 0;
886                         document.onselectstart = function() { return false; };
887                         return false;
888                 }
889
890                 if (selection_disabled) {
891                         document.onselectstart = function() { return false; };
892                         return false;
893                 }
894
895         } catch (e) {
896                 exception_error("mouse_move_handler", e);
897         }
898 }
899
900 function mouse_up_handler(e) {
901         try {
902                 mouse_is_down = false;
903
904                 if (!selection_disabled) {
905                         document.onselectstart = null;
906                         var e = document.getElementById("headlineActionsBody");
907                         if (e) Element.hide(e);
908                 }
909
910         } catch (e) {
911                 exception_error("mouse_move_handler", e);
912         }
913 }
914
915 function request_counters_real() {
916
917         try {
918
919                 if (offline_mode) return;
920
921                 debug("requesting counters...");
922
923                 var query = "backend.php?op=rpc&subop=getAllCounters";
924
925                 if (tagsAreDisplayed()) {
926                         query = query + "&omode=tl";
927                 } else {
928                         query = query + "&omode=flc";
929                 }
930
931                 new Ajax.Request(query, {
932                         onComplete: function(transport) { 
933                                 try {
934                                         all_counters_callback2(transport, true);
935                                 } catch (e) {
936                                         exception_error("viewfeed/getcounters", e);
937                                 }
938                         } });
939
940         } catch (e) {
941                 exception_error("request_counters_real", e);
942         }
943 }
944
945
946 function request_counters() {
947
948         try {
949
950                 if (getInitParam("bw_limit") == "1") return;
951
952                 var date = new Date();
953                 var timestamp = Math.round(date.getTime() / 1000);
954
955 //              if (getInitParam("sync_counters") == "1" || 
956 //                              timestamp - counters_last_request > 10) {
957
958                 if (timestamp - counters_last_request > 15) {
959                         debug("scheduling request of counters...");
960                         window.setTimeout("request_counters_real()", 1000);
961                         counters_last_request = timestamp;
962                 } else {
963                         debug("request_counters: rate limit reached: " + (timestamp - counters_last_request));
964                 }
965
966         } catch (e) {
967                 exception_error("request_counters", e);
968         }
969 }
970
971 function update_feedlist_counters() {
972         try {
973                 var rs = db.execute("SELECT feeds.id,COUNT(articles.id) "+
974                         "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+
975                         "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+
976                         "ORDER BY feeds.title");
977
978                 while (rs.isValidRow()) {
979                         var id = rs.field(0);
980                         var ctr = rs.field(1);
981
982                         var feedctr = document.getElementById("FEEDCTR-" + id);
983                         var feedu = document.getElementById("FEEDU-" + id);
984                         var feedr = document.getElementById("FEEDR-" + id);
985
986                         if (feedctr && feedu && feedr) {
987
988                                 var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML));
989
990                                 feedu.innerHTML = ctr;
991         
992                                 if (ctr > 0) {                                  
993                                         feedctr.className = "feedCtrHasUnread";
994                                         if (!feedr.className.match("Unread")) {
995                                                 var is_selected = feedr.className.match("Selected");
996                 
997                                                 feedr.className = feedr.className.replace("Selected", "");
998                                                 feedr.className = feedr.className.replace("Unread", "");
999                 
1000                                                 feedr.className = feedr.className + "Unread";
1001                 
1002                                                 if (is_selected) {
1003                                                         feedr.className = feedr.className + "Selected";
1004                                                 }       
1005                                                 
1006                                         }
1007
1008                                         if (row_needs_hl) { 
1009                                                 new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5",
1010                                                         queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } );
1011                                         }
1012                                 } else {
1013                                         feedctr.className = "feedCtrNoUnread";
1014                                         feedr.className = feedr.className.replace("Unread", "");
1015                                 }                       
1016                         }
1017                         rs.next();
1018                 }
1019
1020                 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
1021
1022                 global_unread = get_local_feed_unread(-4);
1023                 updateTitle();
1024
1025         } catch (e) {
1026                 exception_error("update_feedlist_counters", e);
1027         }
1028 }