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