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