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