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