]> git.wh0rd.org - tt-rss.git/blame - viewfeed.js
experimental gears cache work
[tt-rss.git] / viewfeed.js
CommitLineData
bb7cface 1var active_post_id = false;
4b6206fa 2var last_article_view = false;
0b126ac2
AD
3var active_real_feed_id = false;
4
13f08f75 5// FIXME: kludges, needs proper implementation
0b126ac2 6var _reload_feedlist_after_view = false;
e08443c1 7
ba0978c8
AD
8var _cdm_wd_timeout = false;
9var _cdm_wd_vishist = new Array();
10
e097e8be
AD
11var article_cache = new Array();
12
081e527d 13var vgroup_last_feed = false;
314fcd2b 14var post_under_pointer = false;
081e527d 15
022d9e9e
AD
16var last_requested_article = false;
17
1341ea0d
AD
18function catchup_callback2(transport, callback) {
19 try {
20 debug("catchup_callback2 " + transport + ", " + callback);
21 notify("");
22 all_counters_callback2(transport);
23 if (callback) {
24 setTimeout(callback, 10);
25 }
26 } catch (e) {
273d1e29 27 exception_error("catchup_callback2", e, transport);
1341ea0d
AD
28 }
29}
30
e19c1824 31function clean_feed_selections() {
a49f5e05 32 try {
6c3b0198 33 var feeds = document.getElementById("feedList").getElementsByTagName("LI");
a49f5e05 34
6c3b0198
AD
35 for (var i = 0; i < feeds.length; i++) {
36 if (feeds[i].id && feeds[i].id.match("FEEDR-")) {
37 feeds[i].className = feeds[i].className.replace("Selected", "");
38 }
5ee9816c
AD
39 if (feeds[i].id && feeds[i].id.match("FCAT-")) {
40 feeds[i].className = feeds[i].className.replace("Selected", "");
41 }
6c3b0198 42 }
e19c1824
AD
43 } catch (e) {
44 exception_error("clean_feed_selections", e);
45 }
46}
47
3d72bbdb 48function headlines_callback2(transport, feed_cur_page) {
e19c1824
AD
49 try {
50
730dbf19
AD
51 loading_set_progress(100);
52
e19c1824
AD
53 debug("headlines_callback2 [page=" + feed_cur_page + "]");
54
2184738a
AD
55 if (!transport_error_check(transport)) return;
56
e19c1824 57 clean_feed_selections();
3d72bbdb
AD
58
59 var is_cat = false;
60 var feed_id = false;
ac541432 61
3d72bbdb
AD
62 if (transport.responseXML) {
63 var headlines = transport.responseXML.getElementsByTagName("headlines")[0];
64 if (headlines) {
65 is_cat = headlines.getAttribute("is_cat");
66 feed_id = headlines.getAttribute("id");
67 setActiveFeedId(feed_id, is_cat);
68 }
6c3b0198 69 }
f46192bb 70
6c3b0198 71 if (!is_cat) {
3d72bbdb 72 var feedr = document.getElementById("FEEDR-" + feed_id);
6c3b0198
AD
73 if (feedr && !feedr.className.match("Selected")) {
74 feedr.className = feedr.className + "Selected";
75 }
5ee9816c 76 } else {
3d72bbdb 77 var feedr = document.getElementById("FCAT-" + feed_id);
5ee9816c
AD
78 if (feedr && !feedr.className.match("Selected")) {
79 feedr.className = feedr.className + "Selected";
80 }
6c3b0198
AD
81 }
82
83 var f = document.getElementById("headlines-frame");
84 try {
85 if (feed_cur_page == 0) {
86 debug("resetting headlines scrollTop");
87 f.scrollTop = 0;
a49f5e05 88 }
6c3b0198
AD
89 } catch (e) { };
90
91 if (transport.responseXML) {
92 var headlines = transport.responseXML.getElementsByTagName("headlines")[0];
93 var headlines_count_obj = transport.responseXML.getElementsByTagName("headlines-count")[0];
e19c1824 94 var headlines_unread_obj = transport.responseXML.getElementsByTagName("headlines-unread")[0];
52d7e7da 95 var disable_cache_obj = transport.responseXML.getElementsByTagName("disable-cache")[0];
e19c1824 96
081e527d
AD
97 var vgroup_last_feed_obj = transport.responseXML.getElementsByTagName("vgroup-last-feed")[0];
98
6c3b0198 99 var headlines_count = headlines_count_obj.getAttribute("value");
e19c1824 100 var headlines_unread = headlines_unread_obj.getAttribute("value");
52d7e7da 101 var disable_cache = disable_cache_obj.getAttribute("value") != "0";
e19c1824 102
081e527d
AD
103 vgroup_last_feed = vgroup_last_feed_obj.getAttribute("value");
104
587bef10
AD
105 if (headlines_count == 0) {
106 _infscroll_disable = 1;
107 } else {
108 _infscroll_disable = 0;
109 }
110
6c3b0198
AD
111 var counters = transport.responseXML.getElementsByTagName("counters")[0];
112 var articles = transport.responseXML.getElementsByTagName("article");
113 var runtime_info = transport.responseXML.getElementsByTagName("runtime-info");
114
115 if (feed_cur_page == 0) {
116 if (headlines) {
117 f.innerHTML = headlines.firstChild.nodeValue;
e19c1824 118
dd5865d4
AD
119 var cache_prefix = "";
120
121 if (is_cat) {
122 cache_prefix = "C:";
123 } else {
124 cache_prefix = "F:";
125 }
126
3d72bbdb 127 cache_invalidate(cache_prefix + feed_id);
7e8832b3 128
52d7e7da 129 if (!disable_cache) {
3d72bbdb 130 cache_inject(cache_prefix + feed_id,
52d7e7da
AD
131 headlines.firstChild.nodeValue, headlines_unread);
132 }
e19c1824 133
6c3b0198
AD
134 } else {
135 debug("headlines_callback: returned no data");
136 f.innerHTML = "<div class='whiteBox'>" + __('Could not update headlines (missing XML data)') + "</div>";
137
138 }
139 } else {
140 if (headlines) {
141 if (headlines_count > 0) {
142 debug("adding some more headlines...");
143
144 var c = document.getElementById("headlinesList");
145
146 if (!c) {
147 c = document.getElementById("headlinesInnerContainer");
148 }
c32cd48a
AD
149
150 var ids = getSelectedArticleIds2();
6c3b0198
AD
151
152 c.innerHTML = c.innerHTML + headlines.firstChild.nodeValue;
c32cd48a
AD
153
154 debug("restore selected ids: " + ids);
155
156 for (var i = 0; i < ids.length; i++) {
157 markHeadline(ids[i]);
158 }
159
6c3b0198
AD
160 } else {
161 debug("no new headlines received");
29dfb258 162 }
29dfb258 163 } else {
6c3b0198
AD
164 debug("headlines_callback: returned no data");
165 notify_error("Error while trying to load more headlines");
166 }
730dbf19 167
6c3b0198
AD
168 }
169
170 if (articles) {
171 for (var i = 0; i < articles.length; i++) {
172 var a_id = articles[i].getAttribute("id");
173 debug("found id: " + a_id);
174 cache_inject(a_id, articles[i].firstChild.nodeValue);
ac541432 175 }
007a38d4 176 } else {
6c3b0198 177 debug("no cached articles received");
961f4c73 178 }
6c3b0198
AD
179
180 if (counters) {
181 debug("parsing piggybacked counters: " + counters);
182 parse_counters(counters, false);
183 } else {
5aaf9b34
AD
184 debug("counters container not found in reply, requesting...");
185 request_counters();
6c3b0198
AD
186 }
187
188 if (runtime_info) {
189 debug("parsing runtime info: " + runtime_info[0]);
190 parse_runtime_info(runtime_info[0]);
191 } else {
192 debug("counters container not found in reply");
03c88bdd 193 }
6c3b0198 194
3de0261a 195 } else {
6c3b0198
AD
196 debug("headlines_callback: returned no XML object");
197 f.innerHTML = "<div class='whiteBox'>" + __('Could not update headlines (missing XML object)') + "</div>";
3de0261a 198 }
6c3b0198
AD
199
200 if (typeof correctPNG != 'undefined') {
201 correctPNG();
935f235d 202 }
6c3b0198
AD
203
204 if (_cdm_wd_timeout) window.clearTimeout(_cdm_wd_timeout);
205
206 if (!document.getElementById("headlinesList") &&
a969b30b 207 getActiveFeedId() != -3 &&
6c3b0198
AD
208 getInitParam("cdm_auto_catchup") == 1) {
209 debug("starting CDM watchdog");
210 _cdm_wd_timeout = window.setTimeout("cdmWatchdog()", 5000);
211 _cdm_wd_vishist = new Array();
ac7bcd71 212 } else {
6c3b0198 213 debug("not in CDM mode or watchdog disabled");
ba0978c8 214 }
6c3b0198 215
6c3b0198 216 _feed_cur_page = feed_cur_page;
82764a41
AD
217 _infscroll_request_sent = 0;
218
6c3b0198 219 notify("");
730dbf19
AD
220
221 remove_splash();
222
6c3b0198 223 } catch (e) {
273d1e29 224 exception_error("headlines_callback2", e, transport);
6b4163cb
AD
225 }
226}
227
e097e8be
AD
228function render_article(article) {
229 try {
6b4163cb 230 var f = document.getElementById("content-frame");
44cc6f20
AD
231 try {
232 f.scrollTop = 0;
233 } catch (e) { };
e097e8be 234
17042fc0
AD
235 var fi = document.getElementById("content-insert");
236
e5ebee09
AD
237 try {
238 fi.scrollTop = 0;
239 } catch (e) { };
240
17042fc0 241 fi.innerHTML = article;
e097e8be
AD
242
243 } catch (e) {
244 exception_error("render_article", e);
245 }
246}
247
71d277de 248function showArticleInHeadlines(id) {
e097e8be 249
868d0ed2 250 try {
e097e8be 251
868d0ed2 252 cleanSelected("headlinesList");
71d277de 253
868d0ed2 254 var crow = document.getElementById("RROW-" + id);
76283a4c
AD
255
256 if (!crow) return;
257
868d0ed2
AD
258 var article_is_unread = crow.className.match("Unread");
259
260 crow.className = crow.className.replace("Unread", "");
fdcdf2de
AD
261
262 selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
fdcdf2de 263
868d0ed2 264 var upd_img_pic = document.getElementById("FUPDPIC-" + id);
ebda016b 265
fdcdf2de 266 var cache_prefix = "";
ebda016b 267
fdcdf2de
AD
268 if (activeFeedIsCat()) {
269 cache_prefix = "C:";
270 } else {
271 cache_prefix = "F:";
272 }
11063ec6
AD
273
274 var view_mode = false;
275
276 try {
277 view_mode = document.forms['main_toolbar_form'].view_mode;
278 view_mode = view_mode[view_mode.selectedIndex].value;
279 } catch (e) {
273d1e29 280 //
11063ec6
AD
281 }
282
fdcdf2de
AD
283 if (upd_img_pic && upd_img_pic.src.match("updated.png")) {
284 upd_img_pic.src = "images/blank_icon.gif";
ebda016b
AD
285
286 cache_invalidate(cache_prefix + getActiveFeedId());
ce411c4b
AD
287
288 cache_inject(cache_prefix + getActiveFeedId(),
289 document.getElementById("headlines-frame").innerHTML,
290 get_feed_unread(getActiveFeedId()));
fdcdf2de 291
11063ec6 292 } else if (article_is_unread && view_mode == "all_articles") {
fdcdf2de
AD
293
294 cache_invalidate(cache_prefix + getActiveFeedId());
295
296 cache_inject(cache_prefix + getActiveFeedId(),
297 document.getElementById("headlines-frame").innerHTML,
298 get_feed_unread(getActiveFeedId())-1);
299
3de99e6b
AD
300 } else if (article_is_unread) {
301 cache_invalidate(cache_prefix + getActiveFeedId());
868d0ed2 302 }
e097e8be 303
4c009c78
AD
304 markHeadline(id);
305
868d0ed2
AD
306 } catch (e) {
307 exception_error("showArticleInHeadlines", e);
308 }
71d277de 309}
e097e8be 310
71d277de
AD
311function article_callback2(transport, id, feed_id) {
312 try {
313 debug("article_callback2 " + id);
e097e8be 314
71d277de 315 if (transport.responseXML) {
e097e8be 316
2184738a
AD
317 if (!transport_error_check(transport)) return;
318
fbcabe1e 319 debug("looking for articles to cache...");
71d277de
AD
320
321 var articles = transport.responseXML.getElementsByTagName("article");
322
323 for (var i = 0; i < articles.length; i++) {
324 var a_id = articles[i].getAttribute("id");
325
326 debug("found id: " + a_id);
327
328 if (a_id == active_post_id) {
329 debug("active article, rendering...");
330 render_article(articles[i].firstChild.nodeValue);
e097e8be 331 }
71d277de
AD
332
333 cache_inject(a_id, articles[i].firstChild.nodeValue);
e097e8be 334 }
fbcabe1e
AD
335
336 if (id != last_requested_article) {
337 debug("requested article id is out of sequence, aborting");
338 return;
339 }
340
341 active_real_feed_id = feed_id;
342 active_post_id = id;
343
344 showArticleInHeadlines(id);
345
346 var reply = transport.responseXML.firstChild.firstChild;
71d277de
AD
347
348 } else {
349 debug("article_callback: returned no XML object");
17042fc0
AD
350 //var f = document.getElementById("content-frame");
351 //f.innerHTML = "<div class='whiteBox'>" + __('Could not display article (missing XML object)') + "</div>";
e097e8be 352 }
4b6206fa
AD
353
354 var date = new Date();
355 last_article_view = date.getTime() / 1000;
356
935f235d
AD
357 if (typeof correctPNG != 'undefined') {
358 correctPNG();
359 }
0b126ac2
AD
360
361 if (_reload_feedlist_after_view) {
362 setTimeout('updateFeedList(false, false)', 50);
363 _reload_feedlist_after_view = false;
364 } else {
71d277de 365 var counters = transport.responseXML.getElementsByTagName("counters")[0];
5a94a953
AD
366
367 if (counters) {
368 debug("parsing piggybacked counters: " + counters);
369 parse_counters(counters, false);
370 } else {
997d9d7c
AD
371 debug("counters container not found in reply, requesting...");
372 request_counters();
5a94a953 373 }
0b126ac2 374 }
9ec58704
AD
375
376 notify("");
71d277de 377 } catch (e) {
273d1e29 378 exception_error("article_callback2", e, transport);
6b4163cb
AD
379 }
380}
381
1dc8dba0 382function view(id, feed_id, skip_history) {
ee1f45f4
AD
383
384 try {
ee1f45f4 385 debug("loading article: " + id + "/" + feed_id);
71d277de 386
e097e8be
AD
387 var cached_article = cache_find(id);
388
389 debug("cache check result: " + (cached_article != false));
ee1f45f4 390
ee1f45f4
AD
391 enableHotkeys();
392
1c2d7193 393 //setActiveFeedId(feed_id);
090e250b 394
6b4163cb
AD
395 var query = "backend.php?op=view&id=" + param_escape(id) +
396 "&feed=" + param_escape(feed_id);
397
4b6206fa
AD
398 var date = new Date();
399
71d277de 400 var neighbor_ids = getRelativePostIds(active_post_id);
e097e8be 401
71d277de 402 /* only request uncached articles */
e097e8be 403
71d277de 404 var cids_to_request = Array();
5a94a953 405
71d277de
AD
406 for (var i = 0; i < neighbor_ids.length; i++) {
407 if (!cache_check(neighbor_ids[i])) {
408 cids_to_request.push(neighbor_ids[i]);
5a94a953 409 }
71d277de 410 }
5a94a953 411
71d277de 412 debug("additional ids: " + cids_to_request.toString());
e097e8be 413
71d277de 414 /* additional info for piggyback counters */
e097e8be 415
71d277de
AD
416 if (tagsAreDisplayed()) {
417 query = query + "&omode=lt";
418 } else {
419 query = query + "&omode=flc";
420 }
e097e8be 421
71d277de
AD
422 var date = new Date();
423 var timestamp = Math.round(date.getTime() / 1000);
424 query = query + "&ts=" + timestamp;
e097e8be 425
71d277de 426 query = query + "&cids=" + cids_to_request.toString();
e097e8be 427
71d277de
AD
428 var crow = document.getElementById("RROW-" + id);
429 var article_is_unread = crow.className.match("Unread");
e097e8be 430
6cc1fab3
AD
431 if (!async_counters_work) {
432 query = query + "&csync=true";
433 }
434
3f70f90f
AD
435 showArticleInHeadlines(id);
436
71d277de 437 if (!cached_article) {
e097e8be 438
793ec6ff 439 notify_progress("Loading, please wait...", true);
e097e8be 440
71d277de 441 } else if (cached_article && article_is_unread) {
addb5836 442
71d277de 443 query = query + "&mode=prefetch";
addb5836 444
71d277de 445 render_article(cached_article);
addb5836 446
71d277de 447 } else if (cached_article) {
e097e8be 448
71d277de
AD
449 query = query + "&mode=prefetch_old";
450 render_article(cached_article);
997d9d7c 451
71d277de 452 }
e097e8be 453
71d277de 454 cache_expire();
86173d9a 455
022d9e9e
AD
456 last_requested_article = id;
457
71d277de
AD
458 new Ajax.Request(query, {
459 onComplete: function(transport) {
460 article_callback2(transport, id, feed_id);
461 } });
6b4163cb 462
a7764e51
AD
463 return false;
464
ee1f45f4
AD
465 } catch (e) {
466 exception_error("view", e);
467 }
f0601b87
AD
468}
469
67343d9f
AD
470function tMark(id) {
471 return toggleMark(id);
472}
473
e4f4b46f
AD
474function tPub(id) {
475 return togglePub(id);
476}
477
6b0f49f9
AD
478function tMark_afh_off(effect) {
479 try {
480 var elem = effect.effects[0].element;
481
482 debug("tMark_afh_off : " + elem.id);
483
484 if (elem) {
f5e0338d
AD
485 elem.src = elem.src.replace("mark_set", "mark_unset");
486 elem.alt = __("Star article");
6b0f49f9
AD
487 Element.show(elem);
488 }
489
490 } catch (e) {
491 exception_error("tMark_afh_off", e);
492 }
493}
494
495function tPub_afh_off(effect) {
496 try {
497 var elem = effect.effects[0].element;
498
499 debug("tPub_afh_off : " + elem.id);
500
501 if (elem) {
f5e0338d
AD
502 elem.src = elem.src.replace("pub_set", "pub_unset");
503 elem.alt = __("Publish article");
6b0f49f9
AD
504 Element.show(elem);
505 }
506
507 } catch (e) {
508 exception_error("tPub_afh_off", e);
509 }
510}
e4f4b46f 511
f5e0338d 512function toggleMark(id, client_only, no_effects) {
f0601b87 513
b685ba25 514 try {
254e0e4b 515
b685ba25
AD
516 var query = "backend.php?op=rpc&id=" + id + "&subop=mark";
517
518 query = query + "&afid=" + getActiveFeedId();
519
520 if (tagsAreDisplayed()) {
521 query = query + "&omode=tl";
522 } else {
523 query = query + "&omode=flc";
7ba176d2 524 }
b685ba25
AD
525
526 var mark_img = document.getElementById("FMPIC-" + id);
56ff7564
AD
527
528 if (!mark_img) return;
529
b685ba25
AD
530 var vfeedu = document.getElementById("FEEDU--1");
531 var crow = document.getElementById("RROW-" + id);
532
f5e0338d
AD
533 if (mark_img.src.match("mark_unset")) {
534 mark_img.src = mark_img.src.replace("mark_unset", "mark_set");
535 mark_img.alt = __("Unstar article");
b685ba25 536 query = query + "&mark=1";
ee8768db 537
b685ba25
AD
538 } else {
539 //mark_img.src = "images/mark_unset.png";
f5e0338d 540 mark_img.alt = __("Please wait...");
b685ba25
AD
541 query = query + "&mark=0";
542
f5e0338d 543 if (document.getElementById("headlinesList") && !no_effects) {
b685ba25
AD
544 Effect.Puff(mark_img, {duration : 0.25, afterFinish: tMark_afh_off});
545 } else {
f5e0338d
AD
546 mark_img.src = mark_img.src.replace("mark_set", "mark_unset");
547 mark_img.alt = __("Star article");
b685ba25 548 }
ace1a6da 549 }
772bc83b 550
f5e0338d
AD
551 if (!client_only) {
552 debug(query);
36e05046 553
1341ea0d
AD
554 new Ajax.Request(query, {
555 onComplete: function(transport) {
556 all_counters_callback2(transport);
557 } });
558
f5e0338d 559 }
f0601b87 560
b685ba25
AD
561 } catch (e) {
562 exception_error("toggleMark", e);
563 }
f0601b87
AD
564}
565
f5e0338d 566function togglePub(id, client_only, no_effects) {
e4f4b46f 567
2bc2147f 568 try {
e4f4b46f 569
2bc2147f
AD
570 var query = "backend.php?op=rpc&id=" + id + "&subop=publ";
571
572 query = query + "&afid=" + getActiveFeedId();
573
574 if (tagsAreDisplayed()) {
575 query = query + "&omode=tl";
576 } else {
577 query = query + "&omode=flc";
e4f4b46f 578 }
2bc2147f
AD
579
580 var mark_img = document.getElementById("FPPIC-" + id);
56ff7564
AD
581
582 if (!mark_img) return;
583
2bc2147f
AD
584 var vfeedu = document.getElementById("FEEDU--2");
585 var crow = document.getElementById("RROW-" + id);
586
f5e0338d
AD
587 if (mark_img.src.match("pub_unset")) {
588 mark_img.src = mark_img.src.replace("pub_unset", "pub_set");
589 mark_img.alt = __("Unpublish article");
2bc2147f
AD
590 query = query + "&pub=1";
591
ee8768db 592
e4f4b46f 593 } else {
6b0f49f9 594 //mark_img.src = "images/pub_unset.png";
f5e0338d 595 mark_img.alt = __("Please wait...");
2bc2147f
AD
596 query = query + "&pub=0";
597
f5e0338d 598 if (document.getElementById("headlinesList") && !no_effects) {
ace1a6da
AD
599 Effect.Puff(mark_img, {duration : 0.25, afterFinish: tPub_afh_off});
600 } else {
f5e0338d
AD
601 mark_img.src = mark_img.src.replace("pub_set", "pub_unset");
602 mark_img.alt = __("Publish article");
ace1a6da 603 }
e4f4b46f 604 }
b685ba25 605
f5e0338d 606 if (!client_only) {
1341ea0d
AD
607 new Ajax.Request(query, {
608 onComplete: function(transport) {
609 all_counters_callback2(transport);
610 } });
f5e0338d 611 }
b685ba25 612
2bc2147f 613 } catch (e) {
e4f4b46f 614
2bc2147f
AD
615 exception_error("togglePub", e);
616 }
e4f4b46f
AD
617}
618
ac162cbe
AD
619function correctHeadlinesOffset(id) {
620
621 try {
622
623 var hlist = document.getElementById("headlinesList");
624 var container = document.getElementById("headlinesInnerContainer");
625 var row = document.getElementById("RROW-" + id);
626
627 var viewport = container.offsetHeight;
628
629 var rel_offset_top = row.offsetTop - container.scrollTop;
630 var rel_offset_bottom = row.offsetTop + row.offsetHeight - container.scrollTop;
631
632 debug("Rtop: " + rel_offset_top + " Rbtm: " + rel_offset_bottom);
633 debug("Vport: " + viewport);
a5e46e0f 634
ac162cbe
AD
635 if (rel_offset_top <= 0 || rel_offset_top > viewport) {
636 container.scrollTop = row.offsetTop;
637 } else if (rel_offset_bottom > viewport) {
a5e46e0f
AD
638
639 /* doesn't properly work with Opera in some cases because
640 Opera fucks up element scrolling */
641
ac162cbe
AD
642 container.scrollTop = row.offsetTop + row.offsetHeight - viewport;
643 }
644
645 } catch (e) {
646 exception_error("correctHeadlinesOffset", e);
647 }
648
649}
650
bb7cface 651function moveToPost(mode) {
f0601b87 652
b8e6acea
AD
653 try {
654
5ad9d132
AD
655 var rows;
656
657 if (isCdmMode()) {
658 rows = cdmGetVisibleArticles();
659 } else {
660 rows = getVisibleHeadlineIds();
661 }
b8e6acea 662
5ad9d132
AD
663 var prev_id = false;
664 var next_id = false;
b8e6acea 665
5ad9d132
AD
666 if (!document.getElementById('RROW-' + active_post_id)) {
667 active_post_id = false;
668 }
b8e6acea 669
5ad9d132
AD
670 if (active_post_id == false) {
671 next_id = getFirstVisibleHeadlineId();
672 prev_id = getLastVisibleHeadlineId();
673 } else {
674 for (var i = 0; i < rows.length; i++) {
675 if (rows[i] == active_post_id) {
676 prev_id = rows[i-1];
677 next_id = rows[i+1];
b8e6acea
AD
678 }
679 }
5ad9d132 680 }
b8e6acea 681
5ad9d132
AD
682 if (mode == "next") {
683 if (next_id) {
684 if (isCdmMode()) {
685
686 if (!cdmArticleIsActuallyVisible(next_id)) {
687 cdmScrollToArticleId(next_id);
688 }
689 cdmSelectArticles("none");
690 toggleUnread(next_id, 0, true);
691 toggleSelected(next_id);
692
693 } else {
b8e6acea
AD
694 correctHeadlinesOffset(next_id);
695 view(next_id, getActiveFeedId());
696 }
697 }
5ad9d132 698 }
b8e6acea 699
5ad9d132
AD
700 if (mode == "prev") {
701 if (prev_id) {
702 if (isCdmMode()) {
703 cdmScrollToArticleId(prev_id);
704 cdmSelectArticles("none");
705 toggleUnread(prev_id, 0, true);
706 toggleSelected(prev_id);
707 } else {
b8e6acea
AD
708 correctHeadlinesOffset(prev_id);
709 view(prev_id, getActiveFeedId());
710 }
5ad9d132
AD
711 }
712 }
713
b8e6acea 714 } catch (e) {
438f2ce9 715 exception_error("moveToPost", e);
bb7cface 716 }
b8e6acea
AD
717}
718
719function toggleSelected(id) {
720 try {
721
5ad9d132
AD
722 var cb = document.getElementById("RCHK-" + id);
723
b8e6acea
AD
724 var row = document.getElementById("RROW-" + id);
725 if (row) {
726 var nc = row.className;
727
728 if (!nc.match("Selected")) {
729 nc = nc + "Selected";
5ad9d132
AD
730 if (cb) {
731 cb.checked = true;
732 }
733
734 // In CDM basically last selected article == active article
735 if (isCdmMode()) active_post_id = id;
b8e6acea
AD
736 } else {
737 nc = nc.replace("Selected", "");
5ad9d132
AD
738 if (cb) {
739 cb.checked = false;
740 }
741
b8e6acea 742 }
bb7cface 743
b8e6acea 744 row.className = nc;
bb7cface 745 }
b8e6acea 746 } catch (e) {
438f2ce9 747 exception_error("toggleSelected", e);
b8e6acea 748 }
bb7cface
AD
749}
750
0df009c3 751function toggleUnread_afh(effect) {
b8e6acea
AD
752 try {
753
754 var elem = effect.element;
0df009c3 755 elem.style.backgroundColor = "";
b8e6acea 756
b8e6acea 757 } catch (e) {
438f2ce9 758 exception_error("toggleUnread_afh", e);
b8e6acea 759 }
0df009c3 760}
b8e6acea
AD
761
762function toggleUnread(id, cmode, effect) {
5f51022a 763 try {
5f51022a
AD
764
765 var row = document.getElementById("RROW-" + id);
766 if (row) {
767 var nc = row.className;
93f66472 768 var is_selected = row.className.match("Selected");
5f51022a
AD
769 nc = nc.replace("Unread", "");
770 nc = nc.replace("Selected", "");
771
b8e6acea
AD
772 // since we are removing selection from the object, uncheck
773 // corresponding checkbox
774
775 var cb = document.getElementById("RCHK-" + id);
776 if (cb) {
777 cb.checked = false;
778 }
779
780 // NOTE: I'm not sure that resetting selection here is a feature -fox
781
a70ab740
AD
782 if (cmode == undefined || cmode == 2) {
783 if (row.className.match("Unread")) {
784 row.className = nc;
b8e6acea 785
0df009c3 786 if (effect) {
b8e6acea
AD
787 new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
788 afterFinish: toggleUnread_afh,
789 queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
0df009c3 790 }
b8e6acea 791
a70ab740
AD
792 } else {
793 row.className = nc + "Unread";
794 }
795 } else if (cmode == 0) {
5f51022a 796 row.className = nc;
b8e6acea 797
54eb7d20 798 if (effect) {
b8e6acea 799 new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
54eb7d20 800 afterFinish: toggleUnread_afh,
b8e6acea 801 queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
54eb7d20 802 }
a70ab740 803 } else if (cmode == 1) {
5f51022a
AD
804 row.className = nc + "Unread";
805 }
806
93f66472
AD
807 // Disable unmarking as selected for the time being (16.05.08) -fox
808 if (is_selected) row.className = row.className + "Selected";
809
a70ab740 810 if (cmode == undefined) cmode = 2;
5f51022a
AD
811
812 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
813 param_escape(id) + "&cmode=" + param_escape(cmode);
814
1341ea0d 815// notify_progress("Loading, please wait...");
9ec58704 816
1341ea0d
AD
817 new Ajax.Request(query, {
818 onComplete: function(transport) {
819 all_counters_callback2(transport);
820 } });
5f51022a
AD
821
822 }
823
824
825 } catch (e) {
826 exception_error("toggleUnread", e);
827 }
828}
829
933ba4ee
AD
830function selectionRemoveLabel(id) {
831 try {
832
833 var ids = getSelectedArticleIds2();
834
835 if (ids.length == 0) {
836 alert(__("No articles are selected."));
837 return;
838 }
839
37843d70 840// var ok = confirm(__("Remove selected articles from label?"));
933ba4ee 841
37843d70 842// if (ok) {
933ba4ee
AD
843
844 var query = "backend.php?op=rpc&subop=removeFromLabel&ids=" +
845 param_escape(ids.toString()) + "&lid=" + param_escape(id);
846
847// notify_progress("Loading, please wait...");
848
898e8562
AD
849 cache_invalidate("F:" + (-11 - id));
850
933ba4ee
AD
851 new Ajax.Request(query, {
852 onComplete: function(transport) {
1c9c6025
AD
853 show_labels_in_headlines(transport);
854 all_counters_callback2(transport);
933ba4ee
AD
855 } });
856
37843d70 857// }
933ba4ee
AD
858
859 } catch (e) {
860 exception_error("selectionAssignLabel", e);
861
862 }
863}
864
b8a637f3
AD
865function selectionAssignLabel(id) {
866 try {
867
868 var ids = getSelectedArticleIds2();
869
870 if (ids.length == 0) {
871 alert(__("No articles are selected."));
872 return;
873 }
874
37843d70 875// var ok = confirm(__("Assign selected articles to label?"));
b8a637f3 876
37843d70 877// if (ok) {
b8a637f3 878
898e8562
AD
879 cache_invalidate("F:" + (-11 - id));
880
b8a637f3
AD
881 var query = "backend.php?op=rpc&subop=assignToLabel&ids=" +
882 param_escape(ids.toString()) + "&lid=" + param_escape(id);
883
884// notify_progress("Loading, please wait...");
885
886 new Ajax.Request(query, {
887 onComplete: function(transport) {
f9247195
AD
888 show_labels_in_headlines(transport);
889 all_counters_callback2(transport);
b8a637f3
AD
890 } });
891
37843d70 892// }
b8a637f3
AD
893
894 } catch (e) {
895 exception_error("selectionAssignLabel", e);
896
897 }
898}
899
2228d0e4 900function selectionToggleUnread(cdm_mode, set_state, callback_func, no_error) {
1572afe5 901 try {
386cbf27
AD
902 var rows;
903
904 if (cdm_mode) {
905 rows = cdmGetSelectedArticles();
906 } else {
907 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
908 }
1572afe5 909
2228d0e4 910 if (rows.length == 0 && !no_error) {
9cc600d1
AD
911 alert(__("No articles are selected."));
912 return;
913 }
914
1572afe5 915 for (i = 0; i < rows.length; i++) {
f1f2db64
AD
916 var row = document.getElementById("RROW-" + rows[i]);
917 if (row) {
918 var nc = row.className;
919 nc = nc.replace("Unread", "");
920 nc = nc.replace("Selected", "");
921
a5ae125a
AD
922 if (set_state == undefined) {
923 if (row.className.match("Unread")) {
924 row.className = nc + "Selected";
925 } else {
926 row.className = nc + "UnreadSelected";
927 }
928 }
929
930 if (set_state == false) {
f1f2db64 931 row.className = nc + "Selected";
a5ae125a
AD
932 }
933
934 if (set_state == true) {
f1f2db64
AD
935 row.className = nc + "UnreadSelected";
936 }
937 }
1572afe5
AD
938 }
939
940 if (rows.length > 0) {
941
b47b5af7
AD
942 var cmode = "";
943
944 if (set_state == undefined) {
945 cmode = "2";
946 } else if (set_state == true) {
947 cmode = "1";
948 } else if (set_state == false) {
949 cmode = "0";
950 }
951
1572afe5 952 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
b47b5af7 953 param_escape(rows.toString()) + "&cmode=" + cmode;
1572afe5 954
9ec58704
AD
955 notify_progress("Loading, please wait...");
956
1341ea0d
AD
957 new Ajax.Request(query, {
958 onComplete: function(transport) {
959 catchup_callback2(transport, callback_func);
960 } });
1572afe5
AD
961
962 }
963
964 } catch (e) {
83f043bb 965 exception_error("selectionToggleUnread", e);
1572afe5
AD
966 }
967}
968
386cbf27 969function selectionToggleMarked(cdm_mode) {
1572afe5 970 try {
1572afe5 971
386cbf27
AD
972 var rows;
973
974 if (cdm_mode) {
975 rows = cdmGetSelectedArticles();
976 } else {
977 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
978 }
1572afe5 979
9cc600d1
AD
980 if (rows.length == 0) {
981 alert(__("No articles are selected."));
982 return;
983 }
984
1572afe5 985 for (i = 0; i < rows.length; i++) {
f5e0338d 986 toggleMark(rows[i], true, true);
1572afe5
AD
987 }
988
989 if (rows.length > 0) {
990
991 var query = "backend.php?op=rpc&subop=markSelected&ids=" +
992 param_escape(rows.toString()) + "&cmode=2";
993
2bc2147f
AD
994 query = query + "&afid=" + getActiveFeedId();
995
1341ea0d 996/* if (tagsAreDisplayed()) {
2bc2147f
AD
997 query = query + "&omode=tl";
998 } else {
999 query = query + "&omode=flc";
1341ea0d
AD
1000 } */
1001
1002 query = query + "&omode=lc";
2bc2147f 1003
1341ea0d
AD
1004 new Ajax.Request(query, {
1005 onComplete: function(transport) {
1006 all_counters_callback2(transport);
1007 } });
1572afe5
AD
1008
1009 }
1010
1011 } catch (e) {
83f043bb 1012 exception_error("selectionToggleMarked", e);
1572afe5
AD
1013 }
1014}
1015
e4f4b46f
AD
1016function selectionTogglePublished(cdm_mode) {
1017 try {
e4f4b46f
AD
1018
1019 var rows;
1020
1021 if (cdm_mode) {
1022 rows = cdmGetSelectedArticles();
1023 } else {
1024 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
1025 }
1026
1027 if (rows.length == 0) {
1028 alert(__("No articles are selected."));
1029 return;
1030 }
1031
1032 for (i = 0; i < rows.length; i++) {
f5e0338d 1033 togglePub(rows[i], true, true);
e4f4b46f
AD
1034 }
1035
1036 if (rows.length > 0) {
1037
1038 var query = "backend.php?op=rpc&subop=publishSelected&ids=" +
1039 param_escape(rows.toString()) + "&cmode=2";
1040
2bc2147f
AD
1041 query = query + "&afid=" + getActiveFeedId();
1042
1341ea0d 1043/* if (tagsAreDisplayed()) {
2bc2147f
AD
1044 query = query + "&omode=tl";
1045 } else {
1046 query = query + "&omode=flc";
1341ea0d
AD
1047 } */
1048
1049 query = query + "&omode=lc";
2bc2147f 1050
1341ea0d
AD
1051 new Ajax.Request(query, {
1052 onComplete: function(transport) {
1053 all_counters_callback2(transport);
1054 } });
e4f4b46f
AD
1055
1056 }
1057
1058 } catch (e) {
1059 exception_error("selectionToggleMarked", e);
1060 }
1061}
1062
386cbf27
AD
1063function cdmGetSelectedArticles() {
1064 var sel_articles = new Array();
b2128f01 1065 var container = document.getElementById("headlinesInnerContainer");
386cbf27
AD
1066
1067 for (i = 0; i < container.childNodes.length; i++) {
1068 var child = container.childNodes[i];
1069
02895941 1070 if (child.id && child.id.match("RROW-") && child.className.match("Selected")) {
386cbf27
AD
1071 var c_id = child.id.replace("RROW-", "");
1072 sel_articles.push(c_id);
1073 }
1074 }
1075
1076 return sel_articles;
1077}
1078
8be83f42
AD
1079function cdmGetVisibleArticles() {
1080 var sel_articles = new Array();
1081 var container = document.getElementById("headlinesInnerContainer");
1082
3a40e8a2
AD
1083 if (!container) return sel_articles;
1084
8be83f42
AD
1085 for (i = 0; i < container.childNodes.length; i++) {
1086 var child = container.childNodes[i];
1087
02895941 1088 if (child.id && child.id.match("RROW-")) {
8be83f42
AD
1089 var c_id = child.id.replace("RROW-", "");
1090 sel_articles.push(c_id);
1091 }
1092 }
1093
1094 return sel_articles;
1095}
1096
1097function cdmGetUnreadArticles() {
1098 var sel_articles = new Array();
1099 var container = document.getElementById("headlinesInnerContainer");
1100
1101 for (i = 0; i < container.childNodes.length; i++) {
1102 var child = container.childNodes[i];
1103
02895941 1104 if (child.id && child.id.match("RROW-") && child.className.match("Unread")) {
8be83f42
AD
1105 var c_id = child.id.replace("RROW-", "");
1106 sel_articles.push(c_id);
1107 }
1108 }
1109
1110 return sel_articles;
1111}
1112
1113
386cbf27
AD
1114// mode = all,none,unread
1115function cdmSelectArticles(mode) {
b2128f01 1116 var container = document.getElementById("headlinesInnerContainer");
386cbf27
AD
1117
1118 for (i = 0; i < container.childNodes.length; i++) {
1119 var child = container.childNodes[i];
1120
02895941 1121 if (child.id && child.id.match("RROW-")) {
06d1a1c1
AD
1122 var aid = child.id.replace("RROW-", "");
1123
1124 var cb = document.getElementById("RCHK-" + aid);
1125
386cbf27
AD
1126 if (mode == "all") {
1127 if (!child.className.match("Selected")) {
1128 child.className = child.className + "Selected";
06d1a1c1 1129 cb.checked = true;
386cbf27
AD
1130 }
1131 } else if (mode == "unread") {
1132 if (child.className.match("Unread") && !child.className.match("Selected")) {
1133 child.className = child.className + "Selected";
06d1a1c1 1134 cb.checked = true;
386cbf27
AD
1135 }
1136 } else {
1137 child.className = child.className.replace("Selected", "");
06d1a1c1 1138 cb.checked = false;
386cbf27
AD
1139 }
1140 }
1141 }
1142}
1143
98bea1b1 1144function catchupPage() {
b47b5af7 1145
3d72bbdb 1146 var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
8a5b4579 1147
a5ae125a
AD
1148 var str = __("Mark all visible articles in %s as read?");
1149
1150 str = str.replace("%s", fn);
8a5b4579
AD
1151
1152 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
1153 return;
1154 }
1155
b47b5af7
AD
1156 if (document.getElementById("headlinesList")) {
1157 selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true);
2228d0e4 1158 selectionToggleUnread(false, false, 'viewCurrentFeed()', true);
b47b5af7
AD
1159 selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
1160 } else {
1161 cdmSelectArticles('all');
2228d0e4 1162 selectionToggleUnread(true, false, 'viewCurrentFeed()', true)
b47b5af7
AD
1163 cdmSelectArticles('none');
1164 }
98bea1b1
AD
1165}
1166
a5ae125a
AD
1167function catchupSelection() {
1168
1169 try {
1170
1171 var rows;
1172
1173 if (document.getElementById("headlinesList")) {
1174 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
1175 } else {
1176 rows = cdmGetSelectedArticles();
1177 }
1178
1179 if (rows.length == 0) {
1180 alert(__("No articles are selected."));
1181 return;
1182 }
1183
1184
3d72bbdb 1185 var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
a5ae125a 1186
ba5fac1b 1187 var str = __("Mark %d selected articles in %s as read?");
a5ae125a 1188
ba5fac1b 1189 str = str.replace("%d", rows.length);
a5ae125a
AD
1190 str = str.replace("%s", fn);
1191
1192 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
1193 return;
1194 }
1195
1196 if (document.getElementById("headlinesList")) {
1197 selectionToggleUnread(false, false, 'viewCurrentFeed()', true);
1198 // selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
1199 } else {
1200 selectionToggleUnread(true, false, 'viewCurrentFeed()', true)
1201 // cdmSelectArticles('none');
1202 }
1203
1204 } catch (e) {
1205 exception_error("catchupSelection", e);
1206 }
1207}
1208
13f08f75 1209function editArticleTags(id, feed_id, cdm_enabled) {
0b126ac2
AD
1210 displayDlg('editArticleTags', id);
1211}
1212
1213
2ef1af84
AD
1214function tag_saved_callback(transport) {
1215 try {
1216 debug("in tag_saved_callback");
0b126ac2 1217
2ef1af84
AD
1218 closeInfoBox();
1219 notify("");
0b126ac2 1220
2ef1af84
AD
1221 if (tagsAreDisplayed()) {
1222 _reload_feedlist_after_view = true;
1223 }
0b126ac2 1224
307d187c
AD
1225
1226 if (transport.responseXML) {
1227 var tags_str = transport.responseXML.getElementsByTagName("tags-str")[0];
1228
1229 if (tags_str) {
1230 var id = tags_str.getAttribute("id");
1231
1232 if (id) {
1233 var tags = document.getElementById("ATSTR-" + id);
1234 if (tags) {
1235 tags.innerHTML = tags_str.firstChild.nodeValue;
1236 }
1237 }
13f08f75 1238 }
0b126ac2 1239 }
2ef1af84
AD
1240
1241 } catch (e) {
307d187c 1242 exception_error("tag_saved_callback", e);
0b126ac2
AD
1243 }
1244}
1245
1246function editTagsSave() {
1247
42c32916 1248 notify_progress("Saving article tags...");
88040f57 1249
0b126ac2
AD
1250 var form = document.forms["tag_edit_form"];
1251
1252 var query = Form.serialize("tag_edit_form");
1253
14b6c54b
AD
1254 query = "backend.php?op=rpc&subop=setArticleTags&" + query;
1255
1256 debug(query);
1257
2ef1af84
AD
1258 new Ajax.Request(query, {
1259 onComplete: function(transport) {
1260 tag_saved_callback(transport);
1261 } });
0b126ac2
AD
1262
1263}
d62a3b63
AD
1264
1265function editTagsInsert() {
1266 try {
1267
1268 var form = document.forms["tag_edit_form"];
1269
1270 var found_tags = form.found_tags;
1271 var tags_str = form.tags_str;
1272
1273 var tag = found_tags[found_tags.selectedIndex].value;
1274
1275 if (tags_str.value.length > 0 &&
1276 tags_str.value.lastIndexOf(", ") != tags_str.value.length - 2) {
1277
1278 tags_str.value = tags_str.value + ", ";
1279 }
1280
1281 tags_str.value = tags_str.value + tag + ", ";
1282
1283 found_tags.selectedIndex = 0;
1284
1285 } catch (e) {
438f2ce9 1286 exception_error("editTagsInsert", e);
d62a3b63
AD
1287 }
1288}
ba0978c8 1289
587bef10
AD
1290function cdmScrollViewport(where) {
1291 debug("cdmScrollViewport: " + where);
1292
1293 var ctr = document.getElementById("headlinesInnerContainer");
1294
1295 if (!ctr) return;
1296
1297 if (where == "bottom") {
1298 ctr.scrollTop = ctr.scrollHeight;
1299 } else {
1300 ctr.scrollTop = where;
1301 }
1302}
1303
b8e6acea
AD
1304function cdmArticleIsBelowViewport(id) {
1305 try {
1306 var ctr = document.getElementById("headlinesInnerContainer");
1307 var e = document.getElementById("RROW-" + id);
1308
1309 if (!e || !ctr) return;
1310
1311 // article starts below viewport
1312
1313 if (ctr.scrollTop < e.offsetTop) {
1314 return true;
1315 } else {
1316 return false;
1317 }
1318
1319 } catch (e) {
438f2ce9 1320 exception_error("cdmArticleIsVisible", e);
b8e6acea
AD
1321 }
1322}
1323
1324function cdmArticleIsAboveViewport(id) {
1325 try {
1326 var ctr = document.getElementById("headlinesInnerContainer");
1327 var e = document.getElementById("RROW-" + id);
1328
1329 if (!e || !ctr) return;
1330
1331 // article starts above viewport
1332
1333 if (ctr.scrollTop > e.offsetTop + e.offsetHeight) {
1334 return true;
1335 } else {
1336 return false;
1337 }
1338
1339 } catch (e) {
438f2ce9 1340 exception_error("cdmArticleIsVisible", e);
b8e6acea
AD
1341 }
1342}
1343
1344function cdmScrollToArticleId(id) {
1345 try {
1346 var ctr = document.getElementById("headlinesInnerContainer");
1347 var e = document.getElementById("RROW-" + id);
1348
1349 if (!e || !ctr) return;
1350
1351 ctr.scrollTop = e.offsetTop;
1352
1353 } catch (e) {
438f2ce9 1354 exception_error("cdmScrollToArticleId", e);
b8e6acea
AD
1355 }
1356}
1357
1358function cdmArticleIsActuallyVisible(id) {
1359 try {
1360 var ctr = document.getElementById("headlinesInnerContainer");
1361 var e = document.getElementById("RROW-" + id);
1362
1363 if (!e || !ctr) return;
1364
1365 // article fits in viewport OR article is longer than viewport and
1366 // its bottom is visible
1367
1368 if (ctr.scrollTop <= e.offsetTop && e.offsetTop + e.offsetHeight <=
1369 ctr.scrollTop + ctr.offsetHeight) {
1370
1371 return true;
1372
1373 } else if (e.offsetHeight > ctr.offsetHeight &&
1374 e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
1375 e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight) {
1376
1377 return true;
1378
1379 }
1380
1381 return false;
1382
1383 } catch (e) {
438f2ce9 1384 exception_error("cdmArticleIsVisible", e);
b8e6acea
AD
1385 }
1386}
1387
ba0978c8
AD
1388function cdmWatchdog() {
1389
1390 try {
1391
1392 var ctr = document.getElementById("headlinesInnerContainer");
1393
9acd22e8
AD
1394 if (!ctr) return;
1395
ba0978c8
AD
1396 var ids = new Array();
1397
1398 var e = ctr.firstChild;
1399
1400 while (e) {
1401 if (e.className && e.className == "cdmArticleUnread" && e.id &&
1402 e.id.match("RROW-")) {
1403
1404 // article fits in viewport OR article is longer than viewport and
1405 // its bottom is visible
1406
1407 if (ctr.scrollTop <= e.offsetTop && e.offsetTop + e.offsetHeight <=
1408 ctr.scrollTop + ctr.offsetHeight) {
1409
1410// debug(e.id + " is visible " + e.offsetTop + "." +
1411// (e.offsetTop + e.offsetHeight) + " vs " + ctr.scrollTop + "." +
1412// (ctr.scrollTop + ctr.offsetHeight));
1413
1414 ids.push(e.id.replace("RROW-", ""));
1415
1416 } else if (e.offsetHeight > ctr.offsetHeight &&
1417 e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
1418 e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight) {
1419
1420 ids.push(e.id.replace("RROW-", ""));
1421
1422 }
1423
c50e2b30
AD
1424 // method 2: article bottom is visible and is in upper 1/2 of the viewport
1425
1426/* if (e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
1427 e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight/2) {
1428
1429 ids.push(e.id.replace("RROW-", ""));
1430
1431 } */
1432
ba0978c8
AD
1433 }
1434
1435 e = e.nextSibling;
1436 }
1437
1438 debug("cdmWatchdog, ids= " + ids.toString());
1439
1341ea0d 1440 if (ids.length > 0) {
ba0978c8
AD
1441
1442 for (var i = 0; i < ids.length; i++) {
1443 var e = document.getElementById("RROW-" + ids[i]);
1444 if (e) {
1445 e.className = e.className.replace("Unread", "");
1446 }
1447 }
1448
1449 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
1450 param_escape(ids.toString()) + "&cmode=0";
1451
1341ea0d
AD
1452 new Ajax.Request(query, {
1453 onComplete: function(transport) {
1454 all_counters_callback2(transport);
1455 } });
ba0978c8
AD
1456
1457 }
1458
c50e2b30 1459 _cdm_wd_timeout = window.setTimeout("cdmWatchdog()", 4000);
ba0978c8
AD
1460
1461 } catch (e) {
438f2ce9 1462 exception_error("cdmWatchdog", e);
ba0978c8
AD
1463 }
1464
1465}
e097e8be
AD
1466
1467
e19c1824 1468function cache_inject(id, article, param) {
fb456d28
AD
1469 try {
1470 if (!cache_check_param(id, param)) {
1471 debug("cache_article: miss: " + id + " [p=" + param + "]");
1472
1473
1474 if (db) {
e097e8be 1475
fb456d28
AD
1476 var date = new Date();
1477 var ts = Math.round(date.getTime() / 1000);
e097e8be 1478
fb456d28
AD
1479 db.execute("INSERT INTO cache (id, article, param, added) VALUES (?, ?, ?, ?)",
1480 [id, article, param, ts]);
1481 } else {
1482
1483 var cache_obj = new Array();
1484
1485 cache_obj["id"] = id;
1486 cache_obj["data"] = article;
1487 cache_obj["param"] = param;
1488
1489 article_cache.push(cache_obj);
1490 }
1491
1492 } else {
1493 debug("cache_article: hit: " + id + " [p=" + param + "]");
1494 }
1495 } catch (e) {
1496 exception_error("cache_inject", e);
e097e8be
AD
1497 }
1498}
1499
1500function cache_find(id) {
fb456d28
AD
1501
1502 if (db) {
1503
1504 } else {
1505 for (var i = 0; i < article_cache.length; i++) {
1506 if (article_cache[i]["id"] == id) {
1507 return article_cache[i]["data"];
1508 }
fed4387d 1509 }
e097e8be 1510 }
fed4387d 1511 return false;
e097e8be
AD
1512}
1513
5d17ead9 1514function cache_find_param(id, param) {
fb456d28
AD
1515
1516 if (db) {
1517 var rs = db.execute("SELECT article FROM cache WHERE id = ? AND param = ?",
1518 [id, param]);
1519
1520 if (rs.isValidRow()) {
1521 return rs.field(0);
1522 }
1523
1524 } else {
1525 for (var i = 0; i < article_cache.length; i++) {
1526 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1527 return article_cache[i]["data"];
1528 }
e19c1824
AD
1529 }
1530 }
1531 return false;
1532}
1533
e097e8be 1534function cache_check(id) {
fb456d28
AD
1535
1536 if (db) {
1537 var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ?",
1538 [id]);
1539
1540 if (rs.isValidRow()) {
1541 return rs.field(0) != "0";
1542 }
1543
1544 } else {
1545 for (var i = 0; i < article_cache.length; i++) {
1546 if (article_cache[i]["id"] == id) {
1547 return true;
1548 }
fed4387d
AD
1549 }
1550 }
1551 return false;
e097e8be
AD
1552}
1553
e19c1824 1554function cache_check_param(id, param) {
5d17ead9 1555
fb456d28
AD
1556 if (db) {
1557 var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ? AND param = ?",
1558 [id, param]);
5d17ead9 1559
fb456d28
AD
1560 if (rs.isValidRow()) {
1561 return rs.field(0) != "0";
1562 }
1563
1564 } else {
1565 for (var i = 0; i < article_cache.length; i++) {
1566 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1567 return true;
1568 }
e19c1824
AD
1569 }
1570 }
1571 return false;
1572}
1573
e097e8be 1574function cache_expire() {
fb456d28
AD
1575 if (!db) {
1576 while (article_cache.length > 25) {
1577 article_cache.shift();
1578 }
fed4387d 1579 }
e097e8be 1580}
b07b61da 1581
3c2d7945
AD
1582function cache_empty() {
1583 article_cache = new Array();
1584}
1585
b07b61da 1586function cache_invalidate(id) {
c1b18749
AD
1587 try {
1588
fb456d28
AD
1589 if (db) {
1590 rs = db.execute("DELETE FROM cache WHERE id = ?", [id]);
1591 return rs.rowsAffected != 0;
1592 } else {
1593
1594 var i = 0
1595
1596 while (i < article_cache.length) {
1597 if (article_cache[i]["id"] == id) {
1598 debug("cache_invalidate: removed id " + id);
1599 article_cache.splice(i, 1);
1600 return true;
1601 }
1602 i++;
c1b18749 1603 }
b07b61da 1604 }
fb456d28 1605
c1b18749
AD
1606 debug("cache_invalidate: id not found: " + id);
1607 return false;
1608 } catch (e) {
1609 exception_error("cache_invalidate", e);
b07b61da 1610 }
b07b61da 1611}
298f3f78
AD
1612
1613function getActiveArticleId() {
1614 return active_post_id;
1615}
e4914b62 1616
3cd4239a 1617function cdmClicked(id) {
e4914b62 1618 try {
3cd4239a
AD
1619 var elem = document.getElementById("RROW-" + id);
1620
1621 if (elem) {
e4914b62
AD
1622 var id = elem.id.replace("RROW-", "");
1623 active_post_id = id;
5ad9d132
AD
1624
1625 cdmSelectArticles("none");
b61cf20c 1626 toggleUnread(id, 0, true);
5ad9d132
AD
1627 toggleSelected(id);
1628
e4914b62
AD
1629 }
1630 } catch (e) {
ee8768db 1631 exception_error("cdmClicked", e);
5ad9d132
AD
1632 }
1633}
e4914b62 1634
aa0fa9df
AD
1635function preload_article_callback(transport) {
1636 try {
1637 if (transport.responseXML) {
1638 var articles = transport.responseXML.getElementsByTagName("article");
1639
1640 for (var i = 0; i < articles.length; i++) {
1641 var id = articles[i].getAttribute("id");
b2bb787c 1642 if (!cache_check(id)) {
aa0fa9df
AD
1643 cache_inject(id, articles[i].firstChild.nodeValue);
1644 debug("preloaded article: " + id);
1645 }
1646 }
1647 }
1648 } catch (e) {
1649 exception_error("preload_article_callback", e);
1650 }
1651}
1652
1653function preloadArticleUnderPointer(id) {
1654 try {
a598370d
AD
1655 if (getInitParam("bw_limit") == "1") return;
1656
b2bb787c 1657 if (post_under_pointer == id && !cache_check(id)) {
aa0fa9df
AD
1658
1659 debug("trying to preload article " + id);
1660
1661 var neighbor_ids = getRelativePostIds(id, 1);
1662
1663 /* only request uncached articles */
1664
1665 var cids_to_request = Array();
1666
1667 for (var i = 0; i < neighbor_ids.length; i++) {
1668 if (!cache_check(neighbor_ids[i])) {
1669 cids_to_request.push(neighbor_ids[i]);
1670 }
1671 }
1672 debug("additional ids: " + cids_to_request.toString());
1673
1674 cids_to_request.push(id);
1675
1676 var query = "backend.php?op=rpc&subop=getArticles&ids=" +
1677 cids_to_request.toString();
1678 new Ajax.Request(query, {
1679 onComplete: function(transport) {
1680 preload_article_callback(transport);
1681 } });
1682 }
1683 } catch (e) {
1684 exception_error("preloadArticleUnderPointer", e);
1685 }
1686}
1687
314fcd2b
AD
1688function postMouseIn(id) {
1689 try {
aa0fa9df
AD
1690 if (post_under_pointer != id) {
1691 post_under_pointer = id;
1692 if (!isCdmMode()) {
1693 window.setTimeout("preloadArticleUnderPointer(" + id + ")", 250);
1694 }
1695 }
1696
314fcd2b
AD
1697 } catch (e) {
1698 exception_error("postMouseIn", e);
1699 }
1700}
1701
1702function postMouseOut(id) {
1703 try {
1704 post_under_pointer = false;
1705 } catch (e) {
1706 exception_error("postMouseOut", e);
1707 }
1708}
1709
ac541432
AD
1710function headlines_scroll_handler() {
1711 try {
1712
1713 var e = document.getElementById("headlinesInnerContainer");
1714
4764c27e
AD
1715 // don't do infinite scrolling when Limit == All
1716
1717 var toolbar_form = document.forms["main_toolbar_form"];
1718
1719 var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex];
1720 if (limit.value != 0) {
587bef10
AD
1721
1722 debug((e.scrollTop + e.offsetHeight) + " vs " + e.scrollHeight + " dis? " +
1723 _infscroll_disable);
1724
1725 if (e.scrollTop + e.offsetHeight > e.scrollHeight - 100) {
4764c27e
AD
1726 if (!_infscroll_disable) {
1727 debug("more cowbell!");
1728 viewNextFeedPage();
1729 }
29dfb258 1730 }
ac541432
AD
1731 }
1732
1733 } catch (e) {
1734 exception_error("headlines_scroll_handler", e);
1735 }
1736}
8be83f42
AD
1737
1738function catchupRelativeToArticle(below) {
1739
1740 try {
1741
49fd1e94 1742
8be83f42
AD
1743 if (!getActiveArticleId()) {
1744 alert(__("No article is selected."));
1745 return;
1746 }
1747
1748 var visible_ids;
1749
1750 if (document.getElementById("headlinesList")) {
1751 visible_ids = getVisibleHeadlineIds();
1752 } else {
1753 visible_ids = cdmGetVisibleArticles();
1754 }
1755
1756 var ids_to_mark = new Array();
1757
1758 if (!below) {
1759 for (var i = 0; i < visible_ids.length; i++) {
1760 if (visible_ids[i] != getActiveArticleId()) {
1761 var e = document.getElementById("RROW-" + visible_ids[i]);
1762
1763 if (e && e.className.match("Unread")) {
1764 ids_to_mark.push(visible_ids[i]);
1765 }
1766 } else {
1767 break;
1768 }
1769 }
1770 } else {
1771 for (var i = visible_ids.length-1; i >= 0; i--) {
1772 if (visible_ids[i] != getActiveArticleId()) {
1773 var e = document.getElementById("RROW-" + visible_ids[i]);
1774
1775 if (e && e.className.match("Unread")) {
1776 ids_to_mark.push(visible_ids[i]);
1777 }
1778 } else {
1779 break;
1780 }
1781 }
1782 }
1783
1784 if (ids_to_mark.length == 0) {
1785 alert(__("No articles found to mark"));
1786 } else {
1787 var msg = __("Mark %d article(s) as read?").replace("%d", ids_to_mark.length);
1788
1789 if (confirm(msg)) {
1790
1791 for (var i = 0; i < ids_to_mark.length; i++) {
1792 var e = document.getElementById("RROW-" + ids_to_mark[i]);
1793 e.className = e.className.replace("Unread", "");
1794 }
1795
1796 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
1797 param_escape(ids_to_mark.toString()) + "&cmode=0";
1798
5fe7767c
AD
1799 new Ajax.Request(query, {
1800 onComplete: function(transport) {
1801 catchup_callback2(transport);
1802 } });
1803
8be83f42
AD
1804 }
1805 }
1806
1807 } catch (e) {
1808 exception_error("catchupRelativeToArticle", e);
1809 }
1810}
a04c8e8d
AD
1811
1812function cdmExpandArticle(a_id) {
1813 try {
1814 var id = 'CICD-' + a_id;
1815
3cd4239a
AD
1816 try {
1817 Element.hide("CEXC-" + a_id);
1818 } catch (e) { }
1819
a04c8e8d
AD
1820 Effect.Appear(id, {duration : 0.5,
1821 beforeStart: function(effect) {
1822 var h_id = 'CICH-' + a_id;
1823 var h_elem = document.getElementById(h_id);
1824 if (h_elem) { h_elem.style.display = "none"; }
1825
1826 toggleUnread(a_id, 0);
1827 }});
1828
1829
1830 } catch (e) {
1831 exception_error("appearBlockElementF", e);
1832 }
1833
1834}
1835
3818a89b
AD
1836function fixHeadlinesOrder(ids) {
1837 try {
1838 for (var i = 0; i < ids.length; i++) {
1839 var e = document.getElementById("RROW-" + ids[i]);
1840
1841 if (e) {
1842 if (i % 2 == 0) {
1843 e.className = e.className.replace("even", "odd");
1844 } else {
1845 e.className = e.className.replace("odd", "even");
1846 }
1847 }
1848 }
1849 } catch (e) {
1850 exception_error("fixHeadlinesOrder", e);
1851 }
1852}
1853
df485d4f
AD
1854function hideReadHeadlines() {
1855 try {
1856
1857 var ids = false;
1858 var vis_ids = new Array();
1859
1860 if (document.getElementById("headlinesList")) {
1861 ids = getVisibleHeadlineIds();
1862 } else {
1863 ids = cdmGetVisibleArticles();
1864 }
1865
004523dd
AD
1866 var read_headlines_visible = true;
1867
df485d4f
AD
1868 for (var i = 0; i < ids.length; i++) {
1869 var row = document.getElementById("RROW-" + ids[i]);
1870
1871 if (row && row.className) {
1872 if (read_headlines_visible) {
1873 if (row.className.match("Unread") || row.className.match("Selected")) {
1874 Element.show(row);
1875 vis_ids.push(ids[i]);
1876 } else {
1877 //Effect.Fade(row, {duration : 0.3});
1878 Element.hide(row);
1879 }
1880 } else {
1881 Element.show(row);
1882 vis_ids.push(ids[i]);
1883 }
1884 }
1885 }
1886
1887 fixHeadlinesOrder(vis_ids);
1888
1889 read_headlines_visible = !read_headlines_visible;
1890
1891 } catch (e) {
1892 exception_error("hideReadHeadlines", e);
1893 }
1894}
1895
e75d70b5
AD
1896function invertHeadlineSelection() {
1897 try {
1898 var rows = new Array();
1899 var r = false;
1900
1901 if (!isCdmMode()) {
1902 r = document.getElementsByTagName("TR");
1903 } else {
1904 r = document.getElementsByTagName("DIV");
1905 }
1906
1907 for (var i = 0; i < r.length; i++) {
1908 if (r[i].id && r[i].id.match("RROW-")) {
1909 rows.push(r[i]);
1910 }
1911 }
1912
1913 for (var i = 0; i < rows.length; i++) {
1914 var nc = rows[i].className;
1915 var id = rows[i].id.replace("RROW-", "");
1916 var cb = document.getElementById("RCHK-" + id);
1917
1918 if (!rows[i].className.match("Selected")) {
1919 nc = nc + "Selected";
1920 cb.checked = true;
1921 } else {
1922 nc = nc.replace("Selected", "");
1923 cb.checked = false;
1924 }
1925
1926 rows[i].className = nc;
1927
1928 }
1929
1930 } catch (e) {
1931 exception_error("invertHeadlineSelection", e);
1932 }
1933}
1934
314fcd2b
AD
1935function getArticleUnderPointer() {
1936 return post_under_pointer;
7a822893 1937}
eedfb635
AD
1938
1939function zoomToArticle(id) {
1940 try {
1941 var w = window.open("backend.php?op=view&mode=zoom&id=" + param_escape(id),
1942 "ttrss_zoom_" + id,
1943 "status=0,toolbar=0,location=0,width=450,height=300,scrollbars=1,menubar=0");
1944
1945 } catch (e) {
1946 exception_error("zoomToArticle", e);
1947 }
1948}
a411875b 1949
4710e3dc
AD
1950function showOriginalArticleInline(id) {
1951 try {
1952
1953 var query = "backend.php?op=rpc&subop=getArticleLink&id=" + id;
1954
1955 notify_progress("Loading, please wait...", true);
1956
1957 new Ajax.Request(query, {
1958 onComplete: function(transport) {
1959
1960 if (transport.responseXML) {
1961
1962 var link = transport.responseXML.getElementsByTagName("link")[0];
1963 var id = transport.responseXML.getElementsByTagName("id")[0];
1964
1965 notify("");
1966
1967 if (link && id) {
1968 link = link.firstChild.nodeValue;
1969
1970 var ci = document.getElementById("content-insert");
1971
1972 var tmp = "<iframe id=\"inline_orig_article\" width=\""+ci.offsetWidth+"\" height=\""+ci.offsetHeight+"\" style=\"border-width : 0px;\" src=\""+link+"\"></iframe>";
1973
1974 render_article(tmp);
1975
1976 }
1977 }
1978 } });
1979
1980 } catch (e) {
1981 exception_error("showOriginalArticleInline", e);
1982 }
1983}
1984
1985
a411875b
AD
1986function scrollArticle(offset) {
1987 try {
1988 if (!isCdmMode()) {
1989 var ci = document.getElementById("content-insert");
1990 if (ci) {
1991 ci.scrollTop += offset;
1992 }
1993 } else {
1994 var hi = document.getElementById("headlinesInnerContainer");
1995 if (hi) {
1996 hi.scrollTop += offset;
1997 }
1998
1999 }
2000 } catch (e) {
2001 exception_error("scrollArticle", e);
2002 }
2003}
f9247195
AD
2004
2005function show_labels_in_headlines(transport) {
2006 try {
2007 if (transport.responseXML) {
2008 var info = transport.responseXML.getElementsByTagName("info-for-headlines")[0];
2009
2010 var elems = info.getElementsByTagName("entry");
2011
2012 for (var l = 0; l < elems.length; l++) {
2013 var e_id = elems[l].getAttribute("id");
2014
2015 if (e_id) {
2016
2017 var ctr = document.getElementById("HLLCTR-" + e_id);
2018
2019 if (ctr) {
2020 ctr.innerHTML = elems[l].firstChild.nodeValue;
2021 }
2022 }
2023
2024 }
2025
2026 }
2027 } catch (e) {
2028 exception_error("show_labels_in_headlines", e);
2029
2030 }
2031}
bf3c9838
AD
2032
2033function toggleHeadlineActions() {
2034 try {
2035 var e = document.getElementById("headlineActionsBody");
2036 var p = document.getElementById("headlineActionsDrop");
2037
2038 if (!Element.visible(e)) {
2039 Element.show(e);
2040 } else {
2041 Element.hide(e);
2042 }
2043
b62f6ff4 2044 e.scrollTop = 0;
bf3c9838
AD
2045 e.style.left = (p.offsetLeft + 1) + "px";
2046// e.style.top = (p.offsetTop + p.offsetHeight - 1) + "px";
2047
2048 } catch (e) {
2049 exception_error("toggleHeadlineActions", e);
2050 }
2051}