]> git.wh0rd.org - tt-rss.git/blame - viewfeed.js
getFeedName: return empty string instead of null when element is not found
[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
b39b57ac
AD
18var preload_id_batch = [];
19var preload_timeout_id = false;
20
21var cache_added = [];
22
1341ea0d
AD
23function catchup_callback2(transport, callback) {
24 try {
84c7b824 25 console.log("catchup_callback2 " + transport + ", " + callback);
1341ea0d 26 notify("");
f8fb4498 27 handle_rpc_reply(transport);
1341ea0d
AD
28 if (callback) {
29 setTimeout(callback, 10);
30 }
31 } catch (e) {
273d1e29 32 exception_error("catchup_callback2", e, transport);
1341ea0d
AD
33 }
34}
35
3d72bbdb 36function headlines_callback2(transport, feed_cur_page) {
e19c1824
AD
37 try {
38
f8fb4498 39 if (!handle_rpc_reply(transport)) return;
9ca945a6 40
730dbf19
AD
41 loading_set_progress(100);
42
84c7b824 43 console.log("headlines_callback2 [page=" + feed_cur_page + "]");
e19c1824 44
2184738a
AD
45 if (!transport_error_check(transport)) return;
46
e19c1824 47 clean_feed_selections();
3d72bbdb
AD
48
49 var is_cat = false;
50 var feed_id = false;
ac541432 51
3d72bbdb
AD
52 if (transport.responseXML) {
53 var headlines = transport.responseXML.getElementsByTagName("headlines")[0];
54 if (headlines) {
55 is_cat = headlines.getAttribute("is_cat");
56 feed_id = headlines.getAttribute("id");
57 setActiveFeedId(feed_id, is_cat);
58 }
6c3b0198 59 }
f46192bb 60
428b704d
AD
61 var update_btn = document.forms["main_toolbar_form"].update;
62
63 update_btn.disabled = !(feed_id >= 0 && !is_cat);
64
6e35a862
AD
65 var ll = $('FLL-' + feed_id);
66
2ab31493
AD
67 if (ll && ll.parentNode)
68 ll.parentNode.removeChild(ll);
69
6c3b0198 70 if (!is_cat) {
acac8448 71 var feedr = $("FEEDR-" + feed_id);
ca8e3d75
AD
72 if (feedr) {
73 feedr.addClassName("Selected");
6c3b0198 74 }
5ee9816c 75 } else {
acac8448 76 var feedr = $("FCAT-" + feed_id);
ca8e3d75
AD
77 if (feedr) {
78 feedr.addClassName("Selected");
5ee9816c 79 }
6c3b0198 80 }
6e35a862 81
105b61b7
AD
82 var img = $('FIMG-' + feed_id);
83
84 if (img && !is_cat) {
85 img.src = img.alt;
105b61b7
AD
86 }
87
acac8448 88 var f = $("headlines-frame");
6c3b0198
AD
89 try {
90 if (feed_cur_page == 0) {
f8fb4498 91 //console.log("resetting headlines scrollTop");
6c3b0198 92 f.scrollTop = 0;
a49f5e05 93 }
6c3b0198
AD
94 } catch (e) { };
95
96 if (transport.responseXML) {
ffbe082d 97 var response = transport.responseXML;
e19c1824 98
ffbe082d
AD
99 var headlines = response.getElementsByTagName("headlines")[0];
100 var headlines_info = response.getElementsByTagName("headlines-info")[0];
081e527d 101
ffbe082d
AD
102 if (headlines_info)
103 headlines_info = JSON.parse(headlines_info.firstChild.nodeValue);
f8fb4498
AD
104 else {
105 console.error("didn't find headlines-info object in response");
106 return;
107 }
e19c1824 108
ffbe082d
AD
109 var headlines_count = headlines_info.count;
110 var headlines_unread = headlines_info.unread;
111 var disable_cache = headlines_info.disable_cache;
112
113 vgroup_last_feed = headlines_info.vgroup_last_feed;
081e527d 114
7d12b6c8 115 if (parseInt(headlines_count) < getInitParam("default_article_limit")) {
587bef10
AD
116 _infscroll_disable = 1;
117 } else {
118 _infscroll_disable = 0;
119 }
120
ffbe082d
AD
121 var counters = response.getElementsByTagName("counters")[0];
122 var articles = response.getElementsByTagName("article");
123 var runtime_info = response.getElementsByTagName("runtime-info");
6c3b0198
AD
124
125 if (feed_cur_page == 0) {
126 if (headlines) {
127 f.innerHTML = headlines.firstChild.nodeValue;
e19c1824 128
dd5865d4
AD
129 var cache_prefix = "";
130
131 if (is_cat) {
132 cache_prefix = "C:";
133 } else {
134 cache_prefix = "F:";
135 }
136
3d72bbdb 137 cache_invalidate(cache_prefix + feed_id);
7e8832b3 138
52d7e7da 139 if (!disable_cache) {
3d72bbdb 140 cache_inject(cache_prefix + feed_id,
52d7e7da
AD
141 headlines.firstChild.nodeValue, headlines_unread);
142 }
e19c1824 143
6c3b0198 144 } else {
f8fb4498 145 console.warn("headlines_callback: returned no data");
6c3b0198
AD
146 f.innerHTML = "<div class='whiteBox'>" + __('Could not update headlines (missing XML data)') + "</div>";
147
148 }
149 } else {
150 if (headlines) {
151 if (headlines_count > 0) {
5ae8f858 152 console.log("adding some more headlines...");
6c3b0198 153
8cc5e965 154 c = $("headlinesInnerContainer");
c32cd48a
AD
155
156 var ids = getSelectedArticleIds2();
6c3b0198
AD
157
158 c.innerHTML = c.innerHTML + headlines.firstChild.nodeValue;
c32cd48a 159
84c7b824 160 console.log("restore selected ids: " + ids);
c32cd48a
AD
161
162 for (var i = 0; i < ids.length; i++) {
163 markHeadline(ids[i]);
164 }
165
6c3b0198 166 } else {
84c7b824 167 console.log("no new headlines received");
29dfb258 168 }
29dfb258 169 } else {
f8fb4498 170 console.warn("headlines_callback: returned no data");
6c3b0198
AD
171 notify_error("Error while trying to load more headlines");
172 }
730dbf19 173
6c3b0198
AD
174 }
175
176 if (articles) {
177 for (var i = 0; i < articles.length; i++) {
178 var a_id = articles[i].getAttribute("id");
f8fb4498 179 //console.log("found id: " + a_id);
6c3b0198 180 cache_inject(a_id, articles[i].firstChild.nodeValue);
ac541432 181 }
007a38d4 182 } else {
84c7b824 183 console.log("no cached articles received");
961f4c73 184 }
d36f5607
AD
185
186 if (counters)
187 parse_counters(counters);
188 else
189 request_counters();
f8fb4498 190
6c3b0198 191 if (runtime_info) {
6c3b0198 192 parse_runtime_info(runtime_info[0]);
f8fb4498 193 }
6c3b0198 194
3de0261a 195 } else {
f8fb4498 196 console.warn("headlines_callback: returned no XML object");
6c3b0198 197 f.innerHTML = "<div class='whiteBox'>" + __('Could not update headlines (missing XML object)') + "</div>";
3de0261a 198 }
6c3b0198 199
5225d420 200
6c3b0198 201 if (_cdm_wd_timeout) window.clearTimeout(_cdm_wd_timeout);
8cc5e965 202
e69fb880 203 if (isCdmMode() &&
a969b30b 204 getActiveFeedId() != -3 &&
6c3b0198 205 getInitParam("cdm_auto_catchup") == 1) {
84c7b824 206 console.log("starting CDM watchdog");
6c3b0198
AD
207 _cdm_wd_timeout = window.setTimeout("cdmWatchdog()", 5000);
208 _cdm_wd_vishist = new Array();
ac7bcd71 209 } else {
84c7b824 210 console.log("not in CDM mode or watchdog disabled");
ba0978c8 211 }
6c3b0198 212
6c3b0198 213 _feed_cur_page = feed_cur_page;
82764a41
AD
214 _infscroll_request_sent = 0;
215
6c3b0198 216 notify("");
730dbf19
AD
217
218 remove_splash();
219
6c3b0198 220 } catch (e) {
273d1e29 221 exception_error("headlines_callback2", e, transport);
6b4163cb
AD
222 }
223}
224
e097e8be
AD
225function render_article(article) {
226 try {
acac8448 227 var f = $("content-frame");
44cc6f20
AD
228 try {
229 f.scrollTop = 0;
230 } catch (e) { };
e097e8be 231
acac8448 232 var fi = $("content-insert");
17042fc0 233
e5ebee09
AD
234 try {
235 fi.scrollTop = 0;
236 } catch (e) { };
95f67d2e 237
17042fc0 238 fi.innerHTML = article;
95f67d2e 239
51682b23 240// article.evalScripts();
e097e8be
AD
241
242 } catch (e) {
243 exception_error("render_article", e);
244 }
245}
246
71d277de 247function showArticleInHeadlines(id) {
e097e8be 248
868d0ed2 249 try {
e097e8be 250
8cc5e965
AD
251 selectArticles("none");
252
acac8448 253 var crow = $("RROW-" + id);
76283a4c
AD
254
255 if (!crow) return;
256
ca8e3d75 257 var article_is_unread = crow.hasClassName("Unread");
868d0ed2 258
ca8e3d75 259 crow.removeClassName("Unread");
fdcdf2de 260
e69fb880
AD
261 selectArticles('none');
262
acac8448 263 var upd_img_pic = $("FUPDPIC-" + id);
ebda016b 264
fdcdf2de 265 var cache_prefix = "";
ebda016b 266
fdcdf2de
AD
267 if (activeFeedIsCat()) {
268 cache_prefix = "C:";
269 } else {
270 cache_prefix = "F:";
271 }
11063ec6
AD
272
273 var view_mode = false;
274
275 try {
276 view_mode = document.forms['main_toolbar_form'].view_mode;
277 view_mode = view_mode[view_mode.selectedIndex].value;
278 } catch (e) {
273d1e29 279 //
11063ec6
AD
280 }
281
784ac51f
AD
282 if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
283 upd_img_pic.src.match("fresh_sign.png"))) {
284
fdcdf2de 285 upd_img_pic.src = "images/blank_icon.gif";
ebda016b
AD
286
287 cache_invalidate(cache_prefix + getActiveFeedId());
ce411c4b
AD
288
289 cache_inject(cache_prefix + getActiveFeedId(),
acac8448 290 $("headlines-frame").innerHTML,
ce411c4b 291 get_feed_unread(getActiveFeedId()));
fdcdf2de 292
11063ec6 293 } else if (article_is_unread && view_mode == "all_articles") {
fdcdf2de
AD
294
295 cache_invalidate(cache_prefix + getActiveFeedId());
296
297 cache_inject(cache_prefix + getActiveFeedId(),
acac8448 298 $("headlines-frame").innerHTML,
fdcdf2de
AD
299 get_feed_unread(getActiveFeedId())-1);
300
3de99e6b
AD
301 } else if (article_is_unread) {
302 cache_invalidate(cache_prefix + getActiveFeedId());
868d0ed2 303 }
e097e8be 304
4c009c78
AD
305 markHeadline(id);
306
ac49453b
AD
307 if (article_is_unread)
308 _force_scheduled_update = true;
309
868d0ed2
AD
310 } catch (e) {
311 exception_error("showArticleInHeadlines", e);
312 }
71d277de 313}
e097e8be 314
a491a7f1 315function article_callback2(transport, id) {
71d277de 316 try {
84c7b824 317 console.log("article_callback2 " + id);
e097e8be 318
f8fb4498 319 if (!handle_rpc_reply(transport)) return;
9ca945a6 320
71d277de 321 if (transport.responseXML) {
e097e8be 322
2184738a
AD
323 if (!transport_error_check(transport)) return;
324
b1039124 325/* var ll = $('LL-' + id);
6e35a862
AD
326 var content = $('HLC-' + id);
327
b1039124 328 if (ll && content) content.removeChild(ll); */
6e35a862 329
b1039124
AD
330 var upic = $('FUPDPIC-' + id);
331
332 if (upic) {
333 upic.src = 'images/blank_icon.gif';
334 }
335
6e35a862 336 if (id != last_requested_article) {
84c7b824 337 console.log("requested article id is out of sequence, aborting");
6e35a862
AD
338 return;
339 }
340
5caea522 341// active_post_id = id;
6e35a862 342
f8fb4498 343 //console.log("looking for articles to cache...");
71d277de
AD
344
345 var articles = transport.responseXML.getElementsByTagName("article");
346
347 for (var i = 0; i < articles.length; i++) {
348 var a_id = articles[i].getAttribute("id");
349
f8fb4498 350 //console.log("found id: " + a_id);
71d277de
AD
351
352 if (a_id == active_post_id) {
f8fb4498 353 //console.log("active article, rendering...");
71d277de 354 render_article(articles[i].firstChild.nodeValue);
e097e8be 355 }
71d277de
AD
356
357 cache_inject(a_id, articles[i].firstChild.nodeValue);
e097e8be 358 }
fbcabe1e 359
fbcabe1e 360
5caea522 361// showArticleInHeadlines(id);
fbcabe1e 362
2f71f07b
AD
363 if (db) {
364 db.execute("UPDATE articles SET unread = 0 WHERE id = ?", [id]);
365 }
366
fbcabe1e 367 var reply = transport.responseXML.firstChild.firstChild;
71d277de
AD
368
369 } else {
f8fb4498 370 console.warn("article_callback: returned no XML object");
acac8448 371 //var f = $("content-frame");
17042fc0 372 //f.innerHTML = "<div class='whiteBox'>" + __('Could not display article (missing XML object)') + "</div>";
e097e8be 373 }
4b6206fa
AD
374
375 var date = new Date();
376 last_article_view = date.getTime() / 1000;
377
0b126ac2
AD
378 if (_reload_feedlist_after_view) {
379 setTimeout('updateFeedList(false, false)', 50);
380 _reload_feedlist_after_view = false;
381 } else {
f8fb4498 382 request_counters();
0b126ac2 383 }
9ec58704
AD
384
385 notify("");
71d277de 386 } catch (e) {
273d1e29 387 exception_error("article_callback2", e, transport);
6b4163cb
AD
388 }
389}
390
a491a7f1 391function view(id) {
ee1f45f4 392 try {
84c7b824 393 console.log("loading article: " + id);
12e55b90 394
a491a7f1 395 if (offline_mode) return view_offline(id);
45a6446d 396
e097e8be
AD
397 var cached_article = cache_find(id);
398
84c7b824 399 console.log("cache check result: " + (cached_article != false));
ee1f45f4 400
ee1f45f4 401 enableHotkeys();
664306d3
AD
402 hideAuxDlg();
403
a491a7f1 404 var query = "?op=view&id=" + param_escape(id);
6b4163cb 405
71d277de 406 var neighbor_ids = getRelativePostIds(active_post_id);
e097e8be 407
71d277de 408 /* only request uncached articles */
e097e8be 409
71d277de 410 var cids_to_request = Array();
5a94a953 411
71d277de
AD
412 for (var i = 0; i < neighbor_ids.length; i++) {
413 if (!cache_check(neighbor_ids[i])) {
414 cids_to_request.push(neighbor_ids[i]);
5a94a953 415 }
71d277de 416 }
5a94a953 417
84c7b824 418 console.log("additional ids: " + cids_to_request.toString());
b39b57ac 419
71d277de 420 query = query + "&cids=" + cids_to_request.toString();
e097e8be 421
acac8448 422 var crow = $("RROW-" + id);
ca8e3d75 423 var article_is_unread = crow.hasClassName("Unread");
e097e8be 424
5caea522 425 active_post_id = id;
3f70f90f
AD
426 showArticleInHeadlines(id);
427
71d277de 428 if (!cached_article) {
e097e8be 429
b1039124
AD
430 var upic = $('FUPDPIC-' + id);
431
432 if (upic) {
883fee8d 433 upic.src = getInitParam("sign_progress");
6e35a862 434 }
e097e8be 435
71d277de 436 } else if (cached_article && article_is_unread) {
addb5836 437
71d277de 438 query = query + "&mode=prefetch";
addb5836 439
71d277de 440 render_article(cached_article);
addb5836 441
71d277de 442 } else if (cached_article) {
e097e8be 443
71d277de
AD
444 query = query + "&mode=prefetch_old";
445 render_article(cached_article);
997d9d7c 446
71d277de 447 }
e097e8be 448
71d277de 449 cache_expire();
86173d9a 450
022d9e9e
AD
451 last_requested_article = id;
452
b4e75b2a
AD
453 new Ajax.Request("backend.php", {
454 parameters: query,
71d277de 455 onComplete: function(transport) {
a491a7f1 456 article_callback2(transport, id);
71d277de 457 } });
6b4163cb 458
a7764e51
AD
459 return false;
460
ee1f45f4
AD
461 } catch (e) {
462 exception_error("view", e);
463 }
f0601b87
AD
464}
465
67343d9f
AD
466function tMark(id) {
467 return toggleMark(id);
468}
469
e4f4b46f
AD
470function tPub(id) {
471 return togglePub(id);
472}
473
6b0f49f9
AD
474function tMark_afh_off(effect) {
475 try {
476 var elem = effect.effects[0].element;
477
f8fb4498 478 //console.log("tMark_afh_off : " + elem.id);
6b0f49f9
AD
479
480 if (elem) {
f5e0338d
AD
481 elem.src = elem.src.replace("mark_set", "mark_unset");
482 elem.alt = __("Star article");
6b0f49f9
AD
483 Element.show(elem);
484 }
485
486 } catch (e) {
487 exception_error("tMark_afh_off", e);
488 }
489}
490
491function tPub_afh_off(effect) {
492 try {
493 var elem = effect.effects[0].element;
494
f8fb4498 495 //console.log("tPub_afh_off : " + elem.id);
6b0f49f9
AD
496
497 if (elem) {
f5e0338d
AD
498 elem.src = elem.src.replace("pub_set", "pub_unset");
499 elem.alt = __("Publish article");
6b0f49f9
AD
500 Element.show(elem);
501 }
502
503 } catch (e) {
504 exception_error("tPub_afh_off", e);
505 }
506}
e4f4b46f 507
4ad8c93b 508function toggleMark(id, client_only) {
b685ba25 509 try {
b4e75b2a 510 var query = "?op=rpc&id=" + id + "&subop=mark";
b685ba25 511
4ad8c93b 512 var img = $("FMPIC-" + id);
56ff7564 513
4ad8c93b 514 if (!img) return;
b685ba25 515
4ad8c93b
AD
516 if (img.src.match("mark_unset")) {
517 img.src = img.src.replace("mark_unset", "mark_set");
518 img.alt = __("Unstar article");
b685ba25 519 query = query + "&mark=1";
ee8768db 520
2f71f07b
AD
521 if (db) {
522 db.execute("UPDATE articles SET marked = 1 WHERE id = ?", [id]);
523 }
524
b685ba25 525 } else {
4ad8c93b
AD
526 img.src = img.src.replace("mark_set", "mark_unset");
527 img.alt = __("Star article");
b685ba25 528 query = query + "&mark=0";
2f71f07b
AD
529
530 if (db) {
531 db.execute("UPDATE articles SET marked = 0 WHERE id = ?", [id]);
532 }
ace1a6da 533 }
772bc83b 534
4ad8c93b 535 update_local_feedlist_counters();
c8a9fe5b 536
f5e0338d 537 if (!client_only) {
b4e75b2a
AD
538 new Ajax.Request("backend.php", {
539 parameters: query,
1341ea0d 540 onComplete: function(transport) {
f8fb4498 541 handle_rpc_reply(transport);
1341ea0d 542 } });
f5e0338d 543 }
f0601b87 544
b685ba25
AD
545 } catch (e) {
546 exception_error("toggleMark", e);
547 }
f0601b87
AD
548}
549
c7e51de1 550function togglePub(id, client_only, no_effects, note) {
2bc2147f 551 try {
b4e75b2a 552 var query = "?op=rpc&id=" + id + "&subop=publ";
2bc2147f 553
c7e51de1
AD
554 if (note != undefined) {
555 query = query + "&note=" + param_escape(note);
556 } else {
557 query = query + "&note=undefined";
558 }
56ff7564 559
4ad8c93b 560 var img = $("FPPIC-" + id);
56ff7564 561
4ad8c93b 562 if (!img) return;
2bc2147f 563
4ad8c93b
AD
564 if (img.src.match("pub_unset") || note != undefined) {
565 img.src = img.src.replace("pub_unset", "pub_set");
566 img.alt = __("Unpublish article");
2bc2147f 567 query = query + "&pub=1";
ee8768db 568
e4f4b46f 569 } else {
4ad8c93b
AD
570 img.src = img.src.replace("pub_set", "pub_unset");
571 img.alt = __("Publish article");
8cc5e965 572
4ad8c93b 573 query = query + "&pub=0";
e4f4b46f 574 }
b685ba25 575
f5e0338d 576 if (!client_only) {
b4e75b2a
AD
577 new Ajax.Request("backend.php", {
578 parameters: query,
1341ea0d 579 onComplete: function(transport) {
f8fb4498 580 handle_rpc_reply(transport);
a5819bb3
AD
581
582 var note = transport.responseXML.getElementsByTagName("note")[0];
583
584 if (note) {
585 var note_id = note.getAttribute("id");
586 var note_size = note.getAttribute("size");
587 var note_content = note.firstChild.nodeValue;
588
589 var container = $('POSTNOTE-' + note_id);
590
591 cache_invalidate(note_id);
592
593 if (container) {
594 if (note_size == "0") {
595 Element.hide(container);
596 } else {
597 container.innerHTML = note_content;
598 Element.show(container);
599 }
600 }
601 }
602
1341ea0d 603 } });
f5e0338d 604 }
b685ba25 605
2bc2147f 606 } catch (e) {
2bc2147f
AD
607 exception_error("togglePub", e);
608 }
e4f4b46f
AD
609}
610
bb7cface 611function moveToPost(mode) {
f0601b87 612
b8e6acea
AD
613 try {
614
e69fb880 615 var rows = getVisibleArticleIds();
5ad9d132 616
5ad9d132
AD
617 var prev_id = false;
618 var next_id = false;
b8e6acea 619
acac8448 620 if (!$('RROW-' + active_post_id)) {
5ad9d132
AD
621 active_post_id = false;
622 }
b8e6acea 623
5ad9d132
AD
624 if (active_post_id == false) {
625 next_id = getFirstVisibleHeadlineId();
626 prev_id = getLastVisibleHeadlineId();
627 } else {
628 for (var i = 0; i < rows.length; i++) {
629 if (rows[i] == active_post_id) {
630 prev_id = rows[i-1];
631 next_id = rows[i+1];
b8e6acea
AD
632 }
633 }
5ad9d132 634 }
b8e6acea 635
5ad9d132
AD
636 if (mode == "next") {
637 if (next_id) {
638 if (isCdmMode()) {
639
dad14b51
AD
640 cdmExpandArticle(next_id);
641 cdmScrollToArticleId(next_id);
5ad9d132
AD
642
643 } else {
b8e6acea
AD
644 correctHeadlinesOffset(next_id);
645 view(next_id, getActiveFeedId());
646 }
647 }
5ad9d132 648 }
b8e6acea 649
5ad9d132
AD
650 if (mode == "prev") {
651 if (prev_id) {
652 if (isCdmMode()) {
dad14b51 653 cdmExpandArticle(prev_id);
5ad9d132 654 cdmScrollToArticleId(prev_id);
5ad9d132 655 } else {
b8e6acea
AD
656 correctHeadlinesOffset(prev_id);
657 view(prev_id, getActiveFeedId());
658 }
5ad9d132
AD
659 }
660 }
661
b8e6acea 662 } catch (e) {
438f2ce9 663 exception_error("moveToPost", e);
bb7cface 664 }
b8e6acea
AD
665}
666
667function toggleSelected(id) {
668 try {
669
acac8448 670 var cb = $("RCHK-" + id);
acac8448 671 var row = $("RROW-" + id);
5ad9d132 672
ca8e3d75
AD
673 if (row) {
674 if (row.hasClassName('Selected')) {
675 row.removeClassName('Selected');
676 if (cb) cb.checked = false;
b8e6acea 677 } else {
ca8e3d75
AD
678 row.addClassName('Selected');
679 if (cb) cb.checked = true;
b8e6acea 680 }
bb7cface 681 }
b8e6acea 682 } catch (e) {
438f2ce9 683 exception_error("toggleSelected", e);
b8e6acea 684 }
bb7cface
AD
685}
686
0df009c3 687function toggleUnread_afh(effect) {
b8e6acea
AD
688 try {
689
690 var elem = effect.element;
0df009c3 691 elem.style.backgroundColor = "";
b8e6acea 692
b8e6acea 693 } catch (e) {
438f2ce9 694 exception_error("toggleUnread_afh", e);
b8e6acea 695 }
0df009c3 696}
b8e6acea
AD
697
698function toggleUnread(id, cmode, effect) {
5f51022a 699 try {
5f51022a 700
acac8448 701 var row = $("RROW-" + id);
5f51022a 702 if (row) {
a70ab740 703 if (cmode == undefined || cmode == 2) {
ca8e3d75
AD
704 if (row.hasClassName("Unread")) {
705 row.removeClassName("Unread");
b8e6acea 706
0df009c3 707 if (effect) {
b8e6acea
AD
708 new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
709 afterFinish: toggleUnread_afh,
710 queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
0df009c3 711 }
b8e6acea 712
a70ab740 713 } else {
ca8e3d75 714 row.addClassName("Unread");
a70ab740 715 }
1a003258
AD
716
717 if (db) {
718 db.execute("UPDATE articles SET unread = not unread "+
719 "WHERE id = ?", [id]);
720 }
721
a70ab740 722 } else if (cmode == 0) {
ca8e3d75
AD
723
724 row.removeClassName("Unread");
b8e6acea 725
54eb7d20 726 if (effect) {
b8e6acea 727 new Effect.Highlight(row, {duration: 1, startcolor: "#fff7d5",
54eb7d20 728 afterFinish: toggleUnread_afh,
b8e6acea 729 queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } );
54eb7d20 730 }
1a003258
AD
731
732 if (db) {
733 db.execute("UPDATE articles SET unread = 0 "+
734 "WHERE id = ?", [id]);
735 }
736
a70ab740 737 } else if (cmode == 1) {
ca8e3d75 738 row.addClassName("Unread");
1a003258
AD
739
740 if (db) {
741 db.execute("UPDATE articles SET unread = 1 "+
742 "WHERE id = ?", [id]);
743 }
744
5f51022a
AD
745 }
746
1a003258
AD
747 update_local_feedlist_counters();
748
a70ab740 749 if (cmode == undefined) cmode = 2;
5f51022a 750
b4e75b2a
AD
751 var query = "?op=rpc&subop=catchupSelected" +
752 "&cmode=" + param_escape(cmode) + "&ids=" + param_escape(id);
5f51022a 753
1341ea0d 754// notify_progress("Loading, please wait...");
9ec58704 755
b4e75b2a
AD
756 new Ajax.Request("backend.php", {
757 parameters: query,
1341ea0d 758 onComplete: function(transport) {
f8fb4498 759 handle_rpc_reply(transport);
1341ea0d 760 } });
5f51022a
AD
761
762 }
763
5f51022a
AD
764 } catch (e) {
765 exception_error("toggleUnread", e);
766 }
767}
768
933ba4ee
AD
769function selectionRemoveLabel(id) {
770 try {
771
772 var ids = getSelectedArticleIds2();
773
774 if (ids.length == 0) {
775 alert(__("No articles are selected."));
776 return;
777 }
778
37843d70 779// var ok = confirm(__("Remove selected articles from label?"));
933ba4ee 780
37843d70 781// if (ok) {
933ba4ee 782
b4e75b2a 783 var query = "?op=rpc&subop=removeFromLabel&ids=" +
933ba4ee
AD
784 param_escape(ids.toString()) + "&lid=" + param_escape(id);
785
905ff52a
AD
786 console.log(query);
787
933ba4ee
AD
788// notify_progress("Loading, please wait...");
789
898e8562
AD
790 cache_invalidate("F:" + (-11 - id));
791
b4e75b2a
AD
792 new Ajax.Request("backend.php", {
793 parameters: query,
933ba4ee 794 onComplete: function(transport) {
1c9c6025 795 show_labels_in_headlines(transport);
f8fb4498 796 handle_rpc_reply(transport);
933ba4ee
AD
797 } });
798
37843d70 799// }
933ba4ee
AD
800
801 } catch (e) {
802 exception_error("selectionAssignLabel", e);
803
804 }
805}
806
b8a637f3
AD
807function selectionAssignLabel(id) {
808 try {
809
810 var ids = getSelectedArticleIds2();
811
812 if (ids.length == 0) {
813 alert(__("No articles are selected."));
814 return;
815 }
816
37843d70 817// var ok = confirm(__("Assign selected articles to label?"));
b8a637f3 818
37843d70 819// if (ok) {
b8a637f3 820
898e8562
AD
821 cache_invalidate("F:" + (-11 - id));
822
b4e75b2a 823 var query = "?op=rpc&subop=assignToLabel&ids=" +
b8a637f3
AD
824 param_escape(ids.toString()) + "&lid=" + param_escape(id);
825
905ff52a
AD
826 console.log(query);
827
b8a637f3
AD
828// notify_progress("Loading, please wait...");
829
b4e75b2a
AD
830 new Ajax.Request("backend.php", {
831 parameters: query,
b8a637f3 832 onComplete: function(transport) {
f9247195 833 show_labels_in_headlines(transport);
f8fb4498 834 handle_rpc_reply(transport);
b8a637f3
AD
835 } });
836
37843d70 837// }
b8a637f3
AD
838
839 } catch (e) {
840 exception_error("selectionAssignLabel", e);
841
842 }
843}
844
50eefedb 845function selectionToggleUnread(set_state, callback_func, no_error) {
1572afe5 846 try {
b83d72b1 847 var rows = getSelectedArticleIds2();
1572afe5 848
2228d0e4 849 if (rows.length == 0 && !no_error) {
9cc600d1
AD
850 alert(__("No articles are selected."));
851 return;
852 }
853
1572afe5 854 for (i = 0; i < rows.length; i++) {
acac8448 855 var row = $("RROW-" + rows[i]);
f1f2db64 856 if (row) {
a5ae125a 857 if (set_state == undefined) {
ca8e3d75
AD
858 if (row.hasClassName("Unread")) {
859 row.removeClassName("Unread");
a5ae125a 860 } else {
ca8e3d75 861 row.addClassName("Unread");
a5ae125a 862 }
46b84d29
AD
863 if (db) {
864 db.execute("UPDATE articles SET unread = NOT unread WHERE id = ?",
865 [rows[i]]);
866 }
a5ae125a
AD
867 }
868
869 if (set_state == false) {
ca8e3d75
AD
870 row.removeClassName("Unread");
871
46b84d29
AD
872 if (db) {
873 db.execute("UPDATE articles SET unread = 0 WHERE id = ?",
874 [rows[i]]);
875 }
a5ae125a
AD
876 }
877
878 if (set_state == true) {
ca8e3d75
AD
879 row.addClassName("Unread");
880
46b84d29
AD
881 if (db) {
882 db.execute("UPDATE articles SET unread = 1 WHERE id = ?",
883 [rows[i]]);
884 }
f1f2db64
AD
885 }
886 }
1572afe5
AD
887 }
888
889 if (rows.length > 0) {
890
46b84d29
AD
891 update_local_feedlist_counters();
892
b47b5af7
AD
893 var cmode = "";
894
895 if (set_state == undefined) {
896 cmode = "2";
897 } else if (set_state == true) {
898 cmode = "1";
899 } else if (set_state == false) {
900 cmode = "0";
901 }
902
b4e75b2a
AD
903 var query = "?op=rpc&subop=catchupSelected" +
904 "&cmode=" + cmode + "&ids=" + param_escape(rows.toString());
1572afe5 905
9ec58704
AD
906 notify_progress("Loading, please wait...");
907
b4e75b2a
AD
908 new Ajax.Request("backend.php", {
909 parameters: query,
1341ea0d
AD
910 onComplete: function(transport) {
911 catchup_callback2(transport, callback_func);
912 } });
1572afe5
AD
913
914 }
915
916 } catch (e) {
83f043bb 917 exception_error("selectionToggleUnread", e);
1572afe5
AD
918 }
919}
920
50eefedb 921function selectionToggleMarked() {
1572afe5 922 try {
1572afe5 923
b83d72b1 924 var rows = getSelectedArticleIds2();
386cbf27 925
9cc600d1
AD
926 if (rows.length == 0) {
927 alert(__("No articles are selected."));
928 return;
929 }
930
1572afe5 931 for (i = 0; i < rows.length; i++) {
f5e0338d 932 toggleMark(rows[i], true, true);
1572afe5
AD
933 }
934
46b84d29
AD
935 update_local_feedlist_counters();
936
1572afe5
AD
937 if (rows.length > 0) {
938
b4e75b2a 939 var query = "?op=rpc&subop=markSelected&ids=" +
1572afe5
AD
940 param_escape(rows.toString()) + "&cmode=2";
941
b4e75b2a
AD
942 new Ajax.Request("backend.php", {
943 parameters: query,
1341ea0d 944 onComplete: function(transport) {
f8fb4498 945 handle_rpc_reply(transport);
1341ea0d 946 } });
1572afe5
AD
947
948 }
949
950 } catch (e) {
83f043bb 951 exception_error("selectionToggleMarked", e);
1572afe5
AD
952 }
953}
954
50eefedb 955function selectionTogglePublished() {
e4f4b46f 956 try {
e4f4b46f 957
b83d72b1 958 var rows = getSelectedArticleIds2();
e4f4b46f
AD
959
960 if (rows.length == 0) {
961 alert(__("No articles are selected."));
962 return;
963 }
964
965 for (i = 0; i < rows.length; i++) {
f5e0338d 966 togglePub(rows[i], true, true);
e4f4b46f
AD
967 }
968
969 if (rows.length > 0) {
970
b4e75b2a 971 var query = "?op=rpc&subop=publishSelected&ids=" +
e4f4b46f
AD
972 param_escape(rows.toString()) + "&cmode=2";
973
b4e75b2a
AD
974 new Ajax.Request("backend.php", {
975 parameters: query,
1341ea0d 976 onComplete: function(transport) {
f8fb4498 977 handle_rpc_reply(transport);
1341ea0d 978 } });
e4f4b46f
AD
979
980 }
981
982 } catch (e) {
983 exception_error("selectionToggleMarked", e);
984 }
985}
986
e69fb880 987function getSelectedArticleIds2() {
386cbf27 988
ca8e3d75 989 var rv = [];
e69fb880 990
ca8e3d75
AD
991 $$("#headlinesInnerContainer > div[id*=RROW][class*=Selected]").each(
992 function(child) {
993 rv.push(child.id.replace("RROW-", ""));
994 });
386cbf27 995
ca8e3d75 996 return rv;
386cbf27
AD
997}
998
e69fb880 999function getLoadedArticleIds() {
ca8e3d75 1000 var rv = [];
8be83f42 1001
ca8e3d75 1002 var children = $$("#headlinesInnerContainer > div[id*=RROW-]");
3a40e8a2 1003
ca8e3d75
AD
1004 children.each(function(child) {
1005 rv.push(child.id.replace("RROW-", ""));
1006 });
8be83f42 1007
ca8e3d75 1008 return rv;
8be83f42 1009
8be83f42
AD
1010}
1011
e69fb880
AD
1012// mode = all,none,unread,invert
1013function selectArticles(mode) {
1014 try {
8be83f42 1015
ca8e3d75 1016 var children = $$("#headlinesInnerContainer > div[id*=RROW]");
06d1a1c1 1017
ca8e3d75
AD
1018 children.each(function(child) {
1019 var id = child.id.replace("RROW-", "");
1020 var cb = $("RCHK-" + id);
06d1a1c1 1021
ca8e3d75
AD
1022 if (mode == "all") {
1023 child.addClassName("Selected");
1024 cb.checked = true;
1025 } else if (mode == "unread") {
1026 if (child.hasClassName("Unread")) {
1027 child.addClassName("Selected");
1028 cb.checked = true;
e69fb880 1029 } else {
ca8e3d75 1030 child.removeClassName("Selected");
e69fb880 1031 cb.checked = false;
386cbf27 1032 }
ca8e3d75
AD
1033 } else if (mode == "invert") {
1034 if (child.hasClassName("Selected")) {
1035 child.removeClassName("Selected");
1036 cb.checked = false;
1037 } else {
1038 child.addClassName("Selected");
1039 cb.checked = true;
1040 }
1041
1042 } else {
1043 child.removeClassName("Selected");
1044 cb.checked = false;
1045 }
1046 });
e69fb880
AD
1047
1048 } catch (e) {
1049 exception_error("selectArticles", e);
386cbf27
AD
1050 }
1051}
1052
98bea1b1 1053function catchupPage() {
b47b5af7 1054
3d72bbdb 1055 var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
8a5b4579 1056
a5ae125a
AD
1057 var str = __("Mark all visible articles in %s as read?");
1058
1059 str = str.replace("%s", fn);
8a5b4579
AD
1060
1061 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
1062 return;
1063 }
1064
e69fb880
AD
1065 selectArticles('all');
1066 selectionToggleUnread(false, 'viewCurrentFeed()', true)
1067 selectArticles('none');
98bea1b1
AD
1068}
1069
e04c18a2
AD
1070function deleteSelection() {
1071
1072 try {
e04c18a2 1073
b83d72b1
AD
1074 var rows = getSelectedArticleIds2();
1075
e04c18a2
AD
1076 if (rows.length == 0) {
1077 alert(__("No articles are selected."));
1078 return;
1079 }
1080
e04c18a2
AD
1081 var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
1082 var str;
1083 var op;
1084
1085 if (getActiveFeedId() != 0) {
1086 str = __("Delete %d selected articles in %s?");
1087 } else {
1088 str = __("Delete %d selected articles?");
1089 }
1090
1091 str = str.replace("%d", rows.length);
1092 str = str.replace("%s", fn);
1093
1094 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
1095 return;
1096 }
1097
b4e75b2a 1098 query = "?op=rpc&subop=delete&ids=" + param_escape(rows);
e04c18a2 1099
84c7b824 1100 console.log(query);
e04c18a2 1101
b4e75b2a
AD
1102 new Ajax.Request("backend.php", {
1103 parameters: query,
e04c18a2
AD
1104 onComplete: function(transport) {
1105 viewCurrentFeed();
1106 } });
1107
1108 } catch (e) {
a12eb9c3 1109 exception_error("deleteSelection", e);
e04c18a2
AD
1110 }
1111}
1112
1113function archiveSelection() {
1114
1115 try {
1116
b83d72b1
AD
1117 var rows = getSelectedArticleIds2();
1118
e04c18a2
AD
1119 if (rows.length == 0) {
1120 alert(__("No articles are selected."));
1121 return;
1122 }
1123
e04c18a2
AD
1124 var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
1125 var str;
1126 var op;
1127
1128 if (getActiveFeedId() != 0) {
1129 str = __("Archive %d selected articles in %s?");
1130 op = "archive";
1131 } else {
1132 str = __("Move %d archived articles back?");
1133 op = "unarchive";
1134 }
1135
1136 str = str.replace("%d", rows.length);
1137 str = str.replace("%s", fn);
1138
1139 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
1140 return;
1141 }
1142
b4e75b2a 1143 query = "?op=rpc&subop="+op+"&ids=" + param_escape(rows);
e04c18a2 1144
84c7b824 1145 console.log(query);
e04c18a2 1146
a12eb9c3
AD
1147 for (var i = 0; i < rows.length; i++) {
1148 cache_invalidate(rows[i]);
1149 }
1150
b4e75b2a
AD
1151 new Ajax.Request("backend.php", {
1152 parameters: query,
e04c18a2
AD
1153 onComplete: function(transport) {
1154 viewCurrentFeed();
1155 } });
1156
1157 } catch (e) {
1158 exception_error("archiveSelection", e);
1159 }
1160}
1161
a5ae125a
AD
1162function catchupSelection() {
1163
1164 try {
1165
b83d72b1
AD
1166 var rows = getSelectedArticleIds2();
1167
a5ae125a
AD
1168 if (rows.length == 0) {
1169 alert(__("No articles are selected."));
1170 return;
1171 }
1172
3d72bbdb 1173 var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
a5ae125a 1174
ba5fac1b 1175 var str = __("Mark %d selected articles in %s as read?");
a5ae125a 1176
ba5fac1b 1177 str = str.replace("%d", rows.length);
a5ae125a
AD
1178 str = str.replace("%s", fn);
1179
1180 if (getInitParam("confirm_feed_catchup") == 1 && !confirm(str)) {
1181 return;
1182 }
1183
8cc5e965 1184 selectionToggleUnread(false, 'viewCurrentFeed()', true)
a5ae125a
AD
1185
1186 } catch (e) {
1187 exception_error("catchupSelection", e);
1188 }
1189}
1190
13f08f75 1191function editArticleTags(id, feed_id, cdm_enabled) {
542aebac
AL
1192 displayDlg('editArticleTags', id,
1193 function () {
126cd3c8
AD
1194 $("tags_str").focus();
1195
1196 new Ajax.Autocompleter('tags_str', 'tags_choices',
542aebac
AL
1197 "backend.php?op=rpc&subop=completeTags",
1198 { tokens: ',', paramName: "search" });
1199 });
0b126ac2
AD
1200}
1201
0b126ac2
AD
1202function editTagsSave() {
1203
42c32916 1204 notify_progress("Saving article tags...");
88040f57 1205
0b126ac2
AD
1206 var form = document.forms["tag_edit_form"];
1207
1208 var query = Form.serialize("tag_edit_form");
1209
b4e75b2a 1210 query = "?op=rpc&subop=setArticleTags&" + query;
14b6c54b 1211
f8fb4498 1212 //console.log(query);
14b6c54b 1213
b4e75b2a
AD
1214 new Ajax.Request("backend.php", {
1215 parameters: query,
2ef1af84 1216 onComplete: function(transport) {
a5819bb3 1217 try {
f8fb4498 1218 //console.log("tags saved...");
a5819bb3
AD
1219
1220 closeInfoBox();
1221 notify("");
1222
1223 if (tagsAreDisplayed()) {
1224 _reload_feedlist_after_view = true;
1225 }
1226
1227 if (transport.responseXML) {
1228 var tags_str = transport.responseXML.getElementsByTagName("tags-str")[0];
1229
1230 if (tags_str) {
1231 var id = tags_str.getAttribute("id");
1232
1233 if (id) {
1234 var tags = $("ATSTR-" + id);
1235 if (tags) {
1236 tags.innerHTML = tags_str.firstChild.nodeValue;
1237 }
bd3f2ade
AD
1238
1239 cache_invalidate(id);
a5819bb3
AD
1240 }
1241 }
1242 }
1243
1244 } catch (e) {
1245 exception_error("editTagsSave", e);
1246 }
2ef1af84 1247 } });
0b126ac2 1248}
d62a3b63
AD
1249
1250function editTagsInsert() {
1251 try {
1252
1253 var form = document.forms["tag_edit_form"];
1254
1255 var found_tags = form.found_tags;
1256 var tags_str = form.tags_str;
1257
1258 var tag = found_tags[found_tags.selectedIndex].value;
1259
1260 if (tags_str.value.length > 0 &&
1261 tags_str.value.lastIndexOf(", ") != tags_str.value.length - 2) {
1262
1263 tags_str.value = tags_str.value + ", ";
1264 }
1265
1266 tags_str.value = tags_str.value + tag + ", ";
1267
1268 found_tags.selectedIndex = 0;
1269
1270 } catch (e) {
438f2ce9 1271 exception_error("editTagsInsert", e);
d62a3b63
AD
1272 }
1273}
ba0978c8 1274
b8e6acea
AD
1275function cdmScrollToArticleId(id) {
1276 try {
acac8448
AD
1277 var ctr = $("headlinesInnerContainer");
1278 var e = $("RROW-" + id);
b8e6acea
AD
1279
1280 if (!e || !ctr) return;
1281
1282 ctr.scrollTop = e.offsetTop;
1283
1284 } catch (e) {
438f2ce9 1285 exception_error("cdmScrollToArticleId", e);
b8e6acea
AD
1286 }
1287}
1288
ba0978c8
AD
1289function cdmWatchdog() {
1290
1291 try {
1292
acac8448 1293 var ctr = $("headlinesInnerContainer");
ba0978c8 1294
9acd22e8
AD
1295 if (!ctr) return;
1296
ba0978c8
AD
1297 var ids = new Array();
1298
1299 var e = ctr.firstChild;
1300
1301 while (e) {
ca8e3d75 1302 if (e.className && e.hasClassName("Unread") && e.id &&
ba0978c8
AD
1303 e.id.match("RROW-")) {
1304
1305 // article fits in viewport OR article is longer than viewport and
1306 // its bottom is visible
1307
1308 if (ctr.scrollTop <= e.offsetTop && e.offsetTop + e.offsetHeight <=
1309 ctr.scrollTop + ctr.offsetHeight) {
1310
84c7b824 1311// console.log(e.id + " is visible " + e.offsetTop + "." +
ba0978c8
AD
1312// (e.offsetTop + e.offsetHeight) + " vs " + ctr.scrollTop + "." +
1313// (ctr.scrollTop + ctr.offsetHeight));
1314
1315 ids.push(e.id.replace("RROW-", ""));
1316
1317 } else if (e.offsetHeight > ctr.offsetHeight &&
1318 e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
1319 e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight) {
1320
1321 ids.push(e.id.replace("RROW-", ""));
1322
1323 }
1324
c50e2b30
AD
1325 // method 2: article bottom is visible and is in upper 1/2 of the viewport
1326
1327/* if (e.offsetTop + e.offsetHeight >= ctr.scrollTop &&
1328 e.offsetTop + e.offsetHeight <= ctr.scrollTop + ctr.offsetHeight/2) {
1329
1330 ids.push(e.id.replace("RROW-", ""));
1331
1332 } */
1333
ba0978c8
AD
1334 }
1335
1336 e = e.nextSibling;
1337 }
1338
84c7b824 1339 console.log("cdmWatchdog, ids= " + ids.toString());
ba0978c8 1340
1341ea0d 1341 if (ids.length > 0) {
ba0978c8
AD
1342
1343 for (var i = 0; i < ids.length; i++) {
acac8448 1344 var e = $("RROW-" + ids[i]);
ba0978c8 1345 if (e) {
ca8e3d75 1346 e.removeClassName("Unread");
ba0978c8
AD
1347 }
1348 }
1349
b4e75b2a
AD
1350 var query = "?op=rpc&subop=catchupSelected" +
1351 "&cmode=0" + "&ids=" + param_escape(ids.toString());
ba0978c8 1352
b4e75b2a
AD
1353 new Ajax.Request("backend.php", {
1354 parameters: query,
1341ea0d 1355 onComplete: function(transport) {
f8fb4498 1356 handle_rpc_reply(transport);
1341ea0d 1357 } });
ba0978c8
AD
1358
1359 }
1360
c50e2b30 1361 _cdm_wd_timeout = window.setTimeout("cdmWatchdog()", 4000);
ba0978c8
AD
1362
1363 } catch (e) {
438f2ce9 1364 exception_error("cdmWatchdog", e);
ba0978c8
AD
1365 }
1366
1367}
e097e8be
AD
1368
1369
e19c1824 1370function cache_inject(id, article, param) {
b39b57ac 1371
fb456d28
AD
1372 try {
1373 if (!cache_check_param(id, param)) {
f8fb4498 1374 //console.log("cache_article: miss: " + id + " [p=" + param + "]");
e097e8be 1375
b39b57ac
AD
1376 var date = new Date();
1377 var ts = Math.round(date.getTime() / 1000);
1378
1379 if (db) {
e097e8be 1380
fb456d28
AD
1381 db.execute("INSERT INTO cache (id, article, param, added) VALUES (?, ?, ?, ?)",
1382 [id, article, param, ts]);
1383 } else {
1384
ff0010c1 1385 var cache_obj = {};
fb456d28
AD
1386
1387 cache_obj["id"] = id;
1388 cache_obj["data"] = article;
1389 cache_obj["param"] = param;
ff0010c1
AD
1390
1391 if (param) id = id + ":" + param;
1392
b39b57ac
AD
1393 cache_added["TS:" + id] = ts;
1394
ff0010c1
AD
1395 if (has_local_storage())
1396 localStorage.setItem(id, JSON.stringify(cache_obj));
1397 else
1398 article_cache.push(cache_obj);
fb456d28
AD
1399 }
1400
1401 } else {
f8fb4498 1402 //console.log("cache_article: hit: " + id + " [p=" + param + "]");
fb456d28
AD
1403 }
1404 } catch (e) {
1405 exception_error("cache_inject", e);
e097e8be
AD
1406 }
1407}
1408
1409function cache_find(id) {
fb456d28
AD
1410
1411 if (db) {
31234407 1412 var rs = db.execute("SELECT article FROM cache WHERE id = ?", [id]);
03c96380 1413 var a = false;
31234407
AD
1414
1415 if (rs.isValidRow()) {
03c96380 1416 var a = rs.field(0);
31234407 1417 }
fb456d28 1418
03c96380
AD
1419 rs.close();
1420
1421 return a;
1422
fb456d28 1423 } else {
ff0010c1
AD
1424
1425 if (has_local_storage()) {
1426 var cache_obj = localStorage.getItem(id);
1427
1428 if (cache_obj) {
1429 cache_obj = JSON.parse(cache_obj);
1430
1431 if (cache_obj)
1432 return cache_obj['data'];
1433 }
1434
1435 } else {
1436 for (var i = 0; i < article_cache.length; i++) {
1437 if (article_cache[i]["id"] == id) {
1438 return article_cache[i]["data"];
1439 }
fb456d28 1440 }
fed4387d 1441 }
e097e8be 1442 }
fed4387d 1443 return false;
e097e8be
AD
1444}
1445
5d17ead9 1446function cache_find_param(id, param) {
fb456d28
AD
1447
1448 if (db) {
1449 var rs = db.execute("SELECT article FROM cache WHERE id = ? AND param = ?",
1450 [id, param]);
03c96380 1451 var a = false;
fb456d28
AD
1452
1453 if (rs.isValidRow()) {
03c96380 1454 a = rs.field(0);
fb456d28
AD
1455 }
1456
03c96380
AD
1457 rs.close();
1458
1459 return a;
1460
fb456d28 1461 } else {
ff0010c1
AD
1462
1463 if (has_local_storage()) {
b39b57ac
AD
1464
1465 if (param) id = id + ":" + param;
1466
1467 var cache_obj = localStorage.getItem(id);
ff0010c1
AD
1468
1469 if (cache_obj) {
1470 cache_obj = JSON.parse(cache_obj);
1471
1472 if (cache_obj)
1473 return cache_obj['data'];
1474 }
1475
1476 } else {
1477 for (var i = 0; i < article_cache.length; i++) {
1478 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1479 return article_cache[i]["data"];
1480 }
fb456d28 1481 }
e19c1824
AD
1482 }
1483 }
1484 return false;
1485}
1486
e097e8be 1487function cache_check(id) {
fb456d28
AD
1488
1489 if (db) {
1490 var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ?",
1491 [id]);
03c96380 1492 var a = false;
fb456d28
AD
1493
1494 if (rs.isValidRow()) {
03c96380 1495 a = rs.field(0) != "0";
fb456d28
AD
1496 }
1497
03c96380
AD
1498 rs.close();
1499
1500 return a;
1501
fb456d28 1502 } else {
b39b57ac 1503 if (has_local_storage()) {
ff0010c1 1504 if (localStorage.getItem(id))
b39b57ac 1505 return true;
ff0010c1
AD
1506 } else {
1507 for (var i = 0; i < article_cache.length; i++) {
1508 if (article_cache[i]["id"] == id) {
1509 return true;
1510 }
fb456d28 1511 }
fed4387d
AD
1512 }
1513 }
1514 return false;
e097e8be
AD
1515}
1516
e19c1824 1517function cache_check_param(id, param) {
5d17ead9 1518
fb456d28
AD
1519 if (db) {
1520 var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ? AND param = ?",
1521 [id, param]);
03c96380 1522 var a = false;
5d17ead9 1523
fb456d28 1524 if (rs.isValidRow()) {
03c96380 1525 a = rs.field(0) != "0";
fb456d28
AD
1526 }
1527
03c96380
AD
1528 rs.close();
1529
1530 return a;
1531
fb456d28 1532 } else {
ff0010c1 1533
b39b57ac
AD
1534 if (has_local_storage()) {
1535
1536 if (param) id = id + ":" + param;
1537
1538 if (localStorage.getItem(id))
1539 return true;
1540
ff0010c1
AD
1541 } else {
1542 for (var i = 0; i < article_cache.length; i++) {
1543 if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
1544 return true;
1545 }
fb456d28 1546 }
e19c1824
AD
1547 }
1548 }
1549 return false;
1550}
1551
e097e8be 1552function cache_expire() {
31234407
AD
1553 if (db) {
1554 var date = new Date();
1555 var ts = Math.round(date.getTime() / 1000);
1556
e0999d95
AD
1557 db.execute("DELETE FROM cache WHERE added < ? - 1800 AND id LIKE 'FEEDLIST'", [ts]);
1558 db.execute("DELETE FROM cache WHERE added < ? - 600 AND (id LIKE 'F:%' OR id LIKE 'C:%')", [ts]);
1559 db.execute("DELETE FROM cache WHERE added < ? - 86400", [ts]);
1560
31234407
AD
1561
1562 } else {
ff0010c1 1563 if (has_local_storage()) {
b39b57ac
AD
1564
1565 var date = new Date();
1566 var timestamp = Math.round(date.getTime() / 1000);
1567
905ff52a 1568 for (var i = 0; i < localStorage.length; i++) {
23d064cc 1569
905ff52a 1570 var id = localStorage.key(i);
23d064cc 1571
905ff52a
AD
1572 if (timestamp - cache_added["TS:" + id] > 180) {
1573 localStorage.removeItem(id);
b39b57ac 1574 }
ff0010c1 1575 }
b39b57ac 1576
ff0010c1
AD
1577 } else {
1578 while (article_cache.length > 25) {
1579 article_cache.shift();
1580 }
fb456d28 1581 }
fed4387d 1582 }
e097e8be 1583}
b07b61da 1584
641444d3 1585function cache_flush() {
5225d420
AD
1586 if (db) {
1587 db.execute("DELETE FROM cache");
1588 } else if (has_local_storage()) {
1589 localStorage.clear();
1590 } else {
1591 article_cache = new Array();
1592 }
3c2d7945
AD
1593}
1594
b07b61da 1595function cache_invalidate(id) {
c1b18749
AD
1596 try {
1597
fb456d28
AD
1598 if (db) {
1599 rs = db.execute("DELETE FROM cache WHERE id = ?", [id]);
1600 return rs.rowsAffected != 0;
1601 } else {
1602
ff0010c1 1603 if (has_local_storage()) {
fb456d28 1604
b39b57ac
AD
1605 var found = false;
1606
905ff52a
AD
1607 for (var i = 0; i < localStorage.length; i++) {
1608 var key = localStorage.key(i);
b39b57ac
AD
1609
1610// console.warn("cache_invalidate: " + key_id + " cmp " + id);
ff0010c1 1611
905ff52a
AD
1612 if (key == id || key.indexOf(id + ":") == 0) {
1613 localStorage.removeItem(key);
b39b57ac
AD
1614 found = true;
1615 break;
b39b57ac 1616 }
ff0010c1 1617 }
b39b57ac 1618
b39b57ac
AD
1619 return found;
1620
ff0010c1
AD
1621 } else {
1622 var i = 0
1623
1624 while (i < article_cache.length) {
1625 if (article_cache[i]["id"] == id) {
f8fb4498 1626 //console.log("cache_invalidate: removed id " + id);
ff0010c1
AD
1627 article_cache.splice(i, 1);
1628 return true;
1629 }
1630 i++;
fb456d28 1631 }
c1b18749 1632 }
b07b61da 1633 }
fb456d28 1634
f8fb4498 1635 //console.log("cache_invalidate: id not found: " + id);
c1b18749
AD
1636 return false;
1637 } catch (e) {
1638 exception_error("cache_invalidate", e);
b07b61da 1639 }
b07b61da 1640}
298f3f78
AD
1641
1642function getActiveArticleId() {
1643 return active_post_id;
1644}
e4914b62 1645
b39b57ac
AD
1646function preloadBatchedArticles() {
1647 try {
1648
1649 var query = "?op=rpc&subop=getArticles&ids=" +
1650 preload_id_batch.toString();
1651
1652 new Ajax.Request("backend.php", {
1653 parameters: query,
1654 onComplete: function(transport) {
1655
1656 preload_id_batch = [];
1657
1658 var articles = transport.responseXML.getElementsByTagName("article");
1659
1660 for (var i = 0; i < articles.length; i++) {
1661 var id = articles[i].getAttribute("id");
1662 if (!cache_check(id)) {
1663 cache_inject(id, articles[i].firstChild.nodeValue);
1664 console.log("preloaded article: " + id);
1665 }
1666 }
1667 } });
1668
1669 } catch (e) {
1670 exception_error("preloadBatchedArticles", e);
1671 }
1672}
1673
aa0fa9df
AD
1674function preloadArticleUnderPointer(id) {
1675 try {
a598370d
AD
1676 if (getInitParam("bw_limit") == "1") return;
1677
b2bb787c 1678 if (post_under_pointer == id && !cache_check(id)) {
aa0fa9df 1679
84c7b824 1680 console.log("trying to preload article " + id);
aa0fa9df
AD
1681
1682 var neighbor_ids = getRelativePostIds(id, 1);
1683
1684 /* only request uncached articles */
1685
b39b57ac
AD
1686 if (preload_id_batch.indexOf(id) == -1) {
1687 for (var i = 0; i < neighbor_ids.length; i++) {
1688 if (!cache_check(neighbor_ids[i])) {
1689 preload_id_batch.push(neighbor_ids[i]);
1690 }
aa0fa9df
AD
1691 }
1692 }
aa0fa9df 1693
b39b57ac
AD
1694 if (preload_id_batch.indexOf(id) == -1)
1695 preload_id_batch.push(id);
aa0fa9df 1696
f8fb4498 1697 //console.log("preload ids batch: " + preload_id_batch.toString());
b4e75b2a 1698
b39b57ac
AD
1699 window.clearTimeout(preload_timeout_id);
1700 preload_batch_timeout_id = window.setTimeout('preloadBatchedArticles()', 1000);
a5819bb3 1701
aa0fa9df
AD
1702 }
1703 } catch (e) {
1704 exception_error("preloadArticleUnderPointer", e);
1705 }
1706}
1707
314fcd2b
AD
1708function postMouseIn(id) {
1709 try {
aa0fa9df
AD
1710 if (post_under_pointer != id) {
1711 post_under_pointer = id;
1712 if (!isCdmMode()) {
1713 window.setTimeout("preloadArticleUnderPointer(" + id + ")", 250);
1714 }
1715 }
1716
314fcd2b
AD
1717 } catch (e) {
1718 exception_error("postMouseIn", e);
1719 }
1720}
1721
1722function postMouseOut(id) {
1723 try {
1724 post_under_pointer = false;
1725 } catch (e) {
1726 exception_error("postMouseOut", e);
1727 }
1728}
1729
ac541432
AD
1730function headlines_scroll_handler() {
1731 try {
1732
acac8448 1733 var e = $("headlinesInnerContainer");
ac541432 1734
4764c27e
AD
1735 var toolbar_form = document.forms["main_toolbar_form"];
1736
dad14b51
AD
1737// console.log((e.scrollTop + e.offsetHeight) + " vs " + e.scrollHeight + " dis? " +
1738// _infscroll_disable);
587bef10 1739
6f068202
AD
1740 if (e.scrollTop + e.offsetHeight > e.scrollHeight - 100) {
1741 if (!_infscroll_disable) {
6f068202 1742 viewNextFeedPage();
29dfb258 1743 }
ac541432
AD
1744 }
1745
1746 } catch (e) {
1747 exception_error("headlines_scroll_handler", e);
1748 }
1749}
8be83f42
AD
1750
1751function catchupRelativeToArticle(below) {
1752
1753 try {
1754
49fd1e94 1755
8be83f42
AD
1756 if (!getActiveArticleId()) {
1757 alert(__("No article is selected."));
1758 return;
1759 }
1760
e69fb880 1761 var visible_ids = getVisibleArticleIds();
8be83f42
AD
1762
1763 var ids_to_mark = new Array();
1764
1765 if (!below) {
1766 for (var i = 0; i < visible_ids.length; i++) {
1767 if (visible_ids[i] != getActiveArticleId()) {
acac8448 1768 var e = $("RROW-" + visible_ids[i]);
8be83f42 1769
ca8e3d75 1770 if (e && e.hasClassName("Unread")) {
8be83f42
AD
1771 ids_to_mark.push(visible_ids[i]);
1772 }
1773 } else {
1774 break;
1775 }
1776 }
1777 } else {
1778 for (var i = visible_ids.length-1; i >= 0; i--) {
1779 if (visible_ids[i] != getActiveArticleId()) {
acac8448 1780 var e = $("RROW-" + visible_ids[i]);
8be83f42 1781
ca8e3d75 1782 if (e && e.hasClassName("Unread")) {
8be83f42
AD
1783 ids_to_mark.push(visible_ids[i]);
1784 }
1785 } else {
1786 break;
1787 }
1788 }
1789 }
1790
1791 if (ids_to_mark.length == 0) {
1792 alert(__("No articles found to mark"));
1793 } else {
1794 var msg = __("Mark %d article(s) as read?").replace("%d", ids_to_mark.length);
1795
fb45339a 1796 if (getInitParam("confirm_feed_catchup") != 1 || confirm(msg)) {
8be83f42
AD
1797
1798 for (var i = 0; i < ids_to_mark.length; i++) {
acac8448 1799 var e = $("RROW-" + ids_to_mark[i]);
ca8e3d75 1800 e.removeClassName("Unread");
8be83f42
AD
1801 }
1802
b4e75b2a
AD
1803 var query = "?op=rpc&subop=catchupSelected" +
1804 "&cmode=0" + "&ids=" + param_escape(ids_to_mark.toString());
8be83f42 1805
b4e75b2a
AD
1806 new Ajax.Request("backend.php", {
1807 parameters: query,
5fe7767c
AD
1808 onComplete: function(transport) {
1809 catchup_callback2(transport);
1810 } });
1811
8be83f42
AD
1812 }
1813 }
1814
1815 } catch (e) {
1816 exception_error("catchupRelativeToArticle", e);
1817 }
1818}
a04c8e8d 1819
dad14b51 1820function cdmExpandArticle(id) {
a04c8e8d 1821 try {
a04c8e8d 1822
e69fb880
AD
1823 hideAuxDlg();
1824
dad14b51 1825 var elem = $("CICD-" + active_post_id);
3cd4239a 1826
62b800b4
AD
1827 var upd_img_pic = $("FUPDPIC-" + id);
1828
1829 if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
1830 upd_img_pic.src.match("fresh_sign.png"))) {
1831
1832 upd_img_pic.src = "images/blank_icon.gif";
1833 }
1834
dad14b51
AD
1835 if (id == active_post_id && Element.visible(elem))
1836 return true;
1837
e69fb880 1838 selectArticles("none");
dad14b51
AD
1839
1840 var old_offset = $("RROW-" + id).offsetTop;
1841
5ae8f858 1842 if (active_post_id && elem && !getInitParam("cdm_expanded")) {
dad14b51
AD
1843 Element.hide(elem);
1844 Element.show("CEXC-" + active_post_id);
1845 }
a04c8e8d 1846
dad14b51 1847 active_post_id = id;
a04c8e8d 1848
dad14b51
AD
1849 elem = $("CICD-" + id);
1850
1851 if (!Element.visible(elem)) {
1852 Element.show(elem);
1853 Element.hide("CEXC-" + id);
dd1c0680 1854
20f16e71 1855 if ($("CWRAP-" + id).innerHTML == "") {
dd1c0680 1856
20f16e71 1857 $("FUPDPIC-" + id).src = "images/indicator_tiny.gif";
dd1c0680 1858
20f16e71
AD
1859 $("CWRAP-" + id).innerHTML = "<div class=\"insensitive\">" +
1860 __("Loading, please wait...") + "</div>";
1861
1862 var query = "?op=rpc&subop=cdmGetArticle&id=" + param_escape(id);
1863
1864 //console.log(query);
1865
1866 new Ajax.Request("backend.php", {
1867 parameters: query,
1868 onComplete: function(transport) {
1869 $("FUPDPIC-" + id).src = 'images/blank_icon.gif';
1870
1871 if (transport.responseXML) {
1872 var article = transport.responseXML.getElementsByTagName("article")[0];
1873 var recv_id = article.getAttribute("id");
1874
1875 if (recv_id == id)
1876 $("CWRAP-" + id).innerHTML = article.firstChild.nodeValue;
1877
1878 } else {
1879 $("CWRAP-" + id).innerHTML = __("Unable to load article.");
1880
1881 }
1882 }});
1883
1884 }
dad14b51
AD
1885 }
1886
1887 var new_offset = $("RROW-" + id).offsetTop;
1888
1889 $("headlinesInnerContainer").scrollTop += (new_offset-old_offset);
1890
1891 if ($("RROW-" + id).offsetTop != old_offset)
1892 $("headlinesInnerContainer").scrollTop = new_offset;
1893
1894 toggleUnread(id, 0, true);
1895 toggleSelected(id);
a04c8e8d
AD
1896
1897 } catch (e) {
d5ed5446 1898 exception_error("cdmExpandArticle", e);
a04c8e8d
AD
1899 }
1900
dad14b51 1901 return false;
a04c8e8d
AD
1902}
1903
3818a89b
AD
1904function fixHeadlinesOrder(ids) {
1905 try {
1906 for (var i = 0; i < ids.length; i++) {
acac8448 1907 var e = $("RROW-" + ids[i]);
3818a89b
AD
1908
1909 if (e) {
1910 if (i % 2 == 0) {
ca8e3d75
AD
1911 e.removeClassName("even");
1912 e.addClassName("odd");
3818a89b 1913 } else {
ca8e3d75
AD
1914 e.removeClassName("odd");
1915 e.addClassName("even");
3818a89b
AD
1916 }
1917 }
1918 }
1919 } catch (e) {
1920 exception_error("fixHeadlinesOrder", e);
1921 }
1922}
1923
314fcd2b
AD
1924function getArticleUnderPointer() {
1925 return post_under_pointer;
7a822893 1926}
eedfb635
AD
1927
1928function zoomToArticle(id) {
1929 try {
1930 var w = window.open("backend.php?op=view&mode=zoom&id=" + param_escape(id),
1931 "ttrss_zoom_" + id,
1932 "status=0,toolbar=0,location=0,width=450,height=300,scrollbars=1,menubar=0");
1933
1934 } catch (e) {
1935 exception_error("zoomToArticle", e);
1936 }
1937}
a411875b
AD
1938
1939function scrollArticle(offset) {
1940 try {
1941 if (!isCdmMode()) {
acac8448 1942 var ci = $("content-insert");
a411875b
AD
1943 if (ci) {
1944 ci.scrollTop += offset;
1945 }
1946 } else {
acac8448 1947 var hi = $("headlinesInnerContainer");
a411875b
AD
1948 if (hi) {
1949 hi.scrollTop += offset;
1950 }
1951
1952 }
1953 } catch (e) {
1954 exception_error("scrollArticle", e);
1955 }
1956}
f9247195
AD
1957
1958function show_labels_in_headlines(transport) {
1959 try {
1960 if (transport.responseXML) {
1961 var info = transport.responseXML.getElementsByTagName("info-for-headlines")[0];
1962
1963 var elems = info.getElementsByTagName("entry");
1964
1965 for (var l = 0; l < elems.length; l++) {
1966 var e_id = elems[l].getAttribute("id");
1967
1968 if (e_id) {
1969
acac8448 1970 var ctr = $("HLLCTR-" + e_id);
f9247195
AD
1971
1972 if (ctr) {
1973 ctr.innerHTML = elems[l].firstChild.nodeValue;
1974 }
1975 }
1976
1977 }
1978
1979 }
1980 } catch (e) {
1981 exception_error("show_labels_in_headlines", e);
1982
1983 }
1984}
bf3c9838
AD
1985
1986function toggleHeadlineActions() {
1987 try {
acac8448
AD
1988 var e = $("headlineActionsBody");
1989 var p = $("headlineActionsDrop");
bf3c9838
AD
1990
1991 if (!Element.visible(e)) {
1992 Element.show(e);
1993 } else {
1994 Element.hide(e);
1995 }
1996
b62f6ff4 1997 e.scrollTop = 0;
bf3c9838 1998 e.style.left = (p.offsetLeft + 1) + "px";
b4dc02e2 1999 e.style.top = (p.offsetTop + p.offsetHeight + 2) + "px";
bf3c9838
AD
2000
2001 } catch (e) {
2002 exception_error("toggleHeadlineActions", e);
2003 }
2004}
c7e51de1
AD
2005
2006function publishWithNote(id, def_note) {
2007 try {
2008 if (!def_note) def_note = '';
2009
2010 var note = prompt(__("Please enter a note for this article:"), def_note);
2011
2012 if (note != undefined) {
2013 togglePub(id, false, false, note);
2014 }
2015
2016 } catch (e) {
2017 exception_error("publishWithNote", e);
2018 }
2019}
31a53903
AD
2020
2021function emailArticle(id) {
2022 try {
f72a7b66
AD
2023 if (!id) {
2024 var ids = getSelectedArticleIds2();
2025
2026 if (ids.length == 0) {
2027 alert(__("No articles are selected."));
2028 return;
2029 }
2030
2031 id = ids.toString();
2032 }
2033
31a53903
AD
2034 displayDlg('emailArticle', id,
2035 function () {
2036 document.forms['article_email_form'].destination.focus();
2037
2038 new Ajax.Autocompleter('destination', 'destination_choices',
2039 "backend.php?op=rpc&subop=completeEmails",
2040 { tokens: '', paramName: "search" });
2041
2042 });
2043
2044 } catch (e) {
2045 exception_error("emailArticle", e);
2046 }
2047}
2048
f72a7b66 2049function emailArticleDo() {
31a53903
AD
2050 try {
2051 var f = document.forms['article_email_form'];
2052
2053 if (f.destination.value == "") {
2054 alert("Please fill in the destination email.");
2055 return;
2056 }
2057
2058 if (f.subject.value == "") {
2059 alert("Please fill in the subject.");
2060 return;
2061 }
2062
2063 var query = Form.serialize("article_email_form");
2064
2065// console.log(query);
2066
2067 new Ajax.Request("backend.php", {
2068 parameters: query,
2069 onComplete: function(transport) {
2070 try {
2071
2072 var error = transport.responseXML.getElementsByTagName('error')[0];
2073
2074 if (error) {
2075 alert(__('Error sending email:') + ' ' + error.firstChild.nodeValue);
2076 } else {
2077 notify_info('Your message has been sent.');
2078 closeInfoBox();
2079 }
2080
2081 } catch (e) {
2082 exception_error("sendEmailDo", e);
2083 }
2084
2085 } });
2086
2087 } catch (e) {
2088 exception_error("emailArticleDo", e);
2089 }
2090}
dad14b51 2091
1ede5814 2092function dismissArticle(id) {
dad14b51
AD
2093 try {
2094 var elem = $("RROW-" + id);
2095
2096 toggleUnread(id, 0, true);
2097
2098 new Effect.Fade(elem, {duration : 0.5});
2099
35c0e3a2
AD
2100 active_post_id = false;
2101
dad14b51 2102 } catch (e) {
1ede5814 2103 exception_error("dismissArticle", e);
dad14b51
AD
2104 }
2105}
bfa0e792 2106
1ede5814 2107function dismissSelectedArticles() {
bfa0e792
AD
2108 try {
2109
e69fb880
AD
2110 var ids = getVisibleArticleIds();
2111 var tmp = [];
2112 var sel = [];
bfa0e792
AD
2113
2114 for (var i = 0; i < ids.length; i++) {
2115 var elem = $("RROW-" + ids[i]);
e69fb880 2116
ca8e3d75 2117 if (elem.className && elem.hasClassName("Selected") &&
35c0e3a2 2118 ids[i] != active_post_id) {
e69fb880
AD
2119 new Effect.Fade(elem, {duration : 0.5});
2120 sel.push(ids[i]);
2121 } else {
2122 tmp.push(ids[i]);
2123 }
bfa0e792
AD
2124 }
2125
e69fb880 2126 if (sel.length > 0)
bfa0e792
AD
2127 selectionToggleUnread(false);
2128
e69fb880
AD
2129 fixHeadlinesOrder(tmp);
2130
bfa0e792 2131 } catch (e) {
1ede5814 2132 exception_error("dismissSelectedArticles", e);
bfa0e792
AD
2133 }
2134}
1ede5814
AD
2135
2136function dismissReadArticles() {
2137 try {
2138
2139 var ids = getVisibleArticleIds();
e69fb880 2140 var tmp = [];
1ede5814
AD
2141
2142 for (var i = 0; i < ids.length; i++) {
2143 var elem = $("RROW-" + ids[i]);
2144
ca8e3d75
AD
2145 if (elem.className && !elem.hasClassName("Unread") &&
2146 !elem.hasClassName("Selected")) {
1ede5814
AD
2147
2148 new Effect.Fade(elem, {duration : 0.5});
e69fb880
AD
2149 } else {
2150 tmp.push(ids[i]);
1ede5814
AD
2151 }
2152 }
2153
e69fb880
AD
2154 fixHeadlinesOrder(tmp);
2155
1ede5814
AD
2156 } catch (e) {
2157 exception_error("dismissSelectedArticles", e);
2158 }
2159}
2160
2161function getVisibleArticleIds() {
e69fb880
AD
2162 var ids = [];
2163
1ede5814 2164 try {
ca8e3d75
AD
2165
2166 getLoadedArticleIds().each(function(id) {
2167 var elem = $("RROW-" + id);
e69fb880 2168 if (elem && Element.visible(elem))
ca8e3d75
AD
2169 ids.push(id);
2170 });
e69fb880 2171
1ede5814 2172 } catch (e) {
e69fb880 2173 exception_error("getVisibleArticleIds", e);
1ede5814 2174 }
e69fb880
AD
2175
2176 return ids;
1ede5814
AD
2177}
2178
2179function cdmClicked(event, id) {
2180 try {
2181 var shift_key = event.shiftKey;
2182
e69fb880
AD
2183 hideAuxDlg();
2184
1ede5814 2185 if (!event.ctrlKey) {
e69fb880 2186 selectArticles("none");
1ede5814
AD
2187 toggleSelected(id);
2188
2189 var elem = $("RROW-" + id);
2190
2191 if (elem)
ca8e3d75 2192 elem.removeClassName("Unread");
1ede5814 2193
62b800b4
AD
2194 var upd_img_pic = $("FUPDPIC-" + id);
2195
2196 if (upd_img_pic && (upd_img_pic.src.match("updated.png") ||
2197 upd_img_pic.src.match("fresh_sign.png"))) {
2198
2199 upd_img_pic.src = "images/blank_icon.gif";
2200 }
2201
ca8e3d75
AD
2202 active_post_id = id;
2203
1ede5814
AD
2204 var query = "?op=rpc&subop=catchupSelected" +
2205 "&cmode=0&ids=" + param_escape(id);
2206
2207 new Ajax.Request("backend.php", {
2208 parameters: query,
2209 onComplete: function(transport) {
2210 handle_rpc_reply(transport);
2211 } });
2212
a627ae35 2213 return true;
1ede5814
AD
2214 } else {
2215 toggleSelected(id);
2216 }
2217
2218 } catch (e) {
2219 exception_error("cdmClicked");
2220 }
2221
2222 return false;
2223}
2224
2225function hlClicked(event, id) {
2226 try {
1ede5814
AD
2227
2228 if (!event.ctrlKey) {
2229 view(id);
3974aad8 2230 return true;
1ede5814
AD
2231 } else {
2232 toggleSelected(id);
3974aad8 2233 return false;
1ede5814
AD
2234 }
2235
2236 } catch (e) {
2237 exception_error("hlClicked");
2238 }
2239
2240 return false;
2241}
e69fb880
AD
2242
2243function getFirstVisibleHeadlineId() {
2244 var rows = getVisibleArticleIds();
2245 return rows[0];
2246
2247}
2248
2249function getLastVisibleHeadlineId() {
2250 var rows = getVisibleArticleIds();
2251 return rows[rows.length-1];
2252}
2253
e69fb880
AD
2254function openArticleInNewWindow(id) {
2255 try {
2256 console.log("openArticleInNewWindow: " + id);
2257
2258 var query = "?op=rpc&subop=getArticleLink&id=" + id;
2259 var wname = "ttrss_article_" + id;
2260
2261 console.log(query + " " + wname);
2262
2263 var w = window.open("", wname);
2264
2265 if (!w) notify_error("Failed to open window for the article");
2266
2267 new Ajax.Request("backend.php", {
2268 parameters: query,
2269 onComplete: function(transport) {
2270
2271 var link = transport.responseXML.getElementsByTagName("link")[0];
2272 var id = transport.responseXML.getElementsByTagName("id")[0];
2273
2274 console.log("open_article received link: " + link);
2275
2276 if (link && id) {
2277
2278 var wname = "ttrss_article_" + id.firstChild.nodeValue;
2279
2280 console.log("link url: " + link.firstChild.nodeValue + ", wname " + wname);
2281
2282 var w = window.open(link.firstChild.nodeValue, wname);
2283
2284 if (!w) { notify_error("Failed to load article in new window"); }
2285
2286 if (id) {
2287 id = id.firstChild.nodeValue;
8cc5e965 2288 window.setTimeout("toggleUnread(" + id + ", 0)", 100);
e69fb880
AD
2289 }
2290 } else {
2291 notify_error("Can't open article: received invalid article link");
2292 }
2293 } });
2294
2295 } catch (e) {
2296 exception_error("openArticleInNewWindow", e);
2297 }
2298}
2299
2300function isCdmMode() {
8cc5e965 2301 return getInitParam("combined_display_mode");
e69fb880
AD
2302}
2303
2304function markHeadline(id) {
2305 var row = $("RROW-" + id);
2306 if (row) {
e69fb880
AD
2307 var check = $("RCHK-" + id);
2308
2309 if (check) {
2310 check.checked = true;
2311 }
2312
ca8e3d75 2313 row.addClassName("Selected");
e69fb880
AD
2314 }
2315}
2316
8cc5e965
AD
2317function getRelativePostIds(id, limit) {
2318
2319 var tmp = [];
2320
2321 try {
2322
2323 if (!limit) limit = 3;
2324
2325 var ids = getVisibleArticleIds();
2326
2327 for (var i = 0; i < ids.length; i++) {
2328 if (ids[i] == id) {
2329 for (var k = 1; k <= limit; k++) {
2330 if (i > k-1) tmp.push(ids[i-k]);
2331 if (i < ids.length-k) tmp.push(ids[i+k]);
2332 }
2333 break;
2334 }
2335 }
2336
2337 } catch (e) {
2338 exception_error("getRelativePostIds", e);
2339 }
2340
2341 return tmp;
2342}
2343
2344function correctHeadlinesOffset(id) {
2345
2346 try {
2347
2348 var container = $("headlinesInnerContainer");
2349 var row = $("RROW-" + id);
2350
2351 var viewport = container.offsetHeight;
2352
2353 var rel_offset_top = row.offsetTop - container.scrollTop;
2354 var rel_offset_bottom = row.offsetTop + row.offsetHeight - container.scrollTop;
2355
2356 //console.log("Rtop: " + rel_offset_top + " Rbtm: " + rel_offset_bottom);
2357 //console.log("Vport: " + viewport);
2358
2359 if (rel_offset_top <= 0 || rel_offset_top > viewport) {
2360 container.scrollTop = row.offsetTop;
2361 } else if (rel_offset_bottom > viewport) {
2362
2363 /* doesn't properly work with Opera in some cases because
2364 Opera fucks up element scrolling */
2365
2366 container.scrollTop = row.offsetTop + row.offsetHeight - viewport;
2367 }
2368
2369 } catch (e) {
2370 exception_error("correctHeadlinesOffset", e);
2371 }
2372
2373}
2374
e69fb880 2375