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