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