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