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