X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=tt-rss.js;h=b0e747a0cebc9e19ffe3ed3d84dff00a6846cb6a;hb=6e4f4ce14bb2ce14fbc73cb8b0fe82f3aa059f24;hp=6d3cc73778139bad149da76ebce2d44a507ae2bd;hpb=4336531d788f86a7442c12733b77cf0542a6598d;p=tt-rss.git diff --git a/tt-rss.js b/tt-rss.js index 6d3cc737..b0e747a0 100644 --- a/tt-rss.js +++ b/tt-rss.js @@ -1,26 +1,26 @@ - var total_unread = 0; -var first_run = true; var display_tags = false; var global_unread = -1; -var active_title_text = ""; -var current_subtitle = ""; -var daemon_enabled = false; -var daemon_refresh_only = false; -//var _qfd_deleted_feed = 0; var firsttime_update = true; var _active_feed_id = 0; var _active_feed_is_cat = false; var number_of_feeds = 0; -var sanity_check_done = false; -var _hfd_scrolltop = 0; var hotkey_prefix = false; var hotkey_prefix_pressed = false; -var init_params = new Object(); -var ver_offset = 0; -var hor_offset = 0; -var feeds_sort_by_unread = false; -var feedlist_sortable_enabled = false; +var init_params = {}; +var _force_scheduled_update = false; +var last_scheduled_update = false; + +var _rpc_seq = 0; + +function next_seq() { + _rpc_seq += 1; + return _rpc_seq; +} + +function get_seq() { + return _rpc_seq; +} function activeFeedIsCat() { return _active_feed_is_cat; @@ -28,7 +28,7 @@ function activeFeedIsCat() { function getActiveFeedId() { try { - debug("gAFID: " + _active_feed_id); + //console.log("gAFID: " + _active_feed_id); return _active_feed_id; } catch (e) { exception_error("getActiveFeedId", e); @@ -37,7 +37,7 @@ function getActiveFeedId() { function setActiveFeedId(id, is_cat) { try { - debug("sAFID(" + id + ", " + is_cat + ")"); + //console.log("sAFID(" + id + ", " + is_cat + ")"); _active_feed_id = id; if (is_cat != undefined) { @@ -62,7 +62,7 @@ function toggleTags(show_all) { try { - debug("toggleTags: " + show_all + "; " + display_tags); + console.log("toggleTags: " + show_all + "; " + display_tags); var p = $("dispSwitchPrompt"); @@ -88,162 +88,36 @@ function toggleTags(show_all) { function dlg_frefresh_callback(transport, deleted_feed) { if (getActiveFeedId() == deleted_feed) { - var h = $("headlines-frame"); - if (h) { - h.innerHTML = "
" + __('No feed selected.') + "
"; - } + setTimeout("viewfeed(-5)", 100); } setTimeout('updateFeedList(false, false)', 50); closeInfoBox(); } -function backend_sanity_check_callback(transport) { - +function updateFeedList() { try { - - if (sanity_check_done) { - fatalError(11, "Sanity check request received twice. This can indicate "+ - "presence of Firebug or some other disrupting extension. "+ - "Please disable it and try again."); - return; - } - - if (!transport.responseXML) { - if (!store) { - fatalError(3, "Sanity check: Received reply is not XML", - transport.responseText); - return; - } else { - init_offline(); - return; - } - } - - if (getURLParam("offline")) { - return init_offline(); - } - - var reply = transport.responseXML.firstChild.firstChild; - - if (!reply) { - fatalError(3, "Sanity check: invalid RPC reply", transport.responseText); - return; - } - - var error_code = reply.getAttribute("error-code"); + //console.log("updateFeedList"); + + var query_str = "backend.php?op=feeds"; - if (error_code && error_code != 0) { - return fatalError(error_code, reply.getAttribute("error-msg")); - } - - debug("sanity check ok"); - - var params = reply.nextSibling; - - if (params) { - debug('reading init-params...'); - var param = params.firstChild; - - while (param) { - var k = param.getAttribute("key"); - var v = param.getAttribute("value"); - debug(k + " => " + v); - init_params[k] = v; - - if (db) { - db.execute("DELETE FROM init_params WHERE key = ?", [k]); - db.execute("INSERT INTO init_params (key,value) VALUES (?, ?)", - [k, v]); - } - - param = param.nextSibling; - } - } - - sanity_check_done = true; - - init_second_stage(); - - } catch (e) { - exception_error("backend_sanity_check_callback", e, transport); - } -} - -function scheduleFeedUpdate(force) { - - debug("in scheduleFeedUpdate"); - -/* if (!daemon_enabled && !daemon_refresh_only) { - notify_progress("Updating feeds...", true); - } */ - - var query_str = "backend.php?op=rpc&subop="; - - if (force) { - query_str = query_str + "forceUpdateAllFeeds"; - } else { - query_str = query_str + "updateAllFeeds"; - } - - var omode; - - if (firsttime_update && !navigator.userAgent.match("Opera")) { - firsttime_update = false; - omode = "T"; - } else { if (display_tags) { - omode = "tl"; - } else { - omode = "flc"; + query_str = query_str + "&tags=1"; } - } - query_str = query_str + "&omode=" + omode; - query_str = query_str + "&uctr=" + global_unread; - - debug("REFETCH query: " + query_str); - - new Ajax.Request("backend.php", { - parameters: query_str, - onComplete: function(transport) { - parse_counters_reply(transport, true); + if (getActiveFeedId() && !activeFeedIsCat()) { + query_str = query_str + "&actid=" + getActiveFeedId(); + } + + new Ajax.Request("backend.php", { + parameters: query_str, + onComplete: function(transport) { + render_feedlist(transport.responseText); } }); -} - -function updateFeedList(silent, fetch) { -// if (silent != true) { -// notify("Loading feed list..."); -// } - - debug("updateFeedList"); - - if (offline_mode) return render_offline_feedlist(); - - var query_str = "backend.php?op=feeds"; - - if (display_tags) { - query_str = query_str + "&tags=1"; - } - - if (getActiveFeedId() && !activeFeedIsCat()) { - query_str = query_str + "&actid=" + getActiveFeedId(); + } catch (e) { + exception_error("updateFeedList", e); } - - if (fetch) query_str = query_str + "&fetch=yes"; - -// var feeds_frame = $("feeds-frame"); -// feeds_frame.src = query_str; - - debug("updateFeedList Q=" + query_str); - - new Ajax.Request("backend.php", { - parameters: query_str, - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - } function catchupAllFeeds() { @@ -256,7 +130,7 @@ function catchupAllFeeds() { notify_progress("Marking all feeds as read..."); - debug("catchupAllFeeds Q=" + query_str); + //console.log("catchupAllFeeds Q=" + query_str); new Ajax.Request("backend.php", { parameters: query_str, @@ -271,74 +145,88 @@ function catchupAllFeeds() { function viewCurrentFeed(subop) { -// if (getActiveFeedId()) { if (getActiveFeedId() != undefined) { viewfeed(getActiveFeedId(), subop, activeFeedIsCat()); - } else { -// viewfeed(-1, subop); // FIXME } return false; // block unneeded form submits } -function viewfeed(feed, subop) { - var f = window.frames["feeds-frame"]; - f.viewfeed(feed, subop); -} - function timeout() { if (getInitParam("bw_limit") == "1") return; - scheduleFeedUpdate(false); + try { + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); - var refresh_time = getInitParam("feeds_frame_refresh"); + if (ts - last_scheduled_update > 10 || _force_scheduled_update) { - if (!refresh_time) refresh_time = 600; + //console.log("timeout()"); - setTimeout("timeout()", refresh_time*1000); -} + window.clearTimeout(counter_timeout_id); + + var query_str = "?op=rpc&subop=getAllCounters&seq=" + next_seq(); + + var omode; + + if (firsttime_update && !navigator.userAgent.match("Opera")) { + firsttime_update = false; + omode = "T"; + } else { + if (display_tags) { + omode = "tl"; + } else { + omode = "flc"; + } + } + + query_str = query_str + "&omode=" + omode; + + if (!_force_scheduled_update) + query_str = query_str + "&last_article_id=" + getInitParam("last_article_id"); + + //console.log("[timeout]" + query_str); + + new Ajax.Request("backend.php", { + parameters: query_str, + onComplete: function(transport) { + handle_rpc_reply(transport, !_force_scheduled_update); + _force_scheduled_update = false; + } }); -function resetSearch() { - var searchbox = $("searchbox") + last_scheduled_update = ts; + } - if (searchbox.value != "" && getActiveFeedId()) { - searchbox.value = ""; - viewfeed(getActiveFeedId(), ""); + } catch (e) { + exception_error("timeout", e); } + + setTimeout("timeout()", 3000); } function search() { closeInfoBox(); - viewCurrentFeed(0, ""); + viewCurrentFeed(); } -// if argument is undefined, current subtitle is not updated -// use blank string to clear subtitle -function updateTitle(s) { +function updateTitle() { var tmp = "Tiny Tiny RSS"; - if (s != undefined) { - current_subtitle = s; - } - if (global_unread > 0) { tmp = tmp + " (" + global_unread + ")"; } - if (current_subtitle) { - tmp = tmp + " - " + current_subtitle; - } - - if (active_title_text.length > 0) { - tmp = tmp + " > " + active_title_text; + if (window.fluid) { + if (global_unread > 0) { + window.fluid.dockBadge = global_unread; + } else { + window.fluid.dockBadge = ""; + } } document.title = tmp; } function genericSanityCheck() { - -// if (!Ajax.getTransport()) fatalError(1); - setCookie("ttrss_test", "TEST"); if (getCookie("ttrss_test") != "TEST") { @@ -349,21 +237,19 @@ function genericSanityCheck() { } function init() { - try { + Form.disable("main_toolbar_form"); - init_gears(); + dojo.require("dijit.layout.BorderContainer"); + dojo.require("dijit.layout.ContentPane"); + dojo.require("dijit.Dialog"); + dojo.require("dijit.form.Button"); - Form.disable("main_toolbar_form"); + //return remove_splash(); if (!genericSanityCheck()) return; - if (getURLParam('debug')) { - Element.show("debug_output"); - debug('debug mode activated'); - } - var params = "&ua=" + param_escape(navigator.userAgent); loading_set_progress(30); @@ -379,131 +265,27 @@ function init() { } } -function resize_headlines(delta_x, delta_y) { - - try { - - debug("resize_headlines: " + delta_x + ":" + delta_y); - - var h_frame = $("headlines-frame"); - var c_frame = $("content-frame"); - var f_frame = $("footer"); - var feeds_frame = $("feeds-holder"); - var resize_grab = $("resize-grabber"); - var resize_handle = $("resize-handle"); - - if (!c_frame || !h_frame) return; - - if (feeds_frame && getInitParam("theme") == "old-skool") { - feeds_frame.style.bottom = f_frame.offsetHeight + "px"; - } - - if (getInitParam("theme_options").match("horiz_resize")) { - - if (delta_x != undefined) { - if (c_frame.offsetLeft - delta_x > feeds_frame.offsetWidth + feeds_frame.offsetLeft + 100 && c_frame.offsetWidth + delta_x > 100) { - hor_offset = hor_offset + delta_x; - } - } - - debug("resize_headlines: HOR-mode: " + hor_offset); - - c_frame.style.width = (400 + hor_offset) + "px"; - h_frame.style.right = c_frame.offsetWidth - 1 + "px"; - - resize_grab.style.top = (h_frame.offsetTop + h_frame.offsetHeight - 60) + "px"; - resize_grab.style.left = (h_frame.offsetLeft + h_frame.offsetWidth - - 4) + "px"; - resize_grab.style.display = "block"; - - //resize_handle.src = "themes/"+getInitParam('theme')+"/images/resize_handle_vert.png"; - resize_handle.style.paddingTop = (resize_grab.offsetHeight / 2 - 7) + "px"; - - } else { - - if (delta_y != undefined) { - if (c_frame.offsetHeight + delta_y > 100 && h_frame.offsetHeight - delta_y > 100) { - ver_offset = ver_offset + delta_y; - } - } - - debug("resize_headlines: VER-mode: " + ver_offset); - - h_frame.style.height = (300 - ver_offset) + "px"; - - c_frame.style.top = (h_frame.offsetTop + h_frame.offsetHeight + 0) + "px"; - h_frame.style.height = h_frame.offsetHeight + "px"; - - } - - if (getInitParam("cookie_lifetime") != 0) { - setCookie("ttrss_offset_ver", ver_offset, - getInitParam("cookie_lifetime")); - setCookie("ttrss_offset_hor", hor_offset, - getInitParam("cookie_lifetime")); - } else { - setCookie("ttrss_offset_ver", ver_offset); - setCookie("ttrss_offset_hor", hor_offset); - } - - } catch (e) { - exception_error("resize_headlines", e); - } - -} - function init_second_stage() { try { delCookie("ttrss_test"); -// document.onresize = resize_headlines; - window.onresize=resize_headlines; - var toolbar = document.forms["main_toolbar_form"]; dropboxSelect(toolbar.view_mode, getInitParam("default_view_mode")); dropboxSelect(toolbar.order_by, getInitParam("default_view_order_by")); - daemon_enabled = getInitParam("daemon_enabled") == 1; - daemon_refresh_only = getInitParam("daemon_refresh_only") == 1; feeds_sort_by_unread = getInitParam("feeds_sort_by_unread") == 1; -/* var fl = cache_find_param("FEEDLIST", getInitParam("num_feeds")); - - if (fl) { - render_feedlist(fl); - if ($("feedList")) { - request_counters(); - } else { - setTimeout('updateFeedList(false, false)', 50); - } - } else { - setTimeout('updateFeedList(false, false)', 50); - } */ - setTimeout('updateFeedList(false, false)', 50); - debug("second stage ok"); + console.log("second stage ok"); loading_set_progress(60); - ver_offset = parseInt(getCookie("ttrss_offset_ver")); - hor_offset = parseInt(getCookie("ttrss_offset_hor")); - - debug("got offsets from cookies: ver " + ver_offset + " hor " + hor_offset); - - /* fuck IE */ - - if (isNaN(hor_offset)) hor_offset = 0; - if (isNaN(ver_offset)) ver_offset = 0; - - debug("offsets from cookies [x:y]: " + hor_offset + ":" + ver_offset); - - resize_headlines(); - - enable_offline_reading(); + if (has_local_storage()) + localStorage.clear(); } catch (e) { exception_error("init_second_stage", e); @@ -566,11 +348,6 @@ function quickMenuGo(opid) { return; } - if (opid == "qmcUpdateFeeds") { - scheduleFeedUpdate(true); - return; - } - if (opid == "qmcCatchupAll") { catchupAllFeeds(); return; @@ -600,9 +377,19 @@ function quickMenuGo(opid) { } if (opid == "qmcResetUI") { - hor_offset = 0; - ver_offset = 0; - resize_headlines(); + alert("Function not implemented"); + } + + if (opid == "qmcToggleReorder") { + feedlist_sortable_enabled = !feedlist_sortable_enabled; + + if (feedlist_sortable_enabled) { + notify_info("Category reordering enabled"); + toggle_sortable_feedlist(true); + } else { + notify_info("Category reordering disabled"); + toggle_sortable_feedlist(false); + } } if (opid == "qmcResetCats") { @@ -626,11 +413,6 @@ function quickMenuGo(opid) { } } -function updateFeedTitle(t) { - active_title_text = t; - updateTitle(); -} - function toggleDispRead() { try { @@ -653,24 +435,20 @@ function toggleDispRead() { } function parse_runtime_info(elem) { - if (!elem) { - debug("parse_runtime_info: elem is null, aborting"); + + if (!elem || !elem.firstChild) { + console.warn("parse_runtime_info: invalid node passed"); return; } - var param = elem.firstChild; + var data = JSON.parse(elem.firstChild.nodeValue); - debug("parse_runtime_info: " + param); + //console.log("parsing runtime info..."); - while (param) { - var k = param.getAttribute("key"); - var v = param.getAttribute("value"); + for (k in data) { + var v = data[k]; - debug("RI: " + k + " => " + v); - - if (k == "num_feeds") { - init_params[k] = v; - } + // console.log("RI: " + k + " => " + v); if (k == "new_version_available") { var icon = $("newVersionIcon"); @@ -681,34 +459,23 @@ function parse_runtime_info(elem) { icon.style.display = "none"; } } + return; } var error_flag; if (k == "daemon_is_running" && v != 1) { notify_error("Update daemon is not running.", true); - error_flag = true; + return; } if (k == "daemon_stamp_ok" && v != 1) { notify_error("Update daemon is not updating feeds.", true); - error_flag = true; - } - - if (!error_flag) { - notify(''); + return; } -/* var w = $("noDaemonWarning"); - - if (w) { - if (k == "daemon_is_running" && v != 1) { - w.style.display = "block"; - } else { - w.style.display = "none"; - } - } */ - param = param.nextSibling; + init_params[k] = v; + notify(''); } } @@ -813,9 +580,9 @@ function feedEditSave() { function collapse_feedlist() { try { - debug("collapse_feedlist"); + //console.log("collapse_feedlist"); - var theme = getInitParam("theme"); +/* var theme = getInitParam("theme"); if (theme != "" && !getInitParam("theme_options").match("collapse_feedlist")) return; @@ -829,7 +596,7 @@ function collapse_feedlist() { if (!Element.visible(fl)) { Element.show(fl); - fbtn.innerHTML = "<<"; + fbtn.innerHTML = "<<"; if (theme != "graycube") { @@ -851,7 +618,7 @@ function collapse_feedlist() { } else { Element.hide(fl); - fbtn.innerHTML = ">>"; + fbtn.innerHTML = ">>"; if (theme != "graycube") { @@ -873,7 +640,10 @@ function collapse_feedlist() { new Ajax.Request("backend.php", { parameters: query }); - } + } */ + + query = "?op=rpc&subop=setpref&key=_COLLAPSED_FEEDLIST&value=true"; + } catch (e) { exception_error("collapse_feedlist", e); } @@ -881,12 +651,12 @@ function collapse_feedlist() { function viewModeChanged() { cache_flush(); - return viewCurrentFeed(0, '') + return viewCurrentFeed('') } function viewLimitChanged() { cache_flush(); - return viewCurrentFeed(0, '') + return viewCurrentFeed('') } /* function adjustArticleScore(id, score) { @@ -947,7 +717,6 @@ function hotkey_handler(e) { var shift_key = false; var cmdline = $('cmdline'); - var feedlist = $('feedList'); try { shift_key = e.shiftKey; @@ -971,12 +740,13 @@ function hotkey_handler(e) { closeInfoBox(); } - if (!hotkeys_enabled) { - debug("hotkeys disabled"); + if (dialogs.length > 0 || !hotkeys_enabled) { + console.log("hotkeys disabled"); return; } if (keycode == 16) return; // ignore lone shift + if (keycode == 17) return; // ignore lone ctrl if ((keycode == 70 || keycode == 67 || keycode == 71) && !hotkey_prefix) { @@ -990,7 +760,7 @@ function hotkey_handler(e) { cmdline.innerHTML = keychar; Element.show(cmdline); - debug("KP: PREFIX=" + keycode + " CHAR=" + keychar + " TS=" + ts); + console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar + " TS=" + ts); return true; } @@ -1004,17 +774,6 @@ function hotkey_handler(e) { if (!hotkey_prefix) { - if (keycode == 68 && shift_key) { // d - if (!Element.visible("debug_output")) { - Element.show("debug_output"); - debug('debug mode activated'); - } else { - Element.hide("debug_output"); - } - - return; - } - if ((keycode == 191 || keychar == '?') && shift_key) { // ? if (!Element.visible("hotkey_help_overlay")) { //Element.show("hotkey_help_overlay"); @@ -1033,10 +792,10 @@ function hotkey_handler(e) { return false; } - if (keycode == 82 && shift_key) { // R +/* if (keycode == 82 && shift_key) { // R scheduleFeedUpdate(true); return; - } + } */ if (keycode == 74) { // j var feed = getActiveFeedId(); @@ -1090,43 +849,41 @@ function hotkey_handler(e) { return; } + if (keycode == 68 && shift_key) { // shift-D + dismissSelectedArticles(); + } + + if (keycode == 88 && shift_key) { // shift-X + dismissReadArticles(); + } if (keycode == 78 || keycode == 40) { // n, down if (typeof moveToPost != 'undefined') { moveToPost('next'); - return; + return false; } } if (keycode == 80 || keycode == 38) { // p, up if (typeof moveToPost != 'undefined') { moveToPost('prev'); - return; + return false; } } if (keycode == 83 && shift_key) { // S - var id = getActiveArticleId(); - if (id) { - togglePub(id); - } + selectionTogglePublished(undefined, false, true); return; } if (keycode == 83) { // s - var id = getActiveArticleId(); - if (id) { - toggleMark(id); - } + selectionToggleMarked(undefined, false, true); return; } if (keycode == 85) { // u - var id = getActiveArticleId(); - if (id) { - toggleUnread(id); - } + selectionToggleUnread(undefined, false, true) return; } @@ -1197,10 +954,10 @@ function hotkey_handler(e) { return false; } - if (keycode == 85 && shift_key) { // U +/* if (keycode == 85 && shift_key) { // U scheduleFeedUpdate(true); return false; - } + } */ if (keycode == 85) { // u if (getActiveFeedId()) { @@ -1238,11 +995,10 @@ function hotkey_handler(e) { return resort_feedlist(); } - if (keycode == 72) { // h - hideReadHeadlines(); + if (keycode == 88) { // x + reverseHeadlineOrder(); return; } - } /* Prefix c */ @@ -1338,9 +1094,9 @@ function hotkey_handler(e) { } if (hotkey_prefix) { - debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar); + console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar); } else { - debug("KP: CODE=" + keycode + " CHAR=" + keychar); + console.log("KP: CODE=" + keycode + " CHAR=" + keychar); } @@ -1349,10 +1105,118 @@ function hotkey_handler(e) { } } -function feedsSortByUnread() { - return feeds_sort_by_unread; -} - function inPreferences() { return false; } + +function reverseHeadlineOrder() { + try { + + var query_str = "?op=rpc&subop=togglepref&key=REVERSE_HEADLINES"; + + new Ajax.Request("backend.php", { + parameters: query_str, + onComplete: function(transport) { + viewCurrentFeed(); + } }); + + } catch (e) { + exception_error("reverseHeadlineOrder", e); + } +} + +function showFeedsWithErrors() { + displayDlg('feedUpdateErrors'); +} + +function handle_rpc_reply(transport, scheduled_call) { + try { + if (transport.responseXML) { + + if (!transport_error_check(transport)) return false; + + var seq = transport.responseXML.getElementsByTagName("seq")[0]; + + if (seq) { + seq = seq.firstChild.nodeValue; + + if (get_seq() != seq) { + //console.log("[handle_rpc_reply] sequence mismatch: " + seq); + return true; + } + } + + var message = transport.responseXML.getElementsByTagName("message")[0]; + + if (message) { + message = message.firstChild.nodeValue; + + if (message == "UPDATE_COUNTERS") { + console.log("need to refresh counters..."); + setInitParam("last_article_id", -1); + _force_scheduled_update = true; + } + } + + var counters = transport.responseXML.getElementsByTagName("counters")[0]; + + if (counters) + parse_counters(counters, scheduled_call); + + var runtime_info = transport.responseXML.getElementsByTagName("runtime-info")[0]; + + if (runtime_info) + parse_runtime_info(runtime_info); + + if (feedsSortByUnread()) + resort_feedlist(); + + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + + } else { + notify_error("Error communicating with server."); + } + + } catch (e) { + exception_error("handle_rpc_reply", e, transport); + } + + return true; +} + +function scheduleFeedUpdate() { + try { + + if (!getActiveFeedId()) { + alert(__("Please select some feed first.")); + return; + } + + var query = "?op=rpc&subop=scheduleFeedUpdate&id=" + + param_escape(getActiveFeedId()) + + "&is_cat=" + param_escape(activeFeedIsCat()); + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + + if (transport.responseXML) { + var message = transport.responseXML.getElementsByTagName("message")[0]; + + if (message) { + notify_info(message.firstChild.nodeValue); + return; + } + } + + notify_error("Error communicating with server."); + + } }); + + + } catch (e) { + exception_error("scheduleFeedUpdate", e); + } +}