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