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