]> git.wh0rd.org - 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