]>
Commit | Line | Data |
---|---|---|
3034277a | 1 | var SCHEMA_VERSION = 3; |
b871dd06 | 2 | |
25d99353 AD |
3 | var offline_mode = false; |
4 | var store = false; | |
5 | var localServer = false; | |
6 | var db = false; | |
7 | ||
4681834e AD |
8 | function view_offline(id, feed_id) { |
9 | try { | |
10 | ||
11 | enableHotkeys(); | |
12 | showArticleInHeadlines(id); | |
13 | ||
1b27261c AD |
14 | db.execute("UPDATE articles SET unread = 0 WHERE id = ?", [id]); |
15 | ||
16 | var rs = db.execute("SELECT * FROM articles WHERE id = ?", [id]); | |
17 | ||
18 | if (rs.isValidRow()) { | |
19 | ||
20 | var tmp = "<div class=\"postReply\">"; | |
21 | ||
22 | tmp += "<div class=\"postHeader\" onmouseover=\"enable_resize(true)\" "+ | |
23 | "onmouseout=\"enable_resize(false)\">"; | |
24 | ||
25 | tmp += "<div class=\"postDate\">"+rs.fieldByName("updated")+"</div>"; | |
26 | ||
27 | if (rs.fieldByName("link") != "") { | |
28 | tmp += "<div clear='both'><a target=\"_blank\" "+ | |
29 | "href=\"" + rs.fieldByName("link") + "\">" + | |
30 | rs.fieldByName("title") + "</a></div>"; | |
31 | } else { | |
32 | tmp += "<div clear='both'>" + rs.fieldByName("title") + "</div>"; | |
33 | } | |
4681834e | 34 | |
1b27261c AD |
35 | tmp += "<div style='float : right'> "+ |
36 | "<img src='images/tag.png' class='tagsPic' alt='Tags' title='Tags'>"; | |
37 | tmp += rs.fieldByName("tags"); | |
38 | tmp += "</div>"; | |
39 | ||
12aa4007 AD |
40 | tmp += "<div clear='both'>"+ |
41 | "<a target=\"_blank\" "+ | |
42 | "href=\"" + rs.fieldByName("comments") + "\">" + | |
43 | __("comments") + "</a></div>"; | |
1b27261c AD |
44 | |
45 | tmp += "</div>"; | |
46 | ||
47 | tmp += "<div class=\"postContent\">" | |
48 | tmp += rs.fieldByName("content"); | |
49 | tmp += "</div>"; | |
50 | ||
51 | tmp += "</div>"; | |
52 | ||
53 | render_article(tmp); | |
54 | update_local_feedlist_counters(); | |
55 | } | |
4681834e | 56 | |
03c96380 AD |
57 | rs.close(); |
58 | ||
4681834e AD |
59 | return false; |
60 | ||
61 | } catch (e) { | |
62 | exception_error("view_offline", e); | |
63 | } | |
64 | } | |
65 | ||
66 | function viewfeed_offline(feed_id, subop, is_cat, subop_param, skip_history, offset) { | |
67 | try { | |
68 | notify(''); | |
69 | ||
70 | if (!offset) offset = 0; | |
71 | ||
0e923da4 AD |
72 | if (offset > 0) { |
73 | _feed_cur_page = parseInt(offset); | |
74 | if (_infscroll_request_sent) { | |
75 | return; | |
76 | } | |
77 | } else { | |
78 | _feed_cur_page = 0; | |
79 | _infscroll_disable = 0; | |
80 | } | |
81 | ||
82 | if (getActiveFeedId() != feed_id) { | |
83 | _feed_cur_page = 0; | |
84 | active_post_id = 0; | |
85 | _infscroll_disable = 0; | |
86 | } | |
87 | ||
4681834e AD |
88 | loading_set_progress(100); |
89 | ||
90 | clean_feed_selections(); | |
91 | ||
92 | setActiveFeedId(feed_id, is_cat); | |
93 | ||
94 | if (!is_cat) { | |
95 | var feedr = document.getElementById("FEEDR-" + feed_id); | |
96 | if (feedr && !feedr.className.match("Selected")) { | |
97 | feedr.className = feedr.className + "Selected"; | |
98 | } | |
99 | } else { | |
100 | var feedr = document.getElementById("FCAT-" + feed_id); | |
101 | if (feedr && !feedr.className.match("Selected")) { | |
102 | feedr.className = feedr.className + "Selected"; | |
103 | } | |
104 | } | |
105 | ||
106 | disableContainerChildren("headlinesToolbar", false); | |
107 | Form.enable("main_toolbar_form"); | |
108 | ||
109 | var f = document.getElementById("headlines-frame"); | |
110 | try { | |
111 | if (reply.offset == 0) { | |
112 | debug("resetting headlines scrollTop"); | |
113 | f.scrollTop = 0; | |
114 | } | |
115 | } catch (e) { }; | |
116 | ||
117 | ||
4681834e AD |
118 | var tmp = ""; |
119 | ||
120 | rs = db.execute("SELECT title FROM feeds WHERE id = ?", [feed_id]); | |
121 | ||
122 | if (rs.isValidRow() || feed_id == -1 || feed_id == -4) { | |
123 | ||
124 | feed_title = rs.field(0); | |
125 | ||
126 | if (feed_id == -1) { | |
127 | feed_title = __("Starred articles"); | |
128 | } | |
129 | ||
130 | if (feed_id == -4) { | |
131 | feed_title = __("All articles"); | |
132 | } | |
133 | ||
134 | if (offset == 0) { | |
135 | tmp += "<div id=\"headlinesContainer\">"; | |
136 | ||
137 | tmp += "<div class=\"headlinesSubToolbar\">"; | |
138 | tmp += "<div id=\"subtoolbar_ftitle\">"; | |
139 | tmp += feed_title; | |
140 | tmp += "</div>"; | |
141 | ||
779ba075 AD |
142 | var sel_all_link; |
143 | var sel_unread_link; | |
144 | var sel_none_link; | |
145 | var sel_inv_link; | |
146 | ||
147 | if (document.getElementById("content-frame")) { | |
148 | sel_all_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, '', true)"; | |
149 | sel_unread_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true)"; | |
150 | sel_none_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false)"; | |
151 | sel_inv_link = "javascript:invertHeadlineSelection()"; | |
152 | } else { | |
153 | sel_all_link = "javascript:cdmSelectArticles('all')"; | |
154 | sel_unread_link = "javascript:cdmSelectArticles('unread')"; | |
155 | sel_none_link = "javascript:cdmSelectArticles('none')"; | |
156 | sel_inv_link = "javascript:invertHeadlineSelection()"; | |
157 | } | |
4681834e AD |
158 | |
159 | tmp += __('Select:')+ | |
160 | " <a href=\""+sel_all_link+"\">"+__('All')+"</a>, "+ | |
161 | "<a href=\""+sel_unread_link+"\">"+__('Unread')+"</a>, "+ | |
162 | "<a href=\""+sel_inv_link+"\">"+__('Invert')+"</a>, "+ | |
163 | "<a href=\""+sel_none_link+"\">"+__('None')+"</a>"; | |
164 | ||
165 | tmp += " "; | |
166 | ||
167 | tmp += "</div>"; | |
168 | ||
169 | tmp += "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">"; | |
779ba075 AD |
170 | if (document.getElementById("content-frame")) { |
171 | tmp += "<table class=\"headlinesList\" id=\"headlinesList\" cellspacing=\"0\">"; | |
172 | } | |
4681834e AD |
173 | |
174 | } | |
175 | ||
4681834e AD |
176 | var limit = 30; |
177 | ||
178 | var toolbar_form = document.forms["main_toolbar_form"]; | |
179 | ||
180 | var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex].value; | |
181 | var view_mode = toolbar_form.view_mode[toolbar_form.view_mode.selectedIndex].value; | |
182 | ||
183 | var limit_qpart = ""; | |
184 | var strategy_qpart = ""; | |
185 | var mode_qpart = ""; | |
e491d06d | 186 | var offset_qpart = ""; |
4681834e AD |
187 | |
188 | if (limit != 0) { | |
189 | limit_qpart = "LIMIT " + limit; | |
190 | } | |
191 | ||
192 | if (view_mode == "all_articles") { | |
193 | mode_qpart = "1"; | |
194 | } else if (view_mode == "adaptive") { | |
195 | if (get_local_feed_unread(feed_id) > 0) { | |
196 | mode_qpart = "unread = 1"; | |
197 | } else { | |
198 | mode_qpart = "1"; | |
199 | } | |
200 | } else if (view_mode == "marked") { | |
201 | mode_qpart = "marked = 1"; | |
202 | } else if (view_mode == "unread") { | |
203 | mode_qpart = "unread = 1"; | |
204 | } else { | |
205 | mode_qpart = "1"; | |
206 | } | |
207 | ||
208 | if (feed_id > 0) { | |
209 | strategy_qpart = "feed_id = " + feed_id; | |
210 | } else if (feed_id == -1) { | |
211 | strategy_qpart = "marked = 1"; | |
212 | } else if (feed_id == -4) { | |
213 | strategy_qpart = "1"; | |
e491d06d AD |
214 | } |
215 | ||
216 | if (offset > 0) { | |
217 | offset_qpart = "OFFSET " + (offset*30); | |
218 | } else { | |
219 | offset_qpart = ""; | |
220 | } | |
4681834e | 221 | |
851ce414 AD |
222 | var query = "SELECT *,feeds.title AS feed_title "+ |
223 | "FROM articles,feeds WHERE " + | |
224 | "feed_id = feeds.id AND " + | |
4681834e AD |
225 | strategy_qpart + |
226 | " AND " + mode_qpart + | |
227 | " ORDER BY updated DESC "+ | |
e491d06d AD |
228 | limit_qpart + " " + |
229 | offset_qpart; | |
4681834e AD |
230 | |
231 | var rs = db.execute(query); | |
232 | ||
e491d06d | 233 | var line_num = offset*30; |
4681834e | 234 | |
851ce414 AD |
235 | var real_feed_id = feed_id; |
236 | ||
4681834e AD |
237 | while (rs.isValidRow()) { |
238 | ||
239 | var id = rs.fieldByName("id"); | |
240 | var feed_id = rs.fieldByName("feed_id"); | |
241 | ||
851ce414 AD |
242 | var entry_feed_title = false; |
243 | ||
244 | if (real_feed_id < 0) { | |
245 | entry_feed_title = rs.fieldByName("feed_title"); | |
246 | } | |
247 | ||
4681834e AD |
248 | var marked_pic; |
249 | ||
250 | var row_class = (line_num % 2) ? "even" : "odd"; | |
251 | ||
252 | if (rs.fieldByName("unread") == "1") { | |
253 | row_class += "Unread"; | |
254 | } | |
255 | ||
256 | if (rs.fieldByName("marked") == "1") { | |
257 | marked_pic = "<img id=\"FMPIC-"+id+"\" "+ | |
258 | "src=\"images/mark_set.png\" class=\"markedPic\""+ | |
259 | "alt=\"Unstar article\" onclick='javascript:tMark("+id+")'>"; | |
260 | } else { | |
261 | marked_pic = "<img id=\"FMPIC-"+id+"\" "+ | |
262 | "src=\"images/mark_unset.png\" class=\"markedPic\""+ | |
263 | "alt=\"Star article\" onclick='javascript:tMark("+id+")'>"; | |
264 | } | |
265 | ||
266 | var mouseover_attrs = "onmouseover='postMouseIn($id)' "+ | |
267 | "onmouseout='postMouseOut($id)'"; | |
779ba075 AD |
268 | |
269 | var content_preview = truncate_string(strip_tags(rs.fieldByName("content")), | |
270 | 100); | |
4681834e | 271 | |
779ba075 | 272 | if (document.getElementById("content-frame")) { |
4681834e | 273 | |
779ba075 AD |
274 | tmp += "<tr class='"+row_class+"' id='RROW-"+id+"' "+mouseover_attrs+">"; |
275 | ||
276 | tmp += "<td class='hlUpdPic'> </td>"; | |
4681834e | 277 | |
779ba075 AD |
278 | tmp += "<td class='hlSelectRow'>"+ |
279 | "<input type=\"checkbox\" onclick=\"tSR(this)\" id=\"RCHK-"+id+"\"></td>"; | |
280 | ||
281 | tmp += "<td class='hlMarkedPic'>"+marked_pic+"</td>"; | |
282 | ||
283 | tmp += "<td onclick='view("+id+","+feed_id+")' "+ | |
284 | "class='hlContent' valign='middle'>"; | |
285 | ||
851ce414 | 286 | tmp += "<a target=\"_blank\" id=\"RTITLE-"+id+"\" href=\"" + |
779ba075 AD |
287 | rs.fieldByName("link") + "\"" + |
288 | "onclick=\"return view("+id+","+feed_id+");\">"+ | |
289 | rs.fieldByName("title"); | |
4681834e | 290 | |
779ba075 AD |
291 | tmp += "<span class=\"contentPreview\"> - "+content_preview+"</span>"; |
292 | ||
293 | tmp += "</a>"; | |
851ce414 AD |
294 | |
295 | if (entry_feed_title) { | |
296 | tmp += " <span class=\"hlFeed\">"+ | |
297 | "(<a href='javascript:viewfeed("+feed_id+ | |
298 | ")'>"+entry_feed_title+"</a>)</span>"; | |
299 | } | |
300 | ||
779ba075 | 301 | tmp += "</td>"; |
d07f08e8 | 302 | |
779ba075 | 303 | tmp += "<td class=\"hlUpdated\" onclick='view("+id+","+feed_id+")'>"+ |
d07f08e8 AD |
304 | "<nobr>"+rs.fieldByName("updated").substring(0,16)+ |
305 | "</nobr></td>"; | |
779ba075 AD |
306 | |
307 | tmp += "</tr>"; | |
308 | } else { | |
4681834e | 309 | |
779ba075 AD |
310 | var add_class = ""; |
311 | ||
312 | if (rs.fieldByName("unread") == "1") { | |
313 | add_class = "Unread"; | |
314 | } | |
315 | ||
316 | tmp += "<div class=\"cdmArticle"+add_class+"\" id=\"RROW-"+id+"\" "+ | |
317 | mouseover_attrs+"'>"; | |
318 | ||
d07f08e8 AD |
319 | feed_icon_img = "<img class=\"tinyFeedIcon\" src=\""+ |
320 | getInitParam("icons_url")+"/"+feed_id+".ico\" alt=\"\">"; | |
321 | cdm_feed_icon = "<span style=\"cursor : pointer\" "+ | |
322 | "onclick=\"viewfeed("+feed_id+")\">"+feed_icon_img+"</span>"; | |
323 | ||
779ba075 AD |
324 | tmp += "<div class=\"cdmHeader\">"; |
325 | tmp += "<div class=\"articleUpdated\">"+ | |
d07f08e8 AD |
326 | rs.fieldByName("updated").substring(0,16)+ |
327 | " "+cdm_feed_icon+"</div>"; | |
779ba075 AD |
328 | |
329 | tmp += "<span id=\"RTITLE-"+id+"\" class=\"titleWrap\">"+ | |
330 | "<a class=\"title\" onclick=\"javascript:toggleUnread("+id+", 0)\""+ | |
331 | "target=\"_blank\" href=\""+rs.fieldByName("link")+ | |
332 | "\">"+rs.fieldByName("title")+"</a>"; | |
851ce414 AD |
333 | |
334 | if (entry_feed_title) { | |
335 | tmp += " (<a href='javascript:viewfeed("+feed_id+ | |
336 | ")'>"+entry_feed_title+"</a>)"; | |
337 | } | |
338 | ||
779ba075 AD |
339 | tmp += "</span></div>"; |
340 | ||
341 | tmp += "<div class=\"cdmContent\" onclick=\"cdmClicked("+id+")\""+ | |
342 | "id=\"CICD-"+id+"\">"; | |
343 | tmp += rs.fieldByName("content"); | |
344 | tmp += "<br clear='both'>" | |
345 | tmp += "</div>"; | |
346 | ||
347 | tmp += "<div class=\"cdmFooter\"><span class='s0'>"; | |
348 | tmp += __("Select:")+ | |
349 | " <input type=\"checkbox\" "+ | |
350 | "onclick=\"toggleSelectRowById(this, 'RROW-"+id+"')\" "+ | |
351 | "class=\"feedCheckBox\" id=\"RCHK-"+id+"\">"; | |
352 | ||
353 | tmp += "</span><span class='s1'>"+marked_pic+"</span> "; | |
354 | ||
355 | tmp += "<span class='s1'>"+ | |
356 | "<img class='tagsPic' src='images/tag.png' alt='Tags' title='Tags'>"+ | |
357 | "<span id=\"ATSTR-"+id+"\">"+rs.fieldByName("tags")+"</span>"+ | |
358 | "</span>"; | |
359 | ||
360 | tmp += "<span class='s2'>Toggle: <a class=\"cdmToggleLink\""+ | |
361 | "href=\"javascript:toggleUnread("+id+")\">"+ | |
362 | "Unread</a></span>"; | |
363 | tmp += "</div>"; | |
364 | ||
365 | tmp += "</div>"; | |
366 | } | |
4681834e AD |
367 | |
368 | rs.next(); | |
369 | line_num++; | |
370 | } | |
03c96380 | 371 | |
0e923da4 AD |
372 | if (line_num - offset*30 < 30) { |
373 | _infscroll_disable = 1; | |
374 | } | |
375 | ||
03c96380 | 376 | rs.close(); |
4681834e AD |
377 | |
378 | if (offset == 0) { | |
379 | tmp += "</table>"; | |
76d20f5f AD |
380 | |
381 | if (line_num - offset*30 == 0) { | |
382 | tmp += "<div class='whiteBox'>" + | |
383 | __("No articles found to display.") + | |
384 | "</div>"; | |
385 | } | |
4681834e AD |
386 | tmp += "</div></div>"; |
387 | } | |
388 | ||
389 | if (offset == 0) { | |
e491d06d | 390 | var container = document.getElementById("headlines-frame"); |
4681834e AD |
391 | container.innerHTML = tmp; |
392 | } else { | |
393 | var ids = getSelectedArticleIds2(); | |
394 | ||
e491d06d AD |
395 | var container = document.getElementById("headlinesList"); |
396 | container.innerHTML = container.innerHTML + tmp; | |
4681834e AD |
397 | |
398 | for (var i = 0; i < ids.length; i++) { | |
399 | markHeadline(ids[i]); | |
400 | } | |
401 | } | |
402 | } | |
403 | ||
404 | remove_splash(); | |
405 | ||
0e923da4 | 406 | _infscroll_request_sent = 0; |
4681834e AD |
407 | |
408 | } catch (e) { | |
409 | exception_error("viewfeed_offline", e); | |
410 | } | |
411 | } | |
412 | ||
413 | function render_offline_feedlist() { | |
414 | try { | |
415 | var tmp = "<ul class=\"feedList\" id=\"feedList\">"; | |
416 | ||
417 | var unread = get_local_feed_unread(-4); | |
418 | ||
419 | global_unread = unread; | |
420 | updateTitle(); | |
421 | ||
422 | tmp += printFeedEntry(-4, __("All articles"), "feed", unread, | |
423 | "images/tag.png"); | |
424 | ||
425 | var unread = get_local_feed_unread(-1); | |
426 | ||
427 | tmp += printFeedEntry(-1, __("Starred articles"), "feed", unread, | |
428 | "images/mark_set.png"); | |
429 | ||
430 | tmp += "<li><hr/></li>"; | |
431 | ||
f4c11347 | 432 | /* var rs = db.execute("SELECT feeds.id,feeds.title,has_icon,COUNT(articles.id) "+ |
4681834e AD |
433 | "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+ |
434 | "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+ | |
f4c11347 AD |
435 | "ORDER BY feeds.title"); */ |
436 | ||
437 | var rs = db.execute("SELECT id,title,has_icon FROM feeds "+ | |
438 | "ORDER BY title"); | |
4681834e AD |
439 | |
440 | while (rs.isValidRow()) { | |
441 | ||
442 | var id = rs.field(0); | |
443 | var title = rs.field(1); | |
444 | var has_icon = rs.field(2); | |
f4c11347 | 445 | var unread = get_local_feed_unread(id); |
4681834e AD |
446 | |
447 | var icon = ""; | |
448 | ||
449 | if (has_icon) { | |
450 | icon = "icons/" + id + ".ico"; | |
451 | } | |
452 | ||
453 | ||
454 | var feed_icon = ""; | |
455 | ||
456 | var row_class = "feed"; | |
457 | ||
458 | if (unread > 0) { | |
459 | row_class += "Unread"; | |
460 | fctr_class = "feedCtrHasUnread"; | |
461 | } else { | |
462 | fctr_class = "feedCtrNoUnread"; | |
463 | } | |
464 | ||
465 | tmp += printFeedEntry(id, title, "feed", unread, icon); | |
466 | ||
467 | rs.next(); | |
468 | } | |
469 | ||
03c96380 AD |
470 | rs.close(); |
471 | ||
4681834e AD |
472 | tmp += "</ul>"; |
473 | ||
474 | render_feedlist(tmp); | |
475 | } catch (e) { | |
476 | exception_error("render_offline_feedlist", e); | |
477 | } | |
478 | } | |
479 | ||
480 | function init_offline() { | |
481 | try { | |
482 | offline_mode = true; | |
483 | ||
484 | Element.hide("dispSwitchPrompt"); | |
485 | Element.hide("feedBrowserPrompt"); | |
4681834e | 486 | |
69ea0cdd AD |
487 | Element.hide("topLinksOnline"); |
488 | Element.show("topLinksOffline"); | |
489 | ||
80b1c238 | 490 | var tb_form = document.getElementById("main_toolbar_form"); |
80b1c238 AD |
491 | Element.hide(tb_form.update); |
492 | ||
3c6d3586 AD |
493 | var chooser = document.getElementById("quickMenuChooser"); |
494 | chooser.disabled = true; | |
495 | ||
3034277a AD |
496 | var rs = db.execute("SELECT key, value FROM init_params"); |
497 | ||
498 | while (rs.isValidRow()) { | |
499 | init_params[rs.field(0)] = rs.field(1); | |
500 | rs.next(); | |
501 | } | |
502 | ||
503 | rs.close(); | |
4681834e | 504 | |
b15e516e AD |
505 | var rs = db.execute("SELECT COUNT(*) FROM feeds"); |
506 | ||
507 | var num_feeds = 0; | |
508 | ||
509 | if (rs.isValidRow()) { | |
510 | num_feeds = rs.field(0); | |
511 | } | |
512 | ||
513 | rs.close(); | |
514 | ||
515 | if (num_feeds == 0) { | |
516 | remove_splash(); | |
517 | return fatalError(0, | |
518 | __("Data for offline browsing has not been downloaded yet.")); | |
519 | } | |
520 | ||
4681834e | 521 | render_offline_feedlist(); |
10003c4c | 522 | init_second_stage(); |
b15e516e AD |
523 | window.setTimeout("viewfeed(-4)", 50); |
524 | ||
4681834e AD |
525 | } catch (e) { |
526 | exception_error("init_offline", e); | |
527 | } | |
528 | } | |
529 | ||
530 | function offline_download_parse(stage, transport) { | |
531 | try { | |
532 | if (transport.responseXML) { | |
533 | ||
534 | if (stage == 0) { | |
535 | ||
536 | var feeds = transport.responseXML.getElementsByTagName("feed"); | |
537 | ||
538 | if (feeds.length > 0) { | |
539 | db.execute("DELETE FROM feeds"); | |
540 | } | |
541 | ||
542 | for (var i = 0; i < feeds.length; i++) { | |
543 | var id = feeds[i].getAttribute("id"); | |
544 | var has_icon = feeds[i].getAttribute("has_icon"); | |
545 | var title = feeds[i].firstChild.nodeValue; | |
546 | ||
547 | db.execute("INSERT INTO feeds (id,title,has_icon)"+ | |
548 | "VALUES (?,?,?)", | |
549 | [id, title, has_icon]); | |
550 | } | |
551 | ||
3e52ab08 | 552 | window.setTimeout("update_offline_data("+(stage+1)+")", 10*1000); |
4681834e AD |
553 | } else { |
554 | ||
555 | var articles = transport.responseXML.getElementsByTagName("article"); | |
556 | ||
3e52ab08 AD |
557 | var limit = transport.responseXML.getElementsByTagName("limit")[0]; |
558 | ||
559 | if (limit) { | |
560 | limit = limit.getAttribute("value"); | |
561 | } else { | |
562 | limit = 0; | |
563 | } | |
564 | ||
4681834e AD |
565 | var articles_found = 0; |
566 | ||
567 | for (var i = 0; i < articles.length; i++) { | |
568 | var a = eval("("+articles[i].firstChild.nodeValue+")"); | |
569 | articles_found++; | |
570 | if (a) { | |
571 | ||
572 | var date = new Date(); | |
573 | var ts = Math.round(date.getTime() / 1000); | |
574 | ||
575 | db.execute("DELETE FROM articles WHERE id = ?", [a.id]); | |
576 | db.execute("INSERT INTO articles "+ | |
577 | "(id, feed_id, title, link, guid, updated, content, "+ | |
3034277a AD |
578 | "unread, marked, tags, added, comments) "+ |
579 | "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", | |
4681834e | 580 | [a.id, a.feed_id, a.title, a.link, a.guid, a.updated, |
3034277a AD |
581 | a.content, a.unread, a.marked, a.tags, ts, |
582 | a.comments]); | |
4681834e AD |
583 | |
584 | } | |
585 | } | |
586 | ||
3e52ab08 AD |
587 | debug("downloaded articles: " + articles_found + " limit: " + limit); |
588 | ||
589 | if (articles_found >= limit) { | |
590 | window.setTimeout("update_offline_data("+(stage+1)+")", 10*1000); | |
591 | debug("update_offline_data: done " + stage); | |
4681834e AD |
592 | } else { |
593 | window.setTimeout("update_offline_data(0)", 1800*1000); | |
3e52ab08 | 594 | debug("update_offline_data: finished"); |
4681834e AD |
595 | |
596 | var date = new Date(); | |
597 | var ts = Math.round(date.getTime() / 1000); | |
598 | ||
599 | db.execute("DELETE FROM articles WHERE added < ? - 2592000", [ts]); | |
600 | ||
601 | } | |
602 | } | |
603 | ||
f45c85f9 | 604 | // notify(''); |
b2319311 | 605 | |
4681834e AD |
606 | } |
607 | } catch (e) { | |
608 | exception_error("offline_download_parse", e); | |
609 | } | |
610 | } | |
611 | ||
612 | function update_offline_data(stage) { | |
613 | try { | |
614 | ||
615 | if (!stage) stage = 0; | |
823ff6aa | 616 | if (offline_mode) return; |
4681834e AD |
617 | |
618 | debug("update_offline_data: stage " + stage); | |
619 | ||
f45c85f9 | 620 | // notify_progress("Updating offline data... (" + stage +")", true); |
4681834e AD |
621 | |
622 | var query = "backend.php?op=rpc&subop=download&stage=" + stage; | |
623 | ||
624 | var rs = db.execute("SELECT MAX(id), MIN(id) FROM articles"); | |
03c96380 | 625 | |
4681834e AD |
626 | if (rs.isValidRow() && rs.field(0)) { |
627 | var offline_dl_max_id = rs.field(0); | |
628 | var offline_dl_min_id = rs.field(1); | |
629 | ||
630 | query = query + "&cidt=" + offline_dl_max_id; | |
631 | query = query + "&cidb=" + offline_dl_min_id; | |
632 | } | |
633 | ||
03c96380 AD |
634 | rs.close(); |
635 | ||
4681834e AD |
636 | new Ajax.Request(query, { |
637 | onComplete: function(transport) { | |
638 | offline_download_parse(stage, transport); | |
4681834e AD |
639 | } }); |
640 | ||
641 | } catch (e) { | |
642 | exception_error("initiate_offline_download", e); | |
643 | } | |
644 | } | |
645 | ||
646 | function set_feedlist_counter(id, ctr) { | |
647 | try { | |
648 | ||
649 | var feedctr = document.getElementById("FEEDCTR-" + id); | |
650 | var feedu = document.getElementById("FEEDU-" + id); | |
651 | var feedr = document.getElementById("FEEDR-" + id); | |
652 | ||
653 | if (feedctr && feedu && feedr) { | |
654 | ||
655 | var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML)); | |
656 | ||
657 | feedu.innerHTML = ctr; | |
658 | ||
659 | if (ctr > 0) { | |
660 | feedctr.className = "feedCtrHasUnread"; | |
661 | if (!feedr.className.match("Unread")) { | |
662 | var is_selected = feedr.className.match("Selected"); | |
663 | ||
664 | feedr.className = feedr.className.replace("Selected", ""); | |
665 | feedr.className = feedr.className.replace("Unread", ""); | |
666 | ||
667 | feedr.className = feedr.className + "Unread"; | |
668 | ||
669 | if (is_selected) { | |
670 | feedr.className = feedr.className + "Selected"; | |
671 | } | |
672 | ||
673 | } | |
674 | ||
675 | if (row_needs_hl) { | |
676 | new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5", | |
677 | queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } ); | |
678 | } | |
679 | } else { | |
680 | feedctr.className = "feedCtrNoUnread"; | |
681 | feedr.className = feedr.className.replace("Unread", ""); | |
682 | } | |
683 | } | |
684 | ||
685 | } catch (e) { | |
686 | exception_error("set_feedlist_counter", e); | |
687 | } | |
688 | } | |
689 | ||
690 | function update_local_feedlist_counters() { | |
691 | try { | |
f4c11347 | 692 | if (!offline_mode) return; |
4681834e | 693 | |
f4c11347 | 694 | /* var rs = db.execute("SELECT feeds.id,COUNT(articles.id) "+ |
4681834e AD |
695 | "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+ |
696 | "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+ | |
f4c11347 AD |
697 | "ORDER BY feeds.title"); */ |
698 | ||
699 | var rs = db.execute("SELECT id,title,has_icon FROM feeds "+ | |
700 | "ORDER BY title"); | |
4681834e AD |
701 | |
702 | while (rs.isValidRow()) { | |
703 | var id = rs.field(0); | |
f4c11347 | 704 | var ctr = get_local_feed_unread(id); |
4681834e AD |
705 | |
706 | set_feedlist_counter(id, ctr); | |
707 | ||
708 | rs.next(); | |
709 | } | |
710 | ||
03c96380 AD |
711 | rs.close(); |
712 | ||
4681834e AD |
713 | set_feedlist_counter(-4, get_local_feed_unread(-4)); |
714 | set_feedlist_counter(-1, get_local_feed_unread(-1)); | |
715 | ||
716 | hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); | |
717 | ||
718 | global_unread = get_local_feed_unread(-4); | |
719 | updateTitle(); | |
720 | ||
721 | } catch (e) { | |
722 | exception_error("update_local_feedlist_counters", e); | |
723 | } | |
724 | } | |
774b8df8 AD |
725 | |
726 | function get_local_feed_unread(id) { | |
727 | try { | |
728 | var rs; | |
729 | ||
730 | if (id == -4) { | |
731 | rs = db.execute("SELECT SUM(unread) FROM articles"); | |
732 | } else if (id == -1) { | |
733 | rs = db.execute("SELECT SUM(unread) FROM articles WHERE marked = 1"); | |
734 | } else { | |
735 | rs = db.execute("SELECT SUM(unread) FROM articles WHERE feed_id = ?", [id]); | |
736 | } | |
737 | ||
03c96380 AD |
738 | var a = false; |
739 | ||
774b8df8 | 740 | if (rs.isValidRow()) { |
03c96380 | 741 | a = rs.field(0); |
774b8df8 | 742 | } else { |
03c96380 | 743 | a = 0; |
774b8df8 AD |
744 | } |
745 | ||
03c96380 AD |
746 | rs.close(); |
747 | ||
748 | return a; | |
749 | ||
774b8df8 AD |
750 | } catch (e) { |
751 | exception_error("get_local_feed_unread", e); | |
752 | } | |
753 | } | |
754 | ||
25d99353 AD |
755 | function init_gears() { |
756 | try { | |
757 | ||
758 | if (window.google && google.gears) { | |
759 | localServer = google.gears.factory.create("beta.localserver"); | |
760 | store = localServer.createManagedStore("tt-rss"); | |
761 | db = google.gears.factory.create('beta.database'); | |
762 | db.open('tt-rss'); | |
763 | ||
764 | db.execute("CREATE TABLE IF NOT EXISTS version (schema_version text)"); | |
765 | ||
766 | var rs = db.execute("SELECT schema_version FROM version"); | |
767 | ||
768 | var version = ""; | |
769 | ||
770 | if (rs.isValidRow()) { | |
771 | version = rs.field(0); | |
772 | } | |
773 | ||
3034277a AD |
774 | rs.close(); |
775 | ||
25d99353 | 776 | if (version != SCHEMA_VERSION) { |
3034277a | 777 | db.execute("DROP TABLE IF EXISTS init_params"); |
b871dd06 AD |
778 | db.execute("DROP TABLE IF EXISTS cache"); |
779 | db.execute("DROP TABLE IF EXISTS feeds"); | |
780 | db.execute("DROP TABLE IF EXISTS articles"); | |
3034277a AD |
781 | db.execute("DROP TABLE IF EXISTS version"); |
782 | db.execute("CREATE TABLE IF NOT EXISTS version (schema_version text)"); | |
25d99353 AD |
783 | db.execute("INSERT INTO version (schema_version) VALUES (?)", |
784 | [SCHEMA_VERSION]); | |
785 | } | |
786 | ||
3034277a AD |
787 | db.execute("CREATE TABLE IF NOT EXISTS init_params (key text, value text)"); |
788 | ||
25d99353 | 789 | db.execute("CREATE TABLE IF NOT EXISTS cache (id text, article text, param text, added text)"); |
b871dd06 AD |
790 | db.execute("CREATE TABLE IF NOT EXISTS feeds (id integer, title text, has_icon integer)"); |
791 | db.execute("CREATE TABLE IF NOT EXISTS articles (id integer, feed_id integer, title text, link text, guid text, updated text, content text, tags text, unread text, marked text, added text, comments text)"); | |
779ba075 | 792 | |
779ba075 | 793 | db.execute("DELETE FROM cache WHERE id LIKE 'F:%' OR id LIKE 'C:%'"); |
69ea0cdd AD |
794 | |
795 | Element.show("restartOfflinePic"); | |
796 | ||
25d99353 AD |
797 | } |
798 | ||
799 | cache_expire(); | |
800 | ||
801 | } catch (e) { | |
802 | exception_error("init_gears", e); | |
803 | } | |
804 | } | |
805 | ||
69ea0cdd AD |
806 | function gotoOffline() { |
807 | window.location.href = "tt-rss.php?offline=1"; | |
808 | } | |
809 | ||
810 | function gotoOnline() { | |
811 | window.location.href = "tt-rss.php"; | |
812 | } | |
774b8df8 | 813 |