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