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