]> git.wh0rd.org Git - tt-rss.git/blob - offline.js
move more stuff to offline.js
[tt-rss.git] / offline.js
1 function view_offline(id, feed_id) {
2         try {
3
4                 enableHotkeys();
5                 showArticleInHeadlines(id);
6
7                 if (db) {
8                         db.execute("UPDATE articles SET unread = 0 WHERE id = ?", [id]);
9                 }
10
11                 render_article("FIXME");
12                 update_local_feedlist_counters();
13
14                 return false;
15
16         } catch (e) {
17                 exception_error("view_offline", e);
18         }
19 }
20
21 function viewfeed_offline(feed_id, subop, is_cat, subop_param, skip_history, offset) {
22         try {
23                 notify('');
24
25                 if (!offset) offset = 0;
26
27                 loading_set_progress(100);
28
29                 clean_feed_selections();
30         
31                 setActiveFeedId(feed_id, is_cat);
32
33                 if (!is_cat) {
34                         var feedr = document.getElementById("FEEDR-" + feed_id);
35                         if (feedr && !feedr.className.match("Selected")) {      
36                                 feedr.className = feedr.className + "Selected";
37                         } 
38                 } else {
39                         var feedr = document.getElementById("FCAT-" + feed_id);
40                         if (feedr && !feedr.className.match("Selected")) {      
41                                 feedr.className = feedr.className + "Selected";
42                         } 
43                 }
44
45                 disableContainerChildren("headlinesToolbar", false);
46                 Form.enable("main_toolbar_form");
47
48                 var f = document.getElementById("headlines-frame");
49                 try {
50                         if (reply.offset == 0) { 
51                                 debug("resetting headlines scrollTop");
52                                 f.scrollTop = 0; 
53                         }
54                 } catch (e) { };
55
56
57                 var container = document.getElementById("headlines-frame");
58
59                 var tmp = "";
60
61                 rs = db.execute("SELECT title FROM feeds WHERE id = ?", [feed_id]);
62
63                 if (rs.isValidRow() || feed_id == -1 || feed_id == -4) {
64
65                         feed_title = rs.field(0);
66
67                         if (feed_id == -1) {
68                                 feed_title = __("Starred articles");
69                         }
70
71                         if (feed_id == -4) {
72                                 feed_title = __("All articles");
73                         }
74
75                         if (offset == 0) {
76                                 tmp += "<div id=\"headlinesContainer\">";
77                 
78                                 tmp += "<div class=\"headlinesSubToolbar\">";
79                                 tmp += "<div id=\"subtoolbar_ftitle\">";
80                                 tmp += feed_title;
81                                 tmp += "</div>";
82
83                                 var sel_all_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, '', true)";
84                                 var sel_unread_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true)";
85                                 var sel_none_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false)";
86                                 var sel_inv_link = "javascript:invertHeadlineSelection()";
87
88                                 tmp += __('Select:')+
89                                         " <a href=\""+sel_all_link+"\">"+__('All')+"</a>, "+
90                                         "<a href=\""+sel_unread_link+"\">"+__('Unread')+"</a>, "+
91                                         "<a href=\""+sel_inv_link+"\">"+__('Invert')+"</a>, "+
92                                         "<a href=\""+sel_none_link+"\">"+__('None')+"</a>";
93         
94                                 tmp += "&nbsp;&nbsp;";
95         
96                                 tmp += "</div>";
97         
98                                 tmp += "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">";
99         
100                                 tmp += "<table class=\"headlinesList\" id=\"headlinesList\" cellspacing=\"0\">";
101                         
102                         }
103         
104                         var rs;
105
106                         var limit = 30;
107                 
108                         var toolbar_form = document.forms["main_toolbar_form"];
109                         
110                         var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex].value;
111                         var view_mode = toolbar_form.view_mode[toolbar_form.view_mode.selectedIndex].value;
112
113                         var limit_qpart = "";
114                         var strategy_qpart = "";
115                         var mode_qpart = "";
116
117                         if (limit != 0) {
118                                 limit_qpart = "LIMIT " + limit;
119                         }
120
121                         if (view_mode == "all_articles") {
122                                 mode_qpart = "1";
123                         } else if (view_mode == "adaptive") {
124                                 if (get_local_feed_unread(feed_id) > 0) {
125                                         mode_qpart = "unread = 1";
126                                 } else {
127                                         mode_qpart = "1";
128                                 }
129                         } else if (view_mode == "marked") {
130                                 mode_qpart = "marked = 1";
131                         } else if (view_mode == "unread") {
132                                 mode_qpart = "unread = 1";
133                         } else {
134                                 mode_qpart = "1";
135                         }
136
137                         if (feed_id > 0) {
138                                 strategy_qpart = "feed_id = " + feed_id;
139                         } else if (feed_id == -1) {
140                                 strategy_qpart = "marked = 1";
141                         } else if (feed_id == -4) {
142                                 strategy_qpart = "1";
143                         }                               
144
145                         var query = "SELECT * FROM articles WHERE " +
146                                 strategy_qpart +
147                                 " AND " + mode_qpart + 
148                                 " ORDER BY updated DESC "+
149                                 limit_qpart;
150
151                         var rs = db.execute(query);
152
153                         var line_num = 0;
154
155                         while (rs.isValidRow()) {
156
157                                 var id = rs.fieldByName("id");
158                                 var feed_id = rs.fieldByName("feed_id");
159
160                                 var marked_pic;
161         
162                                 var row_class = (line_num % 2) ? "even" : "odd";
163
164                                 if (rs.fieldByName("unread") == "1") {
165                                         row_class += "Unread";
166                                 }
167         
168                                 if (rs.fieldByName("marked") == "1") {
169                                         marked_pic = "<img id=\"FMPIC-"+id+"\" "+
170                                                 "src=\"images/mark_set.png\" class=\"markedPic\""+
171                                                 "alt=\"Unstar article\" onclick='javascript:tMark("+id+")'>";
172                                 } else {
173                                         marked_pic = "<img id=\"FMPIC-"+id+"\" "+
174                                                 "src=\"images/mark_unset.png\" class=\"markedPic\""+
175                                                 "alt=\"Star article\" onclick='javascript:tMark("+id+")'>";
176                                 }
177
178                                 var mouseover_attrs = "onmouseover='postMouseIn($id)' "+
179                                         "onmouseout='postMouseOut($id)'";
180         
181                                 tmp += "<tr class='"+row_class+"' id='RROW-"+id+"' "+mouseover_attrs+">";
182                                 
183                                 tmp += "<td class='hlUpdPic'> </td>";
184
185                                 tmp += "<td class='hlSelectRow'>"+
186                                         "<input type=\"checkbox\" onclick=\"tSR(this)\" id=\"RCHK-"+id+"\"></td>";
187                                 
188                                 tmp += "<td class='hlMarkedPic'>"+marked_pic+"</td>";
189         
190                                 tmp += "<td onclick='view("+id+","+feed_id+")' "+
191                                         "class='hlContent' valign='middle'>";
192         
193                                 tmp += "<a target=\"_blank\" id=\"RTITLE-$id\" href=\"" + 
194                                         rs.fieldByName("link") + "\"" +
195                                         "onclick=\"return view("+id+","+feed_id+");\">"+
196                                         rs.fieldByName("title");
197
198                                 var content_preview = truncate_string(strip_tags(rs.fieldByName("content")), 
199                                         100);
200
201                                 tmp += "<span class=\"contentPreview\"> - "+content_preview+"</span>";
202
203                                 tmp += "</a>";
204
205                                 tmp += "</td>";
206         
207                                 tmp += "<td class=\"hlUpdated\" onclick='view("+id+","+feed_id+")'>"+
208                                         "<nobr>"+rs.fieldByName("updated").substring(0,16)+"</nobr></td>";
209
210                                 tmp += "</tr>";
211
212                                 rs.next();
213                                 line_num++;
214                         }
215         
216                         if (offset == 0) {
217                                 tmp += "</table>";
218                                 tmp += "</div></div>";
219                         }
220         
221                         if (offset == 0) {
222                                 container.innerHTML = tmp;
223                         } else {
224                                 var ids = getSelectedArticleIds2();
225                 
226                                 //container.innerHTML = container.innerHTML + tmp;
227         
228                                 for (var i = 0; i < ids.length; i++) {
229                                         markHeadline(ids[i]);
230                                 }
231                         }
232                 }
233
234                 remove_splash();
235
236
237         } catch (e) {
238                 exception_error("viewfeed_offline", e);
239         }
240 }
241
242 function render_offline_feedlist() {
243         try {
244                 var tmp = "<ul class=\"feedList\" id=\"feedList\">";
245
246                 var unread = get_local_feed_unread(-4);
247
248                 global_unread = unread;
249                 updateTitle();
250
251                 tmp += printFeedEntry(-4, __("All articles"), "feed", unread,
252                         "images/tag.png");
253
254                 var unread = get_local_feed_unread(-1);
255
256                 tmp += printFeedEntry(-1, __("Starred articles"), "feed", unread,
257                         "images/mark_set.png");
258
259                 tmp += "<li><hr/></li>";
260
261                 var rs = db.execute("SELECT feeds.id,feeds.title,has_icon,COUNT(articles.id) "+
262                         "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+
263                         "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+
264                         "ORDER BY feeds.title");
265
266                 while (rs.isValidRow()) {
267
268                         var id = rs.field(0);
269                         var title = rs.field(1);
270                         var has_icon = rs.field(2);
271                         var unread = rs.field(3);
272
273                         var icon = "";
274
275                         if (has_icon) {
276                                 icon = "icons/" + id + ".ico";
277                         }
278
279
280                         var feed_icon = "";
281
282                         var row_class = "feed";
283
284                         if (unread > 0) {
285                                 row_class += "Unread";
286                                 fctr_class = "feedCtrHasUnread";
287                         } else {
288                                 fctr_class = "feedCtrNoUnread";
289                         }
290
291                         tmp += printFeedEntry(id, title, "feed", unread, icon);
292
293                         rs.next();
294                 }
295
296                 tmp += "</ul>";
297
298                 render_feedlist(tmp);
299         } catch (e) {
300                 exception_error("render_offline_feedlist", e);
301         }
302 }
303
304 function init_offline() {
305         try {
306                 offline_mode = true;
307
308                 Element.hide("dispSwitchPrompt");
309                 Element.hide("feedBrowserPrompt");
310                 Element.hide("quickMenuChooser");
311
312                 init_params["theme"] = "";
313
314                 render_offline_feedlist();
315                 remove_splash();
316         } catch (e) {
317                 exception_error("init_offline", e);
318         }
319 }
320
321 function offline_download_parse(stage, transport) {
322         try {
323                 if (transport.responseXML) {
324
325                         if (stage == 0) {
326
327                                 var feeds = transport.responseXML.getElementsByTagName("feed");
328
329                                 if (feeds.length > 0) {
330                                         db.execute("DELETE FROM feeds");
331                                 }
332
333                                 for (var i = 0; i < feeds.length; i++) {
334                                         var id = feeds[i].getAttribute("id");
335                                         var has_icon = feeds[i].getAttribute("has_icon");
336                                         var title = feeds[i].firstChild.nodeValue;
337         
338                                         db.execute("INSERT INTO feeds (id,title,has_icon)"+
339                                                 "VALUES (?,?,?)",
340                                                 [id, title, has_icon]);
341                                 }
342                 
343                                 window.setTimeout("update_offline_data("+(stage+1)+")", 60*1000);
344                         } else {
345
346                                 var articles = transport.responseXML.getElementsByTagName("article");
347
348                                 var articles_found = 0;
349
350                                 for (var i = 0; i < articles.length; i++) {                                     
351                                         var a = eval("("+articles[i].firstChild.nodeValue+")");
352                                         articles_found++;
353                                         if (a) {
354
355                                                 var date = new Date();
356                                                 var ts = Math.round(date.getTime() / 1000);
357
358                                                 db.execute("DELETE FROM articles WHERE id = ?", [a.id]);
359                                                 db.execute("INSERT INTO articles "+
360                                                 "(id, feed_id, title, link, guid, updated, content, "+
361                                                         "unread, marked, tags, added) "+
362                                                 "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", 
363                                                         [a.id, a.feed_id, a.title, a.link, a.guid, a.updated, 
364                                                                 a.content, a.unread, a.marked, a.tags, ts]);
365
366                                         }
367                                 }
368
369                                 if (articles_found > 0) {
370                                         window.setTimeout("update_offline_data("+(stage+1)+")", 60*1000);
371                                 } else {
372                                         window.setTimeout("update_offline_data(0)", 1800*1000);
373
374                                         var date = new Date();
375                                         var ts = Math.round(date.getTime() / 1000);
376
377                                         db.execute("DELETE FROM articles WHERE added < ? - 2592000", [ts]);
378
379                                 }
380                         }
381
382                 }
383         } catch (e) {
384                 exception_error("offline_download_parse", e);
385         }
386 }
387
388 function update_offline_data(stage) {
389         try {
390
391                 if (!stage) stage = 0;
392
393                 debug("update_offline_data: stage " + stage);
394
395 //              notify_progress("Loading, please wait... (" + stage +")", true);
396
397                 var query = "backend.php?op=rpc&subop=download&stage=" + stage;
398
399                 var rs = db.execute("SELECT MAX(id), MIN(id) FROM articles");
400                 if (rs.isValidRow() && rs.field(0)) {
401                         var offline_dl_max_id = rs.field(0);
402                         var offline_dl_min_id = rs.field(1);
403
404                         query = query + "&cidt=" + offline_dl_max_id;
405                         query = query + "&cidb=" + offline_dl_min_id;
406                 }
407
408                 new Ajax.Request(query, {
409                         onComplete: function(transport) { 
410                                 offline_download_parse(stage, transport);                               
411                                 debug("update_offline_data: done " + stage);
412                         } });
413
414         } catch (e) {
415                 exception_error("initiate_offline_download", e);
416         }
417 }
418
419 function set_feedlist_counter(id, ctr) {
420         try {
421
422                 var feedctr = document.getElementById("FEEDCTR-" + id);
423                 var feedu = document.getElementById("FEEDU-" + id);
424                 var feedr = document.getElementById("FEEDR-" + id);
425
426                 if (feedctr && feedu && feedr) {
427
428                         var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML));
429
430                         feedu.innerHTML = ctr;
431
432                         if (ctr > 0) {                                  
433                                 feedctr.className = "feedCtrHasUnread";
434                                 if (!feedr.className.match("Unread")) {
435                                         var is_selected = feedr.className.match("Selected");
436         
437                                         feedr.className = feedr.className.replace("Selected", "");
438                                         feedr.className = feedr.className.replace("Unread", "");
439         
440                                         feedr.className = feedr.className + "Unread";
441         
442                                         if (is_selected) {
443                                                 feedr.className = feedr.className + "Selected";
444                                         }       
445                                         
446                                 }
447
448                                 if (row_needs_hl) { 
449                                         new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5",
450                                                 queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } );
451                                 }
452                         } else {
453                                 feedctr.className = "feedCtrNoUnread";
454                                 feedr.className = feedr.className.replace("Unread", "");
455                         }                       
456                 }
457
458         } catch (e) {
459                 exception_error("set_feedlist_counter", e);
460         }
461 }
462
463 function update_local_feedlist_counters() {
464         try {
465                 if (!db) return;
466
467                 var rs = db.execute("SELECT feeds.id,COUNT(articles.id) "+
468                         "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+
469                         "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+
470                         "ORDER BY feeds.title");
471
472                 while (rs.isValidRow()) {
473                         var id = rs.field(0);
474                         var ctr = rs.field(1);
475
476                         set_feedlist_counter(id, ctr);
477
478                         rs.next();
479                 }
480
481                 set_feedlist_counter(-4, get_local_feed_unread(-4));
482                 set_feedlist_counter(-1, get_local_feed_unread(-1));
483
484                 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
485
486                 global_unread = get_local_feed_unread(-4);
487                 updateTitle();
488
489         } catch (e) {
490                 exception_error("update_local_feedlist_counters", e);
491         }
492 }
493
494 function get_local_feed_unread(id) {
495         try {
496                 var rs;
497
498                 if (id == -4) {
499                         rs = db.execute("SELECT SUM(unread) FROM articles");
500                 } else if (id == -1) {
501                         rs = db.execute("SELECT SUM(unread) FROM articles WHERE marked = 1");
502                 } else {
503                         rs = db.execute("SELECT SUM(unread) FROM articles WHERE feed_id = ?", [id]);
504                 }
505
506                 if (rs.isValidRow()) {
507                         return rs.field(0);
508                 } else {
509                         return 0;
510                 }
511
512         } catch (e) {
513                 exception_error("get_local_feed_unread", e);
514         }
515 }
516
517