From 4681834e66e46584684cb4d28feb50ab00237cf3 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 4 Feb 2009 10:17:55 +0300 Subject: [PATCH] add offline.js --- offline.js | 492 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 492 insertions(+) create mode 100644 offline.js diff --git a/offline.js b/offline.js new file mode 100644 index 000000000..371aeecf0 --- /dev/null +++ b/offline.js @@ -0,0 +1,492 @@ +function view_offline(id, feed_id) { + try { + + enableHotkeys(); + showArticleInHeadlines(id); + + if (db) { + db.execute("UPDATE articles SET unread = 0 WHERE id = ?", [id]); + } + + render_article("FIXME"); + update_local_feedlist_counters(); + + return false; + + } catch (e) { + exception_error("view_offline", e); + } +} + +function viewfeed_offline(feed_id, subop, is_cat, subop_param, skip_history, offset) { + try { + notify(''); + + if (!offset) offset = 0; + + loading_set_progress(100); + + clean_feed_selections(); + + setActiveFeedId(feed_id, is_cat); + + if (!is_cat) { + var feedr = document.getElementById("FEEDR-" + feed_id); + if (feedr && !feedr.className.match("Selected")) { + feedr.className = feedr.className + "Selected"; + } + } else { + var feedr = document.getElementById("FCAT-" + feed_id); + if (feedr && !feedr.className.match("Selected")) { + feedr.className = feedr.className + "Selected"; + } + } + + disableContainerChildren("headlinesToolbar", false); + Form.enable("main_toolbar_form"); + + var f = document.getElementById("headlines-frame"); + try { + if (reply.offset == 0) { + debug("resetting headlines scrollTop"); + f.scrollTop = 0; + } + } catch (e) { }; + + + var container = document.getElementById("headlines-frame"); + + var tmp = ""; + + rs = db.execute("SELECT title FROM feeds WHERE id = ?", [feed_id]); + + if (rs.isValidRow() || feed_id == -1 || feed_id == -4) { + + feed_title = rs.field(0); + + if (feed_id == -1) { + feed_title = __("Starred articles"); + } + + if (feed_id == -4) { + feed_title = __("All articles"); + } + + if (offset == 0) { + tmp += "
"; + + tmp += "
"; + tmp += "
"; + tmp += feed_title; + tmp += "
"; + + var sel_all_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, '', true)"; + var sel_unread_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true)"; + var sel_none_link = "javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false)"; + var sel_inv_link = "javascript:invertHeadlineSelection()"; + + tmp += __('Select:')+ + " "+__('All')+", "+ + ""+__('Unread')+", "+ + ""+__('Invert')+", "+ + ""+__('None')+""; + + tmp += "  "; + + tmp += "
"; + + tmp += "
"; + + tmp += ""; + + } + + var rs; + + var limit = 30; + + var toolbar_form = document.forms["main_toolbar_form"]; + + var limit = toolbar_form.limit[toolbar_form.limit.selectedIndex].value; + var view_mode = toolbar_form.view_mode[toolbar_form.view_mode.selectedIndex].value; + + var limit_qpart = ""; + var strategy_qpart = ""; + var mode_qpart = ""; + + if (limit != 0) { + limit_qpart = "LIMIT " + limit; + } + + if (view_mode == "all_articles") { + mode_qpart = "1"; + } else if (view_mode == "adaptive") { + if (get_local_feed_unread(feed_id) > 0) { + mode_qpart = "unread = 1"; + } else { + mode_qpart = "1"; + } + } else if (view_mode == "marked") { + mode_qpart = "marked = 1"; + } else if (view_mode == "unread") { + mode_qpart = "unread = 1"; + } else { + mode_qpart = "1"; + } + + if (feed_id > 0) { + strategy_qpart = "feed_id = " + feed_id; + } else if (feed_id == -1) { + strategy_qpart = "marked = 1"; + } else if (feed_id == -4) { + strategy_qpart = "1"; + } + + var query = "SELECT * FROM articles WHERE " + + strategy_qpart + + " AND " + mode_qpart + + " ORDER BY updated DESC "+ + limit_qpart; + + var rs = db.execute(query); + + var line_num = 0; + + while (rs.isValidRow()) { + + var id = rs.fieldByName("id"); + var feed_id = rs.fieldByName("feed_id"); + + var marked_pic; + + var row_class = (line_num % 2) ? "even" : "odd"; + + if (rs.fieldByName("unread") == "1") { + row_class += "Unread"; + } + + if (rs.fieldByName("marked") == "1") { + marked_pic = ""; + } else { + marked_pic = ""; + } + + var mouseover_attrs = "onmouseover='postMouseIn($id)' "+ + "onmouseout='postMouseOut($id)'"; + + tmp += ""; + + tmp += ""; + + tmp += ""; + + tmp += ""; + + tmp += ""; + + tmp += ""; + + tmp += ""; + + rs.next(); + line_num++; + } + + if (offset == 0) { + tmp += "
"+ + ""+marked_pic+""; + + tmp += ""+ + rs.fieldByName("title"); + + var content_preview = truncate_string(strip_tags(rs.fieldByName("content")), + 100); + + tmp += " - "+content_preview+""; + + tmp += ""; + + tmp += ""+ + ""+rs.fieldByName("updated").substring(0,16)+"
"; + tmp += "
"; + } + + if (offset == 0) { + container.innerHTML = tmp; + } else { + var ids = getSelectedArticleIds2(); + + //container.innerHTML = container.innerHTML + tmp; + + for (var i = 0; i < ids.length; i++) { + markHeadline(ids[i]); + } + } + } + + remove_splash(); + + + } catch (e) { + exception_error("viewfeed_offline", e); + } +} + +function render_offline_feedlist() { + try { + var tmp = ""; + + render_feedlist(tmp); + } catch (e) { + exception_error("render_offline_feedlist", e); + } +} + +function init_offline() { + try { + offline_mode = true; + + Element.hide("dispSwitchPrompt"); + Element.hide("feedBrowserPrompt"); + Element.hide("quickMenuChooser"); + + init_params["theme"] = ""; + + render_offline_feedlist(); + remove_splash(); + } catch (e) { + exception_error("init_offline", e); + } +} + +function offline_download_parse(stage, transport) { + try { + if (transport.responseXML) { + + if (stage == 0) { + + var feeds = transport.responseXML.getElementsByTagName("feed"); + + if (feeds.length > 0) { + db.execute("DELETE FROM feeds"); + } + + for (var i = 0; i < feeds.length; i++) { + var id = feeds[i].getAttribute("id"); + var has_icon = feeds[i].getAttribute("has_icon"); + var title = feeds[i].firstChild.nodeValue; + + db.execute("INSERT INTO feeds (id,title,has_icon)"+ + "VALUES (?,?,?)", + [id, title, has_icon]); + } + + window.setTimeout("update_offline_data("+(stage+1)+")", 60*1000); + } else { + + var articles = transport.responseXML.getElementsByTagName("article"); + + var articles_found = 0; + + for (var i = 0; i < articles.length; i++) { + var a = eval("("+articles[i].firstChild.nodeValue+")"); + articles_found++; + if (a) { + + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); + + db.execute("DELETE FROM articles WHERE id = ?", [a.id]); + db.execute("INSERT INTO articles "+ + "(id, feed_id, title, link, guid, updated, content, "+ + "unread, marked, tags, added) "+ + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + [a.id, a.feed_id, a.title, a.link, a.guid, a.updated, + a.content, a.unread, a.marked, a.tags, ts]); + + } + } + + if (articles_found > 0) { + window.setTimeout("update_offline_data("+(stage+1)+")", 60*1000); + } else { + window.setTimeout("update_offline_data(0)", 1800*1000); + + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); + + db.execute("DELETE FROM articles WHERE added < ? - 2592000", [ts]); + + } + } + + } + } catch (e) { + exception_error("offline_download_parse", e); + } +} + +function update_offline_data(stage) { + try { + + if (!stage) stage = 0; + + debug("update_offline_data: stage " + stage); + +// notify_progress("Loading, please wait... (" + stage +")", true); + + var query = "backend.php?op=rpc&subop=download&stage=" + stage; + + var rs = db.execute("SELECT MAX(id), MIN(id) FROM articles"); + if (rs.isValidRow() && rs.field(0)) { + var offline_dl_max_id = rs.field(0); + var offline_dl_min_id = rs.field(1); + + query = query + "&cidt=" + offline_dl_max_id; + query = query + "&cidb=" + offline_dl_min_id; + } + + new Ajax.Request(query, { + onComplete: function(transport) { + offline_download_parse(stage, transport); + debug("update_offline_data: done " + stage); + } }); + + } catch (e) { + exception_error("initiate_offline_download", e); + } +} + +function set_feedlist_counter(id, ctr) { + try { + + var feedctr = document.getElementById("FEEDCTR-" + id); + var feedu = document.getElementById("FEEDU-" + id); + var feedr = document.getElementById("FEEDR-" + id); + + if (feedctr && feedu && feedr) { + + var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML)); + + feedu.innerHTML = ctr; + + if (ctr > 0) { + feedctr.className = "feedCtrHasUnread"; + if (!feedr.className.match("Unread")) { + var is_selected = feedr.className.match("Selected"); + + feedr.className = feedr.className.replace("Selected", ""); + feedr.className = feedr.className.replace("Unread", ""); + + feedr.className = feedr.className + "Unread"; + + if (is_selected) { + feedr.className = feedr.className + "Selected"; + } + + } + + if (row_needs_hl) { + new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5", + queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } ); + } + } else { + feedctr.className = "feedCtrNoUnread"; + feedr.className = feedr.className.replace("Unread", ""); + } + } + + } catch (e) { + exception_error("set_feedlist_counter", e); + } +} + +function update_local_feedlist_counters() { + try { + if (!db) return; + + var rs = db.execute("SELECT feeds.id,COUNT(articles.id) "+ + "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+ + "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+ + "ORDER BY feeds.title"); + + while (rs.isValidRow()) { + var id = rs.field(0); + var ctr = rs.field(1); + + set_feedlist_counter(id, ctr); + + rs.next(); + } + + set_feedlist_counter(-4, get_local_feed_unread(-4)); + set_feedlist_counter(-1, get_local_feed_unread(-1)); + + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + + global_unread = get_local_feed_unread(-4); + updateTitle(); + + } catch (e) { + exception_error("update_local_feedlist_counters", e); + } +}