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