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