]> git.wh0rd.org - tt-rss.git/blame - js/tt-rss.js
fix filter testing on mysql
[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 43 selectFeed(id, is_cat);
3d72bbdb
AD
44 } catch (e) {
45 exception_error("setActiveFeedId", e);
46 }
47}
48
49
50eefedb
AD
50function updateFeedList() {
51 try {
102cfe73 52
009646d2 53// $("feeds-holder").innerHTML = "<div id=\"feedlistLoading\">" +
9c99281f
AD
54// __("Loading, please wait...") + "</div>";
55
56 Element.show("feedlistLoading");
57
102cfe73
AD
58 if (dijit.byId("feedTree")) {
59 dijit.byId("feedTree").destroyRecursive();
50eefedb 60 }
102cfe73
AD
61
62 var store = new dojo.data.ItemFileWriteStore({
2ecd2df5 63 url: "backend.php?op=pref_feeds&method=getfeedtree&mode=2"});
102cfe73 64
e032e2e7 65 var treeModel = new fox.FeedStoreModel({
102cfe73
AD
66 store: store,
67 query: {
854a2ace 68 "type": getInitParam('enable_feed_cats') == 1 ? "category" : "feed"
102cfe73
AD
69 },
70 rootId: "root",
71 rootLabel: "Feeds",
72 childrenAttrs: ["items"]
73 });
74
05f224a3 75 var tree = new fox.FeedTree({
247bb1bf 76 persist: false,
102cfe73 77 model: treeModel,
102cfe73
AD
78 onOpen: function (item, node) {
79 var id = String(item.id);
80 var cat_id = id.substr(id.indexOf(":")+1);
81
009646d2 82 new Ajax.Request("backend.php",
f30ef1fa 83 { parameters: "backend.php?op=feeds&method=collapse&cid=" +
1a709d21 84 param_escape(cat_id) + "&mode=0" } );
102cfe73
AD
85 },
86 onClose: function (item, node) {
87 var id = String(item.id);
88 var cat_id = id.substr(id.indexOf(":")+1);
89
009646d2 90 new Ajax.Request("backend.php",
f30ef1fa 91 { parameters: "backend.php?op=feeds&method=collapse&cid=" +
1a709d21 92 param_escape(cat_id) + "&mode=1" } );
102cfe73
AD
93
94 },
95 onClick: function (item, node) {
96 var id = String(item.id);
97 var is_cat = id.match("^CAT:");
98 var feed = id.substr(id.indexOf(":")+1);
99 viewfeed(feed, '', is_cat);
100 return false;
101 },
102 openOnClick: false,
103 showRoot: false,
104 id: "feedTree",
105 }, "feedTree");
106
2ecd2df5
AD
107 _force_scheduled_update = true;
108
997429c2 109/* var menu = new dijit.Menu({id: 'feedMenu'});
009646d2 110
997429c2
AD
111 menu.addChild(new dijit.MenuItem({
112 label: "Simple menu item"
113 }));
114
115// menu.bindDomNode(tree.domNode); */
009646d2
AD
116
117 var tmph = dojo.connect(dijit.byId('feedMenu'), '_openMyself', function (event) {
997429c2
AD
118 console.log(dijit.getEnclosingWidget(event.target));
119 dojo.disconnect(tmph);
120 });
121
102cfe73
AD
122 $("feeds-holder").appendChild(tree.domNode);
123
9c99281f
AD
124 var tmph = dojo.connect(tree, 'onLoad', function() {
125 dojo.disconnect(tmph);
126 Element.hide("feedlistLoading");
1a709d21
AD
127
128 tree.collapseHiddenCats();
129
1beea800 130 feedlist_init();
997429c2
AD
131
132// var node = dijit.byId("feedTree")._itemNodesMap['FEED:-2'][0].domNode
133// menu.bindDomNode(node);
134
fcc36744 135 loading_set_progress(25);
9c99281f
AD
136 });
137
102cfe73 138 tree.startup();
e1123aee 139
50eefedb
AD
140 } catch (e) {
141 exception_error("updateFeedList", e);
142 }
1a66d16e 143}
175847de 144
476cac42 145function catchupAllFeeds() {
076682aa 146
f8232151 147 var str = __("Mark all articles as read?");
476cac42 148
f8232151 149 if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) {
476cac42 150
f30ef1fa 151 var query_str = "backend.php?op=feeds&method=catchupAll";
1a66d16e 152
f8232151 153 notify_progress("Marking all feeds as read...");
476cac42 154
f8fb4498 155 //console.log("catchupAllFeeds Q=" + query_str);
fc69e641 156
b4e75b2a
AD
157 new Ajax.Request("backend.php", {
158 parameters: query_str,
009646d2
AD
159 onComplete: function(transport) {
160 feedlist_callback2(transport);
f8232151
AD
161 } });
162
163 global_unread = 0;
164 updateTitle("");
165 }
476cac42 166}
1cd17194 167
f30ef1fa 168function viewCurrentFeed(method) {
973c4a64 169 console.log("viewCurrentFeed");
1a66d16e 170
ec6e2fd3 171 if (getActiveFeedId() != undefined) {
f30ef1fa 172 viewfeed(getActiveFeedId(), method, activeFeedIsCat());
f0601b87 173 }
164f4738 174 return false; // block unneeded form submits
f0601b87
AD
175}
176
40d13c28 177function timeout() {
a598370d
AD
178 if (getInitParam("bw_limit") == "1") return;
179
f8fb4498
AD
180 try {
181 var date = new Date();
182 var ts = Math.round(date.getTime() / 1000);
183
184 if (ts - last_scheduled_update > 10 || _force_scheduled_update) {
f5de0d8d 185
ac49453b
AD
186 //console.log("timeout()");
187
f8fb4498 188 window.clearTimeout(counter_timeout_id);
009646d2 189
f30ef1fa 190 var query_str = "?op=rpc&method=getAllCounters&seq=" + next_seq();
009646d2 191
f8fb4498 192 var omode;
009646d2 193
f8fb4498
AD
194 if (firsttime_update && !navigator.userAgent.match("Opera")) {
195 firsttime_update = false;
196 omode = "T";
197 } else {
9c99281f 198 omode = "flc";
f8fb4498 199 }
009646d2 200
f8fb4498 201 query_str = query_str + "&omode=" + omode;
ac49453b
AD
202
203 if (!_force_scheduled_update)
204 query_str = query_str + "&last_article_id=" + getInitParam("last_article_id");
009646d2 205
f8fb4498 206 //console.log("[timeout]" + query_str);
009646d2 207
f8fb4498
AD
208 new Ajax.Request("backend.php", {
209 parameters: query_str,
009646d2 210 onComplete: function(transport) {
563b9c78 211 handle_rpc_json(transport, !_force_scheduled_update);
47fb32b0 212 _force_scheduled_update = false;
f8fb4498
AD
213 } });
214
215 last_scheduled_update = ts;
216 }
217
218 } catch (e) {
219 exception_error("timeout", e);
220 }
221
222 setTimeout("timeout()", 3000);
ac53063a
AD
223}
224
f0601b87 225function search() {
3f363052 226 var query = "backend.php?op=dlg&method=search&param=" +
973fe3c6
AD
227 param_escape(getActiveFeedId() + ":" + activeFeedIsCat());
228
229 if (dijit.byId("searchDlg"))
230 dijit.byId("searchDlg").destroyRecursive();
231
232 dialog = new dijit.Dialog({
233 id: "searchDlg",
234 title: __("Search"),
235 style: "width: 600px",
236 execute: function() {
237 if (this.validate()) {
238 _search_query = dojo.objectToQuery(this.attr('value'));
239 this.hide();
240 viewCurrentFeed();
241 }
242 },
243 href: query});
244
245 dialog.show();
76798ff3 246}
1cd17194 247
f8fb4498 248function updateTitle() {
fc69e641 249 var tmp = "Tiny Tiny RSS";
21703604 250
fc69e641
AD
251 if (global_unread > 0) {
252 tmp = tmp + " (" + global_unread + ")";
253 }
254
fdf47b9d
AD
255 if (window.fluid) {
256 if (global_unread > 0) {
257 window.fluid.dockBadge = global_unread;
258 } else {
259 window.fluid.dockBadge = "";
260 }
261 }
262
fc69e641
AD
263 document.title = tmp;
264}
265
22a93ad8 266function genericSanityCheck() {
57937c42 267 setCookie("ttrss_test", "TEST");
009646d2 268
57937c42 269 if (getCookie("ttrss_test") != "TEST") {
68535211 270 return fatalError(2);
295f9b42
AD
271 }
272
22a93ad8
AD
273 return true;
274}
275
276function init() {
7719618b 277 try {
04150375 278 //dojo.registerModulePath("fox", "../../js/");
05f224a3
AD
279
280 dojo.require("fox.FeedTree");
281
8d3cb8c0
AD
282 if (typeof themeBeforeLayout == 'function') {
283 themeBeforeLayout();
284 }
285
1354d172
AD
286 dojo.require("dijit.ColorPalette");
287 dojo.require("dijit.Dialog");
288 dojo.require("dijit.form.Button");
289 dojo.require("dijit.form.CheckBox");
290 dojo.require("dijit.form.DropDownButton");
291 dojo.require("dijit.form.FilteringSelect");
292 dojo.require("dijit.form.Form");
293 dojo.require("dijit.form.RadioButton");
294 dojo.require("dijit.form.Select");
295 dojo.require("dijit.form.SimpleTextarea");
296 dojo.require("dijit.form.TextBox");
297 dojo.require("dijit.form.ValidationTextBox");
298 dojo.require("dijit.InlineEditBox");
299 dojo.require("dijit.layout.AccordionContainer");
300 dojo.require("dijit.layout.BorderContainer");
301 dojo.require("dijit.layout.ContentPane");
302 dojo.require("dijit.layout.TabContainer");
303 dojo.require("dijit.Menu");
304 dojo.require("dijit.ProgressBar");
305 dojo.require("dijit.ProgressBar");
306 dojo.require("dijit.Toolbar");
307 dojo.require("dijit.Tree");
308 dojo.require("dijit.tree.dndSource");
309 dojo.require("dojo.data.ItemFileWriteStore");
310
d80b3f3d
AD
311 dojo.parser.parse();
312
009646d2 313 if (!genericSanityCheck())
68535211 314 return false;
ac43eba1 315
fcc36744 316 loading_set_progress(20);
fca95d5f 317
c3edc667
AD
318 var hasAudio = !!((myAudioTag = document.createElement('audio')).canPlayType);
319
b4e75b2a 320 new Ajax.Request("backend.php", {
f30ef1fa 321 parameters: {op: "rpc", method: "sanityCheck", hasAudio: hasAudio},
9ca945a6
AD
322 onComplete: function(transport) {
323 backend_sanity_check_callback(transport);
324 } });
47179952 325
7719618b
AD
326 } catch (e) {
327 exception_error("init", e);
a8d28f48 328 }
7719618b 329}
86741347 330
7719618b 331function init_second_stage() {
295f9b42 332
7719618b 333 try {
118f4180
AD
334 dojo.addOnLoad(function() {
335 updateFeedList();
336 closeArticlePanel();
337
338 if (typeof themeAfterLayout == 'function') {
339 themeAfterLayout();
340 }
341
342 });
2f587484 343
57937c42 344 delCookie("ttrss_test");
770bbb02 345
40496720 346 var toolbar = document.forms["main_toolbar_form"];
f31673f7 347
009646d2 348 dijit.getEnclosingWidget(toolbar.view_mode).attr('value',
37f1a234
AD
349 getInitParam("default_view_mode"));
350
009646d2 351 dijit.getEnclosingWidget(toolbar.order_by).attr('value',
37f1a234 352 getInitParam("default_view_order_by"));
c6784aea 353
61a20560 354 feeds_sort_by_unread = getInitParam("feeds_sort_by_unread") == 1;
5f136c9a 355
fcc36744 356 loading_set_progress(30);
730dbf19 357
37c03d3a
AD
358 // can't use cache_clear() here because viewfeed might not have initialized yet
359 if ('sessionStorage' in window && window['sessionStorage'] !== null)
360 sessionStorage.clear();
ff0010c1 361
4a28ab44 362 console.log("second stage ok");
fcf70c51 363
7719618b
AD
364 } catch (e) {
365 exception_error("init_second_stage", e);
2f587484 366 }
1cd17194 367}
ac43eba1 368
c09ec856 369function quickMenuGo(opid) {
bb3423cf 370 try {
bb3423cf
AD
371 if (opid == "qmcPrefs") {
372 gotoPreferences();
373 }
009646d2 374
9c99281f
AD
375 if (opid == "qmcTagCloud") {
376 displayDlg("printTagCloud");
377 }
378
147f5632
CM
379 if (opid == "qmcTagSelect") {
380 displayDlg("printTagSelect");
381 }
382
bb3423cf 383 if (opid == "qmcSearch") {
973fe3c6 384 search();
6de5d056
AD
385 return;
386 }
009646d2 387
bb3423cf 388 if (opid == "qmcAddFeed") {
3393238d 389 quickAddFeed();
bb3423cf 390 return;
69668465 391 }
7086277c 392
1bf679a3 393 if (opid == "qmcDigest") {
ac220751 394 window.location.href = "backend.php?op=digest";
1bf679a3
AD
395 return;
396 }
397
7086277c 398 if (opid == "qmcEditFeed") {
33f31dfd
AD
399 if (activeFeedIsCat())
400 alert(__("You can't edit this kind of feed."));
401 else
402 editFeed(getActiveFeedId());
403 return;
7086277c 404 }
009646d2 405
bb3423cf
AD
406 if (opid == "qmcRemoveFeed") {
407 var actid = getActiveFeedId();
442d77f1
AD
408
409 if (activeFeedIsCat()) {
89cb787e 410 alert(__("You can't unsubscribe from the category."));
442d77f1 411 return;
009646d2 412 }
442d77f1
AD
413
414 if (!actid) {
89cb787e 415 alert(__("Please select some feed first."));
bb3423cf
AD
416 return;
417 }
64a2875d
AD
418
419 var fn = getFeedName(actid);
89cb787e
AD
420
421 var pr = __("Unsubscribe from %s?").replace("%s", fn);
422
423 if (confirm(pr)) {
e978f78d 424 unsubscribeFeed(actid);
bb3423cf 425 }
009646d2 426
bb3423cf
AD
427 return;
428 }
d1f0c584 429
bb3423cf
AD
430 if (opid == "qmcCatchupAll") {
431 catchupAllFeeds();
432 return;
433 }
009646d2 434
bb3423cf
AD
435 if (opid == "qmcShowOnlyUnread") {
436 toggleDispRead();
437 return;
438 }
009646d2 439
bb3423cf 440 if (opid == "qmcAddFilter") {
db4e4539
AD
441 quickAddFilter();
442 return;
bb3423cf 443 }
0979b696 444
1380f8ee
AD
445 if (opid == "qmcAddLabel") {
446 addLabel();
db4e4539 447 return;
1380f8ee
AD
448 }
449
9a85081a
AD
450 if (opid == "qmcRescoreFeed") {
451 rescoreCurrentFeed();
db4e4539 452 return;
9a85081a
AD
453 }
454
238eff01 455 if (opid == "qmcHKhelp") {
b8cb4d08 456 helpDialog("main");
238eff01
AD
457 }
458
bb3423cf
AD
459 } catch (e) {
460 exception_error("quickMenuGo", e);
a24f525c 461 }
e2f8f7b4
AD
462}
463
3745788e 464function toggleDispRead() {
7f123cda 465 try {
3745788e 466
dbfc9522 467 var hide = !(getInitParam("hide_read_feeds") == "1");
3745788e 468
dbfc9522 469 hideOrShowFeeds(hide);
e8bd0da9 470
f30ef1fa 471 var query = "?op=rpc&method=setpref&key=HIDE_READ_FEEDS&value=" +
dbfc9522 472 param_escape(hide);
e8bd0da9 473
05f224a3
AD
474 setInitParam("hide_read_feeds", hide);
475
dbfc9522
AD
476 new Ajax.Request("backend.php", {
477 parameters: query,
009646d2 478 onComplete: function(transport) {
dbfc9522 479 } });
009646d2 480
7f123cda
AD
481 } catch (e) {
482 exception_error("toggleDispRead", e);
3745788e 483 }
3745788e 484}
295f9b42 485
563b9c78 486function parse_runtime_info(data) {
71ad883b 487
f8fb4498 488 //console.log("parsing runtime info...");
1cb7492d 489
c4f7ba80
AD
490 for (k in data) {
491 var v = data[k];
3ac2b520 492
563b9c78 493// console.log("RI: " + k + " => " + v);
1cb7492d 494
d9fa39f1 495 if (k == "new_version_available") {
acac8448 496 var icon = $("newVersionIcon");
d9fa39f1
AD
497 if (icon) {
498 if (v == "1") {
499 icon.style.display = "inline";
500 } else {
501 icon.style.display = "none";
502 }
503 }
5ae8f858 504 return;
d9fa39f1
AD
505 }
506
ef16ae37 507 if (k == "daemon_is_running" && v != 1) {
8e00ae9b 508 notify_error("<span onclick=\"javascript:explainError(1)\">Update daemon is not running.</span>", true);
5ae8f858 509 return;
8e00ae9b
AD
510 }
511
512 if (k == "daemon_stamp_ok" && v != 1) {
513 notify_error("<span onclick=\"javascript:explainError(3)\">Update daemon is not updating feeds.</span>", true);
5ae8f858 514 return;
8e00ae9b
AD
515 }
516
8cd576a1
AD
517 if (k == "max_feed_id" || k == "num_feeds") {
518 if (init_params[k] != v) {
519 console.log("feed count changed, need to reload feedlist.");
520 updateFeedList();
521 }
522 }
523
009646d2 524 init_params[k] = v;
5ae8f858 525 notify('');
71ad883b
AD
526 }
527}
fce24838 528
8389b150
AD
529function collapse_feedlist() {
530 try {
0ce61157
AD
531
532 if (!Element.visible('feeds-holder')) {
533 Element.show('feeds-holder');
ab7b5042 534 Element.show('feeds-holder_splitter');
0ce61157
AD
535 $("collapse_feeds_btn").innerHTML = "&lt;&lt;";
536 } else {
537 Element.hide('feeds-holder');
ab7b5042 538 Element.hide('feeds-holder_splitter');
0ce61157
AD
539 $("collapse_feeds_btn").innerHTML = "&gt;&gt;";
540 }
541
542 dijit.byId("main").resize();
6e4f4ce1 543
f30ef1fa 544 query = "?op=rpc&method=setpref&key=_COLLAPSED_FEEDLIST&value=true";
fcf70c51 545 new Ajax.Request("backend.php", { parameters: query });
6e4f4ce1 546
8389b150 547 } catch (e) {
f88c7814 548 exception_error("collapse_feedlist", e);
8389b150 549 }
3c2d7945 550}
8389b150 551
3c2d7945 552function viewModeChanged() {
4f79e9aa 553 cache_clear();
e331188f 554 return viewCurrentFeed('');
3c2d7945 555}
8389b150 556
3c2d7945 557function viewLimitChanged() {
e331188f 558 return viewCurrentFeed('');
8389b150 559}
546499a9 560
9bf3f101 561/* function adjustArticleScore(id, score) {
546499a9
AD
562 try {
563
564 var pr = prompt(__("Assign score to article:"), score);
565
566 if (pr != undefined) {
f30ef1fa 567 var query = "?op=rpc&method=setScore&id=" + id + "&score=" + pr;
546499a9 568
b4e75b2a
AD
569 new Ajax.Request("backend.php", {
570 parameters: query,
546499a9
AD
571 onComplete: function(transport) {
572 viewCurrentFeed();
573 } });
574
575 }
576 } catch (e) {
438f2ce9 577 exception_error("adjustArticleScore", e);
546499a9 578 }
9bf3f101 579} */
9a85081a
AD
580
581function rescoreCurrentFeed() {
582
583 var actid = getActiveFeedId();
584
9c99281f 585 if (activeFeedIsCat() || actid < 0) {
9a85081a
AD
586 alert(__("You can't rescore this kind of feed."));
587 return;
009646d2 588 }
9a85081a
AD
589
590 if (!actid) {
591 alert(__("Please select some feed first."));
592 return;
593 }
594
595 var fn = getFeedName(actid);
69811a7d 596 var pr = __("Rescore articles in %s?").replace("%s", fn);
9a85081a
AD
597
598 if (confirm(pr)) {
599 notify_progress("Rescoring articles...");
600
f30ef1fa 601 var query = "?op=pref-feeds&method=rescore&quiet=1&ids=" + actid;
9a85081a 602
b4e75b2a
AD
603 new Ajax.Request("backend.php", {
604 parameters: query,
605 onComplete: function(transport) {
606 viewCurrentFeed();
607 } });
9a85081a
AD
608 }
609}
610
93f66472 611function hotkey_handler(e) {
93f66472
AD
612 try {
613
8386f861 614 if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
18606807 615
e331188f 616 var keycode = false;
93f66472
AD
617 var shift_key = false;
618
78935092 619 var cmdline = $('cmdline');
93f66472
AD
620
621 try {
622 shift_key = e.shiftKey;
623 } catch (e) {
624
625 }
009646d2 626
93f66472
AD
627 if (window.event) {
628 keycode = window.event.keyCode;
629 } else if (e) {
630 keycode = e.which;
631 }
632
eec498c3 633 var keychar = String.fromCharCode(keycode);
c177f2e6 634
93f66472 635 if (keycode == 27) { // escape
93f66472 636 hotkey_prefix = false;
009646d2 637 }
93f66472 638
93f66472 639 if (keycode == 16) return; // ignore lone shift
ac743c83 640 if (keycode == 17) return; // ignore lone ctrl
93f66472 641
a83b58f1
AD
642 if (!shift_key) keychar = keychar.toLowerCase();
643
e218c5f5
AD
644 var hotkeys = getInitParam("hotkeys");
645
646 if (!hotkey_prefix && hotkeys[0].indexOf(keychar) != -1) {
a83b58f1
AD
647
648 var date = new Date();
649 var ts = Math.round(date.getTime() / 1000);
650
651 hotkey_prefix = keychar;
652 hotkey_prefix_pressed = ts;
653
654 cmdline.innerHTML = keychar;
655 Element.show(cmdline);
656
657 return true;
658 }
659
660 Element.hide(cmdline);
661
662 var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
663 hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
664 hotkey_prefix = false;
665
666 var hotkey_action = false;
667 var hotkeys = getInitParam("hotkeys");
668
e218c5f5
AD
669 for (sequence in hotkeys[1]) {
670 if (sequence == hotkey) {
671 hotkey_action = hotkeys[1][sequence];
672 break;
a83b58f1
AD
673 }
674 }
675
676 switch (hotkey_action) {
677 case "next_feed":
e218c5f5
AD
678 var rv = dijit.byId("feedTree").getNextFeed(
679 getActiveFeedId(), activeFeedIsCat());
680
681 if (rv) viewfeed(rv[0], '', rv[1]);
4ba1f8bb 682 return false;
a83b58f1 683 case "prev_feed":
e218c5f5
AD
684 var rv = dijit.byId("feedTree").getPreviousFeed(
685 getActiveFeedId(), activeFeedIsCat());
686
687 if (rv) viewfeed(rv[0], '', rv[1]);
4ba1f8bb 688 return false;
a83b58f1 689 case "next_article":
e218c5f5 690 moveToPost('next');
4ba1f8bb 691 return false;
a83b58f1 692 case "prev_article":
e218c5f5 693 moveToPost('prev');
4ba1f8bb 694 return false;
a83b58f1 695 case "search_dialog":
e218c5f5
AD
696 search();
697 return ;
a83b58f1 698 case "toggle_mark":
e218c5f5 699 selectionToggleMarked(undefined, false, true);
4ba1f8bb 700 return false;
a83b58f1 701 case "toggle_publ":
e218c5f5 702 selectionTogglePublished(undefined, false, true);
4ba1f8bb 703 return false;
a83b58f1 704 case "toggle_unread":
e218c5f5 705 selectionToggleUnread(undefined, false, true);
4ba1f8bb 706 return false;
a83b58f1 707 case "edit_tags":
e218c5f5
AD
708 var id = getActiveArticleId();
709 if (id) {
710 editArticleTags(id, getActiveFeedId(), isCdmMode());
711 return;
712 }
4ba1f8bb 713 return false;
a83b58f1 714 case "dismiss_selected":
e218c5f5 715 dismissSelectedArticles();
4ba1f8bb 716 return false;
a83b58f1 717 case "dismiss_read":
4ba1f8bb 718 return false;
a83b58f1 719 case "open_in_new_window":
e218c5f5
AD
720 if (getActiveArticleId()) {
721 openArticleInNewWindow(getActiveArticleId());
722 return;
723 }
4ba1f8bb 724 return false;
a83b58f1 725 case "catchup_below":
e218c5f5 726 catchupRelativeToArticle(1);
4ba1f8bb 727 return false;
a83b58f1 728 case "catchup_above":
e218c5f5 729 catchupRelativeToArticle(0);
4ba1f8bb 730 return false;
e218c5f5
AD
731 case "article_scroll_down":
732 scrollArticle(50);
4ba1f8bb 733 return false;
e218c5f5
AD
734 case "article_scroll_up":
735 scrollArticle(-50);
4ba1f8bb 736 return false;
a83b58f1 737 case "email_article":
0b2f8843
AD
738 if (typeof emailArticle != "undefined") {
739 emailArticle();
740 } else {
741 alert(__("Please enable mail plugin first."));
742 }
4ba1f8bb 743 return false;
a83b58f1 744 case "select_all":
e218c5f5 745 selectArticles('all');
4ba1f8bb 746 return false;
a83b58f1 747 case "select_unread":
e218c5f5 748 selectArticles('unread');
4ba1f8bb 749 return false;
a83b58f1 750 case "select_marked":
e218c5f5 751 selectArticles('marked');
4ba1f8bb 752 return false;
a83b58f1 753 case "select_published":
e218c5f5 754 selectArticles('published');
4ba1f8bb 755 return false;
a83b58f1 756 case "select_invert":
e218c5f5 757 selectArticles('invert');
4ba1f8bb 758 return false;
a83b58f1 759 case "select_none":
e218c5f5 760 selectArticles('none');
4ba1f8bb 761 return false;
a83b58f1 762 case "feed_refresh":
e218c5f5
AD
763 if (getActiveFeedId() != undefined) {
764 viewfeed(getActiveFeedId(), '', activeFeedIsCat());
765 return;
766 }
4ba1f8bb 767 return false;
a83b58f1 768 case "feed_unhide_read":
e218c5f5 769 toggleDispRead();
4ba1f8bb 770 return false;
a83b58f1
AD
771 case "feed_subscribe":
772 quickAddFeed();
4ba1f8bb 773 return false;
e218c5f5
AD
774 case "feed_debug_update":
775 window.open("backend.php?op=feeds&method=view&feed=" + getActiveFeedId() +
776 "&view_mode=adaptive&order_by=default&update=&m=ForceUpdate&cat=" +
fe021c8b 777 activeFeedIsCat() + "&DevForceUpdate=1&debug=1&xdebug=1&csrf_token=" +
e218c5f5 778 getInitParam("csrf_token"));
4ba1f8bb 779 return false;
a83b58f1 780 case "feed_edit":
e218c5f5
AD
781 if (activeFeedIsCat())
782 alert(__("You can't edit this kind of feed."));
783 else
784 editFeed(getActiveFeedId());
4ba1f8bb 785 return false;
a83b58f1 786 case "feed_catchup":
e218c5f5
AD
787 if (getActiveFeedId() != undefined) {
788 catchupCurrentFeed();
789 return;
790 }
4ba1f8bb 791 return false;
a83b58f1 792 case "feed_reverse":
e218c5f5 793 reverseHeadlineOrder();
4ba1f8bb 794 return false;
a83b58f1 795 case "catchup_all":
e218c5f5 796 catchupAllFeeds();
4ba1f8bb 797 return false;
a83b58f1 798 case "cat_toggle_collapse":
e218c5f5
AD
799 if (activeFeedIsCat()) {
800 dijit.byId("feedTree").collapseCat(getActiveFeedId());
801 return;
802 }
4ba1f8bb 803 return false;
a83b58f1 804 case "goto_all":
e218c5f5 805 viewfeed(-4);
4ba1f8bb 806 return false;
a83b58f1 807 case "goto_fresh":
e218c5f5 808 viewfeed(-3);
4ba1f8bb 809 return false;
a83b58f1 810 case "goto_marked":
e218c5f5 811 viewfeed(-1);
4ba1f8bb 812 return false;
a83b58f1 813 case "goto_published":
e218c5f5 814 viewfeed(-2);
4ba1f8bb 815 return false;
a83b58f1 816 case "goto_tagcloud":
e218c5f5 817 displayDlg("printTagCloud");
4ba1f8bb 818 return false;
a83b58f1 819 case "goto_prefs":
e218c5f5 820 gotoPreferences();
4ba1f8bb 821 return false;
a83b58f1 822 case "select_article_cursor":
e218c5f5
AD
823 var id = getArticleUnderPointer();
824 if (id) {
825 var cb = dijit.byId("RCHK-" + id);
826 if (cb) {
827 cb.attr("checked", !cb.attr("checked"));
828 toggleSelectRowById(cb, "RROW-" + id);
829 return false;
830 }
831 }
4ba1f8bb 832 return false;
a83b58f1 833 case "create_label":
e218c5f5 834 addLabel();
4ba1f8bb 835 return false;
a83b58f1 836 case "create_filter":
e218c5f5 837 quickAddFilter();
4ba1f8bb 838 return false;
a83b58f1 839 case "collapse_sidebar":
e218c5f5 840 collapse_feedlist();
4ba1f8bb 841 return false;
a83b58f1 842 case "help_dialog":
b8cb4d08 843 helpDialog("main");
e218c5f5 844 return false;
a83b58f1
AD
845 default:
846 console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey);
847 }
848
93f66472
AD
849 } catch (e) {
850 exception_error("hotkey_handler", e);
851 }
852}
61a20560 853
a5819bb3
AD
854function inPreferences() {
855 return false;
856}
8a3e0b1a
AD
857
858function reverseHeadlineOrder() {
859 try {
860
f30ef1fa 861 var query_str = "?op=rpc&method=togglepref&key=REVERSE_HEADLINES";
8a3e0b1a
AD
862
863 new Ajax.Request("backend.php", {
864 parameters: query_str,
009646d2 865 onComplete: function(transport) {
8a3e0b1a
AD
866 viewCurrentFeed();
867 } });
868
869 } catch (e) {
870 exception_error("reverseHeadlineOrder", e);
871 }
872}
fe1087fb 873
63855db1
AD
874function newVersionDlg() {
875 try {
3f363052 876 var query = "backend.php?op=dlg&method=newVersion";
63855db1
AD
877
878 if (dijit.byId("newVersionDlg"))
879 dijit.byId("newVersionDlg").destroyRecursive();
880
881 dialog = new dijit.Dialog({
882 id: "newVersionDlg",
883 title: __("New version available!"),
884 style: "width: 600px",
885 href: query,
886 });
887
888 dialog.show();
889
890 } catch (e) {
891 exception_error("newVersionDlg", e);
892 }
893}
563b9c78
AD
894
895function handle_rpc_json(transport, scheduled_call) {
896 try {
897 var reply = JSON.parse(transport.responseText);
898
899 if (reply) {
900
901 var error = reply['error'];
902
903 if (error) {
904 var code = error['code'];
905 var msg = error['msg'];
009646d2
AD
906
907 console.warn("[handle_rpc_json] received fatal error " + code + "/" + msg);
908
563b9c78
AD
909 if (code != 0) {
910 fatalError(code, msg);
911 return false;
912 }
913 }
914
915 var seq = reply['seq'];
916
917 if (seq) {
918 if (get_seq() != seq) {
009646d2 919 console.log("[handle_rpc_json] sequence mismatch: " + seq +
563b9c78
AD
920 " (want: " + get_seq() + ")");
921 return true;
922 }
923 }
924
925 var message = reply['message'];
926
927 if (message) {
928 if (message == "UPDATE_COUNTERS") {
929 console.log("need to refresh counters...");
930 setInitParam("last_article_id", -1);
931 _force_scheduled_update = true;
932 }
933 }
934
935 var counters = reply['counters'];
009646d2 936
563b9c78
AD
937 if (counters)
938 parse_counters(counters, scheduled_call);
939
940 var runtime_info = reply['runtime-info'];;
941
942 if (runtime_info)
943 parse_runtime_info(runtime_info);
944
945 hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
946
947 } else {
948 notify_error("Error communicating with server.");
949 }
950
951 } catch (e) {
beb119a2
AD
952 notify_error("Error communicating with server.");
953 console.log(e);
954 //exception_error("handle_rpc_json", e, transport);
563b9c78
AD
955 }
956
957 return true;
958}
959