function updateFeedList() {
try {
-// $("feeds-holder").innerHTML = "<div id=\"feedlistLoading\">" +
+// $("feeds-holder").innerHTML = "<div id=\"feedlistLoading\">" +
// __("Loading, please wait...") + "</div>";
Element.show("feedlistLoading");
var id = String(item.id);
var cat_id = id.substr(id.indexOf(":")+1);
- new Ajax.Request("backend.php",
- { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
+ new Ajax.Request("backend.php",
+ { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
param_escape(cat_id) + "&mode=0" } );
},
onClose: function (item, node) {
var id = String(item.id);
var cat_id = id.substr(id.indexOf(":")+1);
- new Ajax.Request("backend.php",
- { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
+ new Ajax.Request("backend.php",
+ { parameters: "backend.php?op=feeds&subop=collapse&cid=" +
param_escape(cat_id) + "&mode=1" } );
},
}, "feedTree");
/* var menu = new dijit.Menu({id: 'feedMenu'});
-
+
menu.addChild(new dijit.MenuItem({
label: "Simple menu item"
}));
// menu.bindDomNode(tree.domNode); */
-
- var tmph = dojo.connect(dijit.byId('feedMenu'), '_openMyself', function (event) {
+
+ var tmph = dojo.connect(dijit.byId('feedMenu'), '_openMyself', function (event) {
console.log(dijit.getEnclosingWidget(event.target));
dojo.disconnect(tmph);
});
new Ajax.Request("backend.php", {
parameters: query_str,
- onComplete: function(transport) {
- feedlist_callback2(transport);
+ onComplete: function(transport) {
+ feedlist_callback2(transport);
} });
global_unread = 0;
//console.log("timeout()");
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 {
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) {
+ onComplete: function(transport) {
handle_rpc_json(transport, !_force_scheduled_update);
_force_scheduled_update = false;
} });
function genericSanityCheck() {
setCookie("ttrss_test", "TEST");
-
+
if (getCookie("ttrss_test") != "TEST") {
- fatalError(2);
+ return fatalError(2);
}
return true;
function init() {
try {
- //Form.disable("main_toolbar_form");
-
- dojo.require("dijit.layout.BorderContainer");
- dojo.require("dijit.layout.TabContainer");
- dojo.require("dijit.layout.ContentPane");
- dojo.require("dijit.Dialog");
- dojo.require("dijit.form.Button");
- dojo.require("dijit.Menu");
- dojo.require("dojo.data.ItemFileWriteStore");
- dojo.require("dijit.Tree");
- dojo.require("dijit.form.Select");
- dojo.require("dijit.form.TextBox");
- dojo.require("dijit.form.ValidationTextBox");
- dojo.require("dijit.form.FilteringSelect");
- dojo.require("dijit.form.CheckBox");
- dojo.require("dijit.form.SimpleTextarea");
- dojo.require("dijit.Toolbar");
- dojo.require("dijit.ProgressBar");
- dojo.require("dijit.Menu");
- dojo.require("dojo.parser");
-
dojo.registerModulePath("fox", "../..");
dojo.require("fox.FeedTree");
themeBeforeLayout();
}
+ dojo.parser.parse();
+
dojo.addOnLoad(function() {
updateFeedList();
closeArticlePanel();
});
- if (!genericSanityCheck())
- return;
+ if (!genericSanityCheck())
+ return false;
loading_set_progress(20);
var toolbar = document.forms["main_toolbar_form"];
- dijit.getEnclosingWidget(toolbar.view_mode).attr('value',
+ dijit.getEnclosingWidget(toolbar.view_mode).attr('value',
getInitParam("default_view_mode"));
- dijit.getEnclosingWidget(toolbar.order_by).attr('value',
+ dijit.getEnclosingWidget(toolbar.order_by).attr('value',
getInitParam("default_view_order_by"));
feeds_sort_by_unread = getInitParam("feeds_sort_by_unread") == 1;
loading_set_progress(30);
- if (has_local_storage())
+ // can't use cache_clear() here because viewfeed might not have initialized yet
+ if ('sessionStorage' in window && window['sessionStorage'] !== null)
sessionStorage.clear();
console.log("second stage ok");
if (opid == "qmcPrefs") {
gotoPreferences();
}
-
+
if (opid == "qmcTagCloud") {
displayDlg("printTagCloud");
}
+ if (opid == "qmcTagSelect") {
+ displayDlg("printTagSelect");
+ }
+
if (opid == "qmcSearch") {
search();
return;
}
-
+
if (opid == "qmcAddFeed") {
quickAddFeed();
return;
editFeed(getActiveFeedId());
return;
}
-
+
if (opid == "qmcRemoveFeed") {
var actid = getActiveFeedId();
if (activeFeedIsCat()) {
alert(__("You can't unsubscribe from the category."));
return;
- }
+ }
if (!actid) {
alert(__("Please select some feed first."));
if (confirm(pr)) {
unsubscribeFeed(actid);
}
-
+
return;
}
catchupAllFeeds();
return;
}
-
+
if (opid == "qmcShowOnlyUnread") {
toggleDispRead();
return;
}
-
+
if (opid == "qmcAddFilter") {
quickAddFilter();
return;
Effect.Appear("hotkey_help_overlay", {duration : 0.3});
}
+ if (opid == "qmcAbout") {
+ dialog = new dijit.Dialog({
+ title: __("About..."),
+ style: "width: 400px",
+ href: "backend.php?op=dlg&id=about",
+ });
+
+ dialog.show();
+ }
+
} catch (e) {
exception_error("quickMenuGo", e);
}
hideOrShowFeeds(hide);
- var query = "?op=rpc&subop=setpref&key=HIDE_READ_FEEDS&value=" +
+ var query = "?op=rpc&subop=setpref&key=HIDE_READ_FEEDS&value=" +
param_escape(hide);
setInitParam("hide_read_feeds", hide);
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
} });
-
+
} catch (e) {
exception_error("toggleDispRead", e);
}
return;
}
- var error_flag;
-
if (k == "daemon_is_running" && v != 1) {
notify_error("<span onclick=\"javascript:explainError(1)\">Update daemon is not running.</span>", true);
return;
}
}
- init_params[k] = v;
+ init_params[k] = v;
notify('');
}
}
function catchupCurrentFeed() {
var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
-
+
var str = __("Mark all articles in %s as read?").replace("%s", fn);
if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) {
- return viewCurrentFeed('MarkAllRead')
+ return viewCurrentFeed('MarkAllRead');
}
}
var str = __("Mark all articles in %s as read?").replace("%s", title);
if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) {
- return viewCurrentFeed('MarkAllReadGR:' + id)
+ return viewCurrentFeed('MarkAllReadGR:' + id);
}
} catch (e) {
}
function viewModeChanged() {
- cache_flush();
- return viewCurrentFeed('')
+ return viewCurrentFeed('');
}
function viewLimitChanged() {
- cache_flush();
- return viewCurrentFeed('')
+ return viewCurrentFeed('');
}
/* function adjustArticleScore(id, score) {
if (activeFeedIsCat() || actid < 0) {
alert(__("You can't rescore this kind of feed."));
return;
- }
+ }
if (!actid) {
alert(__("Please select some feed first."));
if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
- var keycode;
+ var keycode = false;
var shift_key = false;
var cmdline = $('cmdline');
} catch (e) {
}
-
+
if (window.event) {
keycode = window.event.keyCode;
} else if (e) {
Element.hide("hotkey_help_overlay");
}
hotkey_prefix = false;
- }
+ }
if (keycode == 16) return; // ignore lone shift
if (keycode == 17) return; // ignore lone ctrl
- if ((keycode == 70 || keycode == 67 || keycode == 71)
+ if ((keycode == 70 || keycode == 67 || keycode == 71 || keycode == 65)
&& !hotkey_prefix) {
var date = new Date();
if (!hotkey_prefix) {
+ if (keycode == 27) { // escape
+ closeArticlePanel();
+ return;
+ }
+
+ if (keycode == 69) { // e
+ var id = getActiveArticleId();
+ emailArticle(id);
+ }
+
if ((keycode == 191 || keychar == '?') && shift_key) { // ?
if (!Element.visible("hotkey_help_overlay")) {
- Effect.Appear("hotkey_help_overlay", {duration : 0.3});
+ Effect.Appear("hotkey_help_overlay", {duration : 0.3, to : 0.9});
} else {
Element.hide("hotkey_help_overlay");
}
return false;
}
- if (keycode == 74) { // j
- var rv = dijit.byId("feedTree").model.getPreviousFeed(
+ if (keycode == 74 && !shift_key) { // j
+ var rv = dijit.byId("feedTree").getPreviousFeed(
getActiveFeedId(), activeFeedIsCat());
if (rv) viewfeed(rv[0], '', rv[1]);
return;
}
-
+
if (keycode == 75) { // k
- var rv = dijit.byId("feedTree").model.getNextFeed(
+ var rv = dijit.byId("feedTree").getNextFeed(
getActiveFeedId(), activeFeedIsCat());
if (rv) viewfeed(rv[0], '', rv[1]);
}
if (shift_key && keycode == 78) { // N
- scrollArticle(50);
+ scrollArticle(50);
return;
}
if (shift_key && keycode == 80) { // P
- scrollArticle(-50);
+ scrollArticle(-50);
return;
}
if (keycode == 68 && shift_key) { // shift-D
dismissSelectedArticles();
+ return;
}
if (keycode == 88 && shift_key) { // shift-X
dismissReadArticles();
+ return;
}
if (keycode == 78 || keycode == 40) { // n, down
return false;
}
}
-
+
if (keycode == 80 || keycode == 38) { // p, up
if (typeof moveToPost != 'undefined') {
moveToPost('prev');
return;
}
-
if (keycode == 85) { // u
- selectionToggleUnread(undefined, false, true)
+ selectionToggleUnread(undefined, false, true);
return;
}
if (keycode == 9) { // tab
var id = getArticleUnderPointer();
- if (id) {
+ if (id) {
var cb = $("RCHK-" + id);
if (cb) {
}
}
- if (keycode == 88) { // x
+ if (keycode == 88 && !shift_key) { // x
if (activeFeedIsCat()) {
dijit.byId("feedTree").collapseCat(getActiveFeedId());
+ return;
}
}
}
+ /* Prefix a */
+
+ if (hotkey_prefix == 65) { // a
+ hotkey_prefix = false;
+
+ if (keycode == 65) { // a
+ selectArticles('all');
+ return;
+ }
+
+ if (keycode == 85) { // u
+ selectArticles('unread');
+ return;
+ }
+
+ if (keycode == 73) { // i
+ selectArticles('invert');
+ return;
+ }
+
+ if (keycode == 78) { // n
+ selectArticles('none');
+ return;
+ }
+
+ }
+
/* Prefix f */
- if (hotkey_prefix == 70) { // f
+ if (hotkey_prefix == 70) { // f
hotkey_prefix = false;
return false;
}
- if (keycode == 84 && shift_key) { // T
- toggleTags();
+ if (keycode == 84) { // t
+ displayDlg("printTagCloud");
return false;
}
}
/* Cmd */
- if (hotkey_prefix == 224 || hotkey_prefix == 91) { // f
+ if (hotkey_prefix == 224 || hotkey_prefix == 91) { // f
hotkey_prefix = false;
return;
}
new Ajax.Request("backend.php", {
parameters: query_str,
- onComplete: function(transport) {
+ onComplete: function(transport) {
viewCurrentFeed();
} });
}
}
-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(JSON.parse(counters.firstChild.nodeValue), scheduled_call);
-
- var runtime_info = transport.responseXML.getElementsByTagName("runtime-info")[0];
-
- if (runtime_info)
- parse_runtime_info(JSON.parse(runtime_info.firstChild.nodeValue));
-
- 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(id, is_cat) {
try {
if (!id) {
return;
}
- var query = "?op=rpc&subop=scheduleFeedUpdate&id=" +
+ var query = "?op=rpc&subop=scheduleFeedUpdate&id=" +
param_escape(id) +
"&is_cat=" + param_escape(is_cat);
new Ajax.Request("backend.php", {
parameters: query,
- onComplete: function(transport) {
+ onComplete: function(transport) {
handle_rpc_json(transport);
var reply = JSON.parse(transport.responseText);
if (error) {
var code = error['code'];
var msg = error['msg'];
+
+ console.warn("[handle_rpc_json] received fatal error " + code + "/" + msg);
+
if (code != 0) {
fatalError(code, msg);
return false;
if (seq) {
if (get_seq() != seq) {
- console.log("[handle_rpc_json] sequence mismatch: " + seq +
+ console.log("[handle_rpc_json] sequence mismatch: " + seq +
" (want: " + get_seq() + ")");
return true;
}
}
var counters = reply['counters'];
-
+
if (counters)
parse_counters(counters, scheduled_call);