]> git.wh0rd.org - tt-rss.git/blobdiff - js/tt-rss.js
assign stored content-insert height/width in switchPanelMode(); reset stored sizes...
[tt-rss.git] / js / tt-rss.js
index 54ac077f43deedbbc55fe1182dac8b67dbdbac87..7d6f22f877e529a7a4f34cf6d70f9eedc922153e 100644 (file)
@@ -1,6 +1,7 @@
 var global_unread = -1;
 var hotkey_prefix = false;
 var hotkey_prefix_pressed = false;
+var hotkey_actions = {};
 var _widescreen_mode = false;
 var _rpc_seq = 0;
 var _active_feed_id = 0;
@@ -35,7 +36,12 @@ function setActiveFeedId(id, is_cat) {
                _active_feed_id = id;
                _active_feed_is_cat = is_cat;
 
+               $("headlines-frame").setAttribute("feed-id", id);
+               $("headlines-frame").setAttribute("is-cat", is_cat ? 1 : 0);
+
                selectFeed(id, is_cat);
+
+               PluginHost.run(PluginHost.HOOK_FEED_SET_ACTIVE, _active_article_id);
        } catch (e) {
                exception_error("setActiveFeedId", e);
        }
@@ -110,6 +116,7 @@ function updateFeedList() {
 
                tree.startup();
 
+
        } catch (e) {
                exception_error("updateFeedList", e);
        }
