]> git.wh0rd.org - tt-rss.git/blame - digest.js
sort feeds list by unread; support fatal error messages and login redirects
[tt-rss.git] / digest.js
CommitLineData
c01f40f4
AD
1var last_feeds = [];
2
1ca8997b
AD
3var _active_feed_id = false;
4var _active_feed_offset = false;
118e9399 5var _update_timeout = false;
1ca8997b 6
d5d56329
AD
7function catchup_article(article_id, callback) {
8 try {
9 var query = "?op=rpc&subop=catchupSelected" +
10 "&cmode=0&ids=" + article_id;
11
12 new Ajax.Request("backend.php", {
13 parameters: query,
14 onComplete: function(transport) {
15 if (callback) callback(transport);
16 } });
17
18 } catch (e) {
19 exception_error("catchup_article", e);
20 }
21}
22
23function set_selected_feed(feed_id) {
11a7a966
AD
24 try {
25 var feeds = $("feeds-content").getElementsByTagName("LI");
26
27 for (var i = 0; i < feeds.length; i++) {
28 if (feeds[i].id == "F-" + feed_id)
29 feeds[i].className = "selected";
30 else
31 feeds[i].className = "";
32 }
33
d5d56329
AD
34 _active_feed_id = feed_id;
35
11a7a966
AD
36 } catch (e) {
37 exception_error("mark_selected_feed", e);
38 }
39}
40
118e9399 41function zoom(article_id) {
22933e5e 42 try {
118e9399 43 var elem = $('A-' + article_id);
22933e5e 44
118e9399
AD
45 if (elem) {
46 var divs = elem.getElementsByTagName('DIV');
47
48 for (var i = 0; i < divs.length; i++) {
49 if (divs[i].className == 'excerpt')
50 Element.hide(divs[i]);
51
52 if (divs[i].className == 'content')
53 Element.show(divs[i]);
54 }
55 }
56
d5d56329
AD
57 catchup_article(article_id,
58 function() { update(); });
118e9399
AD
59
60 } catch (e) {
61 exception_error("zoom", e);
62 }
63}
64
65function load_more() {
66 try {
118e9399
AD
67 viewfeed(_active_feed_id, _active_feed_offset + 10);
68 } catch (e) {
69 exception_error("load_more", e);
70 }
71}
72
73function update() {
74 try {
d5d56329
AD
75 console.log('updating feeds...');
76
77 window.clearTimeout(_update_timeout);
78
79 new Ajax.Request("backend.php", {
80 parameters: "?op=rpc&subop=digest-init",
81 onComplete: function(transport) {
e0cebf2a 82 fatal_error_check(transport);
d5d56329
AD
83 parse_feeds(transport);
84 set_selected_feed(_active_feed_id);
85 } });
86
87 _update_timeout = window.setTimeout('update()', 5*1000);
118e9399
AD
88 } catch (e) {
89 exception_error("update", e);
90 }
91}
92
d5d56329 93function remove_headline_entry(article_id) {
118e9399
AD
94 try {
95 var elem = $('A-' + article_id);
96
d5d56329
AD
97 if (elem) {
98 elem.parentNode.removeChild(elem);
99 }
118e9399 100
d5d56329
AD
101 } catch (e) {
102 exception_error("remove_headline_entry", e);
103 }
104}
118e9399 105
d5d56329
AD
106function view(article_id, dismiss_only) {
107 try {
108 remove_headline_entry(article_id);
118e9399 109
d5d56329
AD
110 catchup_article(article_id,
111 function() { update(); });
118e9399
AD
112
113 return dismiss_only != true;
22933e5e
AD
114 } catch (e) {
115 exception_error("view", e);
116 }
117}
118
1ca8997b 119function viewfeed(feed_id, offset) {
b41c2549
AD
120 try {
121
1ca8997b
AD
122 if (!feed_id) feed_id = _active_feed_id;
123
d5d56329 124 if (!offset) {
1ca8997b 125 offset = 0;
d5d56329 126 } else {
1ca8997b 127 offset = _active_feed_offset + offset;
d5d56329 128 }
1ca8997b
AD
129
130 var query = "backend.php?op=rpc&subop=digest-update&feed_id=" + feed_id +
131 "&offset=" + offset;
132
b41c2549 133 new Ajax.Request("backend.php", {
1ca8997b 134 parameters: query,
b41c2549 135 onComplete: function(transport) {
e0cebf2a 136 fatal_error_check(transport);
d5d56329
AD
137 parse_headlines(transport, offset == 0);
138 set_selected_feed(feed_id);
1ca8997b 139 _active_feed_offset = offset;
11a7a966 140 } });
b41c2549
AD
141
142 } catch (e) {
143 exception_error("view", e);
144 }
145}
146
118e9399
AD
147function find_article(articles, article_id) {
148 try {
149 for (var i = 0; i < articles.length; i++) {
150 if (articles[i].id == article_id)
151 return articles[i];
152 }
153
154 return false;
155
156 } catch (e) {
157 exception_error("find_article", e);
158 }
159}
160
c01f40f4
AD
161function find_feed(feeds, feed_id) {
162 try {
163 for (var i = 0; i < feeds.length; i++) {
164 if (feeds[i].id == feed_id)
165 return feeds[i];
166 }
167
168 return false;
169
170 } catch (e) {
171 exception_error("find_feed", e);
172 }
173}
174
b41c2549
AD
175function get_feed_icon(feed) {
176 try {
177 if (feed.has_icon)
178 return 'icons/' + feed.id + '.ico';
179
180 if (feed.id == -1)
181 return 'images/mark_set.png';
182
183 if (feed.id == -2)
184 return 'images/pub_set.png';
185
186 if (feed.id == -3)
187 return 'images/fresh.png';
188
189 if (feed.id == -4)
190 return 'images/tag.png';
191
192 if (feed.id < -10)
193 return 'images/label.png';
194
d5d56329
AD
195 return 'images/blank_icon.gif';
196
b41c2549
AD
197 } catch (e) {
198 exception_error("get_feed_icon", e);
199 }
200}
201
c01f40f4
AD
202function add_feed_entry(feed) {
203 try {
204 var icon_part = "";
205
b41c2549 206 icon_part = "<img src='" + get_feed_icon(feed) + "'/>";
c01f40f4 207
11a7a966 208 var tmp_html = "<li id=\"F-"+feed.id+"\">" +
c01f40f4 209 icon_part +
1ca8997b 210 "<a href=\"#\" onclick=\"viewfeed("+feed.id+")\">" + feed.title +
c01f40f4
AD
211 "<div class='unread-ctr'>" + feed.unread + "</div>" +
212 "</li>";
213
214 $("feeds-content").innerHTML += tmp_html;
215
216 } catch (e) {
217 exception_error("add_feed_entry", e);
218 }
219}
220
c01f40f4
AD
221function add_headline_entry(article, feed) {
222 try {
223
224 var icon_part = "";
225
d5d56329 226 icon_part = "<img class='icon' src='" + get_feed_icon(feed) + "'/>";
c01f40f4 227
22933e5e 228 var tmp_html = "<li id=\"A-"+article.id+"\">" +
c01f40f4 229 icon_part +
6361fd20
AD
230 "<div class='digest-check'>" +
231 "<img title='Set starred' onclick=\"toggleMark(this, "+article.id+")\" src='images/mark_unset.png'>" +
232 "<img title='Set published' onclick=\"togglePub(this, "+article.id+")\" src='images/pub_unset.png'>" +
118e9399 233 "<img title='Dismiss' onclick=\"view("+article.id+", true)\" class='digest-check' src='images/digest_checkbox.png'>" +
6361fd20 234 "</div>" +
22933e5e
AD
235 "<a target=\"_blank\" href=\""+article.link+"\""+
236 "onclick=\"return view("+article.id+")\" class='title'>" +
237 article.title + "</a>" +
118e9399
AD
238 "<div class='body'>" +
239 "<div title=\"Click to expand article\" onclick=\"zoom("+article.id+")\" class='excerpt'>" +
240 article.excerpt + "</div>" +
241 "<div style='display : none' class='content'>" +
242 article.content + "</div>" +
c524d7e6
AD
243 "<div class='info'><a href=\#\" onclick=\"viewfeed("+feed.id+")\">" +
244 feed.title + "</a> " + " @ " +
b41c2549 245 new Date(article.updated * 1000) + "</div>" +
1ca8997b 246 "</div></li>";
c01f40f4
AD
247
248 $("headlines-content").innerHTML += tmp_html;
249
250 } catch (e) {
251 exception_error("add_headline_entry", e);
252 }
253}
254
d5d56329
AD
255function parse_feeds(transport) {
256 try {
257
258 var feeds = transport.responseXML.getElementsByTagName('feeds')[0];
259
260 if (feeds) {
261 feeds = eval("(" + feeds.firstChild.nodeValue + ")");
262
e0cebf2a
AD
263 feeds.sort( function (a,b)
264 {
265 if (b.unread != a.unread)
266 return (b.unread - a.unread)
267 else
268 if (a.title > b.title)
269 return 1;
270 else if (a.title < b.title)
271 return -1;
272 else
273 return 0;
274 });
275
d5d56329
AD
276 last_feeds = feeds;
277
278 $('feeds-content').innerHTML = "";
279
280 for (var i = 0; i < feeds.length; i++) {
281 add_feed_entry(feeds[i]);
282 }
283 }
284
285 } catch (e) {
286 exception_error("parse_feeds", e);
287 }
288}
289
290function parse_headlines(transport, replace) {
291 try {
292 var headlines = transport.responseXML.getElementsByTagName('headlines')[0];
293
294 if (headlines) {
295 headlines = eval("(" + headlines.firstChild.nodeValue + ")");
296
297 if (replace) $('headlines-content').innerHTML = '';
298
299 var pr = $('MORE-PROMPT');
300
301 if (pr) pr.parentNode.removeChild(pr);
302
303 for (var i = 0; i < headlines.length; i++) {
304
305 if (!$('A-' + headlines[i].id)) {
306 add_headline_entry(headlines[i],
307 find_feed(last_feeds, headlines[i].feed_id));
308 }
309 }
310
311 if (pr) {
312 $('headlines-content').appendChild(pr);
313 } else {
314 $('headlines-content').innerHTML += "<li id='MORE-PROMPT'>" +
315 "<div class='body'><a href=\"javascript:load_more()\">" +
316 __("More articles...") + "</a></div></li>";
317 }
318
319 new Effect.Appear('headlines-content');
320 }
321
322 } catch (e) {
323 exception_error("parse_headlines", e);
324 }
325}
326
327/*function digest_update(transport, feed_id, offset) {
c01f40f4
AD
328 try {
329 var feeds = transport.responseXML.getElementsByTagName('feeds')[0];
330 var headlines = transport.responseXML.getElementsByTagName('headlines')[0];
331
332 if (feeds) {
c01f40f4
AD
333 feeds = eval("(" + feeds.firstChild.nodeValue + ")");
334
1ca8997b
AD
335 last_feeds = feeds;
336
b41c2549
AD
337 $('feeds-content').innerHTML = "";
338
c01f40f4
AD
339 for (var i = 0; i < feeds.length; i++) {
340 add_feed_entry(feeds[i]);
341 }
1ca8997b
AD
342 } else {
343 feeds = last_feeds;
c01f40f4
AD
344 }
345
346 if (headlines) {
347 headlines = eval("(" + headlines.firstChild.nodeValue + ")");
348
d5d56329 349 if (_active_feed_id != feed_id || !offset)
118e9399
AD
350 $('headlines-content').innerHTML = "";
351
118e9399 352 var pr = $('MORE-PROMPT');
b41c2549 353
118e9399
AD
354 if (pr) {
355 pr.id = '';
356 Element.hide(pr);
357 }
1ca8997b 358
c01f40f4 359 for (var i = 0; i < headlines.length; i++) {
118e9399
AD
360 var elem = $('A-' + headlines[i].id);
361
362 if (elem && Element.visible(elem)) {
d5d56329
AD
363 if (!headlines[i].unread)
364 remove_headline_entry(headlines[i].id);
118e9399
AD
365
366 } else {
367 add_headline_entry(headlines[i], find_feed(feeds, headlines[i].feed_id));
368 }
c01f40f4 369 }
b41c2549 370
118e9399
AD
371 $('headlines-content').innerHTML += "<li id='MORE-PROMPT'>" +
372 "<div class='body'><a href=\"#\" onclick=\"load_more()\">" +
373 __("More articles...") + "</a></div></li>";
1ca8997b
AD
374
375 new Effect.Appear('headlines-content');
d5d56329 376 }
1ca8997b 377
d5d56329
AD
378 if (feed_id != undefined) {
379 _active_feed_id = feed_id;
c01f40f4
AD
380 }
381
d5d56329
AD
382 if (offset != undefined) _active_feed_offset = offset;
383
384 mark_selected_feed(_active_feed_id);
385
c01f40f4
AD
386 } catch (e) {
387 exception_error("digest_update", e);
388 }
d5d56329 389} */
c01f40f4 390
d5d56329 391function init() {
c01f40f4
AD
392 try {
393
394 new Ajax.Request("backend.php", {
395 parameters: "backend.php?op=rpc&subop=digest-init",
396 onComplete: function(transport) {
d5d56329 397 parse_feeds(transport);
1ca8997b 398 window.setTimeout('viewfeed(-4)', 100);
d5d56329 399 _update_timeout = window.setTimeout('update()', 5*1000);
c01f40f4
AD
400 } });
401
402 } catch (e) {
403 exception_error("digest_init", e);
404 }
405}
6361fd20
AD
406
407function tMark_afh_off(effect) {
408 try {
409 var elem = effect.effects[0].element;
410
411 console.log("tMark_afh_off : " + elem.id);
412
413 if (elem) {
414 elem.src = elem.src.replace("mark_set", "mark_unset");
415 elem.alt = __("Star article");
416 Element.show(elem);
417 }
418
419 } catch (e) {
420 exception_error("tMark_afh_off", e);
421 }
422}
423
424function tPub_afh_off(effect) {
425 try {
426 var elem = effect.effects[0].element;
427
428 console.log("tPub_afh_off : " + elem.id);
429
430 if (elem) {
431 elem.src = elem.src.replace("pub_set", "pub_unset");
432 elem.alt = __("Publish article");
433 Element.show(elem);
434 }
435
436 } catch (e) {
437 exception_error("tPub_afh_off", e);
438 }
439}
440
441function toggleMark(mark_img, id) {
442
443 try {
444
445 var query = "?op=rpc&id=" + id + "&subop=mark";
446
447 query = query + "&afid=" + _active_feed_id;
448 query = query + "&omode=c";
449
450 if (!mark_img) return;
451
6361fd20
AD
452 if (mark_img.src.match("mark_unset")) {
453 mark_img.src = mark_img.src.replace("mark_unset", "mark_set");
454 mark_img.alt = __("Unstar article");
455 query = query + "&mark=1";
456 } else {
457 mark_img.alt = __("Please wait...");
458 query = query + "&mark=0";
459
460 mark_img.src = mark_img.src.replace("mark_set", "mark_unset");
461 mark_img.alt = __("Star article");
462 }
463
464 new Ajax.Request("backend.php", {
465 parameters: query,
466 onComplete: function(transport) {
467 //
468 } });
469
470 } catch (e) {
471 exception_error("toggleMark", e);
472 }
473}
474
475function togglePub(mark_img, id, note) {
476
477 try {
478
479 var query = "?op=rpc&id=" + id + "&subop=publ";
480
481 query = query + "&afid=" + _active_feed_id;
482
483 if (note != undefined) {
484 query = query + "&note=" + param_escape(note);
485 } else {
486 query = query + "&note=undefined";
487 }
488
489 query = query + "&omode=c";
490
491 if (!mark_img) return;
492
493 if (mark_img.src.match("pub_unset") || note != undefined) {
494 mark_img.src = mark_img.src.replace("pub_unset", "pub_set");
495 mark_img.alt = __("Unpublish article");
496 query = query + "&pub=1";
497
498 } else {
499 mark_img.alt = __("Please wait...");
500 query = query + "&pub=0";
501
502 mark_img.src = mark_img.src.replace("pub_set", "pub_unset");
503 mark_img.alt = __("Publish article");
504 }
505
506 new Ajax.Request("backend.php", {
507 parameters: query,
508 onComplete: function(transport) {
509 //
510 } });
511
512 } catch (e) {
513 exception_error("togglePub", e);
514 }
515}
516
e0cebf2a
AD
517function fatal_error(code, msg) {
518 try {
519
520 if (code == 6) {
521 window.location.href = "digest.php";
522 } else if (code == 5) {
523 window.location.href = "update.php";
524 } else {
525
526 if (msg == "") msg = "Unknown error";
527
528 console.error("Fatal error: " + code + "\n" +
529 msg);
530
531 }
532
533 } catch (e) {
534 exception_error("fatalError", e);
535 }
536}
537
538function fatal_error_check(transport) {
539 try {
540 if (transport.responseXML) {
541 var error = transport.responseXML.getElementsByTagName("error")[0];
542
543 if (error) {
544 var code = error.getAttribute("error-code");
545 var msg = error.getAttribute("error-msg");
546 if (code != 0) {
547 fatal_error(code, msg);
548 return false;
549 }
550 }
551 }
552 } catch (e) {
553 exception_error("fatal_error_check", e);
554 }
555 return true;
556}
557
558