]> git.wh0rd.org - tt-rss.git/blame - viewfeed.js
block main Actions dropbox in offline mode
[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) {
fb456d28
AD
1469 try {
1470 if (!cache_check_param(id, param)) {
1471 debug("cache_article: miss: " + id + " [p=" + param + "]");
1472
1473
1474 if (db) {
e097e8be 1475
fb456d28
AD
1476 var date = new Date();
1477 var ts = Math.round(date.getTime() / 1000);
e097e8be 1478
fb456d28
AD
1479 db.execute("INSERT INTO cache (id, article, param, added) VALUES (?, ?, ?, ?)",
1480 [id, article, param, ts]);
1481 } else {
1482
1483 var cache_obj = new Array();
1484
1485 cache_obj["id"] = id;
1486 cache_obj["data"] = article;
1487 cache_obj["param"] = param;
1488
1489 article_cache.push(cache_obj);
1490 }
1491
1492 } else {
1493 debug("cache_article: hit: " + id + " [p=" + param + "]");
1494 }
1495 } catch (e) {
1496 exception_error("cache_inject", e);
e097e8be
AD
1497 }
1498}
1499
1500function cache_find(id) {
fb456d28
AD
1501
1502 if (db) {
31234407
AD
1503 var rs = db.execute("SELECT article FROM cache WHERE id = ?", [id]);
1504
1505 if (rs.isValidRow()) {
1506 return rs.field(0);
1507 }
fb456d28
AD
1508
1509 } else {
1510 for (var i = 0; i < article_cache.length; i++) {
1511 if (article_cache[i]["id"] == id) {
1512 return article_cache[i]["data"];
1513 }
fed4387d 1514 }
e097e8be 1515 }
fed4387d 1516 return false;
e097e8be
AD
1517}
1518
5d17ead9 1519function cache_find_param(id, param) {
fb456d28
AD
1520
1521 if (db) {
1522 var rs = db.execute("SELECT article FROM cache WHERE id = ? AND param = ?",
1523 [id, param]);
1524
1525 if (rs.isValidRow()) {
1526 return rs.field(0);
1527 }
1528
1529 } else {
1530 for (var i = 0; i < article_cache.length; i++) {
1531 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1532 return article_cache[i]["data"];
1533 }
e19c1824
AD
1534 }
1535 }
1536 return false;
1537}
1538
e097e8be 1539function cache_check(id) {
fb456d28
AD
1540
1541 if (db) {
1542 var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ?",
1543 [id]);
1544
1545 if (rs.isValidRow()) {
1546 return rs.field(0) != "0";
1547 }
1548
1549 } else {
1550 for (var i = 0; i < article_cache.length; i++) {
1551 if (article_cache[i]["id"] == id) {
1552 return true;
1553 }
fed4387d
AD
1554 }
1555 }
1556 return false;
e097e8be
AD
1557}
1558
e19c1824 1559function cache_check_param(id, param) {
5d17ead9 1560
fb456d28
AD
1561 if (db) {
1562 var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ? AND param = ?",
1563 [id, param]);
5d17ead9 1564
fb456d28
AD
1565 if (rs.isValidRow()) {
1566 return rs.field(0) != "0";
1567 }
1568
1569 } else {
1570 for (var i = 0; i < article_cache.length; i++) {
1571 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1572 return true;
1573 }
e19c1824
AD
1574 }
1575 }
1576 return false;
1577}
1578
e097e8be 1579function cache_expire() {
31234407
AD
1580 if (db) {
1581 var date = new Date();
1582 var ts = Math.round(date.getTime() / 1000);
1583
1584 db.execute("DELETE FROM cache WHERE added < ? - 600", [ts]);
1585
1586 } else {
fb456d28
AD
1587 while (article_cache.length > 25) {
1588 article_cache.shift();
1589 }
fed4387d 1590 }
e097e8be 1591}
b07b61da 1592
3c2d7945
AD
1593function cache_empty() {
1594 article_cache = new Array();
1595}
1596
b07b61da 1597function cache_invalidate(id) {
c1b18749
AD
1598 try {
1599
fb456d28
AD
1600 if (db) {
1601 rs = db.execute("DELETE FROM cache WHERE id = ?", [id]);
1602 return rs.rowsAffected != 0;
1603 } else {
1604
1605 var i = 0
1606
1607 while (i < article_cache.length) {
1608 if (article_cache[i]["id"] == id) {
1609 debug("cache_invalidate: removed id " + id);
1610 article_cache.splice(i, 1);
1611 return true;
1612 }
1613 i++;
c1b18749 1614 }
b07b61da 1615 }
fb456d28 1616
c1b18749
AD
1617 debug("cache_invalidate: id not found: " + id);
1618 return false;
1619 } catch (e) {
1620 exception_error("cache_invalidate", e);
b07b61da 1621 }
b07b61da 1622}
298f3f78
AD
1623
1624function getActiveArticleId() {
1625 return active_post_id;
1626}
e4914b62 1627
3cd4239a 1628function cdmClicked(id) {
e4914b62 1629 try {
3cd4239a
AD
1630 var elem = document.getElementById("RROW-" + id);
1631
1632 if (elem) {
e4914b62
AD
1633 var id = elem.id.replace("RROW-", "");
1634 active_post_id = id;
5ad9d132
AD
1635
1636 cdmSelectArticles("none");
b61cf20c 1637 toggleUnread(id, 0, true);
5ad9d132
AD
1638 toggleSelected(id);
1639
e4914b62
AD
1640 }
1641 } catch (e) {
ee8768db 1642 exception_error("cdmClicked", e);
5ad9d132
AD
1643 }
1644}
e4914b62 1645
aa0fa9df
AD
1646function preload_article_callback(transport) {
1647 try {
1648 if (transport.responseXML) {
1649 var articles = transport.responseXML.getElementsByTagName("article");
1650
1651 for (var i = 0; i < articles.length; i++) {
1652 var id = articles[i].getAttribute("id");
b2bb787c 1653 if (!cache_check(id)) {
aa0fa9df
AD
1654 cache_inject(id, articles[i].firstChild.nodeValue);
1655 debug("preloaded article: " + id);
1656 }
1657 }
1658 }
1659 } catch (e) {
1660 exception_error("preload_article_callback", e);
1661 }
1662}
1663
1664function preloadArticleUnderPointer(id) {
1665 try {
a598370d
AD
1666 if (getInitParam("bw_limit") == "1") return;
1667
b2bb787c 1668 if (post_under_pointer == id && !cache_check(id)) {
aa0fa9df
AD
1669
1670 debug("trying to preload article " + id);
1671
1672 var neighbor_ids = getRelativePostIds(id, 1);
1673
1674 /* only request uncached articles */
1675
1676 var cids_to_request = Array();
1677
1678 for (var i = 0; i < neighbor_ids.length; i++) {
1679 if (!cache_check(neighbor_ids[i])) {
1680 cids_to_request.push(neighbor_ids[i]);
1681 }
1682 }
1683 debug("additional ids: " + cids_to_request.toString());
1684
1685 cids_to_request.push(id);
1686
1687 var query = "backend.php?op=rpc&subop=getArticles&ids=" +
1688 cids_to_request.toString();
1689 new Ajax.Request(query, {
1690 onComplete: function(transport) {
1691 preload_article_callback(transport);
1692 } });
1693 }
1694 } catch (e) {
1695 exception_error("preloadArticleUnderPointer", e);
1696 }
1697}
1698
314fcd2b
AD
1699function postMouseIn(id) {
1700 try {
aa0fa9df
AD
1701 if (post_under_pointer != id) {
1702 post_under_pointer = id;
1703 if (!isCdmMode()) {
1704 window.setTimeout("preloadArticleUnderPointer(" + id + ")", 250);
1705 }
1706 }
1707
314fcd2b
AD
1708 } catch (e) {
1709 exception_error("postMouseIn", e);
1710 }
1711}
1712
1713function postMouseOut(id) {
1714 try {
1715 post_under_pointer = false;
1716 } catch (e) {
1717 exception_error("postMouseOut", e);
1718 }
1719}
1720
ac541432
AD
1721function headlines_scroll_handler() {
1722 try {
1723
1724 var e = document.getElementById("headlinesInnerContainer");
1725
4764c27e
AD
1726 // don't do infinite scrolling when Limit == All
1727
1728 var toolbar_form = document.forms["main_toolbar_form"];
1729
1730 var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex];
1731 if (limit.value != 0) {
587bef10
AD
1732
1733 debug((e.scrollTop + e.offsetHeight) + " vs " + e.scrollHeight + " dis? " +
1734 _infscroll_disable);
1735
1736 if (e.scrollTop + e.offsetHeight > e.scrollHeight - 100) {
4764c27e
AD
1737 if (!_infscroll_disable) {
1738 debug("more cowbell!");
1739 viewNextFeedPage();
1740 }
29dfb258 1741 }
ac541432
AD
1742 }
1743
1744 } catch (e) {
1745 exception_error("headlines_scroll_handler", e);
1746 }
1747}
8be83f42
AD
1748
1749function catchupRelativeToArticle(below) {
1750
1751 try {
1752
49fd1e94 1753
8be83f42
AD
1754 if (!getActiveArticleId()) {
1755 alert(__("No article is selected."));
1756 return;
1757 }
1758
1759 var visible_ids;
1760
1761 if (document.getElementById("headlinesList")) {
1762 visible_ids = getVisibleHeadlineIds();
1763 } else {
1764 visible_ids = cdmGetVisibleArticles();
1765 }
1766
1767 var ids_to_mark = new Array();
1768
1769 if (!below) {
1770 for (var i = 0; i < visible_ids.length; i++) {
1771 if (visible_ids[i] != getActiveArticleId()) {
1772 var e = document.getElementById("RROW-" + visible_ids[i]);
1773
1774 if (e && e.className.match("Unread")) {
1775 ids_to_mark.push(visible_ids[i]);
1776 }
1777 } else {
1778 break;
1779 }
1780 }
1781 } else {
1782 for (var i = visible_ids.length-1; i >= 0; i--) {
1783 if (visible_ids[i] != getActiveArticleId()) {
1784 var e = document.getElementById("RROW-" + visible_ids[i]);
1785
1786 if (e && e.className.match("Unread")) {
1787 ids_to_mark.push(visible_ids[i]);
1788 }
1789 } else {
1790 break;
1791 }
1792 }
1793 }
1794
1795 if (ids_to_mark.length == 0) {
1796 alert(__("No articles found to mark"));
1797 } else {
1798 var msg = __("Mark %d article(s) as read?").replace("%d", ids_to_mark.length);
1799
1800 if (confirm(msg)) {
1801
1802 for (var i = 0; i < ids_to_mark.length; i++) {
1803 var e = document.getElementById("RROW-" + ids_to_mark[i]);
1804 e.className = e.className.replace("Unread", "");
1805 }
1806
1807 var query = "backend.php?op=rpc&subop=catchupSelected&ids=" +
1808 param_escape(ids_to_mark.toString()) + "&cmode=0";
1809
5fe7767c
AD
1810 new Ajax.Request(query, {
1811 onComplete: function(transport) {
1812 catchup_callback2(transport);
1813 } });
1814
8be83f42
AD
1815 }
1816 }
1817
1818 } catch (e) {
1819 exception_error("catchupRelativeToArticle", e);
1820 }
1821}
a04c8e8d
AD
1822
1823function cdmExpandArticle(a_id) {
1824 try {
1825 var id = 'CICD-' + a_id;
1826
3cd4239a
AD
1827 try {
1828 Element.hide("CEXC-" + a_id);
1829 } catch (e) { }
1830
a04c8e8d
AD
1831 Effect.Appear(id, {duration : 0.5,
1832 beforeStart: function(effect) {
1833 var h_id = 'CICH-' + a_id;
1834 var h_elem = document.getElementById(h_id);
1835 if (h_elem) { h_elem.style.display = "none"; }
1836
1837 toggleUnread(a_id, 0);
1838 }});
1839
1840
1841 } catch (e) {
1842 exception_error("appearBlockElementF", e);
1843 }
1844
1845}
1846
3818a89b
AD
1847function fixHeadlinesOrder(ids) {
1848 try {
1849 for (var i = 0; i < ids.length; i++) {
1850 var e = document.getElementById("RROW-" + ids[i]);
1851
1852 if (e) {
1853 if (i % 2 == 0) {
1854 e.className = e.className.replace("even", "odd");
1855 } else {
1856 e.className = e.className.replace("odd", "even");
1857 }
1858 }
1859 }
1860 } catch (e) {
1861 exception_error("fixHeadlinesOrder", e);
1862 }
1863}
1864
df485d4f
AD
1865function hideReadHeadlines() {
1866 try {
1867
1868 var ids = false;
1869 var vis_ids = new Array();
1870
1871 if (document.getElementById("headlinesList")) {
1872 ids = getVisibleHeadlineIds();
1873 } else {
1874 ids = cdmGetVisibleArticles();
1875 }
1876
004523dd
AD
1877 var read_headlines_visible = true;
1878
df485d4f
AD
1879 for (var i = 0; i < ids.length; i++) {
1880 var row = document.getElementById("RROW-" + ids[i]);
1881
1882 if (row && row.className) {
1883 if (read_headlines_visible) {
1884 if (row.className.match("Unread") || row.className.match("Selected")) {
1885 Element.show(row);
1886 vis_ids.push(ids[i]);
1887 } else {
1888 //Effect.Fade(row, {duration : 0.3});
1889 Element.hide(row);
1890 }
1891 } else {
1892 Element.show(row);
1893 vis_ids.push(ids[i]);
1894 }
1895 }
1896 }
1897
1898 fixHeadlinesOrder(vis_ids);
1899
1900 read_headlines_visible = !read_headlines_visible;
1901
1902 } catch (e) {
1903 exception_error("hideReadHeadlines", e);
1904 }
1905}
1906
e75d70b5
AD
1907function invertHeadlineSelection() {
1908 try {
1909 var rows = new Array();
1910 var r = false;
1911
1912 if (!isCdmMode()) {
1913 r = document.getElementsByTagName("TR");
1914 } else {
1915 r = document.getElementsByTagName("DIV");
1916 }
1917
1918 for (var i = 0; i < r.length; i++) {
1919 if (r[i].id && r[i].id.match("RROW-")) {
1920 rows.push(r[i]);
1921 }
1922 }
1923
1924 for (var i = 0; i < rows.length; i++) {
1925 var nc = rows[i].className;
1926 var id = rows[i].id.replace("RROW-", "");
1927 var cb = document.getElementById("RCHK-" + id);
1928
1929 if (!rows[i].className.match("Selected")) {
1930 nc = nc + "Selected";
1931 cb.checked = true;
1932 } else {
1933 nc = nc.replace("Selected", "");
1934 cb.checked = false;
1935 }
1936
1937 rows[i].className = nc;
1938
1939 }
1940
1941 } catch (e) {
1942 exception_error("invertHeadlineSelection", e);
1943 }
1944}
1945
314fcd2b
AD
1946function getArticleUnderPointer() {
1947 return post_under_pointer;
7a822893 1948}
eedfb635
AD
1949
1950function zoomToArticle(id) {
1951 try {
1952 var w = window.open("backend.php?op=view&mode=zoom&id=" + param_escape(id),
1953 "ttrss_zoom_" + id,
1954 "status=0,toolbar=0,location=0,width=450,height=300,scrollbars=1,menubar=0");
1955
1956 } catch (e) {
1957 exception_error("zoomToArticle", e);
1958 }
1959}
a411875b 1960
4710e3dc
AD
1961function showOriginalArticleInline(id) {
1962 try {
1963
1964 var query = "backend.php?op=rpc&subop=getArticleLink&id=" + id;
1965
1966 notify_progress("Loading, please wait...", true);
1967
1968 new Ajax.Request(query, {
1969 onComplete: function(transport) {
1970
1971 if (transport.responseXML) {
1972
1973 var link = transport.responseXML.getElementsByTagName("link")[0];
1974 var id = transport.responseXML.getElementsByTagName("id")[0];
1975
1976 notify("");
1977
1978 if (link && id) {
1979 link = link.firstChild.nodeValue;
1980
1981 var ci = document.getElementById("content-insert");
1982
1983 var tmp = "<iframe id=\"inline_orig_article\" width=\""+ci.offsetWidth+"\" height=\""+ci.offsetHeight+"\" style=\"border-width : 0px;\" src=\""+link+"\"></iframe>";
1984
1985 render_article(tmp);
1986
1987 }
1988 }
1989 } });
1990
1991 } catch (e) {
1992 exception_error("showOriginalArticleInline", e);
1993 }
1994}
1995
1996
a411875b
AD
1997function scrollArticle(offset) {
1998 try {
1999 if (!isCdmMode()) {
2000 var ci = document.getElementById("content-insert");
2001 if (ci) {
2002 ci.scrollTop += offset;
2003 }
2004 } else {
2005 var hi = document.getElementById("headlinesInnerContainer");
2006 if (hi) {
2007 hi.scrollTop += offset;
2008 }
2009
2010 }
2011 } catch (e) {
2012 exception_error("scrollArticle", e);
2013 }
2014}
f9247195
AD
2015
2016function show_labels_in_headlines(transport) {
2017 try {
2018 if (transport.responseXML) {
2019 var info = transport.responseXML.getElementsByTagName("info-for-headlines")[0];
2020
2021 var elems = info.getElementsByTagName("entry");
2022
2023 for (var l = 0; l < elems.length; l++) {
2024 var e_id = elems[l].getAttribute("id");
2025
2026 if (e_id) {
2027
2028 var ctr = document.getElementById("HLLCTR-" + e_id);
2029
2030 if (ctr) {
2031 ctr.innerHTML = elems[l].firstChild.nodeValue;
2032 }
2033 }
2034
2035 }
2036
2037 }
2038 } catch (e) {
2039 exception_error("show_labels_in_headlines", e);
2040
2041 }
2042}
bf3c9838
AD
2043
2044function toggleHeadlineActions() {
2045 try {
2046 var e = document.getElementById("headlineActionsBody");
2047 var p = document.getElementById("headlineActionsDrop");
2048
2049 if (!Element.visible(e)) {
2050 Element.show(e);
2051 } else {
2052 Element.hide(e);
2053 }
2054
b62f6ff4 2055 e.scrollTop = 0;
bf3c9838
AD
2056 e.style.left = (p.offsetLeft + 1) + "px";
2057// e.style.top = (p.offsetTop + p.offsetHeight - 1) + "px";
2058
2059 } catch (e) {
2060 exception_error("toggleHeadlineActions", e);
2061 }
2062}