]> git.wh0rd.org - tt-rss.git/blame - js/tt-rss.js
fix filters not loading for feeds in Uncategorized
[tt-rss.git] / js / tt-rss.js
CommitLineData
76798ff3 1var total_unread = 0;
806a3d14 2var global_unread = -1;
2bf6e0a8 3var firsttime_update = true;
3ea91b2d 4var _active_feed_id = undefined;
3d72bbdb 5var _active_feed_is_cat = false;
93f66472 6var hotkey_prefix = false;
164469f9 7var hotkey_prefix_pressed = false;
f8fb4498
AD
8var _force_scheduled_update = false;
9var last_scheduled_update = false;
a5550322 10
6237ea05
AD
11var _rpc_seq = 0;
12
13function next_seq() {
14 _rpc_seq += 1;
15 return _rpc_seq;
16}
17
18function get_seq() {
19 return _rpc_seq;
20}
21
3d72bbdb
AD
22function activeFeedIsCat() {
23 return _active_feed_is_cat;
24}
25
26function getActiveFeedId() {
3d72bbdb 27 try {
50eefedb 28 //console.log("gAFID: " + _active_feed_id);
3d72bbdb
AD
29 return _active_feed_id;
30 } catch (e) {
31 exception_error("getActiveFeedId", e);
32 }
33}
34
35function setActiveFeedId(id, is_cat) {
3d72bbdb 36 try {
3d72bbdb
AD
37 _active_feed_id = id;
38
39 if (is_cat != undefined) {
40 _active_feed_is_cat = is_cat;
41 }
42
fcf70c51
AD
43 selectFeed(id, is_cat);
44
854a2ace
AD
45 dijit.byId("include_children").attr("disabled", !(is_cat && id > 0));
46
09101297 47
3d72bbdb
AD
48 } catch (e) {
49 exception_error("setActiveFeedId", e);
50 }
51}
52
53
50eefedb
AD
54function updateFeedList() {
55 try {
102cfe73 56
009646d2 57// $("feeds-holder").innerHTML = "<div id=\"feedlistLoading\">" +
9c99281f
AD
58// __("Loading, please wait...") + "</div>";
59
60 Element.show("feedlistLoading");
61
102cfe73
AD
62 if (dijit.byId("feedTree")) {
63 dijit.byId("feedTree").destroyRecursive();
50eefedb 64 }
102cfe73
AD
65
66 var store = new dojo.data.ItemFileWriteStore({
2ecd2df5 67 url: "backend.php?op=pref_feeds&method=getfeedtree&mode=2"});
102cfe73 68
e032e2e7 69 var treeModel = new fox.FeedStoreModel({
102cfe73
AD
70 store: store,
71 query: {
854a2ace 72 "type": getInitParam('enable_feed_cats') == 1 ? "category" : "feed"
102cfe73
AD
73 },
74 rootId: "root",
75 rootLabel: "Feeds",
76 childrenAttrs: ["items"]
77 });
78
05f224a3 79 var tree = new fox.FeedTree({
247bb1bf 80 persist: false,
102cfe73 81 model: treeModel,
102cfe73
AD
82 onOpen: function (item, node) {
83 var id = String(item.id);
84 var cat_id = id.substr(id.indexOf(":")+1);
85
009646d2 86 new Ajax.Request("backend.php",
f30ef1fa 87 { parameters: "backend.php?op=feeds&method=collapse&cid=" +
1a709d21 88 param_escape(cat_id) + "&mode=0" } );
102cfe73
AD
89 },
90 onClose: function (item, node) {
91 var id = String(item.id);
92 var cat_id = id.substr(id.indexOf(":")+1);
93
009646d2 94 new Ajax.Request("backend.php",
f30ef1fa 95 { parameters: "backend.php?op=feeds&method=collapse&cid=" +
1a709d21 96 param_escape(cat_id) + "&mode=1" } );
102cfe73
AD
97
98 },
99 onClick: function (item, node) {
100 var id = String(item.id);
101 var is_cat = id.match("^CAT:");
102 var feed = id.substr(id.indexOf(":")+1);
103 viewfeed(feed, '', is_cat);
104 return false;
105 },
106 openOnClick: false,
107 showRoot: false,
108 id: "feedTree",
109 }, "feedTree");
110
2ecd2df5
AD
111 _force_scheduled_update = true;
112
997429c2 113/* var menu = new dijit.Menu({id: 'feedMenu'});
009646d2 114
997429c2
AD
115 menu.addChild(new dijit.MenuItem({
116 label: "Simple menu item"
117 }));
118
119// menu.bindDomNode(tree.domNode); */
009646d2
AD
120
121 var tmph = dojo.connect(dijit.byId('feedMenu'), '_openMyself', function (event) {
997429c2
AD
122 console.log(dijit.getEnclosingWidget(event.target));
123 dojo.disconnect(tmph);
124 });
125
102cfe73
AD
126 $("feeds-holder").appendChild(tree.domNode);
127
9c99281f
AD
128 var tmph = dojo.connect(tree, 'onLoad', function() {
129 dojo.disconnect(tmph);
130 Element.hide("feedlistLoading");
1a709d21
AD
131
132 tree.collapseHiddenCats();
133
1beea800 134 feedlist_init();
997429c2
AD
135
136// var node = dijit.byId("feedTree")._itemNodesMap['FEED:-2'][0].domNode
137// menu.bindDomNode(node);
138
fcc36744 139 loading_set_progress(25);
9c99281f
AD
140 });
141
102cfe73 142 tree.startup();
e1123aee 143
50eefedb
AD
144 } catch (e) {
145 exception_error("updateFeedList", e);
146 }
1a66d16e 147}
175847de 148
476cac42 149function catchupAllFeeds() {
076682aa 150
f8232151 151 var str = __("Mark all articles as read?");
476cac42 152
f8232151 153 if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) {
476cac42 154
f30ef1fa 155 var query_str = "backend.php?op=feeds&method=catchupAll";
1a66d16e 156
f8232151 157 notify_progress("Marking all feeds as read...");
476cac42 158
f8fb4498 159 //console.log("catchupAllFeeds Q=" + query_str);
fc69e641 160
b4e75b2a
AD
161 new Ajax.Request("backend.php", {
162 parameters: query_str,
009646d2
AD
163 onComplete: function(transport) {
164 feedlist_callback2(transport);
f8232151
AD
165 } });
166
167 global_unread = 0;
168 updateTitle("");
169 }
476cac42 170}
1cd17194 171
f30ef1fa 172function viewCurrentFeed(method) {
973c4a64 173 console.log("viewCurrentFeed");
1a66d16e 174
ec6e2fd3 175 if (getActiveFeedId() != undefined) {
f30ef1fa 176 viewfeed(getActiveFeedId(), method, activeFeedIsCat());
f0601b87 177 }
164f4738 178 return false; // block unneeded form submits
f0601b87
AD
179}
180
40d13c28 181function timeout() {
a598370d
AD
182 if (getInitParam("bw_limit") == "1") return;
183
f8fb4498
AD
184 try {
185 var date = new Date();
186 var ts = Math.round(date.getTime() / 1000);
187
188 if (ts - last_scheduled_update > 10 || _force_scheduled_update) {
f5de0d8d 189
ac49453b
AD
190 //console.log("timeout()");
191
f8fb4498 192 window.clearTimeout(counter_timeout_id);
009646d2 193
f30ef1fa 194 var query_str = "?op=rpc&method=getAllCounters&seq=" + next_seq();
009646d2 195
f8fb4498 196 var omode;
009646d2 197
f8fb4498
AD
198 if (firsttime_update && !navigator.userAgent.match("Opera")) {
199 firsttime_update = false;
200 omode = "T";
201 } else {
9c99281f 202 omode = "flc";
f8fb4498 203 }
009646d2 204
f8fb4498 205 query_str = query_str + "&omode=" + omode;
ac49453b
AD
206
207 if (!_force_scheduled_update)
208 query_str = query_str + "&last_article_id=" + getInitParam("last_article_id");
009646d2 209
f8fb4498 210 //console.log("[timeout]" + query_str);
009646d2 211
f8fb4498
AD
212 new Ajax.Request("backend.php", {
213 parameters: query_str,
009646d2 214 onComplete: function(transport) {
563b9c78 215 handle_rpc_json(transport, !_force_scheduled_update);
47fb32b0 216 _force_scheduled_update = false;
f8fb4498
AD
217 } });
218
219 last_scheduled_update = ts;
220 }
221
222 } catch (e) {
223 exception_error("timeout", e);
224 }
225
226 setTimeout("timeout()", 3000);
ac53063a
AD
227}
228
f0601b87 229function search() {
3f363052 230 var query = "backend.php?op=dlg&method=search&param=" +
973fe3c6
AD
231 param_escape(getActiveFeedId() + ":" + activeFeedIsCat());
232
233 if (dijit.byId("searchDlg"))
234 dijit.byId("searchDlg").destroyRecursive();
235
236 dialog = new dijit.Dialog({
237 id: "searchDlg",
238 title: __("Search"),
239 style: "width: 600px",
240 execute: function() {
241 if (this.validate()) {
242 _search_query = dojo.objectToQuery(this.attr('value'));
243 this.hide();
244 viewCurrentFeed();
245 }
246 },
247 href: query});
248
249 dialog.show();
76798ff3 250}
1cd17194 251
f8fb4498 252function updateTitle() {
fc69e641 253 var tmp = "Tiny Tiny RSS";
21703604 254
fc69e641
AD
255 if (global_unread > 0) {
256 tmp = tmp + " (" + global_unread + ")";
257 }
258
fdf47b9d
AD
259 if (window.fluid) {
260 if (global_unread > 0) {
261 window.fluid.dockBadge = global_unread;
262 } else {
263 window.fluid.dockBadge = "";
264 }
265 }
266
fc69e641
AD
267 document.title = tmp;
268}
269
22a93ad8 270function genericSanityCheck() {
57937c42 271 setCookie("ttrss_test", "TEST");
009646d2 272
57937c42 273 if (getCookie("ttrss_test") != "TEST") {
68535211 274 return fatalError(2);
295f9b42
AD
275 }
276
22a93ad8
AD
277 return true;
278}
279
280function init() {
7719618b 281 try {
04150375 282 //dojo.registerModulePath("fox", "../../js/");
05f224a3
AD
283
284 dojo.require("fox.FeedTree");
285
8d3cb8c0
AD
286 if (typeof themeBeforeLayout == 'function') {
287 themeBeforeLayout();
288 }
289
1354d172
AD
290 dojo.require("dijit.ColorPalette");
291 dojo.require("dijit.Dialog");
292 dojo.require("dijit.form.Button");
293 dojo.require("dijit.form.CheckBox");
294 dojo.require("dijit.form.DropDownButton");
295 dojo.require("dijit.form.FilteringSelect");
296 dojo.require("dijit.form.Form");
297 dojo.require("dijit.form.RadioButton");
298 dojo.require("dijit.form.Select");
299 dojo.require("dijit.form.SimpleTextarea");
300 dojo.require("dijit.form.TextBox");
301 dojo.require("dijit.form.ValidationTextBox");
302 dojo.require("dijit.InlineEditBox");
303 dojo.require("dijit.layout.AccordionContainer");
304 dojo.require("dijit.layout.BorderContainer");
305 dojo.require("dijit.layout.ContentPane");
306 dojo.require("dijit.layout.TabContainer");
307 dojo.require("dijit.Menu");
308 dojo.require("dijit.ProgressBar");
309 dojo.require("dijit.ProgressBar");
310 dojo.require("dijit.Toolbar");
311 dojo.require("dijit.Tree");
312 dojo.require("dijit.tree.dndSource");
313 dojo.require("dojo.data.ItemFileWriteStore");
314
d80b3f3d
AD
315 dojo.parser.parse();
316
009646d2 317 if (!genericSanityCheck())
68535211 318 return false;
ac43eba1 319
fcc36744 320 loading_set_progress(20);
fca95d5f 321
c3edc667
AD
322 var hasAudio = !!((myAudioTag = document.createElement('audio')).canPlayType);
323
b4e75b2a 324 new Ajax.Request("backend.php", {
f30ef1fa 325 parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio},
9ca945a6
AD
326 onComplete: function(transport) {
327 backend_sanity_check_callback(transport);
328 } });
47179952 329
7719618b
AD
330 } catch (e) {
331 exception_error("init", e);
a8d28f48 332 }
7719618b 333}
86741347 334
7719618b 335function init_second_stage() {
295f9b42 336
7719618b 337 try {
118f4180
AD
338 dojo.addOnLoad(function() {
339 updateFeedList();
340 closeArticlePanel();
341
342 if (typeof themeAfterLayout == 'function') {
343 themeAfterLayout();
344 }
345
346 });
2f587484 347
57937c42 348 delCookie("ttrss_test");
770bbb02 349
40496720 350 var toolbar = document.forms["main_toolbar_form"];
f31673f7 351
009646d2 352 dijit.getEnclosingWidget(toolbar.view_mode).attr('value',
37f1a234
AD
353 getInitParam("default_view_mode"));
354
009646d2 355 dijit.getEnclosingWidget(toolbar.order_by).attr('value',
37f1a234 356 getInitParam("default_view_order_by"));
c6784aea 357
854a2ace
AD
358
359 if (getInitParam("enable_feed_cats") == 0)
360 Element.hide(dijit.byId("include_children").domNode);
361
3ea91b2d
AD
362 dijit.byId("include_children").attr("checked",
363 getInitParam("default_include_children"));
854a2ace 364
61a20560 365 feeds_sort_by_unread = getInitParam("feeds_sort_by_unread") == 1;
5f136c9a 366
fcc36744 367 loading_set_progress(30);
730dbf19 368
37c03d3a
AD
369 // can't use cache_clear() here because viewfeed might not have initialized yet
370 if ('sessionStorage' in window && window['sessionStorage'] !== null)
371 sessionStorage.clear();
ff0010c1 372
4a28ab44 373 console.log("second stage ok");
fcf70c51 374
7719618b
AD
375 } catch (e) {
376 exception_error("init_second_stage", e);
2f587484 377 }
1cd17194 378}
ac43eba1 379
c09ec856 380function quickMenuGo(opid) {
bb3423cf 381 try {
bb3423cf
AD
382 if (opid == "qmcPrefs") {
383 gotoPreferences();
384 }
009646d2 385
9c99281f
AD
386 if (opid == "qmcTagCloud") {
387 displayDlg("printTagCloud");
388 }
389
147f5632
CM
390 if (opid == "qmcTagSelect") {
391 displayDlg("printTagSelect");
392 }
393
bb3423cf 394 if (opid == "qmcSearch") {
973fe3c6 395 search();
6de5d056
AD
396 return;
397 }
009646d2 398
bb3423cf 399 if (opid == "qmcAddFeed") {
3393238d 400 quickAddFeed();
bb3423cf 401 return;
69668465 402 }
7086277c 403
1bf679a3
AD
404 if (opid == "qmcDigest") {
405 window.location.href = "digest.php";
406 return;
407 }
408
7086277c 409 if (opid == "qmcEditFeed") {
33f31dfd
AD
410 if (activeFeedIsCat())
411 alert(__("You can't edit this kind of feed."));
412 else
413 editFeed(getActiveFeedId());
414 return;
7086277c 415 }
009646d2 416
bb3423cf
AD
417 if (opid == "qmcRemoveFeed") {
418 var actid = getActiveFeedId();
442d77f1
AD
419
420 if (activeFeedIsCat()) {
89cb787e 421 alert(__("You can't unsubscribe from the category."));
442d77f1 422 return;
009646d2 423 }
442d77f1
AD
424
425 if (!actid) {
89cb787e 426 alert(__("Please select some feed first."));
bb3423cf
AD
427 return;
428 }
64a2875d
AD
429
430 var fn = getFeedName(actid);
89cb787e
AD
431
432 var pr = __("Unsubscribe from %s?").replace("%s", fn);
433
434 if (confirm(pr)) {
e978f78d 435 unsubscribeFeed(actid);
bb3423cf 436 }
009646d2 437
bb3423cf
AD
438 return;
439 }
d1f0c584 440
bb3423cf
AD
441 if (opid == "qmcCatchupAll") {
442 catchupAllFeeds();
443 return;
444 }
009646d2 445
bb3423cf
AD
446 if (opid == "qmcShowOnlyUnread") {
447 toggleDispRead();
448 return;
449 }
009646d2 450
bb3423cf 451 if (opid == "qmcAddFilter") {
db4e4539
AD
452 quickAddFilter();
453 return;
bb3423cf 454 }
0979b696 455
1380f8ee
AD
456 if (opid == "qmcAddLabel") {
457 addLabel();
db4e4539 458 return;
1380f8ee
AD
459 }
460
9a85081a
AD
461 if (opid == "qmcRescoreFeed") {
462 rescoreCurrentFeed();
db4e4539 463 return;
9a85081a
AD
464 }
465
238eff01 466 if (opid == "qmcHKhelp") {
66be620a
AD
467 new Ajax.Request("backend.php", {
468 parameters: "?op=backend&method=help&topic=main",
469 onComplete: function(transport) {
470 $("hotkey_help_overlay").innerHTML = transport.responseText;
471 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
472 } });
238eff01
AD
473 }
474
bb3423cf
AD
475 } catch (e) {
476 exception_error("quickMenuGo", e);
a24f525c 477 }
e2f8f7b4
AD
478}
479
3745788e 480function toggleDispRead() {
7f123cda 481 try {
3745788e 482
dbfc9522 483 var hide = !(getInitParam("hide_read_feeds") == "1");
3745788e 484
dbfc9522 485 hideOrShowFeeds(hide);
e8bd0da9 486
f30ef1fa 487 var query = "?op=rpc&method=setpref&key=HIDE_READ_FEEDS&value=" +
dbfc9522 488 param_escape(hide);
e8bd0da9 489
05f224a3
AD
490 setInitParam("hide_read_feeds", hide);
491
dbfc9522
AD
492 new Ajax.Request("backend.php", {
493 parameters: query,
009646d2 494 onComplete: function(transport) {
dbfc9522 495 } });
009646d2 496
7f123cda
AD
497 } catch (e) {
498 exception_error("toggleDispRead", e);
3745788e 499 }
3745788e 500}
295f9b42 501
563b9c78 502function parse_runtime_info(data) {
71ad883b 503
f8fb4498 504 //console.log("parsing runtime info...");
1cb7492d 505
c4f7ba80
AD
506 for (k in data) {
507 var v = data[k];
3ac2b520 508
563b9c78 509// console.log("RI: " + k + " => " + v);
1cb7492d 510
d9fa39f1 511 if (k == "new_version_available") {
acac8448 512 var icon = $("newVersionIcon");
d9fa39f1
AD
513 if (icon) {
514 if (v == "1") {
515 icon.style.display = "inline";
516 } else {
517 icon.style.display = "none";
518 }
519 }
5ae8f858 520 return;
d9fa39f1
AD
521 }
522
ef16ae37 523 if (k == "daemon_is_running" && v != 1) {
8e00ae9b 524 notify_error("<span onclick=\"javascript:explainError(1)\">Update daemon is not running.</span>", true);
5ae8f858 525 return;
8e00ae9b
AD
526 }
527
528 if (k == "daemon_stamp_ok" && v != 1) {
529 notify_error("<span onclick=\"javascript:explainError(3)\">Update daemon is not updating feeds.</span>", true);
5ae8f858 530 return;
8e00ae9b
AD
531 }
532
8cd576a1
AD
533 if (k == "max_feed_id" || k == "num_feeds") {
534 if (init_params[k] != v) {
535 console.log("feed count changed, need to reload feedlist.");
536 updateFeedList();
537 }
538 }
539
009646d2 540 init_params[k] = v;
5ae8f858 541 notify('');
71ad883b
AD
542 }
543}
fce24838 544
8389b150
AD
545function collapse_feedlist() {
546 try {
0ce61157
AD
547
548 if (!Element.visible('feeds-holder')) {
549 Element.show('feeds-holder');
ab7b5042 550 Element.show('feeds-holder_splitter');
0ce61157
AD
551 $("collapse_feeds_btn").innerHTML = "&lt;&lt;";
552 } else {
553 Element.hide('feeds-holder');
ab7b5042 554 Element.hide('feeds-holder_splitter');
0ce61157
AD
555 $("collapse_feeds_btn").innerHTML = "&gt;&gt;";
556 }
557
558 dijit.byId("main").resize();
6e4f4ce1 559
f30ef1fa 560 query = "?op=rpc&method=setpref&key=_COLLAPSED_FEEDLIST&value=true";
fcf70c51 561 new Ajax.Request("backend.php", { parameters: query });
6e4f4ce1 562
8389b150 563 } catch (e) {
f88c7814 564 exception_error("collapse_feedlist", e);
8389b150 565 }
3c2d7945 566}
8389b150 567
3c2d7945 568function viewModeChanged() {
e331188f 569 return viewCurrentFeed('');
3c2d7945 570}
8389b150 571
3c2d7945 572function viewLimitChanged() {
e331188f 573 return viewCurrentFeed('');
8389b150 574}
546499a9 575
9bf3f101 576/* function adjustArticleScore(id, score) {
546499a9
AD
577 try {
578
579 var pr = prompt(__("Assign score to article:"), score);
580
581 if (pr != undefined) {
f30ef1fa 582 var query = "?op=rpc&method=setScore&id=" + id + "&score=" + pr;
546499a9 583
b4e75b2a
AD
584 new Ajax.Request("backend.php", {
585 parameters: query,
546499a9
AD
586 onComplete: function(transport) {
587 viewCurrentFeed();
588 } });
589
590 }
591 } catch (e) {
438f2ce9 592 exception_error("adjustArticleScore", e);
546499a9 593 }
9bf3f101 594} */
9a85081a
AD
595
596function rescoreCurrentFeed() {
597
598 var actid = getActiveFeedId();
599
9c99281f 600 if (activeFeedIsCat() || actid < 0) {
9a85081a
AD
601 alert(__("You can't rescore this kind of feed."));
602 return;
009646d2 603 }
9a85081a
AD
604
605 if (!actid) {
606 alert(__("Please select some feed first."));
607 return;
608 }
609
610 var fn = getFeedName(actid);
69811a7d 611 var pr = __("Rescore articles in %s?").replace("%s", fn);
9a85081a
AD
612
613 if (confirm(pr)) {
614 notify_progress("Rescoring articles...");
615
f30ef1fa 616 var query = "?op=pref-feeds&method=rescore&quiet=1&ids=" + actid;
9a85081a 617
b4e75b2a
AD
618 new Ajax.Request("backend.php", {
619 parameters: query,
620 onComplete: function(transport) {
621 viewCurrentFeed();
622 } });
9a85081a
AD
623 }
624}
625
93f66472 626function hotkey_handler(e) {
93f66472
AD
627 try {
628
8386f861 629 if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
18606807 630
e331188f 631 var keycode = false;
93f66472
AD
632 var shift_key = false;
633
78935092 634 var cmdline = $('cmdline');
93f66472
AD
635
636 try {
637 shift_key = e.shiftKey;
638 } catch (e) {
639
640 }
009646d2 641
93f66472
AD
642 if (window.event) {
643 keycode = window.event.keyCode;
644 } else if (e) {
645 keycode = e.which;
646 }
647
eec498c3 648 var keychar = String.fromCharCode(keycode);
c177f2e6 649
93f66472
AD
650 if (keycode == 27) { // escape
651 if (Element.visible("hotkey_help_overlay")) {
652 Element.hide("hotkey_help_overlay");
653 }
654 hotkey_prefix = false;
009646d2 655 }
93f66472 656
93f66472 657 if (keycode == 16) return; // ignore lone shift
ac743c83 658 if (keycode == 17) return; // ignore lone ctrl
93f66472 659
2bb3f957 660 if ((keycode == 70 || keycode == 67 || keycode == 71 || keycode == 65)
fe3320d2 661 && !hotkey_prefix) {
344702be 662
164469f9
AD
663 var date = new Date();
664 var ts = Math.round(date.getTime() / 1000);
665
93f66472 666 hotkey_prefix = keycode;
164469f9 667 hotkey_prefix_pressed = ts;
78935092
AD
668
669 cmdline.innerHTML = keychar;
670 Element.show(cmdline);
671
84c7b824 672 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar + " TS=" + ts);
344702be 673 return true;
93f66472
AD
674 }
675
676 if (Element.visible("hotkey_help_overlay")) {
677 Element.hide("hotkey_help_overlay");
678 }
679
680 /* Global hotkeys */
681
78935092
AD
682 Element.hide(cmdline);
683
93f66472
AD
684 if (!hotkey_prefix) {
685
0dfc968b
AD
686 if (keycode == 27) { // escape
687 closeArticlePanel();
688 return;
689 }
690
fe66e229
CC
691 if (keycode == 69) { // e
692 var id = getActiveArticleId();
693 emailArticle(id);
694 }
695
eec498c3 696 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
6802e1be
AD
697
698 new Ajax.Request("backend.php", {
699 parameters: "?op=backend&method=help&topic=main",
700 onComplete: function(transport) {
701 $("hotkey_help_overlay").innerHTML = transport.responseText;
702 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
703 } });
eec498c3 704 return false;
93f66472 705 }
60ea2377 706
eec498c3 707 if (keycode == 191 || keychar == '/') { // /
973fe3c6 708 search();
eec498c3 709 return false;
93f66472
AD
710 }
711
4c58e285 712 if (keycode == 74 && !shift_key) { // j
d026d372 713 var rv = dijit.byId("feedTree").getPreviousFeed(
69de6b46
AD
714 getActiveFeedId(), activeFeedIsCat());
715
716 if (rv) viewfeed(rv[0], '', rv[1]);
717
19d7bfcd 718 return;
93f66472 719 }
009646d2 720
93f66472 721 if (keycode == 75) { // k
d026d372 722 var rv = dijit.byId("feedTree").getNextFeed(
69de6b46
AD
723 getActiveFeedId(), activeFeedIsCat());
724
725 if (rv) viewfeed(rv[0], '', rv[1]);
726
19d7bfcd 727 return;
93f66472
AD
728 }
729
a411875b 730 if (shift_key && keycode == 40) { // shift-down
62f2d58f 731 catchupRelativeToArticle(1);
19d7bfcd 732 return;
62f2d58f
AD
733 }
734
a411875b 735 if (shift_key && keycode == 38) { // shift-up
62f2d58f 736 catchupRelativeToArticle(0);
19d7bfcd 737 return;
62f2d58f
AD
738 }
739
a411875b 740 if (shift_key && keycode == 78) { // N
009646d2 741 scrollArticle(50);
a411875b
AD
742 return;
743 }
744
745 if (shift_key && keycode == 80) { // P
009646d2 746 scrollArticle(-50);
a411875b
AD
747 return;
748 }
749
0129090b 750 if (keycode == 68 && shift_key) { // shift-D
1ede5814 751 dismissSelectedArticles();
9ad53991 752 return;
1ede5814
AD
753 }
754
755 if (keycode == 88 && shift_key) { // shift-X
756 dismissReadArticles();
9ad53991 757 return;
0129090b 758 }
a411875b 759
93f66472
AD
760 if (keycode == 78 || keycode == 40) { // n, down
761 if (typeof moveToPost != 'undefined') {
314fcd2b 762 moveToPost('next');
dad14b51 763 return false;
93f66472
AD
764 }
765 }
009646d2 766
93f66472
AD
767 if (keycode == 80 || keycode == 38) { // p, up
768 if (typeof moveToPost != 'undefined') {
314fcd2b 769 moveToPost('prev');
dad14b51 770 return false;
93f66472
AD
771 }
772 }
773
774 if (keycode == 83 && shift_key) { // S
ac743c83 775 selectionTogglePublished(undefined, false, true);
19d7bfcd 776 return;
93f66472
AD
777 }
778
779 if (keycode == 83) { // s
ac743c83 780 selectionToggleMarked(undefined, false, true);
19d7bfcd 781 return;
93f66472
AD
782 }
783
93f66472 784 if (keycode == 85) { // u
e331188f 785 selectionToggleUnread(undefined, false, true);
19d7bfcd 786 return;
93f66472
AD
787 }
788
314fcd2b 789 if (keycode == 84 && shift_key) { // T
93f66472
AD
790 var id = getActiveArticleId();
791 if (id) {
792 editArticleTags(id, getActiveFeedId(), isCdmMode());
19d7bfcd 793 return;
93f66472
AD
794 }
795 }
796
314fcd2b
AD
797 if (keycode == 9) { // tab
798 var id = getArticleUnderPointer();
009646d2 799 if (id) {
acac8448 800 var cb = $("RCHK-" + id);
93f66472
AD
801
802 if (cb) {
803 cb.checked = !cb.checked;
804 toggleSelectRowById(cb, "RROW-" + id);
eec498c3 805 return false;
93f66472
AD
806 }
807 }
314fcd2b 808 }
93f66472
AD
809
810 if (keycode == 79) { // o
811 if (getActiveArticleId()) {
812 openArticleInNewWindow(getActiveArticleId());
19d7bfcd 813 return;
93f66472
AD
814 }
815 }
816
c1780289
AD
817 if (keycode == 81 && shift_key) { // Q
818 if (typeof catchupAllFeeds != 'undefined') {
819 catchupAllFeeds();
36cebe0f 820 return;
c1780289
AD
821 }
822 }
823
9ad53991 824 if (keycode == 88 && !shift_key) { // x
9bbbc82c 825 if (activeFeedIsCat()) {
7613280a 826 dijit.byId("feedTree").collapseCat(getActiveFeedId());
9ad53991 827 return;
9bbbc82c
AD
828 }
829 }
93f66472
AD
830 }
831
2bb3f957
AD
832 /* Prefix a */
833
834 if (hotkey_prefix == 65) { // a
835 hotkey_prefix = false;
836
837 if (keycode == 65) { // a
838 selectArticles('all');
839 return;
840 }
841
842 if (keycode == 85) { // u
843 selectArticles('unread');
844 return;
845 }
846
847 if (keycode == 73) { // i
848 selectArticles('invert');
849 return;
850 }
851
852 if (keycode == 78) { // n
853 selectArticles('none');
854 return;
855 }
856
857 }
858
93f66472
AD
859 /* Prefix f */
860
009646d2 861 if (hotkey_prefix == 70) { // f
93f66472
AD
862
863 hotkey_prefix = false;
864
617698d7
AD
865 if (keycode == 81) { // q
866 if (getActiveFeedId()) {
867 catchupCurrentFeed();
868 return;
869 }
870 }
871
872 if (keycode == 82) { // r
873 if (getActiveFeedId()) {
0569a712 874 viewfeed(getActiveFeedId(), '', activeFeedIsCat());
617698d7
AD
875 return;
876 }
877 }
878
93f66472 879 if (keycode == 65) { // a
eec498c3
AD
880 toggleDispRead();
881 return false;
93f66472
AD
882 }
883
93f66472
AD
884 if (keycode == 85) { // u
885 if (getActiveFeedId()) {
0569a712 886 viewfeed(getActiveFeedId(), '');
eec498c3 887 return false;
93f66472
AD
888 }
889 }
890
891 if (keycode == 69) { // e
33f31dfd
AD
892
893 if (activeFeedIsCat())
894 alert(__("You can't edit this kind of feed."));
895 else
896 editFeed(getActiveFeedId());
897 return;
898
eec498c3 899 return false;
93f66472
AD
900 }
901
902 if (keycode == 83) { // s
3393238d 903 quickAddFeed();
eec498c3 904 return false;
93f66472
AD
905 }
906
907 if (keycode == 67 && shift_key) { // C
908 if (typeof catchupAllFeeds != 'undefined') {
eec498c3
AD
909 catchupAllFeeds();
910 return false;
93f66472
AD
911 }
912 }
913
914 if (keycode == 67) { // c
915 if (getActiveFeedId()) {
eec498c3
AD
916 catchupCurrentFeed();
917 return false;
93f66472
AD
918 }
919 }
920
8a3e0b1a
AD
921 if (keycode == 88) { // x
922 reverseHeadlineOrder();
923 return;
924 }
93f66472
AD
925 }
926
927 /* Prefix c */
928
929 if (hotkey_prefix == 67) { // c
930 hotkey_prefix = false;
931
932 if (keycode == 70) { // f
db4e4539 933 quickAddFilter();
eec498c3 934 return false;
93f66472
AD
935 }
936
fc2732f4
AD
937 if (keycode == 76) { // l
938 addLabel();
939 return false;
940 }
941
93f66472
AD
942 if (keycode == 83) { // s
943 if (typeof collapse_feedlist != 'undefined') {
eec498c3
AD
944 collapse_feedlist();
945 return false;
93f66472
AD
946 }
947 }
948
a5550322 949 if (keycode == 77) { // m
6e88da82
AD
950 // TODO: sortable feedlist
951 return;
a5550322
AD
952 }
953
a411875b
AD
954 if (keycode == 78) { // n
955 catchupRelativeToArticle(1);
956 return;
957 }
958
959 if (keycode == 80) { // p
960 catchupRelativeToArticle(0);
961 return;
962 }
963
964
93f66472
AD
965 }
966
967 /* Prefix g */
968
969 if (hotkey_prefix == 71) { // g
970
971 hotkey_prefix = false;
972
49f4a7e9
AD
973
974 if (keycode == 65) { // a
975 viewfeed(-4);
976 return false;
977 }
978
93f66472 979 if (keycode == 83) { // s
eec498c3
AD
980 viewfeed(-1);
981 return false;
93f66472
AD
982 }
983
984 if (keycode == 80 && shift_key) { // P
eec498c3
AD
985 gotoPreferences();
986 return false;
93f66472
AD
987 }
988
989 if (keycode == 80) { // p
eec498c3
AD
990 viewfeed(-2);
991 return false;
93f66472
AD
992 }
993
994 if (keycode == 70) { // f
eec498c3
AD
995 viewfeed(-3);
996 return false;
93f66472
AD
997 }
998
e31ed61a
AD
999 if (keycode == 84) { // t
1000 displayDlg("printTagCloud");
eec498c3 1001 return false;
3a391f67 1002 }
43319e5e
AD
1003 }
1004
1005 /* Cmd */
93f66472 1006
009646d2 1007 if (hotkey_prefix == 224 || hotkey_prefix == 91) { // f
43319e5e
AD
1008 hotkey_prefix = false;
1009 return;
93f66472
AD
1010 }
1011
93f66472 1012 if (hotkey_prefix) {
84c7b824 1013 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
93f66472 1014 } else {
84c7b824 1015 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
93f66472
AD
1016 }
1017
1018
1019 } catch (e) {
1020 exception_error("hotkey_handler", e);
1021 }
1022}
61a20560 1023
a5819bb3
AD
1024function inPreferences() {
1025 return false;
1026}
8a3e0b1a
AD
1027
1028function reverseHeadlineOrder() {
1029 try {
1030
f30ef1fa 1031 var query_str = "?op=rpc&method=togglepref&key=REVERSE_HEADLINES";
8a3e0b1a
AD
1032
1033 new Ajax.Request("backend.php", {
1034 parameters: query_str,
009646d2 1035 onComplete: function(transport) {
8a3e0b1a
AD
1036 viewCurrentFeed();
1037 } });
1038
1039 } catch (e) {
1040 exception_error("reverseHeadlineOrder", e);
1041 }
1042}
fe1087fb 1043
997429c2 1044function scheduleFeedUpdate(id, is_cat) {
428b704d 1045 try {
997429c2
AD
1046 if (!id) {
1047 id = getActiveFeedId();
1048 is_cat = activeFeedIsCat();
1049 }
428b704d 1050
997429c2 1051 if (!id) {
428b704d
AD
1052 alert(__("Please select some feed first."));
1053 return;
1054 }
1055
f30ef1fa 1056 var query = "?op=rpc&method=scheduleFeedUpdate&id=" +
997429c2
AD
1057 param_escape(id) +
1058 "&is_cat=" + param_escape(is_cat);
428b704d
AD
1059
1060 console.log(query);
1061
1062 new Ajax.Request("backend.php", {
1063 parameters: query,
009646d2 1064 onComplete: function(transport) {
74d12bab 1065 handle_rpc_json(transport);
428b704d 1066
74d12bab
AD
1067 var reply = JSON.parse(transport.responseText);
1068 var message = reply['message'];
428b704d 1069
74d12bab
AD
1070 if (message) {
1071 notify_info(message);
1072 return;
428b704d
AD
1073 }
1074
428b704d
AD
1075 } });
1076
1077
1078 } catch (e) {
1079 exception_error("scheduleFeedUpdate", e);
1080 }
1081}
63855db1
AD
1082
1083function newVersionDlg() {
1084 try {
3f363052 1085 var query = "backend.php?op=dlg&method=newVersion";
63855db1
AD
1086
1087 if (dijit.byId("newVersionDlg"))
1088 dijit.byId("newVersionDlg").destroyRecursive();
1089
1090 dialog = new dijit.Dialog({
1091 id: "newVersionDlg",
1092 title: __("New version available!"),
1093 style: "width: 600px",
1094 href: query,
1095 });
1096
1097 dialog.show();
1098
1099 } catch (e) {
1100 exception_error("newVersionDlg", e);
1101 }
1102}
563b9c78
AD
1103
1104function handle_rpc_json(transport, scheduled_call) {
1105 try {
1106 var reply = JSON.parse(transport.responseText);
1107
1108 if (reply) {
1109
1110 var error = reply['error'];
1111
1112 if (error) {
1113 var code = error['code'];
1114 var msg = error['msg'];
009646d2
AD
1115
1116 console.warn("[handle_rpc_json] received fatal error " + code + "/" + msg);
1117
563b9c78
AD
1118 if (code != 0) {
1119 fatalError(code, msg);
1120 return false;
1121 }
1122 }
1123
1124 var seq = reply['seq'];
1125
1126 if (seq) {
1127 if (get_seq() != seq) {
009646d2 1128 console.log("[handle_rpc_json] sequence mismatch: " + seq +
563b9c78
AD
1129 " (want: " + get_seq() + ")");
1130 return true;
1131 }
1132 }
1133
1134 var message = reply['message'];
1135
1136 if (message) {
1137 if (message == "UPDATE_COUNTERS") {
1138 console.log("need to refresh counters...");
1139 setInitParam("last_article_id", -1);
1140 _force_scheduled_update = true;
1141 }
1142 }
1143
1144 var counters = reply['counters'];
009646d2 1145
563b9c78
AD
1146 if (counters)
1147 parse_counters(counters, scheduled_call);
1148
1149 var runtime_info = reply['runtime-info'];;
1150
1151 if (runtime_info)
1152 parse_runtime_info(runtime_info);
1153
1154 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
1155
1156 } else {
1157 notify_error("Error communicating with server.");
1158 }
1159
1160 } catch (e) {
beb119a2
AD
1161 notify_error("Error communicating with server.");
1162 console.log(e);
1163 //exception_error("handle_rpc_json", e, transport);
563b9c78
AD
1164 }
1165
1166 return true;
1167}
1168