X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=tt-rss.js;h=71ebf13bc72d7efee2538d109c6b5e336499c72c;hb=c3b44b7304e5261a87427a3277508451fd6eee43;hp=215699c5094e8b72ccbe73bf86c18cb137b68633;hpb=d00bfb5f45b8970de0fbef0ed93eb5a01d7a3dc6;p=tt-rss.git diff --git a/tt-rss.js b/tt-rss.js index 215699c5..71ebf13b 100644 --- a/tt-rss.js +++ b/tt-rss.js @@ -1,4 +1,3 @@ -var xmlhttp = false; var total_unread = 0; var first_run = true; var display_tags = false; @@ -7,21 +6,18 @@ var active_title_text = ""; var current_subtitle = ""; var daemon_enabled = false; var daemon_refresh_only = false; -var _qfd_deleted_feed = 0; +//var _qfd_deleted_feed = 0; var firsttime_update = true; -var last_refetch = 0; -var cookie_lifetime = 0; var active_feed_id = 0; var active_feed_is_cat = false; var number_of_feeds = 0; var sanity_check_done = false; - -var xmlhttp = Ajax.getTransport(); -var xmlhttp_ctr = Ajax.getTransport(); - +var _hfd_scrolltop = 0; +var hotkey_prefix = false; var init_params = new Object(); - -//var op_history = new Array(); +var ver_offset = 0; +var hor_offset = 0; +var feeds_sort_by_unread = false; function tagsAreDisplayed() { return display_tags; @@ -29,6 +25,10 @@ function tagsAreDisplayed() { function toggleTags(show_all) { + try { + + debug("toggleTags: " + show_all + "; " + display_tags); + var p = document.getElementById("dispSwitchPrompt"); if (!show_all && !display_tags) { @@ -45,113 +45,107 @@ function toggleTags(show_all) { notify_progress("Loading, please wait...", true); updateFeedList(); } -} -function dlg_frefresh_callback() { - if (xmlhttp.readyState == 4) { -// notify(xmlhttp.responseText); + } catch (e) { + exception_error("toggleTags", e); + } +} - if (getActiveFeedId() == _qfd_deleted_feed) { - var h = document.getElementById("headlines-frame"); - if (h) { - h.innerHTML = "
" + __('No feed selected.') + "
"; - } +function dlg_frefresh_callback(transport, deleted_feed) { + if (getActiveFeedId() == deleted_feed) { + var h = document.getElementById("headlines-frame"); + if (h) { + h.innerHTML = "
" + __('No feed selected.') + "
"; } + } - setTimeout('updateFeedList(false, false)', 50); - closeInfoBox(); - } + setTimeout('updateFeedList(false, false)', 50); + closeInfoBox(); } -function refetch_callback() { - if (xmlhttp_ctr.readyState == 4) { - try { - - var date = new Date(); +function refetch_callback2(transport) { + try { - last_refetch = date.getTime() / 1000; + var date = new Date(); - parse_counters_reply(xmlhttp_ctr, true); + parse_counters_reply(transport, true); - debug("refetch_callback: done"); + debug("refetch_callback2: done"); - if (!daemon_enabled && !daemon_refresh_only) { - notify_info("All feeds updated."); - updateTitle(""); - } else { - //notify(""); - } - } catch (e) { - exception_error("refetch_callback", e); +/* if (!daemon_enabled && !daemon_refresh_only) { + notify_info("All feeds updated."); updateTitle(""); - } + } else { + //notify(""); + } */ + } catch (e) { + exception_error("refetch_callback", e); + updateTitle(""); } } -function backend_sanity_check_callback() { +function backend_sanity_check_callback(transport) { - if (xmlhttp.readyState == 4) { + try { - 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 (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 (!xmlhttp.responseXML) { - fatalError(3, "[D001, Received reply is not XML]: " + xmlhttp.responseText); - return; - } - - var reply = xmlhttp.responseXML.firstChild.firstChild; - - if (!reply) { - fatalError(3, "[D002, Invalid RPC reply]: " + xmlhttp.responseText); - return; - } - - var error_code = reply.getAttribute("error-code"); - - if (error_code && error_code != 0) { - return fatalError(error_code, reply.getAttribute("error-msg")); - } + if (!transport.responseXML) { + fatalError(3, "[D001, Received reply is not XML]: " + transport.responseText); + return; + } + + var reply = transport.responseXML.firstChild.firstChild; + + if (!reply) { + fatalError(3, "[D002, Invalid RPC reply]: " + transport.responseText); + return; + } + + var error_code = reply.getAttribute("error-code"); - debug("sanity check ok"); + if (error_code && error_code != 0) { + return fatalError(error_code, reply.getAttribute("error-msg")); + } - var params = reply.nextSibling; + debug("sanity check ok"); - if (params) { - debug('reading init-params...'); - var param = params.firstChild; + var params = reply.nextSibling; - while (param) { - var k = param.getAttribute("key"); - var v = param.getAttribute("value"); - debug(k + " => " + v); - init_params[k] = v; - param = param.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; + param = param.nextSibling; } + } - sanity_check_done = true; + sanity_check_done = true; - init_second_stage(); + init_second_stage(); - } catch (e) { - exception_error("backend_sanity_check_callback", e); - } + } catch (e) { + exception_error("backend_sanity_check_callback", e); } } function scheduleFeedUpdate(force) { - if (!daemon_enabled && !daemon_refresh_only) { - notify_progress("Updating feeds, please wait.", true); - updateTitle("Updating"); - } + debug("in scheduleFeedUpdate"); + +/* if (!daemon_enabled && !daemon_refresh_only) { + notify_progress("Updating feeds...", true); + } */ var query_str = "backend.php?op=rpc&subop="; @@ -177,28 +171,16 @@ function scheduleFeedUpdate(force) { query_str = query_str + "&omode=" + omode; query_str = query_str + "&uctr=" + global_unread; - debug("in scheduleFeedUpdate"); - var date = new Date(); - var timestamp = Math.round(date.getTime() / 1000); query_str = query_str + "&ts=" + timestamp - if (!xmlhttp_ready(xmlhttp_ctr) && last_refetch < date.getTime() / 1000 - 60) { - debug("xmlhttp seems to be stuck, aborting"); - xmlhttp_ctr.abort(); - } - debug("REFETCH query: " + query_str); - if (xmlhttp_ready(xmlhttp_ctr)) { - xmlhttp_ctr.open("GET", query_str, true); - xmlhttp_ctr.onreadystatechange=refetch_callback; - xmlhttp_ctr.send(null); - } else { - debug("xmlhttp_ctr busy"); - //printLockingError(); - } + new Ajax.Request(query_str, { + onComplete: function(transport) { + refetch_callback2(transport); + } }); } function updateFeedList(silent, fetch) { @@ -230,44 +212,40 @@ function updateFeedList(silent, fetch) { debug("updateFeedList Q=" + query_str); - if (xmlhttp_ready(xmlhttp)) { - xmlhttp.open("GET", query_str, true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); - } else { - debug("xmlhttp busy"); - //printLockingError(); - } + new Ajax.Request(query_str, { + onComplete: function(transport) { + feedlist_callback2(transport); + } }); } function catchupAllFeeds() { - var query_str = "backend.php?op=feeds&subop=catchupAll"; + var str = __("Mark all articles as read?"); - notify_progress("Marking all feeds as read..."); + if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) { - debug("catchupAllFeeds Q=" + query_str); + var query_str = "backend.php?op=feeds&subop=catchupAll"; - if (xmlhttp_ready(xmlhttp)) { - xmlhttp.open("GET", query_str, true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); - } else { - debug("xmlhttp busy"); - //printLockingError(); - } + notify_progress("Marking all feeds as read..."); + + debug("catchupAllFeeds Q=" + query_str); - global_unread = 0; - updateTitle(""); + new Ajax.Request(query_str, { + onComplete: function(transport) { + feedlist_callback2(transport); + } }); + global_unread = 0; + updateTitle(""); + } } function viewCurrentFeed(subop) { // if (getActiveFeedId()) { if (getActiveFeedId() != undefined) { - viewfeed(getActiveFeedId(), subop); + viewfeed(getActiveFeedId(), subop, active_feed_is_cat); } else { disableContainerChildren("headlinesToolbar", false, document); // viewfeed(-1, subop); // FIXME @@ -281,6 +259,8 @@ function viewfeed(feed, subop) { } function timeout() { + if (getInitParam("bw_limit") == "1") return; + scheduleFeedUpdate(false); var refresh_time = getInitParam("feeds_frame_refresh"); @@ -308,19 +288,6 @@ function search() { viewCurrentFeed(0, ""); } -function localPiggieFunction(enable) { - if (enable) { - var query_str = "backend.php?op=feeds&subop=piggie"; - - if (xmlhttp_ready(xmlhttp)) { - - xmlhttp.open("GET", query_str, true); - xmlhttp.onreadystatechange=feedlist_callback; - xmlhttp.send(null); - } - } -} - // if argument is undefined, current subtitle is not updated // use blank string to clear subtitle function updateTitle(s) { @@ -347,7 +314,7 @@ function updateTitle(s) { function genericSanityCheck() { - if (!xmlhttp) fatalError(1); +// if (!Ajax.getTransport()) fatalError(1); setCookie("ttrss_vf_test", "TEST"); @@ -375,62 +342,118 @@ function init() { return; if (getURLParam('debug')) { - document.getElementById('debug_output').style.display = 'block'; + Element.show("debug_output"); debug('debug mode activated'); } var params = "&ua=" + param_escape(navigator.userAgent); - xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck" + params, true); - xmlhttp.onreadystatechange=backend_sanity_check_callback; - xmlhttp.send(null); + loading_set_progress(30); + + new Ajax.Request("backend.php?op=rpc&subop=sanityCheck" + params, { + onComplete: function(transport) { + backend_sanity_check_callback(transport); + } }); } catch (e) { exception_error("init", e); } } -function resize_headlines() { - - var h_frame = document.getElementById("headlines-frame"); - var c_frame = document.getElementById("content-frame"); - var f_frame = document.getElementById("footer"); - - if (!c_frame || !h_frame) return; +function resize_headlines(delta_x, delta_y) { - debug("resize_headlines"); + try { - if (!is_msie()) { - h_frame.style.height = 30 + "%"; - c_frame.style.top = h_frame.offsetTop + h_frame.offsetHeight + 1 + "px"; - h_frame.style.height = h_frame.offsetHeight + "px"; - } else { - h_frame.style.height = document.documentElement.clientHeight * 0.3 + "px"; - c_frame.style.top = h_frame.offsetTop + h_frame.offsetHeight + 1 + "px"; + debug("resize_headlines: " + delta_x + ":" + delta_y); + + var h_frame = document.getElementById("headlines-frame"); + var c_frame = document.getElementById("content-frame"); + var f_frame = document.getElementById("footer"); + var feeds_frame = document.getElementById("feeds-holder"); + var resize_grab = document.getElementById("resize-grabber"); + var resize_handle = document.getElementById("resize-handle"); + + if (!c_frame || !h_frame) return; + + if (feeds_frame && getInitParam("theme") == "compat") { + feeds_frame.style.bottom = f_frame.offsetHeight + "px"; + } + + if (getInitParam("theme") == "3pane") { + + 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"; - var c_bottom = document.documentElement.clientHeight; + resize_handle.src = "themes/3pane/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 + 1) + "px"; + h_frame.style.height = h_frame.offsetHeight + "px"; + + var theme_c = 0; + + if (getInitParam("theme") == "graycube") { + theme_c = 1; + } - if (f_frame) { - c_bottom = f_frame.offsetTop; + if (getInitParam("theme") == "graycube" || getInitParam("theme") == "compat") { + resize_handle.src = "themes/graycube/images/resize_handle_horiz.png"; + } + +/* resize_grab.style.top = (h_frame.offsetTop + h_frame.offsetHeight - + 4 - theme_c) + "px"; + resize_grab.style.display = "block"; */ + + } + + 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); } - c_frame.style.height = c_bottom - (h_frame.offsetTop + - h_frame.offsetHeight + 1) + "px"; - h_frame.style.height = h_frame.offsetHeight + "px"; - + } catch (e) { + exception_error("resize_headlines", e); } + } function init_second_stage() { try { - cookie_lifetime = getCookie("ttrss_cltime"); - delCookie("ttrss_vf_test"); // document.onresize = resize_headlines; - resize_headlines(); var toolbar = document.forms["main_toolbar_form"]; @@ -439,11 +462,26 @@ function init_second_stage() { daemon_enabled = getInitParam("daemon_enabled") == 1; daemon_refresh_only = getInitParam("daemon_refresh_only") == 1; + feeds_sort_by_unread = getInitParam("feeds_sort_by_unread") == 1; setTimeout('updateFeedList(false, false)', 50); debug("second stage ok"); - + + loading_set_progress(60); + + ver_offset = parseInt(getCookie("ttrss_offset_ver")); + hor_offset = parseInt(getCookie("ttrss_offset_hor")); + + /* 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(); + } catch (e) { exception_error("init_second_stage", e); } @@ -482,24 +520,51 @@ function quickMenuGo(opid) { var actid = getActiveFeedId(); if (activeFeedIsCat()) { - alert("You can't unsubscribe from the category."); + alert(__("You can't unsubscribe from the category.")); return; } if (!actid) { - alert("Please select some feed first."); + alert(__("Please select some feed first.")); return; } var fn = getFeedName(actid); - - if (confirm("Unsubscribe from " + fn + "?")) { - qfdDelete(actid); + + var pr = __("Unsubscribe from %s?").replace("%s", fn); + + if (confirm(pr)) { + unsubscribeFeed(actid); + } + + return; + } + + if (opid == "qmcClearFeed") { + var actid = getActiveFeedId(); + + if (!actid) { + alert(__("Please select some feed first.")); + return; + } + + if (activeFeedIsCat() || actid < 0) { + alert(__("You can't clear this type of feed.")); + return; + } + + var fn = getFeedName(actid); + + var pr = __("Erase all non-starred articles in %s?").replace("%s", fn); + + if (confirm(pr)) { + clearFeedArticles(actid); } return; } + if (opid == "qmcUpdateFeeds") { scheduleFeedUpdate(true); return; @@ -519,25 +584,37 @@ function quickMenuGo(opid) { displayDlg("quickAddFilter", getActiveFeedId()); } + if (opid == "qmcRescoreFeed") { + rescoreCurrentFeed(); + } + + if (opid == "qmcHKhelp") { + //Element.show("hotkey_help_overlay"); + Effect.Appear("hotkey_help_overlay", {duration : 0.3}); + } + + if (opid == "qmcResetUI") { + hor_offset = 0; + ver_offset = 0; + resize_headlines(); + } + } catch (e) { exception_error("quickMenuGo", e); } } -function qfdDelete(feed_id) { +function unsubscribeFeed(feed_id) { notify_progress("Removing feed..."); - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } + var query = "backend.php?op=pref-feeds&quiet=1&subop=remove&ids=" + feed_id; - _qfd_deleted_feed = feed_id; + new Ajax.Request(query, { + onComplete: function(transport) { + dlg_frefresh_callback(transport, feed_id); + } }); - xmlhttp.open("GET", "backend.php?op=pref-feeds&quiet=1&subop=remove&ids=" + feed_id); - xmlhttp.onreadystatechange=dlg_frefresh_callback; - xmlhttp.send(null); return false; } @@ -551,25 +628,15 @@ function updateFeedTitle(t) { function toggleDispRead() { try { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - var hide_read_feeds = (getInitParam("hide_read_feeds") == "1"); hide_read_feeds = !hide_read_feeds; debug("toggle_disp_read => " + hide_read_feeds); - hideOrShowFeeds(getFeedsContext().document, hide_read_feeds); + hideOrShowFeeds(hide_read_feeds); storeInitParam("hide_read_feeds", hide_read_feeds, true); - -/* var query = "backend.php?op=rpc&subop=setpref" + - "&key=HIDE_READ_FEEDS&value=" + param_escape(hide_read_feeds); - - new Ajax.Request(query); */ } catch (e) { exception_error("toggleDispRead", e); @@ -603,9 +670,19 @@ function parse_runtime_info(elem) { } } + var error_flag; + if (k == "daemon_is_running" && v != 1) { - notify_error("Update daemon is not running."); - } else { + notify_error("Update daemon is not running.", true); + error_flag = true; + } + + if (k == "daemon_stamp_ok" && v != 1) { + notify_error("Update daemon is not updating feeds.", true); + error_flag = true; + } + + if (!error_flag) { notify(''); } @@ -626,7 +703,7 @@ function catchupCurrentFeed() { var fn = getFeedName(getActiveFeedId(), active_feed_is_cat); - var str = "Mark all articles in " + fn + " as read?"; + var str = __("Mark all articles in %s as read?").replace("%s", fn); /* if (active_feed_is_cat) { str = "Mark all articles in this category as read?"; @@ -637,33 +714,45 @@ function catchupCurrentFeed() { } } -function userSwitch() { - var chooser = document.getElementById("userSwitch"); - var user = chooser[chooser.selectedIndex].value; - window.location = "tt-rss.php?swu=" + user; +function catchupFeedInGroup(id, title) { + + var str = __("Mark all articles in %s as read?").replace("%s", title); + + if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) { + return viewCurrentFeed('MarkAllReadGR:' + id) + } } function editFeedDlg(feed) { + try { - disableHotkeys(); + if (!feed) { + alert(__("Please select some feed first.")); + return; + } + + if ((feed <= 0 && feed > -10) || activeFeedIsCat() || tagsAreDisplayed()) { + alert(__("You can't edit this kind of feed.")); + return; + } + + var query = ""; + + if (feed > 0) { + query = "backend.php?op=pref-feeds&subop=editfeed&id=" + param_escape(feed); + } else { + query = "backend.php?op=pref-labels&subop=edit&id=" + param_escape(-feed-11); + } - if (!feed) { - alert("Please select some feed first."); - return; - } + disableHotkeys(); - if (feed <= 0 || activeFeedIsCat() || tagsAreDisplayed()) { - alert("You can't edit this kind of feed."); - return; - } + new Ajax.Request(query, { + onComplete: function(transport) { + infobox_callback2(transport); + } }); - if (xmlhttp_ready(xmlhttp)) { - xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editfeed&id=" + - param_escape(feed), true); - xmlhttp.onreadystatechange=infobox_callback; - xmlhttp.send(null); - } else { - printLockingError(); + } catch (e) { + exception_error("editFeedDlg", e); } } @@ -679,21 +768,18 @@ function feedEditSave() { try { - if (!xmlhttp_ready(xmlhttp)) { - printLockingError(); - return - } - // FIXME: add parameter validation var query = Form.serialize("edit_feed_form"); notify_progress("Saving feed..."); - xmlhttp.open("POST", "backend.php", true); - xmlhttp.onreadystatechange=dlg_frefresh_callback; - xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xmlhttp.send(query); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + dlg_frefresh_callback(transport); + } }); + closeInfoBox(); @@ -703,84 +789,556 @@ function feedEditSave() { exception_error("feedEditSave (main)", e); } } + +function labelEditCancel() { + closeInfoBox(); + return false; +} + +function labelEditSave() { + + try { + + closeInfoBox(); + + notify_progress("Saving label..."); + + query = Form.serialize("label_edit_form"); + + new Ajax.Request("backend.php?" + query, { + onComplete: function(transport) { + dlg_frefresh_callback(transport); + } }); + + return false; + + } catch (e) { + exception_error("feedEditSave (main)", e); + } + +} + +function clearFeedArticles(feed_id) { + + notify_progress("Clearing feed..."); + + var query = "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id; + + new Ajax.Request(query, { + onComplete: function(transport) { + dlg_frefresh_callback(transport, feed_id); + } }); + + return false; +} + /* -function localHotkeyHandler(e) { +function toggle_feedlist() { + try { + debug("toggle_feedlist"); + + var fl = document.getElementById("feeds-holder"); + + if (!Element.visible(fl)) { + Element.show(fl); + fl.style.zIndex = 30; + fl.scrollTop = _hfd_scrolltop; + } else { + _hfd_scrolltop = fl.scrollTop; + Element.hide(fl); +// Effect.Fade(fl, {duration : 0.2, +// queue: { position: 'end', scope: 'FLFADEQ', limit: 1 }}); + } + } catch (e) { + exception_error("toggle_feedlist", e); + } +} */ + +function collapse_feedlist() { + try { + debug("toggle_feedlist"); + + var theme = getInitParam("theme"); + if (theme != "" && theme != "compact" && theme != "graycube" && + theme != "compat") return; + + var fl = document.getElementById("feeds-holder"); + var fh = document.getElementById("headlines-frame"); + var fc = document.getElementById("content-frame"); + var ft = document.getElementById("toolbar"); + var ff = document.getElementById("footer"); + var fhdr = document.getElementById("header"); + var fbtn = document.getElementById("collapse_feeds_btn"); + + if (!Element.visible(fl)) { + Element.show(fl); + fbtn.value = "<<"; + + if (theme != "graycube") { + + fh.style.left = fl.offsetWidth + "px"; + ft.style.left = fl.offsetWidth + "px"; + if (fc) fc.style.left = fl.offsetWidth + "px"; + if (ff && theme != "compat") ff.style.left = (fl.offsetWidth-1) + "px"; + + if (theme == "compact") fhdr.style.left = (fl.offsetWidth + 10) + "px"; + } else { + fh.style.left = fl.offsetWidth + 40 + "px"; + ft.style.left = fl.offsetWidth + 40 +"px"; + if (fc) fc.style.left = fl.offsetWidth + 40 + "px"; + } + + setCookie("ttrss_vf_fclps", "0"); + + } else { + Element.hide(fl); + fbtn.value = ">>"; + + if (theme != "graycube") { + + fh.style.left = "0px"; + ft.style.left = "0px"; + if (fc) fc.style.left = "0px"; + if (ff) ff.style.left = "0px"; + + if (theme == "compact") fhdr.style.left = "10px"; + + } else { + fh.style.left = "20px"; + ft.style.left = "20px"; + if (fc) fc.style.left = "20px"; + + } + + setCookie("ttrss_vf_fclps", "1"); + } + } catch (e) { + exception_error("toggle_feedlist", e); + } +} + +function viewModeChanged() { + cache_empty(); + return viewCurrentFeed(0, '') +} + +function viewLimitChanged() { + cache_empty(); + return viewCurrentFeed(0, '') +} + +function adjustArticleScore(id, score) { + try { + + var pr = prompt(__("Assign score to article:"), score); + + if (pr != undefined) { + var query = "backend.php?op=rpc&subop=setScore&id=" + id + "&score=" + pr; + + new Ajax.Request(query, { + onComplete: function(transport) { + viewCurrentFeed(); + } }); + + } + } catch (e) { + exception_error("adjustArticleScore", e); + } +} + +function rescoreCurrentFeed() { - var keycode; + var actid = getActiveFeedId(); - if (window.event) { - keycode = window.event.keyCode; - } else if (e) { - keycode = e.which; + if (activeFeedIsCat() || actid < 0 || tagsAreDisplayed()) { + alert(__("You can't rescore this kind of feed.")); + return; + } + + if (!actid) { + alert(__("Please select some feed first.")); + return; } - var shift_key = false; + var fn = getFeedName(actid); + var pr = __("Rescore articles in %s?").replace("%s", fn); + + if (confirm(pr)) { + notify_progress("Rescoring articles..."); + + var query = "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids=" + actid; + + new Ajax.Request(query, { + onComplete: function(transport) { + viewCurrentFeed(); + } }); + } +} + +function hotkey_handler(e) { try { - shift_key = e.shiftKey; - } catch (e) { } - if (keycode == 66 && shift_key) { // shift-B + var keycode; + var shift_key = false; + + var feedlist = document.getElementById('feedList'); + + try { + shift_key = e.shiftKey; + } catch (e) { + + } + + if (window.event) { + keycode = window.event.keyCode; + } else if (e) { + keycode = e.which; + } - var op = history_pop(); + var keychar = String.fromCharCode(keycode); - if (op) { - var op_s = op.split(":"); + if (keycode == 27) { // escape + if (Element.visible("hotkey_help_overlay")) { + Element.hide("hotkey_help_overlay"); + } + hotkey_prefix = false; + closeInfoBox(); + } - var i; - for (i = 0; i < op_s.length; i++) { - if (op_s[i] == 'undefined') { - op_s[i] = undefined; + if (!hotkeys_enabled) { + debug("hotkeys disabled"); + return; + } + + if (keycode == 16) return; // ignore lone shift + + if ((keycode == 70 || keycode == 67 || keycode == 71 || + keycode == 224 || keycode == 91) && !hotkey_prefix) { + + hotkey_prefix = keycode; + debug("KP: PREFIX=" + keycode + " CHAR=" + keychar); + return true; + } + + if (Element.visible("hotkey_help_overlay")) { + Element.hide("hotkey_help_overlay"); + } + + /* Global hotkeys */ + + 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"); + Effect.Appear("hotkey_help_overlay", {duration : 0.3}); + } else { + Element.hide("hotkey_help_overlay"); + } + return false; + } - if (op_s[i] == 'false') { - op_s[i] = false; + if (keycode == 191 || keychar == '/') { // / + displayDlg("search", getActiveFeedId() + ":" + activeFeedIsCat()); + return false; + } + + if (keycode == 82 && shift_key) { // R + scheduleFeedUpdate(true); + return; + } + + if (keycode == 82) { // r + if (getActiveFeedId()) { + viewfeed(getActiveFeedId(), "ForceUpdate", activeFeedIsCat()); + return; } + } - if (op_s[i] == 'true') { - op_s[i] = true; + if (keycode == 74) { // j + var feed = getActiveFeedId(); + var new_feed = getRelativeFeedId2(feed, activeFeedIsCat(), 'prev'); +// alert(feed + " IC: " + activeFeedIsCat() + " => " + new_feed); + if (new_feed) { + var is_cat = new_feed.match("CAT:"); + if (is_cat) { + new_feed = new_feed.replace("CAT:", ""); + viewCategory(new_feed); + } else { + viewfeed(new_feed, '', false); + } } - + return; + } + + if (keycode == 75) { // k + var feed = getActiveFeedId(); + var new_feed = getRelativeFeedId2(feed, activeFeedIsCat(), 'next'); +// alert(feed + " IC: " + activeFeedIsCat() + " => " + new_feed); + if (new_feed) { + var is_cat = new_feed.match("CAT:"); + if (is_cat == "CAT:") { + new_feed = new_feed.replace("CAT:", ""); + viewCategory(new_feed); + } else { + viewfeed(new_feed, '', false); + } + } + return; } - debug("history split: " + op_s); + if (shift_key && (keycode == 78 || keycode == 40)) { // shift - n, down + catchupRelativeToArticle(1); + return; + } - if (op_s[0] == "ARTICLE") { - debug("history: reverting to article " + op_s[1] + "/" + op_s[2]); - view(op_s[1], op_s[2], true); + if (shift_key && (keycode == 80 || keycode == 38)) { // shift - p, up + catchupRelativeToArticle(0); + return; } - if (op_s[0] == "FEED") { - viewfeed(op_s[1], op_s[2], op_s[3], op_s[4], true); + if (keycode == 78 || keycode == 40) { // n, down + if (typeof moveToPost != 'undefined') { + moveToPost('next'); + return; + } + } + + if (keycode == 80 || keycode == 38) { // p, up + if (typeof moveToPost != 'undefined') { + moveToPost('prev'); + return; + } } - } else { - notify_error("No operation to undo"); + if (keycode == 83 && shift_key) { // S + var id = getActiveArticleId(); + if (id) { + togglePub(id); + } + return; + } + + if (keycode == 83) { // s + var id = getActiveArticleId(); + if (id) { + toggleMark(id); + } + return; + } + + + if (keycode == 85) { // u + var id = getActiveArticleId(); + if (id) { + toggleUnread(id); + } + return; + } + + if (keycode == 84 && shift_key) { // T + var id = getActiveArticleId(); + if (id) { + editArticleTags(id, getActiveFeedId(), isCdmMode()); + return; + } + } + + if (keycode == 9) { // tab + var id = getArticleUnderPointer(); + if (id) { + var cb = document.getElementById("RCHK-" + id); + + if (cb) { + cb.checked = !cb.checked; + toggleSelectRowById(cb, "RROW-" + id); + return false; + } + } + } + + if (keycode == 79) { // o + if (getActiveArticleId()) { + openArticleInNewWindow(getActiveArticleId()); + return; + } + } + + if (keycode == 81 && shift_key) { // Q + if (typeof catchupAllFeeds != 'undefined') { + catchupAllFeeds(); + return; + } + } + + if (keycode == 81) { // q + if (getActiveFeedId()) { + catchupCurrentFeed(); + return; + } + } + + if (keycode == 220 && shift_key) { // shift + | + if (document.getElementById("subtoolbar_search")) { + if (Element.visible("subtoolbar_search")) { + Element.hide("subtoolbar_search"); + Element.show("subtoolbar_ftitle"); + setTimeout("Element.focus('subtoolbar_search_box')", 100); + } else { + Element.show("subtoolbar_search"); + Element.hide("subtoolbar_ftitle"); + } + } + } + + if (keycode == 88) { // x + if (activeFeedIsCat()) { + toggleCollapseCat(getActiveFeedId()); + } + } } - return false; + /* Prefix f */ - } + if (hotkey_prefix == 70) { // f + + hotkey_prefix = false; - debug("LKP=" + keycode); -} + if (keycode == 65) { // a + toggleDispRead(); + return false; + } + + if (keycode == 85 && shift_key) { // U + scheduleFeedUpdate(true); + return false; + } -function history_push(op) { - debug("history_push: " + op); - op_history.push(op); + if (keycode == 85) { // u + if (getActiveFeedId()) { + viewfeed(getActiveFeedId(), "ForceUpdate"); + return false; + } + } - while (op_history.length > 30) { - op_history.shift(); + if (keycode == 69) { // e + editFeedDlg(getActiveFeedId()); + return false; + } + + if (keycode == 83) { // s + displayDlg("quickAddFeed"); + return false; + } + + if (keycode == 67 && shift_key) { // C + if (typeof catchupAllFeeds != 'undefined') { + catchupAllFeeds(); + return false; + } + } + + if (keycode == 67) { // c + if (getActiveFeedId()) { + catchupCurrentFeed(); + return false; + } + } + + if (keycode == 87) { // w + feeds_sort_by_unread = !feeds_sort_by_unread; + return resort_feedlist(); + } + + if (keycode == 72) { // h + hideReadHeadlines(); + return; + } + + } + + /* Prefix c */ + + if (hotkey_prefix == 67) { // c + hotkey_prefix = false; + + if (keycode == 70) { // f + displayDlg("quickAddFilter", getActiveFeedId()); + return false; + } + + if (keycode == 83) { // s + if (typeof collapse_feedlist != 'undefined') { + collapse_feedlist(); + return false; + } + } + + } + + /* Prefix g */ + + if (hotkey_prefix == 71) { // g + + hotkey_prefix = false; + + if (keycode == 83) { // s + viewfeed(-1); + return false; + } + + if (keycode == 80 && shift_key) { // P + gotoPreferences(); + return false; + } + + if (keycode == 80) { // p + viewfeed(-2); + return false; + } + + if (keycode == 70) { // f + viewfeed(-3); + return false; + } + + if (keycode == 84 && shift_key) { // T + toggleTags(); + return false; + } + } + + /* Cmd */ + + if (hotkey_prefix == 224 || hotkey_prefix == 91) { // f + hotkey_prefix = false; + return; + } + + if (hotkey_prefix) { + debug("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar); + } else { + debug("KP: CODE=" + keycode + " CHAR=" + keychar); + } + + + } catch (e) { + exception_error("hotkey_handler", e); } } -function history_pop() { - var op = op_history.pop(); - debug("history_pop: " + op); - return op; +function feedsSortByUnread() { + return feeds_sort_by_unread; } - -function history_clear() { - debug("history_clear"); - op_history.clear(); -} */