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