]> git.wh0rd.org - tt-rss.git/blame - viewfeed.js
recache headlines when removing updated mark
[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
5var _tag_active_post_id = false;
6var _tag_active_feed_id = false;
13f08f75 7var _tag_active_cdm = false;
0b126ac2 8
13f08f75
AD
9// FIXME: kludge, to restore scrollTop after tag editor terminates
10var _tag_cdm_scroll = false;
11
12// FIXME: kludges, needs proper implementation
0b126ac2 13var _reload_feedlist_after_view = false;
e08443c1 14
ba0978c8
AD
15var _cdm_wd_timeout = false;
16var _cdm_wd_vishist = new Array();
17
e097e8be
AD
18var article_cache = new Array();
19
e08443c1
AD
20function catchup_callback() {
21 if (xmlhttp_rpc.readyState == 4) {
8f3b99ba
AD
22 try {
23 debug("catchup_callback");
9ec58704 24 notify("");
d395a942 25 all_counters_callback2(xmlhttp_rpc);
af6f8bf2
AD
26 if (_catchup_callback_func) {
27 setTimeout(_catchup_callback_func, 10);
28 }
8f3b99ba
AD
29 } catch (e) {
30 exception_error("catchup_callback", e);
31 }
e08443c1
AD
32 }
33}
f0601b87 34
1341ea0d
AD
35function catchup_callback2(transport, callback) {
36 try {
37 debug("catchup_callback2 " + transport + ", " + callback);
38 notify("");
39 all_counters_callback2(transport);
40 if (callback) {
41 setTimeout(callback, 10);
42 }
43 } catch (e) {
44 exception_error("catchup_callback2", e);
45 }
46}
47
e19c1824 48function clean_feed_selections() {
a49f5e05 49 try {
6c3b0198 50 var feeds = document.getElementById("feedList").getElementsByTagName("LI");
a49f5e05 51
6c3b0198
AD
52 for (var i = 0; i < feeds.length; i++) {
53 if (feeds[i].id && feeds[i].id.match("FEEDR-")) {
54 feeds[i].className = feeds[i].className.replace("Selected", "");
55 }
56 }
e19c1824
AD
57 } catch (e) {
58 exception_error("clean_feed_selections", e);
59 }
60}
61
62function headlines_callback2(transport, active_feed_id, is_cat, feed_cur_page) {
63 try {
64
65 debug("headlines_callback2 [page=" + feed_cur_page + "]");
66
67 clean_feed_selections();
ac541432 68
6c3b0198
AD
69 setActiveFeedId(active_feed_id);
70
71 if (is_cat != undefined) {
72 active_feed_is_cat = is_cat;
73 }
74
75 if (!is_cat) {
76 var feedr = document.getElementById("FEEDR-" + active_feed_id);
77 if (feedr && !feedr.className.match("Selected")) {
78 feedr.className = feedr.className + "Selected";
79 }
80 }
81
82 var f = document.getElementById("headlines-frame");
83 try {
84 if (feed_cur_page == 0) {
85 debug("resetting headlines scrollTop");
86 f.scrollTop = 0;
a49f5e05 87 }
6c3b0198
AD
88 } catch (e) { };
89
90 if (transport.responseXML) {
91 var headlines = transport.responseXML.getElementsByTagName("headlines")[0];
92 var headlines_count_obj = transport.responseXML.getElementsByTagName("headlines-count")[0];
e19c1824 93 var headlines_unread_obj = transport.responseXML.getElementsByTagName("headlines-unread")[0];
52d7e7da 94 var disable_cache_obj = transport.responseXML.getElementsByTagName("disable-cache")[0];
e19c1824 95
6c3b0198 96 var headlines_count = headlines_count_obj.getAttribute("value");
e19c1824 97 var headlines_unread = headlines_unread_obj.getAttribute("value");
52d7e7da 98 var disable_cache = disable_cache_obj.getAttribute("value") != "0";
e19c1824 99
6c3b0198 100 if (headlines_count == 0) _infscroll_disable = 1;
29dfb258 101
6c3b0198
AD
102 var counters = transport.responseXML.getElementsByTagName("counters")[0];
103 var articles = transport.responseXML.getElementsByTagName("article");
104 var runtime_info = transport.responseXML.getElementsByTagName("runtime-info");
105
106 if (feed_cur_page == 0) {
107 if (headlines) {
108 f.innerHTML = headlines.firstChild.nodeValue;
e19c1824 109
dd5865d4
AD
110 var cache_prefix = "";
111
112 if (is_cat) {
113 cache_prefix = "C:";
114 } else {
115 cache_prefix = "F:";
116 }
117
7e8832b3
AD
118 cache_invalidate(cache_prefix + active_feed_id);
119
52d7e7da
AD
120 if (!disable_cache) {
121 cache_inject(cache_prefix + active_feed_id,
122 headlines.firstChild.nodeValue, headlines_unread);
123 }
e19c1824 124
6c3b0198
AD
125 } else {
126 debug("headlines_callback: returned no data");
127 f.innerHTML = "<div class='whiteBox'>" + __('Could not update headlines (missing XML data)') + "</div>";
128
129 }
130 } else {
131 if (headlines) {
132 if (headlines_count > 0) {
133 debug("adding some more headlines...");
134
135 var c = document.getElementById("headlinesList");
136
137 if (!c) {
138 c = document.getElementById("headlinesInnerContainer");
139 }
c32cd48a
AD
140
141 var ids = getSelectedArticleIds2();
6c3b0198
AD
142
143 c.innerHTML = c.innerHTML + headlines.firstChild.nodeValue;
c32cd48a
AD
144
145 debug("restore selected ids: " + ids);
146
147 for (var i = 0; i < ids.length; i++) {
148 markHeadline(ids[i]);
149 }
150
6c3b0198
AD
151 } else {
152 debug("no new headlines received");
29dfb258 153 }
29dfb258 154 } else {
6c3b0198
AD
155 debug("headlines_callback: returned no data");
156 notify_error("Error while trying to load more headlines");
157 }
158
159 }
160
161 if (articles) {
162 for (var i = 0; i < articles.length; i++) {
163 var a_id = articles[i].getAttribute("id");
164 debug("found id: " + a_id);
165 cache_inject(a_id, articles[i].firstChild.nodeValue);
ac541432 166 }
007a38d4 167 } else {
6c3b0198 168 debug("no cached articles received");
961f4c73 169 }
6c3b0198
AD
170
171 if (counters) {
172 debug("parsing piggybacked counters: " + counters);
173 parse_counters(counters, false);
174 } else {
175 debug("counters container not found in reply");
176 }
177
178 if (runtime_info) {
179 debug("parsing runtime info: " + runtime_info[0]);
180 parse_runtime_info(runtime_info[0]);
181 } else {
182 debug("counters container not found in reply");
03c88bdd 183 }
6c3b0198 184
3de0261a 185 } else {
6c3b0198
AD
186 debug("headlines_callback: returned no XML object");
187 f.innerHTML = "<div class='whiteBox'>" + __('Could not update headlines (missing XML object)') + "</div>";
3de0261a 188 }
6c3b0198
AD
189
190 if (typeof correctPNG != 'undefined') {
191 correctPNG();
935f235d 192 }
6c3b0198
AD
193
194 if (_cdm_wd_timeout) window.clearTimeout(_cdm_wd_timeout);
195
196 if (!document.getElementById("headlinesList") &&
197 getInitParam("cdm_auto_catchup") == 1) {
198 debug("starting CDM watchdog");
199 _cdm_wd_timeout = window.setTimeout("cdmWatchdog()", 5000);
200 _cdm_wd_vishist = new Array();
ac7bcd71 201 } else {
6c3b0198 202 debug("not in CDM mode or watchdog disabled");
ba0978c8 203 }
6c3b0198
AD
204
205 if (_tag_cdm_scroll) {
206 try {
207 document.getElementById("headlinesInnerContainer").scrollTop = _tag_cdm_scroll;
208 _tag_cdm_scroll = false;
209 debug("resetting headlinesInner scrollTop");
210
211 } catch (e) { }
212 }
213
214 _feed_cur_page = feed_cur_page;
82764a41
AD
215 _infscroll_request_sent = 0;
216
6c3b0198
AD
217 notify("");
218 } catch (e) {
219 exception_error("headlines_callback2", e);
6b4163cb
AD
220 }
221}
222
e097e8be
AD
223function render_article(article) {
224 try {
6b4163cb 225 var f = document.getElementById("content-frame");
44cc6f20
AD
226 try {
227 f.scrollTop = 0;
228 } catch (e) { };
e097e8be
AD
229
230 f.innerHTML = article;
231
232 } catch (e) {
233 exception_error("render_article", e);
234 }
235}
236
71d277de 237function showArticleInHeadlines(id) {
e097e8be 238
868d0ed2 239 try {
e097e8be 240
868d0ed2 241 cleanSelected("headlinesList");
71d277de 242
868d0ed2 243 var crow = document.getElementById("RROW-" + id);
76283a4c
AD
244
245 if (!crow) return;
246
868d0ed2
AD
247 var article_is_unread = crow.className.match("Unread");
248
249 crow.className = crow.className.replace("Unread", "");
250
251 var upd_img_pic = document.getElementById("FUPDPIC-" + id);
252
ebda016b 253 if (upd_img_pic && upd_img_pic.src.match("updated.png")) {
868d0ed2 254 upd_img_pic.src = "images/blank_icon.gif";
ebda016b
AD
255
256 var cache_prefix = "";
257
258 if (activeFeedIsCat()) {
259 cache_prefix = "C:";
260 } else {
261 cache_prefix = "F:";
262 }
263
264 cache_invalidate(cache_prefix + getActiveFeedId());
ce411c4b
AD
265
266 cache_inject(cache_prefix + getActiveFeedId(),
267 document.getElementById("headlines-frame").innerHTML,
268 get_feed_unread(getActiveFeedId()));
269
868d0ed2
AD
270 }
271
272 selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
273 markHeadline(id);
e097e8be 274
868d0ed2
AD
275 } catch (e) {
276 exception_error("showArticleInHeadlines", e);
277 }
71d277de 278}
e097e8be 279
71d277de
AD
280function article_callback2(transport, id, feed_id) {
281 try {
282 debug("article_callback2 " + id);
e097e8be 283
71d277de 284 if (transport.responseXML) {
e097e8be 285
71d277de
AD
286 active_real_feed_id = feed_id;
287 active_post_id = id;
288
289 showArticleInHeadlines(id);
290
291 var reply = transport.responseXML.firstChild.firstChild;
292
293 var articles = transport.responseXML.getElementsByTagName("article");
294
295 for (var i = 0; i < articles.length; i++) {
296 var a_id = articles[i].getAttribute("id");
297
298 debug("found id: " + a_id);
299
300 if (a_id == active_post_id) {
301 debug("active article, rendering...");
302 render_article(articles[i].firstChild.nodeValue);
e097e8be 303 }
71d277de
AD
304
305 cache_inject(a_id, articles[i].firstChild.nodeValue);
e097e8be 306 }
71d277de
AD
307
308 } else {
309 debug("article_callback: returned no XML object");
310 var f = document.getElementById("content-frame");
311 f.innerHTML = "<div class='whiteBox'>" + __('Could not display article (missing XML object)') + "</div>";
e097e8be 312 }
4b6206fa
AD
313
314 var date = new Date();
315 last_article_view = date.getTime() / 1000;
316
935f235d
AD
317 if (typeof correctPNG != 'undefined') {
318 correctPNG();
319 }
0b126ac2
AD
320
321 if (_reload_feedlist_after_view) {
322 setTimeout('updateFeedList(false, false)', 50);
323 _reload_feedlist_after_view = false;
324 } else {
71d277de 325 var counters = transport.responseXML.getElementsByTagName("counters")[0];
5a94a953
AD
326
327 if (counters) {
328 debug("parsing piggybacked counters: " + counters);
329 parse_counters(counters, false);
330 } else {
addb5836 331 debug("counters container not found in reply");
5a94a953 332 }
0b126ac2 333 }
9ec58704
AD
334
335 notify("");
71d277de
AD
336 } catch (e) {
337 exception_error("article_callback2", e);
6b4163cb
AD
338 }
339}
340
1dc8dba0 341function view(id, feed_id, skip_history) {
ee1f45f4
AD
342
343 try {
ee1f45f4 344 debug("loading article: " + id + "/" + feed_id);
71d277de 345
e097e8be
AD
346 var cached_article = cache_find(id);
347
348 debug("cache check result: " + (cached_article != false));
ee1f45f4 349
ee1f45f4
AD
350 enableHotkeys();
351
1c2d7193 352 //setActiveFeedId(feed_id);
090e250b 353
6b4163cb
AD
354 var query = "backend.php?op=view&id=" + param_escape(id) +
355 "&feed=" + param_escape(feed_id);
356
4b6206fa
AD
357 var date = new Date();
358
71d277de 359 var neighbor_ids = getRelativePostIds(active_post_id);
e097e8be 360
71d277de 361 /* only request uncached articles */
e097e8be 362
71d277de 363 var cids_to_request = Array();
5a94a953 364
71d277de
AD
365 for (var i = 0; i < neighbor_ids.length; i++) {
366 if (!cache_check(neighbor_ids[i])) {
367 cids_to_request.push(neighbor_ids[i]);
5a94a953 368 }
71d277de 369 }
5a94a953 370
71d277de 371 debug("additional ids: " + cids_to_request.toString());
e097e8be 372
71d277de 373 /* additional info for piggyback counters */
e097e8be 374
71d277de
AD
375 if (tagsAreDisplayed()) {
376 query = query + "&omode=lt";
377 } else {
378 query = query + "&omode=flc";
379 }
e097e8be 380
71d277de
AD
381 var date = new Date();
382 var timestamp = Math.round(date.getTime() / 1000);
383 query = query + "&ts=" + timestamp;
e097e8be 384
71d277de 385 query = query + "&cids=" + cids_to_request.toString();
e097e8be 386
71d277de
AD
387 var crow = document.getElementById("RROW-" + id);
388 var article_is_unread = crow.className.match("Unread");
e097e8be 389
71d277de 390 showArticleInHeadlines(id);
e097e8be 391
71d277de 392 if (!cached_article) {
e097e8be 393
71d277de 394 notify_progress("Loading, please wait...");
e097e8be 395
71d277de 396 } else if (cached_article && article_is_unread) {
addb5836 397
71d277de 398 query = query + "&mode=prefetch";
addb5836 399
71d277de 400 render_article(cached_article);
addb5836 401
71d277de 402 } else if (cached_article) {
e097e8be 403
71d277de
AD
404 query = query + "&mode=prefetch_old";
405 render_article(cached_article);
406 }
e097e8be 407
71d277de 408 cache_expire();
86173d9a 409
71d277de
AD
410 new Ajax.Request(query, {
411 onComplete: function(transport) {
412 article_callback2(transport, id, feed_id);
413 } });
6b4163cb 414
ee1f45f4
AD
415 } catch (e) {
416 exception_error("view", e);
417 }
f0601b87
AD
418}
419
67343d9f
AD
420function tMark(id) {
421 return toggleMark(id);
422}
423
e4f4b46f
AD
424function tPub(id) {
425 return togglePub(id);
426}
427
6b0f49f9
AD
428function tMark_afh_off(effect) {
429 try {
430 var elem = effect.effects[0].element;
431
432 debug("tMark_afh_off : " + elem.id);
433
434 if (elem) {
f5e0338d
AD
435 elem.src = elem.src.replace("mark_set", "mark_unset");
436 elem.alt = __("Star article");
6b0f49f9
AD
437 Element.show(elem);
438 }
439
440 } catch (e) {
441 exception_error("tMark_afh_off", e);
442 }
443}
444
445function tPub_afh_off(effect) {
446 try {
447 var elem = effect.effects[0].element;
448
449 debug("tPub_afh_off : " + elem.id);
450
451 if (elem) {
f5e0338d
AD
452 elem.src = elem.src.replace("pub_set", "pub_unset");
453 elem.alt = __("Publish article");
6b0f49f9
AD
454 Element.show(elem);
455 }
456
457 } catch (e) {
458 exception_error("tPub_afh_off", e);
459 }
460}
e4f4b46f 461
f5e0338d 462function toggleMark(id, client_only, no_effects) {
f0601b87 463
b685ba25 464 try {
254e0e4b 465
b685ba25
AD
466 var query = "backend.php?op=rpc&id=" + id + "&subop=mark";
467
468 query = query + "&afid=" + getActiveFeedId();
469
470 if (tagsAreDisplayed()) {
471 query = query + "&omode=tl";
472 } else {
473 query = query + "&omode=flc";
7ba176d2 474 }
b685ba25
AD
475
476 var mark_img = document.getElementById("FMPIC-" + id);
477 var vfeedu = document.getElementById("FEEDU--1");
478 var crow = document.getElementById("RROW-" + id);
479
f5e0338d
AD
480 if (mark_img.src.match("mark_unset")) {
481 mark_img.src = mark_img.src.replace("mark_unset", "mark_set");
482 mark_img.alt = __("Unstar article");
b685ba25
AD
483 query = query + "&mark=1";
484
485/* if (vfeedu && crow.className.match("Unread")) {
486 vfeedu.innerHTML = (+vfeedu.innerHTML) + 1;
487 } */
488
489 } else {
490 //mark_img.src = "images/mark_unset.png";
f5e0338d 491 mark_img.alt = __("Please wait...");
b685ba25
AD
492 query = query + "&mark=0";
493
494/* if (vfeedu && crow.className.match("Unread")) {
495 vfeedu.innerHTML = (+vfeedu.innerHTML) - 1;
496 } */
497
f5e0338d 498 if (document.getElementById("headlinesList") && !no_effects) {
b685ba25
AD
499 Effect.Puff(mark_img, {duration : 0.25, afterFinish: tMark_afh_off});
500 } else {
f5e0338d
AD
501 mark_img.src = mark_img.src.replace("mark_set", "mark_unset");
502 mark_img.alt = __("Star article");
b685ba25 503 }
ace1a6da 504 }
b685ba25
AD
505
506/* var vfeedctr = document.getElementById("FEEDCTR--1");
507 var vfeedr = document.getElementById("FEEDR--1");
508
509 if (vfeedu && vfeedctr) {
510 if ((+vfeedu.innerHTML) > 0) {
511 if (crow.className.match("Unread") && !vfeedr.className.match("Unread")) {
512 vfeedr.className = vfeedr.className + "Unread";
513 vfeedctr.className = "odd";
514 }
515 } else {
516 vfeedctr.className = "invisible";
517 vfeedr.className = vfeedr.className.replace("Unread", "");
8add756a 518 }
254e0e4b 519 }
b685ba25
AD
520
521 debug("toggle starred for aid " + id);
522
523 //new Ajax.Request(query); */
772bc83b 524
f5e0338d
AD
525 if (!client_only) {
526 debug(query);
36e05046 527
1341ea0d
AD
528 new Ajax.Request(query, {
529 onComplete: function(transport) {
530 all_counters_callback2(transport);
531 } });
532
f5e0338d 533 }
f0601b87 534
b685ba25
AD
535 } catch (e) {
536 exception_error("toggleMark", e);
537 }
f0601b87
AD
538}
539
f5e0338d 540function togglePub(id, client_only, no_effects) {
e4f4b46f 541
2bc2147f 542 try {
e4f4b46f 543
2bc2147f
AD
544 var query = "backend.php?op=rpc&id=" + id + "&subop=publ";
545
546 query = query + "&afid=" + getActiveFeedId();
547
548 if (tagsAreDisplayed()) {
549 query = query + "&omode=tl";
550 } else {
551 query = query + "&omode=flc";
e4f4b46f 552 }
2bc2147f
AD
553
554 var mark_img = document.getElementById("FPPIC-" + id);
555 var vfeedu = document.getElementById("FEEDU--2");
556 var crow = document.getElementById("RROW-" + id);
557
f5e0338d
AD
558 if (mark_img.src.match("pub_unset")) {
559 mark_img.src = mark_img.src.replace("pub_unset", "pub_set");
560 mark_img.alt = __("Unpublish article");
2bc2147f
AD
561 query = query + "&pub=1";
562
b685ba25 563/* if (vfeedu && crow.className.match("Unread")) {
2bc2147f 564 vfeedu.innerHTML = (+vfeedu.innerHTML) + 1;
b685ba25 565 } */
2bc2147f 566
e4f4b46f 567 } else {
6b0f49f9 568 //mark_img.src = "images/pub_unset.png";
f5e0338d 569 mark_img.alt = __("Please wait...");
2bc2147f
AD
570 query = query + "&pub=0";
571
b685ba25 572/* if (vfeedu && crow.className.match("Unread")) {
2bc2147f 573 vfeedu.innerHTML = (+vfeedu.innerHTML) - 1;
b685ba25 574 } */
6b0f49f9 575
f5e0338d 576 if (document.getElementById("headlinesList") && !no_effects) {
ace1a6da
AD
577 Effect.Puff(mark_img, {duration : 0.25, afterFinish: tPub_afh_off});
578 } else {
f5e0338d
AD
579 mark_img.src = mark_img.src.replace("pub_set", "pub_unset");
580 mark_img.alt = __("Publish article");
ace1a6da 581 }
e4f4b46f 582 }
2bc2147f 583
b685ba25 584/* var vfeedctr = document.getElementById("FEEDCTR--2");
2bc2147f
AD
585 var vfeedr = document.getElementById("FEEDR--2");
586
587 if (vfeedu && vfeedctr) {
588 if ((+vfeedu.innerHTML) > 0) {
589 if (crow.className.match("Unread") && !vfeedr.className.match("Unread")) {
590 vfeedr.className = vfeedr.className + "Unread";
591 vfeedctr.className = "odd";
592 }
593 } else {
594 vfeedctr.className = "invisible";
595 vfeedr.className = vfeedr.className.replace("Unread", "");
596 }
597 }
598
599 debug("toggle published for aid " + id);
600
b685ba25
AD
601 new Ajax.Request(query); */
602
f5e0338d 603 if (!client_only) {
1341ea0d
AD
604 new Ajax.Request(query, {
605 onComplete: function(transport) {
606 all_counters_callback2(transport);
607 } });
f5e0338d 608 }
b685ba25 609
2bc2147f 610 } catch (e) {
e4f4b46f 611
2bc2147f
AD
612 exception_error("togglePub", e);
613 }
e4f4b46f
AD
614}
615
ac162cbe
AD
616function correctHeadlinesOffset(id) {
617
618 try {
619
620 var hlist = document.getElementById("headlinesList");
621 var container = document.getElementById("headlinesInnerContainer");
622 var row = document.getElementById("RROW-" + id);
623
624 var viewport = container.offsetHeight;
625
626 var rel_offset_top = row.offsetTop - container.scrollTop;
627 var rel_offset_bottom = row.offsetTop + row.offsetHeight - container.scrollTop;
628
629 debug("Rtop: " + rel_offset_top + " Rbtm: " + rel_offset_bottom);
630 debug("Vport: " + viewport);
a5e46e0f 631
ac162cbe
AD
632 if (rel_offset_top <= 0 || rel_offset_top > viewport) {
633 container.scrollTop = row.offsetTop;
634 } else if (rel_offset_bottom > viewport) {
a5e46e0f
AD
635
636 /* doesn't properly work with Opera in some cases because
637 Opera fucks up element scrolling */
638
ac162cbe
AD
639 container.scrollTop = row.offsetTop + row.offsetHeight - viewport;
640 }
641
642 } catch (e) {
643 exception_error("correctHeadlinesOffset", e);
644 }
645
646}
647
bb7cface 648function moveToPost(mode) {
f0601b87 649
4e51dd2b
AD
650 // check for combined mode
651 if (!document.getElementById("headlinesList"))
652 return;
653
bb7cface
AD
654 var rows = getVisibleHeadlineIds();
655
ac162cbe
AD
656 var prev_id = false;
657 var next_id = false;
bb7cface 658
d4eec882
AD
659 if (!document.getElementById('RROW-' + active_post_id)) {
660 active_post_id = false;
661 }
662
bb7cface
AD
663 if (active_post_id == false) {
664 next_id = getFirstVisibleHeadlineId();
665 prev_id = getLastVisibleHeadlineId();
666 } else {
667 for (var i = 0; i < rows.length; i++) {
668 if (rows[i] == active_post_id) {
669 prev_id = rows[i-1];
670 next_id = rows[i+1];
671 }
672 }
673 }
674
675 if (mode == "next") {
ac162cbe
AD
676 if (next_id) {
677 correctHeadlinesOffset(next_id);
86741347 678 view(next_id, getActiveFeedId());
bb7cface
AD
679 }
680 }
681
682 if (mode == "prev") {
ac162cbe
AD
683 if (prev_id) {
684 correctHeadlinesOffset(prev_id);
86741347 685 view(prev_id, getActiveFeedId());
bb7cface
AD
686 }
687 }
688}
689
5f51022a
AD
690function toggleUnread(id, cmode) {
691 try {
5f51022a
AD
692
693 var row = document.getElementById("RROW-" + id);
694 if (row) {
695 var nc = row.className;
696 nc = nc.replace("Unread", "");
697 nc = nc.replace("Selected", "");
698
a70ab740
AD
699 if (cmode == undefined || cmode == 2) {
700 if (row.className.match("Unread")) {
701 row.className = nc;
702 } else {
703 row.className = nc + "Unread";
704 }
705 } else if (cmode == 0) {
5f51022a 706 row.className = nc;
a70ab740 707 } else if (cmode == 1) {
5f51022a
AD
708 row.className = nc + "Unread";
709 }
710
a70ab740 711 if (cmode == undefined) cmode = 2;
5f51022a
AD
712
713 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
714 param_escape(id) + "&cmode=" + param_escape(cmode);
715
1341ea0d 716// notify_progress("Loading, please wait...");
9ec58704 717
1341ea0d
AD
718 new Ajax.Request(query, {
719 onComplete: function(transport) {
720 all_counters_callback2(transport);
721 } });
5f51022a
AD
722
723 }
724
725
726 } catch (e) {
727 exception_error("toggleUnread", e);
728 }
729}
730
2228d0e4 731function selectionToggleUnread(cdm_mode, set_state, callback_func, no_error) {
1572afe5 732 try {
386cbf27
AD
733 var rows;
734
735 if (cdm_mode) {
736 rows = cdmGetSelectedArticles();
737 } else {
738 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
739 }
1572afe5 740
2228d0e4 741 if (rows.length == 0 && !no_error) {
9cc600d1
AD
742 alert(__("No articles are selected."));
743 return;
744 }
745
1572afe5 746 for (i = 0; i < rows.length; i++) {
f1f2db64
AD
747 var row = document.getElementById("RROW-" + rows[i]);
748 if (row) {
749 var nc = row.className;
750 nc = nc.replace("Unread", "");
751 nc = nc.replace("Selected", "");
752
a5ae125a
AD
753 if (set_state == undefined) {
754 if (row.className.match("Unread")) {
755 row.className = nc + "Selected";
756 } else {
757 row.className = nc + "UnreadSelected";
758 }
759 }
760
761 if (set_state == false) {
f1f2db64 762 row.className = nc + "Selected";
a5ae125a
AD
763 }
764
765 if (set_state == true) {
f1f2db64
AD
766 row.className = nc + "UnreadSelected";
767 }
768 }
1572afe5
AD
769 }
770
771 if (rows.length > 0) {
772
b47b5af7
AD
773 var cmode = "";
774
775 if (set_state == undefined) {
776 cmode = "2";
777 } else if (set_state == true) {
778 cmode = "1";
779 } else if (set_state == false) {
780 cmode = "0";
781 }
782
1572afe5 783 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
b47b5af7 784 param_escape(rows.toString()) + "&cmode=" + cmode;
1572afe5 785
9ec58704
AD
786 notify_progress("Loading, please wait...");
787
1341ea0d
AD
788 new Ajax.Request(query, {
789 onComplete: function(transport) {
790 catchup_callback2(transport, callback_func);
791 } });
1572afe5
AD
792
793 }
794
795 } catch (e) {
83f043bb 796 exception_error("selectionToggleUnread", e);
1572afe5
AD
797 }
798}
799
386cbf27 800function selectionToggleMarked(cdm_mode) {
1572afe5 801 try {
1572afe5 802
386cbf27
AD
803 var rows;
804
805 if (cdm_mode) {
806 rows = cdmGetSelectedArticles();
807 } else {
808 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
809 }
1572afe5 810
9cc600d1
AD
811 if (rows.length == 0) {
812 alert(__("No articles are selected."));
813 return;
814 }
815
1572afe5 816 for (i = 0; i < rows.length; i++) {
f5e0338d 817 toggleMark(rows[i], true, true);
1572afe5
AD
818 }
819
820 if (rows.length > 0) {
821
822 var query = "backend.php?op=rpc&subop=markSelected&ids=" +
823 param_escape(rows.toString()) + "&cmode=2";
824
2bc2147f
AD
825 query = query + "&afid=" + getActiveFeedId();
826
1341ea0d 827/* if (tagsAreDisplayed()) {
2bc2147f
AD
828 query = query + "&omode=tl";
829 } else {
830 query = query + "&omode=flc";
1341ea0d
AD
831 } */
832
833 query = query + "&omode=lc";
2bc2147f 834
1341ea0d
AD
835 new Ajax.Request(query, {
836 onComplete: function(transport) {
837 all_counters_callback2(transport);
838 } });
1572afe5
AD
839
840 }
841
842 } catch (e) {
83f043bb 843 exception_error("selectionToggleMarked", e);
1572afe5
AD
844 }
845}
846
e4f4b46f
AD
847function selectionTogglePublished(cdm_mode) {
848 try {
e4f4b46f
AD
849
850 var rows;
851
852 if (cdm_mode) {
853 rows = cdmGetSelectedArticles();
854 } else {
855 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
856 }
857
858 if (rows.length == 0) {
859 alert(__("No articles are selected."));
860 return;
861 }
862
863 for (i = 0; i < rows.length; i++) {
f5e0338d 864 togglePub(rows[i], true, true);
e4f4b46f
AD
865 }
866
867 if (rows.length > 0) {
868
869 var query = "backend.php?op=rpc&subop=publishSelected&ids=" +
870 param_escape(rows.toString()) + "&cmode=2";
871
2bc2147f
AD
872 query = query + "&afid=" + getActiveFeedId();
873
1341ea0d 874/* if (tagsAreDisplayed()) {
2bc2147f
AD
875 query = query + "&omode=tl";
876 } else {
877 query = query + "&omode=flc";
1341ea0d
AD
878 } */
879
880 query = query + "&omode=lc";
2bc2147f 881
1341ea0d
AD
882 new Ajax.Request(query, {
883 onComplete: function(transport) {
884 all_counters_callback2(transport);
885 } });
e4f4b46f
AD
886
887 }
888
889 } catch (e) {
890 exception_error("selectionToggleMarked", e);
891 }
892}
893
386cbf27
AD
894function cdmGetSelectedArticles() {
895 var sel_articles = new Array();
b2128f01 896 var container = document.getElementById("headlinesInnerContainer");
386cbf27
AD
897
898 for (i = 0; i < container.childNodes.length; i++) {
899 var child = container.childNodes[i];
900
901 if (child.id.match("RROW-") && child.className.match("Selected")) {
902 var c_id = child.id.replace("RROW-", "");
903 sel_articles.push(c_id);
904 }
905 }
906
907 return sel_articles;
908}
909
8be83f42
AD
910function cdmGetVisibleArticles() {
911 var sel_articles = new Array();
912 var container = document.getElementById("headlinesInnerContainer");
913
914 for (i = 0; i < container.childNodes.length; i++) {
915 var child = container.childNodes[i];
916
917 if (child.id.match("RROW-")) {
918 var c_id = child.id.replace("RROW-", "");
919 sel_articles.push(c_id);
920 }
921 }
922
923 return sel_articles;
924}
925
926function cdmGetUnreadArticles() {
927 var sel_articles = new Array();
928 var container = document.getElementById("headlinesInnerContainer");
929
930 for (i = 0; i < container.childNodes.length; i++) {
931 var child = container.childNodes[i];
932
933 if (child.id.match("RROW-") && child.className.match("Unread")) {
934 var c_id = child.id.replace("RROW-", "");
935 sel_articles.push(c_id);
936 }
937 }
938
939 return sel_articles;
940}
941
942
386cbf27
AD
943// mode = all,none,unread
944function cdmSelectArticles(mode) {
b2128f01 945 var container = document.getElementById("headlinesInnerContainer");
386cbf27
AD
946
947 for (i = 0; i < container.childNodes.length; i++) {
948 var child = container.childNodes[i];
949
950 if (child.id.match("RROW-")) {
06d1a1c1
AD
951 var aid = child.id.replace("RROW-", "");
952
953 var cb = document.getElementById("RCHK-" + aid);
954
386cbf27
AD
955 if (mode == "all") {
956 if (!child.className.match("Selected")) {
957 child.className = child.className + "Selected";
06d1a1c1 958 cb.checked = true;
386cbf27
AD
959 }
960 } else if (mode == "unread") {
961 if (child.className.match("Unread") && !child.className.match("Selected")) {
962 child.className = child.className + "Selected";
06d1a1c1 963 cb.checked = true;
386cbf27
AD
964 }
965 } else {
966 child.className = child.className.replace("Selected", "");
06d1a1c1 967 cb.checked = false;
386cbf27
AD
968 }
969 }
970 }
971}
972
98bea1b1 973function catchupPage() {
b47b5af7 974
8a5b4579
AD
975 var fn = getFeedName(getActiveFeedId(), active_feed_is_cat);
976
a5ae125a
AD
977 var str = __("Mark all visible articles in %s as read?");
978
979 str = str.replace("%s", fn);
8a5b4579
AD
980
981 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
982 return;
983 }
984
b47b5af7
AD
985 if (document.getElementById("headlinesList")) {
986 selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true);
2228d0e4 987 selectionToggleUnread(false, false, 'viewCurrentFeed()', true);
b47b5af7
AD
988 selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
989 } else {
990 cdmSelectArticles('all');
2228d0e4 991 selectionToggleUnread(true, false, 'viewCurrentFeed()', true)
b47b5af7
AD
992 cdmSelectArticles('none');
993 }
98bea1b1
AD
994}
995
a5ae125a
AD
996function catchupSelection() {
997
998 try {
999
1000 var rows;
1001
1002 if (document.getElementById("headlinesList")) {
1003 rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK");
1004 } else {
1005 rows = cdmGetSelectedArticles();
1006 }
1007
1008 if (rows.length == 0) {
1009 alert(__("No articles are selected."));
1010 return;
1011 }
1012
1013
1014 var fn = getFeedName(getActiveFeedId(), active_feed_is_cat);
1015
ba5fac1b 1016 var str = __("Mark %d selected articles in %s as read?");
a5ae125a 1017
ba5fac1b 1018 str = str.replace("%d", rows.length);
a5ae125a
AD
1019 str = str.replace("%s", fn);
1020
1021 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
1022 return;
1023 }
1024
1025 if (document.getElementById("headlinesList")) {
1026 selectionToggleUnread(false, false, 'viewCurrentFeed()', true);
1027 // selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false);
1028 } else {
1029 selectionToggleUnread(true, false, 'viewCurrentFeed()', true)
1030 // cdmSelectArticles('none');
1031 }
1032
1033 } catch (e) {
1034 exception_error("catchupSelection", e);
1035 }
1036}
1037
1038
88040f57
AD
1039function labelFromSearch(search, search_mode, match_on, feed_id, is_cat) {
1040
1041 if (!xmlhttp_ready(xmlhttp_rpc)) {
1042 printLockingError();
1043 }
1044
a5ae125a 1045 var title = prompt(__("Please enter label title:"), "");
88040f57
AD
1046
1047 if (title) {
1048
1049 var query = "backend.php?op=labelFromSearch&search=" + param_escape(search) +
1050 "&smode=" + param_escape(search_mode) + "&match=" + param_escape(match_on) +
1051 "&feed=" + param_escape(feed_id) + "&is_cat=" + param_escape(is_cat) +
1052 "&title=" + param_escape(title);
1053
1054 debug("LFS: " + query);
88040f57 1055
2ef1af84
AD
1056 new Ajax.Request(query, {
1057 onComplete: function(transport) {
1058 dlg_frefresh_callback(transport);
1059 } });
1060 }
88040f57
AD
1061}
1062
13f08f75 1063function editArticleTags(id, feed_id, cdm_enabled) {
0b126ac2
AD
1064 _tag_active_post_id = id;
1065 _tag_active_feed_id = feed_id;
13f08f75 1066 _tag_active_cdm = cdm_enabled;
b07b61da
AD
1067
1068 cache_invalidate(id);
1069
13f08f75
AD
1070 try {
1071 _tag_cdm_scroll = document.getElementById("headlinesInnerContainer").scrollTop;
1072 } catch (e) { }
0b126ac2
AD
1073 displayDlg('editArticleTags', id);
1074}
1075
1076
2ef1af84
AD
1077function tag_saved_callback(transport) {
1078 try {
1079 debug("in tag_saved_callback");
0b126ac2 1080
2ef1af84
AD
1081 closeInfoBox();
1082 notify("");
0b126ac2 1083
2ef1af84
AD
1084 if (tagsAreDisplayed()) {
1085 _reload_feedlist_after_view = true;
1086 }
0b126ac2 1087
2ef1af84
AD
1088 if (!_tag_active_cdm) {
1089 if (active_post_id == _tag_active_post_id) {
1090 debug("reloading current article");
1091 view(_tag_active_post_id, _tag_active_feed_id);
13f08f75 1092 }
2ef1af84
AD
1093 } else {
1094 debug("reloading current feed");
1095 viewCurrentFeed();
0b126ac2 1096 }
2ef1af84
AD
1097
1098 } catch (e) {
1099 exception_error("catchup_callback", e);
0b126ac2
AD
1100 }
1101}
1102
1103function editTagsSave() {
1104
42c32916 1105 notify_progress("Saving article tags...");
88040f57 1106
0b126ac2
AD
1107 var form = document.forms["tag_edit_form"];
1108
1109 var query = Form.serialize("tag_edit_form");
1110
14b6c54b
AD
1111 query = "backend.php?op=rpc&subop=setArticleTags&" + query;
1112
1113 debug(query);
1114
2ef1af84
AD
1115 new Ajax.Request(query, {
1116 onComplete: function(transport) {
1117 tag_saved_callback(transport);
1118 } });
0b126ac2
AD
1119
1120}
d62a3b63
AD
1121
1122function editTagsInsert() {
1123 try {
1124
1125 var form = document.forms["tag_edit_form"];
1126
1127 var found_tags = form.found_tags;
1128 var tags_str = form.tags_str;
1129
1130 var tag = found_tags[found_tags.selectedIndex].value;
1131
1132 if (tags_str.value.length > 0 &&
1133 tags_str.value.lastIndexOf(", ") != tags_str.value.length - 2) {
1134
1135 tags_str.value = tags_str.value + ", ";
1136 }
1137
1138 tags_str.value = tags_str.value + tag + ", ";
1139
1140 found_tags.selectedIndex = 0;
1141
1142 } catch (e) {
1143 exception_error(e, "editTagsInsert");
1144 }
1145}
ba0978c8
AD
1146
1147function cdmWatchdog() {
1148
1149 try {
1150
1151 var ctr = document.getElementById("headlinesInnerContainer");
1152
9acd22e8
AD
1153 if (!ctr) return;
1154
ba0978c8
AD
1155 var ids = new Array();
1156
1157 var e = ctr.firstChild;
1158
1159 while (e) {
1160 if (e.className && e.className == "cdmArticleUnread" && e.id &&
1161 e.id.match("RROW-")) {
1162
1163 // article fits in viewport OR article is longer than viewport and
1164 // its bottom is visible
1165
1166 if (ctr.scrollTop <= e.offsetTop && e.offsetTop + e.offsetHeight <=
1167 ctr.scrollTop + ctr.offsetHeight) {
1168
1169// debug(e.id + " is visible " + e.offsetTop + "." +
1170// (e.offsetTop + e.offsetHeight) + " vs " + ctr.scrollTop + "." +
1171// (ctr.scrollTop + ctr.offsetHeight));
1172
1173 ids.push(e.id.replace("RROW-", ""));
1174
1175 } else if (e.offsetHeight > ctr.offsetHeight &&
1176 e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
1177 e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight) {
1178
1179 ids.push(e.id.replace("RROW-", ""));
1180
1181 }
1182
c50e2b30
AD
1183 // method 2: article bottom is visible and is in upper 1/2 of the viewport
1184
1185/* if (e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
1186 e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight/2) {
1187
1188 ids.push(e.id.replace("RROW-", ""));
1189
1190 } */
1191
ba0978c8
AD
1192 }
1193
1194 e = e.nextSibling;
1195 }
1196
1197 debug("cdmWatchdog, ids= " + ids.toString());
1198
1341ea0d 1199 if (ids.length > 0) {
ba0978c8
AD
1200
1201 for (var i = 0; i < ids.length; i++) {
1202 var e = document.getElementById("RROW-" + ids[i]);
1203 if (e) {
1204 e.className = e.className.replace("Unread", "");
1205 }
1206 }
1207
1208 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
1209 param_escape(ids.toString()) + "&cmode=0";
1210
1341ea0d
AD
1211 new Ajax.Request(query, {
1212 onComplete: function(transport) {
1213 all_counters_callback2(transport);
1214 } });
ba0978c8
AD
1215
1216 }
1217
c50e2b30 1218 _cdm_wd_timeout = window.setTimeout("cdmWatchdog()", 4000);
ba0978c8
AD
1219
1220 } catch (e) {
1221 exception_error(e, "cdmWatchdog");
1222 }
1223
1224}
e097e8be
AD
1225
1226
e19c1824 1227function cache_inject(id, article, param) {
5d17ead9 1228 if (!cache_check_param(id, param)) {
e19c1824 1229 debug("cache_article: miss: " + id + " [p=" + param + "]");
e097e8be
AD
1230
1231 var cache_obj = new Array();
1232
fed4387d 1233 cache_obj["id"] = id;
e097e8be 1234 cache_obj["data"] = article;
e19c1824 1235 cache_obj["param"] = param;
e097e8be 1236
fed4387d 1237 article_cache.push(cache_obj);
e097e8be
AD
1238
1239 } else {
e19c1824 1240 debug("cache_article: hit: " + id + " [p=" + param + "]");
e097e8be
AD
1241 }
1242}
1243
1244function cache_find(id) {
fed4387d
AD
1245 for (var i = 0; i < article_cache.length; i++) {
1246 if (article_cache[i]["id"] == id) {
fed4387d
AD
1247 return article_cache[i]["data"];
1248 }
e097e8be 1249 }
fed4387d 1250 return false;
e097e8be
AD
1251}
1252
5d17ead9 1253function cache_find_param(id, param) {
e19c1824 1254 for (var i = 0; i < article_cache.length; i++) {
5d17ead9
AD
1255 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1256 return article_cache[i]["data"];
e19c1824
AD
1257 }
1258 }
1259 return false;
1260}
1261
e097e8be 1262function cache_check(id) {
fed4387d
AD
1263 for (var i = 0; i < article_cache.length; i++) {
1264 if (article_cache[i]["id"] == id) {
1265 return true;
1266 }
1267 }
1268 return false;
e097e8be
AD
1269}
1270
e19c1824
AD
1271function cache_check_param(id, param) {
1272 for (var i = 0; i < article_cache.length; i++) {
5d17ead9
AD
1273
1274// debug("cache_check_param " + article_cache[i]["id"] + ":" +
1275// article_cache[i]["param"] + " vs " + id + ":" + param);
1276
e19c1824
AD
1277 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1278 return true;
1279 }
1280 }
1281 return false;
1282}
1283
e097e8be 1284function cache_expire() {
7289eacf 1285 while (article_cache.length > 20) {
fed4387d
AD
1286 article_cache.shift();
1287 }
e097e8be 1288}
b07b61da
AD
1289
1290function cache_invalidate(id) {
1291 var i = 0
c1b18749
AD
1292
1293 try {
1294
1295 while (i < article_cache.length) {
1296 if (article_cache[i]["id"] == id) {
1297 debug("cache_invalidate: removed id " + id);
1298 article_cache.splice(i, 1);
1299 return true;
1300 }
1301 i++;
b07b61da 1302 }
c1b18749
AD
1303 debug("cache_invalidate: id not found: " + id);
1304 return false;
1305 } catch (e) {
1306 exception_error("cache_invalidate", e);
b07b61da 1307 }
b07b61da 1308}
298f3f78
AD
1309
1310function getActiveArticleId() {
1311 return active_post_id;
1312}
e4914b62
AD
1313
1314function cdmMouseIn(elem) {
1315 try {
1316 if (elem.id && elem.id.match("RROW-")) {
1317 var id = elem.id.replace("RROW-", "");
1318 active_post_id = id;
1319 }
1320 } catch (e) {
1321 exception_error("cdmMouseIn", e);
1322 }
1323
1324}
1325
1326function cdmMouseOut(elem) {
1327 active_post_id = false;
1328}
ac541432
AD
1329
1330function headlines_scroll_handler() {
1331 try {
1332
1333 var e = document.getElementById("headlinesInnerContainer");
1334
4764c27e
AD
1335 // don't do infinite scrolling when Limit == All
1336
1337 var toolbar_form = document.forms["main_toolbar_form"];
1338
1339 var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex];
1340 if (limit.value != 0) {
1341 if (e.scrollTop + e.offsetHeight > e.scrollHeight - 50) {
1342 if (!_infscroll_disable) {
1343 debug("more cowbell!");
1344 viewNextFeedPage();
1345 }
29dfb258 1346 }
ac541432
AD
1347 }
1348
1349 } catch (e) {
1350 exception_error("headlines_scroll_handler", e);
1351 }
1352}
8be83f42
AD
1353
1354function catchupRelativeToArticle(below) {
1355
1356 try {
1357
1358 if (!xmlhttp_ready(xmlhttp_rpc)) {
1359 printLockingError();
1360 }
1361
1362 if (!getActiveArticleId()) {
1363 alert(__("No article is selected."));
1364 return;
1365 }
1366
1367 var visible_ids;
1368
1369 if (document.getElementById("headlinesList")) {
1370 visible_ids = getVisibleHeadlineIds();
1371 } else {
1372 visible_ids = cdmGetVisibleArticles();
1373 }
1374
1375 var ids_to_mark = new Array();
1376
1377 if (!below) {
1378 for (var i = 0; i < visible_ids.length; i++) {
1379 if (visible_ids[i] != getActiveArticleId()) {
1380 var e = document.getElementById("RROW-" + visible_ids[i]);
1381
1382 if (e && e.className.match("Unread")) {
1383 ids_to_mark.push(visible_ids[i]);
1384 }
1385 } else {
1386 break;
1387 }
1388 }
1389 } else {
1390 for (var i = visible_ids.length-1; i >= 0; i--) {
1391 if (visible_ids[i] != getActiveArticleId()) {
1392 var e = document.getElementById("RROW-" + visible_ids[i]);
1393
1394 if (e && e.className.match("Unread")) {
1395 ids_to_mark.push(visible_ids[i]);
1396 }
1397 } else {
1398 break;
1399 }
1400 }
1401 }
1402
1403 if (ids_to_mark.length == 0) {
1404 alert(__("No articles found to mark"));
1405 } else {
1406 var msg = __("Mark %d article(s) as read?").replace("%d", ids_to_mark.length);
1407
1408 if (confirm(msg)) {
1409
1410 for (var i = 0; i < ids_to_mark.length; i++) {
1411 var e = document.getElementById("RROW-" + ids_to_mark[i]);
1412 e.className = e.className.replace("Unread", "");
1413 }
1414
1415 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
1416 param_escape(ids_to_mark.toString()) + "&cmode=0";
1417
5fe7767c
AD
1418 new Ajax.Request(query, {
1419 onComplete: function(transport) {
1420 catchup_callback2(transport);
1421 } });
1422
8be83f42
AD
1423 }
1424 }
1425
1426 } catch (e) {
1427 exception_error("catchupRelativeToArticle", e);
1428 }
1429}
a04c8e8d
AD
1430
1431function cdmExpandArticle(a_id) {
1432 try {
1433 var id = 'CICD-' + a_id;
1434
1435 Effect.Appear(id, {duration : 0.5,
1436 beforeStart: function(effect) {
1437 var h_id = 'CICH-' + a_id;
1438 var h_elem = document.getElementById(h_id);
1439 if (h_elem) { h_elem.style.display = "none"; }
1440
1441 toggleUnread(a_id, 0);
1442 }});
1443
1444
1445 } catch (e) {
1446 exception_error("appearBlockElementF", e);
1447 }
1448
1449}
1450
1451