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