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