@@ -130,7 +137,8 @@ function catchupAllFeeds() {
                new Ajax.Request("backend.php", {
                        parameters: query_str,
                        onComplete: function(transport) {
-                               feedlist_callback2(transport);
+                               request_counters(true);
+                               viewCurrentFeed();
                        } });
 
                global_unread = 0;
@@ -155,7 +163,7 @@ function timeout() {
 }
 
 function search() {
-       var query = "backend.php?op=dlg&method=search&param=" +
+       var query = "backend.php?op=feeds&method=search&param=" +
                param_escape(getActiveFeedId() + ":" + activeFeedIsCat());
 
        if (dijit.byId("searchDlg"))
@@ -205,6 +213,7 @@ function genericSanityCheck() {
        return true;
 }
 
+
 function init() {
        try {
                //dojo.registerModulePath("fox", "../../js/");
@@ -241,18 +250,298 @@ function init() {
                if (!genericSanityCheck())
                        return false;
 
-               loading_set_progress(20);
+               loading_set_progress(30);
+
+               var a = document.createElement('audio');
 
-               var hasAudio = !!((myAudioTag = document.createElement('audio')).canPlayType);
+               var hasAudio = !!a.canPlayType;
                var hasSandbox = "sandbox" in document.createElement("iframe");
+               var hasMp3 = !!(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, ''));
+               var clientTzOffset = new Date().getTimezoneOffset() * 60;
 
                new Ajax.Request("backend.php", {
                        parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio,
+                               hasMp3: hasMp3,
+                               clientTzOffset: clientTzOffset,
                                hasSandbox: hasSandbox},
                        onComplete: function(transport) {
                                        backend_sanity_check_callback(transport);
                                } });
 
+               hotkey_actions["next_feed"] = function() {
+                               var rv = dijit.byId("feedTree").getNextFeed(
+                                               getActiveFeedId(), activeFeedIsCat());
+
+                               if (rv) viewfeed(rv[0], '', rv[1], null, null, null, true);
+               };
+               hotkey_actions["prev_feed"] = function() {
+                               var rv = dijit.byId("feedTree").getPreviousFeed(
+                                               getActiveFeedId(), activeFeedIsCat());
+
+                               if (rv) viewfeed(rv[0], '', rv[1], null, null, null, true);
+               };
+               hotkey_actions["next_article"] = function() {
+                               moveToPost('next');
+               };
+               hotkey_actions["prev_article"] = function() {
+                               moveToPost('prev');
+               };
+               hotkey_actions["next_article_noscroll"] = function() {
+                               moveToPost('next', true);
+               };
+               hotkey_actions["prev_article_noscroll"] = function() {
+                               moveToPost('prev', true);
+               };
+               hotkey_actions["next_article_noexpand"] = function() {
+                               moveToPost('next', true, true);
+               };
+               hotkey_actions["prev_article_noexpand"] = function() {
+                               moveToPost('prev', true, true);
+               };
+               hotkey_actions["collapse_article"] = function() {
+                               var id = getActiveArticleId();
+                               var elem = $("CICD-"+id);
+                               if(elem.visible()) {
+                                       cdmCollapseArticle(null, id);
+                               }
+                               else {
+                                       cdmExpandArticle(id);
+                               }
+               };
+               hotkey_actions["toggle_expand"] = function() {
+                               var id = getActiveArticleId();
+                               var elem = $("CICD-"+id);
+                               if(elem.visible()) {
+                                       cdmCollapseArticle(null, id, false);
+                               }
+                               else {
+                                       cdmExpandArticle(id);
+                               }
+               };
+               hotkey_actions["search_dialog"] = function() {
+                               search();
+               };
+               hotkey_actions["toggle_mark"] = function() {
+                               selectionToggleMarked(undefined, false, true);
+               };
+               hotkey_actions["toggle_publ"] = function() {
+                               selectionTogglePublished(undefined, false, true);
+               };
+               hotkey_actions["toggle_unread"] = function() {
+                               selectionToggleUnread(undefined, false, true);
+               };
+               hotkey_actions["edit_tags"] = function() {
+                               var id = getActiveArticleId();
+                               if (id) {
+                                       editArticleTags(id);
+                               };
+                       }
+               hotkey_actions["dismiss_selected"] = function() {
+                               dismissSelectedArticles();
+               };
+               hotkey_actions["dismiss_read"] = function() {
+                               dismissReadArticles();
+               };
+               hotkey_actions["open_in_new_window"] = function() {
+                               if (getActiveArticleId()) {
+                                       openArticleInNewWindow(getActiveArticleId());
+                                       return;
+                               }
+               };
+               hotkey_actions["catchup_below"] = function() {
+                               catchupRelativeToArticle(1);
+               };
+               hotkey_actions["catchup_above"] = function() {
+                               catchupRelativeToArticle(0);
+               };
+               hotkey_actions["article_scroll_down"] = function() {
+                               var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame");
+
+                               scrollArticle(40);
+               };
+               hotkey_actions["article_scroll_up"] = function() {
+                               var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame");
+
+                               scrollArticle(-40);
+               };
+               hotkey_actions["close_article"] = function() {
+                               if (isCdmMode()) {
+                                       if (!getInitParam("cdm_expanded")) {
+                                               cdmCollapseArticle(false, getActiveArticleId());
+                                       } else {
+                                               dismissArticle(getActiveArticleId());
+                                       }
+                               } else {
+                                       closeArticlePanel();
+                               }
+               };
+               hotkey_actions["email_article"] = function() {
+                               if (typeof emailArticle != "undefined") {
+                                       emailArticle();
+                               } else if (typeof mailtoArticle != "undefined") {
+                                       mailtoArticle();
+                               } else {
+                                       alert(__("Please enable mail plugin first."));
+                               }
+               };
+               hotkey_actions["select_all"] = function() {
+                               selectArticles('all');
+               };
+               hotkey_actions["select_unread"] = function() {
+                               selectArticles('unread');
+               };
+               hotkey_actions["select_marked"] = function() {
+                               selectArticles('marked');
+               };
+               hotkey_actions["select_published"] = function() {
+                               selectArticles('published');
+               };
+               hotkey_actions["select_invert"] = function() {
+                               selectArticles('invert');
+               };
+               hotkey_actions["select_none"] = function() {
+                               selectArticles('none');
+               };
+               hotkey_actions["feed_refresh"] = function() {
+                               if (getActiveFeedId() != undefined) {
+                                       viewfeed(getActiveFeedId(), '', activeFeedIsCat());
+                                       return;
+                               }
+               };
+               hotkey_actions["feed_unhide_read"] = function() {
+                               toggleDispRead();
+               };
+               hotkey_actions["feed_subscribe"] = function() {
+                               quickAddFeed();
+               };
+               hotkey_actions["feed_debug_update"] = function() {
+                               window.open("backend.php?op=feeds&method=view&feed=" + getActiveFeedId() +
+                                       "&view_mode=adaptive&order_by=default&update=&m=ForceUpdate&cat=" +
+                                       activeFeedIsCat() + "&DevForceUpdate=1&debug=1&xdebug=1&csrf_token=" +
+                                       getInitParam("csrf_token"));
+               };
+               hotkey_actions["feed_edit"] = function() {
+                               if (activeFeedIsCat())
+                                       alert(__("You can't edit this kind of feed."));
+                               else
+                                       editFeed(getActiveFeedId());
+               };
+               hotkey_actions["feed_catchup"] = function() {
+                               if (getActiveFeedId() != undefined) {
+                                       catchupCurrentFeed();
+                                       return;
+                               }
+               };
+               hotkey_actions["feed_reverse"] = function() {
+                               reverseHeadlineOrder();
+               };
+               hotkey_actions["catchup_all"] = function() {
+                               catchupAllFeeds();
+               };
+               hotkey_actions["cat_toggle_collapse"] = function() {
+                               if (activeFeedIsCat()) {
+                                       dijit.byId("feedTree").collapseCat(getActiveFeedId());
+                                       return;
+                               }
+               };
+               hotkey_actions["goto_all"] = function() {
+                               viewfeed(-4);
+               };
+               hotkey_actions["goto_fresh"] = function() {
+                               viewfeed(-3);
+               };
+               hotkey_actions["goto_marked"] = function() {
+                               viewfeed(-1);
+               };
+               hotkey_actions["goto_published"] = function() {
+                               viewfeed(-2);
+               };
+               hotkey_actions["goto_tagcloud"] = function() {
+                               displayDlg(__("Tag cloud"), "printTagCloud");
+               };
+               hotkey_actions["goto_prefs"] = function() {
+                               gotoPreferences();
+               };
+               hotkey_actions["select_article_cursor"] = function() {
+                               var id = getArticleUnderPointer();
+                               if (id) {
+                                       var row = $("RROW-" + id);
+
+                                       if (row) {
+                                               var cb = dijit.getEnclosingWidget(
+                                                       row.getElementsByClassName("rchk")[0]);
+
+                                               if (cb) {
+                                                       cb.attr("checked", !cb.attr("checked"));
+                                                       toggleSelectRowById(cb, "RROW-" + id);
+                                                       return false;
+                                               }
+                                       }
+                               }
+               };
+               hotkey_actions["create_label"] = function() {
+                               addLabel();
+               };
+               hotkey_actions["create_filter"] = function() {
+                               quickAddFilter();
+               };
+               hotkey_actions["collapse_sidebar"] = function() {
+                               collapse_feedlist();
+               };
+               hotkey_actions["toggle_embed_original"] = function() {
+                               if (typeof embedOriginalArticle != "undefined") {
+                                       if (getActiveArticleId())
+                                               embedOriginalArticle(getActiveArticleId());
+                               } else {
+                                       alert(__("Please enable embed_original plugin first."));
+                               }
+               };
+               hotkey_actions["toggle_widescreen"] = function() {
+                               if (!isCdmMode()) {
+                                       _widescreen_mode = !_widescreen_mode;
+
+                                       // reset stored sizes because geometry changed
+                                       setCookie("ttrss_ci_width", 0);
+                                       setCookie("ttrss_ci_height", 0);
+
+                                       switchPanelMode(_widescreen_mode);
+                               }
+               };
+               hotkey_actions["help_dialog"] = function() {
+                               helpDialog("main");
+               };
+               hotkey_actions["toggle_combined_mode"] = function() {
+                               notify_progress("Loading, please wait...");
+
+                               var value = isCdmMode() ? "false" : "true";
+                               var query = "?op=rpc&method=setpref&key=COMBINED_DISPLAY_MODE&value=" + value;
+
+                               new Ajax.Request("backend.php", {
+                                       parameters: query,
+                                       onComplete: function(transport) {
+                                               setInitParam("combined_display_mode",
+                                                               !getInitParam("combined_display_mode"));
+
+                                               closeArticlePanel();
+                                               viewCurrentFeed();
+
+                                                               } });
+               };
+               hotkey_actions["toggle_cdm_expanded"] = function() {
+                               notify_progress("Loading, please wait...");
+
+                               var value = getInitParam("cdm_expanded") ? "false" : "true";
+                               var query = "?op=rpc&method=setpref&key=CDM_EXPANDED&value=" + value;
+
+                               new Ajax.Request("backend.php", {
+                                       parameters: query,
+                                       onComplete: function(transport) {
+                                               setInitParam("cdm_expanded", !getInitParam("cdm_expanded"));
+                                               viewCurrentFeed();
+                                       } });
+               };
+
+
        } catch (e) {
                exception_error("init", e);
        }
@@ -265,12 +554,28 @@ function init_second_stage() {
                        updateFeedList();
                        closeArticlePanel();
 
-                       _widescreen_mode = getInitParam("widescreen");
-
-                       if (_widescreen_mode) {
-                               switchPanelMode(_widescreen_mode);
+                       if (parseInt(getCookie("ttrss_fh_width")) > 0) {
+                               dijit.byId("feeds-holder").domNode.setStyle(
+                                       {width: getCookie("ttrss_fh_width") + "px" });
                        }
 
+                       dijit.byId("main").resize();
+
+                       var tmph = dojo.connect(dijit.byId('feeds-holder'), 'resize',
+                               function (args) {
+                                       if (args && args.w >= 0) {
+                                               setCookie("ttrss_fh_width", args.w, getInitParam("cookie_lifetime"));
+                                       }
+                       });
+
+                       var tmph = dojo.connect(dijit.byId('content-insert'), 'resize',
+                               function (args) {
+                                       if (args && args.w >= 0 && args.h >= 0) {
+                                               setCookie("ttrss_ci_width", args.w, getInitParam("cookie_lifetime"));
+                                               setCookie("ttrss_ci_height", args.h, getInitParam("cookie_lifetime"));
+                                       }
+                       });
+
                });
 
                delCookie("ttrss_test");
@@ -292,7 +597,7 @@ function init_second_stage() {
                        setActiveFeedId(hash_feed_id, hash_feed_is_cat);
                }
 
-               loading_set_progress(30);
+               loading_set_progress(50);
 
                // can't use cache_clear() here because viewfeed might not have initialized yet
                if ('sessionStorage' in window && window['sessionStorage'] !== null)
@@ -309,6 +614,9 @@ function init_second_stage() {
                hotkeys[1] = tmp;
                setInitParam("hotkeys", hotkeys);
 
+               _widescreen_mode = getInitParam("widescreen");
+               switchPanelMode(_widescreen_mode);
+
                console.log("second stage ok");
 
                if (getInitParam("simple_update")) {
@@ -331,10 +639,10 @@ function quickMenuGo(opid) {
                        gotoLogout();
                        break;
                case "qmcTagCloud":
-                       displayDlg("printTagCloud");
+                       displayDlg(__("Tag cloud"), "printTagCloud");
                        break;
                case "qmcTagSelect":
-                       displayDlg("printTagSelect");
+                       displayDlg(__("Select item(s) by tags"), "printTagSelect");
                        break;
                case "qmcSearch":
                        search();
@@ -391,6 +699,10 @@ function quickMenuGo(opid) {
                        if (!isCdmMode()) {
                                _widescreen_mode = !_widescreen_mode;
 
+                               // reset stored sizes because geometry changed
+                               setCookie("ttrss_ci_width", 0);
+                               setCookie("ttrss_ci_height", 0);
+
                                switchPanelMode(_widescreen_mode);
                        }
                        break;
@@ -472,6 +784,8 @@ function parse_runtime_info(data) {
                init_params[k] = v;
                notify('');
        }
+
+       PluginHost.run(PluginHost.HOOK_RUNTIME_INFO_LOADED, data);
 }
 
 function collapse_feedlist() {
@@ -479,19 +793,14 @@ function collapse_feedlist() {
 
                if (!Element.visible('feeds-holder')) {
                        Element.show('feeds-holder');
-                       Element.show('feeds-holder_splitter');
                        $("collapse_feeds_btn").innerHTML = "<<";
                } else {
                        Element.hide('feeds-holder');
-                       Element.hide('feeds-holder_splitter');
                        $("collapse_feeds_btn").innerHTML = ">>";
                }
 
                dijit.byId("main").resize();
 
-               query = "?op=rpc&method=setpref&key=_COLLAPSED_FEEDLIST&value=true";
-               new Ajax.Request("backend.php", { parameters: query });
-
        } catch (e) {
                exception_error("collapse_feedlist", e);
        }
@@ -502,10 +811,6 @@ function viewModeChanged() {
        return viewCurrentFeed('');
 }
 
-function viewLimitChanged() {
-       return viewCurrentFeed('');
-}
-
 function rescoreCurrentFeed() {
 
        var actid = getActiveFeedId();
@@ -543,11 +848,16 @@ function hotkey_handler(e) {
 
                var keycode = false;
                var shift_key = false;
+               var ctrl_key = false;
+               var alt_key = false;
+               var meta_key = false;
 
                var cmdline = $('cmdline');
 
                shift_key = e.shiftKey;
                ctrl_key = e.ctrlKey;
+               alt_key = e.altKey;
+               meta_key = e.metaKey;
 
                if (window.event) {
                        keycode = window.event.keyCode;
@@ -589,6 +899,8 @@ function hotkey_handler(e) {
                // ensure ^*char notation
                if (shift_key) hotkey = "*" + hotkey;
                if (ctrl_key) hotkey = "^" + hotkey;
+               if (alt_key) hotkey = "+" + hotkey;
+               if (meta_key) hotkey = "%" + hotkey;
 
                hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
                hotkey_prefix = false;
@@ -603,228 +915,11 @@ function hotkey_handler(e) {
                        }
                }
 
-               switch (hotkey_action) {
-               case "next_feed":
-                       var rv = dijit.byId("feedTree").getNextFeed(
-                                       getActiveFeedId(), activeFeedIsCat());
-
-                       if (rv) viewfeed(rv[0], '', rv[1]);
-                       return false;
-               case "prev_feed":
-                       var rv = dijit.byId("feedTree").getPreviousFeed(
-                                       getActiveFeedId(), activeFeedIsCat());
-
-                       if (rv) viewfeed(rv[0], '', rv[1]);
-                       return false;
-               case "next_article":
-                       moveToPost('next');
-                       return false;
-               case "prev_article":
-                       moveToPost('prev');
-                       return false;
-               case "next_article_noscroll":
-                       moveToPost('next', true);
-                       return false;
-               case "prev_article_noscroll":
-                       moveToPost('prev', true);
-                       return false;
-               case "search_dialog":
-                       search();
-                       return ;
-               case "toggle_mark":
-                       selectionToggleMarked(undefined, false, true);
-                       return false;
-               case "toggle_publ":
-                       selectionTogglePublished(undefined, false, true);
-                       return false;
-               case "toggle_unread":
-                       selectionToggleUnread(undefined, false, true);
-                       return false;
-               case "edit_tags":
-                       var id = getActiveArticleId();
-                       if (id) {
-                               editArticleTags(id, getActiveFeedId(), isCdmMode());
-                               return;
-                       }
-                       return false;
-               case "dismiss_selected":
-                       dismissSelectedArticles();
-                       return false;
-               case "dismiss_read":
-                       return false;
-               case "open_in_new_window":
-                       if (getActiveArticleId()) {
-                               openArticleInNewWindow(getActiveArticleId());
-                               return;
-                       }
-                       return false;
-               case "catchup_below":
-                       catchupRelativeToArticle(1);
-                       return false;
-               case "catchup_above":
-                       catchupRelativeToArticle(0);
-                       return false;
-               case "article_scroll_down":
-                       var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame");
-
-                       scrollArticle(ctr.offsetHeight/3);
-                       return false;
-               case "article_scroll_up":
-                       var ctr = $("content_insert") ? $("content_insert") : $("headlines-frame");
-
-                       scrollArticle(-ctr.offsetHeight/3);
-                       return false;
-               case "close_article":
-                       if (isCdmMode()) {
-                               if (!getInitParam("cdm_expanded")) {
-                                       cdmCollapseArticle(false, getActiveArticleId());
-                               } else {
-                                       dismissArticle(getActiveArticleId());
-                               }
-                       } else {
-                               closeArticlePanel();
-                       }
-                       return false;
-               case "email_article":
-                       if (typeof emailArticle != "undefined") {
-                               emailArticle();
-                       } else if (typeof mailtoArticle != "undefined") {
-                               mailtoArticle();
-                       } else {
-                               alert(__("Please enable mail plugin first."));
-                       }
-                       return false;
-               case "select_all":
-                       selectArticles('all');
-                       return false;
-               case "select_unread":
-                       selectArticles('unread');
-                       return false;
-               case "select_marked":
-                       selectArticles('marked');
-                       return false;
-               case "select_published":
-                       selectArticles('published');
-                       return false;
-               case "select_invert":
-                       selectArticles('invert');
-                       return false;
-               case "select_none":
-                       selectArticles('none');
-                       return false;
-               case "feed_refresh":
-                       if (getActiveFeedId() != undefined) {
-                               viewfeed(getActiveFeedId(), '', activeFeedIsCat());
-                               return;
-                       }
-                       return false;
-               case "feed_unhide_read":
-                       toggleDispRead();
-                       return false;
-               case "feed_subscribe":
-                       quickAddFeed();
-                       return false;
-               case "feed_debug_update":
-                       window.open("backend.php?op=feeds&method=view&feed=" + getActiveFeedId() +
-                               "&view_mode=adaptive&order_by=default&update=&m=ForceUpdate&cat=" +
-                               activeFeedIsCat() + "&DevForceUpdate=1&debug=1&xdebug=1&csrf_token=" +
-                               getInitParam("csrf_token"));
-                       return false;
-               case "feed_edit":
-                       if (activeFeedIsCat())
-                               alert(__("You can't edit this kind of feed."));
-                       else
-                               editFeed(getActiveFeedId());
-                       return false;
-               case "feed_catchup":
-                       if (getActiveFeedId() != undefined) {
-                               catchupCurrentFeed();
-                               return;
-                       }
-                       return false;
-               case "feed_reverse":
-                       reverseHeadlineOrder();
-                       return false;
-               case "catchup_all":
-                       catchupAllFeeds();
-                       return false;
-               case "cat_toggle_collapse":
-                       if (activeFeedIsCat()) {
-                               dijit.byId("feedTree").collapseCat(getActiveFeedId());
-                               return;
-                       }
-                       return false;
-               case "goto_all":
-                       viewfeed(-4);
-                       return false;
-               case "goto_fresh":
-                       viewfeed(-3);
-                       return false;
-               case "goto_marked":
-                       viewfeed(-1);
-                       return false;
-               case "goto_published":
-                       viewfeed(-2);
-                       return false;
-               case "goto_tagcloud":
-                       displayDlg("printTagCloud");
-                       return false;
-               case "goto_prefs":
-                       gotoPreferences();
-                       return false;
-               case "select_article_cursor":
-                       var id = getArticleUnderPointer();
-                       if (id) {
-                               var cb = dijit.byId("RCHK-" + id);
-                               if (cb) {
-                                       cb.attr("checked", !cb.attr("checked"));
-                                       toggleSelectRowById(cb, "RROW-" + id);
-                                       return false;
-                               }
-                       }
-                       return false;
-               case "create_label":
-                       addLabel();
-                       return false;
-               case "create_filter":
-                       quickAddFilter();
-                       return false;
-               case "collapse_sidebar":
-                       collapse_feedlist();
-                       return false;
-               case "toggle_embed_original":
-                       if (typeof embedOriginalArticle != "undefined") {
-                               if (getActiveArticleId())
-                                       embedOriginalArticle(getActiveArticleId());
-                       } else {
-                               alert(__("Please enable embed_original plugin first."));
-                       }
-                       return false;
-               case "toggle_widescreen":
-                       if (!isCdmMode()) {
-                               _widescreen_mode = !_widescreen_mode;
-
-                               switchPanelMode(_widescreen_mode);
-                       }
-                       return false;
-               case "help_dialog":
-                       helpDialog("main");
-                       return false;
-               case "toggle_combined_mode":
-                       notify_progress("Loading, please wait...");
-
-                       var value = isCdmMode() ? "false" : "true";
-                       var query = "?op=rpc&method=setpref&key=COMBINED_DISPLAY_MODE&value=" + value;
-
-                       new Ajax.Request("backend.php", {
-                               parameters: query,
-                               onComplete: function(transport) {
-                                       window.location.reload();
-                               } });
+               var action = hotkey_actions[hotkey_action];
 
+               if (action != null) {
+                       action();
                        return false;
-               default:
-                       console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey);
                }
 
        } catch (e) {
@@ -839,13 +934,27 @@ function inPreferences() {
 function reverseHeadlineOrder() {
        try {
 
-               var query_str = "?op=rpc&method=togglepref&key=REVERSE_HEADLINES";
+               /* var query_str = "?op=rpc&method=togglepref&key=REVERSE_HEADLINES";
 
                new Ajax.Request("backend.php", {
                        parameters: query_str,
                        onComplete: function(transport) {
                                        viewCurrentFeed();
-                               } });
+                               } }); */
+
+               var toolbar = document.forms["main_toolbar_form"];
+               var order_by = dijit.getEnclosingWidget(toolbar.order_by);
+
+               var value = order_by.attr('value');
+
+               if (value == "date_reverse")
+                       value = "default";
+               else
+                       value = "date_reverse";
+
+               order_by.attr('value', value);
+
+               viewCurrentFeed();
 
        } catch (e) {
                exception_error("reverseHeadlineOrder", e);
@@ -877,6 +986,12 @@ function handle_rpc_json(transport, scheduled_call) {
        try {
                var reply = JSON.parse(transport.responseText);
 
+               var netalert_dijit = dijit.byId("net-alert");
+               var netalert = false;
+
+               if (netalert_dijit)
+                       netalert = netalert_dijit.domNode;
+
                if (reply) {
 
                        var error = reply['error'];
@@ -918,21 +1033,26 @@ function handle_rpc_json(transport, scheduled_call) {
                        if (counters)
                                parse_counters(counters, scheduled_call);
 
-                       var runtime_info = reply['runtime-info'];;
+                       var runtime_info = reply['runtime-info'];
 
                        if (runtime_info)
                                parse_runtime_info(runtime_info);
 
-                       Element.hide(dijit.byId("net-alert").domNode);
+                       if (netalert) Element.hide(netalert);
 
                } else {
-                       //notify_error("Error communicating with server.");
-                       Element.show(dijit.byId("net-alert").domNode);
+                       if (netalert)
+                               Element.show(netalert);
+                       else
+                               notify_error("Communication problem with server.");
                }
 
        } catch (e) {
-               Element.show(dijit.byId("net-alert").domNode);
-               //notify_error("Error communicating with server.");
+               if (netalert)
+                       Element.show(netalert);
+               else
+                       notify_error("Communication problem with server.");
+
                console.log(e);
                //exception_error("handle_rpc_json", e, transport);
        }
@@ -952,11 +1072,15 @@ function switchPanelMode(wide) {
 
                        dijit.byId("content-insert").domNode.setStyle({width: '50%',
                                height: 'auto',
-                               borderLeftWidth: '1px',
-                               borderLeftColor: '#c0c0c0',
                                borderTopWidth: '0px' });
 
-                       $("headlines-toolbar").setStyle({ borderBottomWidth: '0px' });
+                       if (parseInt(getCookie("ttrss_ci_width")) > 0) {
+                               dijit.byId("content-insert").domNode.setStyle(
+                                       {width: getCookie("ttrss_ci_width") + "px" });
+                       }
+
+                       $("headlines-frame").setStyle({ borderBottomWidth: '0px' });
+                       $("headlines-frame").addClassName("wide");
 
                } else {
 
@@ -964,10 +1088,16 @@ function switchPanelMode(wide) {
 
                        dijit.byId("content-insert").domNode.setStyle({width: 'auto',
                                height: '50%',
-                               borderLeftWidth: '0px',
-                               borderTopWidth: '1px'});
+                               borderTopWidth: '0px'});
+
+                       if (parseInt(getCookie("ttrss_ci_height")) > 0) {
+                               dijit.byId("content-insert").domNode.setStyle(
+                                       {height: getCookie("ttrss_ci_height") + "px" });
+                       }
+
+                       $("headlines-frame").setStyle({ borderBottomWidth: '1px' });
+                       $("headlines-frame").removeClassName("wide");
 
-                       $("headlines-toolbar").setStyle({ borderBottomWidth: '1px' });
                }
 
                closeArticlePanel();
@@ -1007,7 +1137,7 @@ function hash_get(key) {
                kv = window.location.hash.substring(1).toQueryParams();
                return kv[key];
        } catch (e) {
-               exception_error("hash_set", e);
+               exception_error("hash_get", e);
        }
 }
 function hash_set(key, value) {