]> git.wh0rd.org - tt-rss.git/blame - js/prefs.js
filter_to_sql: fix for all feeds
[tt-rss.git] / js / prefs.js
CommitLineData
a7565293
AD
1var init_params = new Array();
2
746dcf42 3var hotkey_prefix = false;
78935092 4var hotkey_prefix_pressed = false;
7a09510c 5
a998dbef
AD
6var seq = "";
7
66665fba
AD
8function notify_callback2(transport, sticky) {
9 notify_info(transport.responseText, sticky);
60715b53
AD
10}
11
b83c7545 12function updateFeedList(sort_key) {
16270276
AD
13
14 var user_search = $("feed_search");
15 var search = "";
16 if (user_search) { search = user_search.value; }
17
b4e75b2a 18 new Ajax.Request("backend.php", {
16270276 19 parameters: "?op=pref-feeds&search=" + param_escape(search),
fb5662de 20 onComplete: function(transport) {
cbe50c80
AD
21 dijit.byId('feedConfigTab').attr('content', transport.responseText);
22 selectTab("feedConfig", true);
23 notify("");
60715b53 24 } });
007bda35
AD
25}
26
373266eb
AD
27function updateInstanceList(sort_key) {
28 new Ajax.Request("backend.php", {
29 parameters: "?op=pref-instances&sort=" + param_escape(sort_key),
30 onComplete: function(transport) {
66665fba
AD
31 dijit.byId('instanceConfigTab').attr('content', transport.responseText);
32 selectTab("instanceConfig", true);
33 notify("");
373266eb
AD
34 } });
35}
36
79ec0f2f 37function updateUsersList(sort_key) {
fbf7d545 38 try {
acac8448 39 var user_search = $("user_search");
fbf7d545
AD
40 var search = "";
41 if (user_search) { search = user_search.value; }
fb5662de 42
b4e75b2a 43 var query = "?op=pref-users&sort="
fbf7d545
AD
44 + param_escape(sort_key) +
45 "&search=" + param_escape(search);
fb5662de 46
b4e75b2a
AD
47 new Ajax.Request("backend.php", {
48 parameters: query,
fb5662de 49 onComplete: function(transport) {
66665fba
AD
50 dijit.byId('userConfigTab').attr('content', transport.responseText);
51 selectTab("userConfig", true)
52 notify("");
fbf7d545 53 } });
e6cb77a0 54
fbf7d545
AD
55 } catch (e) {
56 exception_error("updateUsersList", e);
57 }
e6cb77a0
AD
58}
59
e6cb77a0
AD
60function addUser() {
61
fbf7d545 62 try {
e6cb77a0 63
eb70b777 64 var login = prompt(__("Please enter login:"), "");
fb5662de
AD
65
66 if (login == null) {
eb70b777
AD
67 return false;
68 }
fb5662de 69
eb70b777
AD
70 if (login == "") {
71 alert(__("Can't create user: no login specified."));
72 return false;
fbf7d545 73 }
fb5662de 74
eb70b777 75 notify_progress("Adding user...");
fb5662de 76
f30ef1fa 77 var query = "?op=pref-users&method=add&login=" +
eb70b777 78 param_escape(login);
fb5662de 79
b4e75b2a
AD
80 new Ajax.Request("backend.php", {
81 parameters: query,
fb5662de 82 onComplete: function(transport) {
66665fba
AD
83 notify_callback2(transport);
84 updateUsersList();
eb70b777 85 } });
e6cb77a0 86
fbf7d545
AD
87 } catch (e) {
88 exception_error("addUser", e);
e6cb77a0 89 }
e6cb77a0
AD
90}
91
a998dbef 92function editUser(id, event) {
e6cb77a0 93
163723c4 94 try {
a998dbef
AD
95 if (!event || !event.ctrlKey) {
96
163723c4 97 notify_progress("Loading, please wait...");
9e31e1b9 98
e69fb880 99 selectTableRows('prefUserList', 'none');
163723c4 100 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
e6cb77a0 101
f30ef1fa 102 var query = "?op=pref-users&method=edit&id=" +
163723c4
AD
103 param_escape(id);
104
b4e75b2a
AD
105 new Ajax.Request("backend.php", {
106 parameters: query,
163723c4
AD
107 onComplete: function(transport) {
108 infobox_callback2(transport);
fb5662de 109 document.forms['user_edit_form'].login.focus();
163723c4 110 } });
e6cb77a0 111
a998dbef
AD
112 } else if (event.ctrlKey) {
113 var cb = $('UMCHK-' + id);
114 cb.checked = !cb.checked;
115 toggleSelectRow(cb);
116 }
117
163723c4
AD
118 } catch (e) {
119 exception_error("editUser", e);
120 }
fb5662de 121
e6cb77a0
AD
122}
123
8a097fa3 124function editFilter(id) {
163723c4 125 try {
a0d53889 126
f30ef1fa 127 var query = "backend.php?op=pref-filters&method=edit&id=" + param_escape(id);
4cd30111
AD
128
129 if (dijit.byId("feedEditDlg"))
130 dijit.byId("feedEditDlg").destroyRecursive();
6068d33b 131
d90868d7
AD
132 if (dijit.byId("filterEditDlg"))
133 dijit.byId("filterEditDlg").destroyRecursive();
134
135 dialog = new dijit.Dialog({
136 id: "filterEditDlg",
137 title: __("Edit Filter"),
138 style: "width: 600px",
4e02f582
AD
139 test: function() {
140 var query = "backend.php?" + dojo.formToQuery("filter_edit_form") + "&savemode=test";
141
142 if (dijit.byId("filterTestDlg"))
143 dijit.byId("filterTestDlg").destroyRecursive();
144
145 var test_dlg = new dijit.Dialog({
146 id: "filterTestDlg",
147 title: "Test Filter",
148 style: "width: 600px",
149 href: query});
150
151 test_dlg.show();
152 },
ec630524
AD
153 selectRules: function(select) {
154 $$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
155 e.checked = select;
156 if (select)
157 e.parentNode.addClassName("Selected");
158 else
159 e.parentNode.removeClassName("Selected");
160 });
161 },
162 selectActions: function(select) {
163 $$("#filterDlg_Actions input[type=checkbox]").each(function(e) {
164 e.checked = select;
165
166 if (select)
167 e.parentNode.addClassName("Selected");
168 else
169 e.parentNode.removeClassName("Selected");
170
171 });
172 },
6aff7845
AD
173 editRule: function(e) {
174 var li = e.parentNode;
175 var rule = li.getElementsByTagName("INPUT")[1].value;
176 addFilterRule(li, rule);
177 },
178 editAction: function(e) {
179 var li = e.parentNode;
180 var action = li.getElementsByTagName("INPUT")[1].value;
181 addFilterAction(li, action);
182 },
90e4e726 183 removeFilter: function() {
6aff7845 184 var msg = __("Remove filter?");
fb5662de 185
90e4e726
AD
186 if (confirm(msg)) {
187 this.hide();
188
189 notify_progress("Removing filter...");
fb5662de 190
90e4e726
AD
191 var id = this.attr('value').id;
192
f30ef1fa 193 var query = "?op=pref-filters&method=remove&ids="+
90e4e726
AD
194 param_escape(id);
195
196 new Ajax.Request("backend.php", {
197 parameters: query,
198 onComplete: function(transport) {
199 updateFilterList();
200 } });
201 }
202 },
6aff7845
AD
203 addAction: function() { addFilterAction(); },
204 addRule: function() { addFilterRule(); },
205 deleteAction: function() {
206 $$("#filterDlg_Actions li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
207 },
208 deleteRule: function() {
209 $$("#filterDlg_Matches li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
5593784a 210 },
d90868d7
AD
211 execute: function() {
212 if (this.validate()) {
141fb6e3 213
6aff7845 214 notify_progress("Saving data...", true);
141fb6e3 215
6aff7845 216 var query = dojo.formToQuery("filter_edit_form");
141fb6e3 217
6aff7845
AD
218 console.log(query);
219
220 new Ajax.Request("backend.php", {
141fb6e3 221 parameters: query,
d90868d7 222 onComplete: function(transport) {
6aff7845
AD
223 dialog.hide();
224 updateFilterList();
225 }});
d90868d7
AD
226 }
227 },
228 href: query});
229
230 dialog.show();
a998dbef 231
a0d53889 232
163723c4
AD
233 } catch (e) {
234 exception_error("editFilter", e);
235 }
a0d53889
AD
236}
237
91ff844a 238function getSelectedLabels() {
fb8b2153
AD
239 var tree = dijit.byId("labelTree");
240 var items = tree.model.getCheckedItems();
241 var rv = [];
242
243 items.each(function(item) {
244 rv.push(tree.model.store.getValue(item, 'bare_id'));
245 });
246
247 return rv;
91ff844a 248}
48f0adb0 249
91ff844a 250function getSelectedUsers() {
e69fb880 251 return getSelectedTableRowIds("prefUserList");
a0d53889
AD
252}
253
83fe4d6d 254function getSelectedFeeds() {
1985a5e0
AD
255 var tree = dijit.byId("feedTree");
256 var items = tree.model.getCheckedItems();
257 var rv = [];
258
259 items.each(function(item) {
7c227bb3
AD
260 if (item.id[0].match("FEED:"))
261 rv.push(tree.model.store.getValue(item, 'bare_id'));
1985a5e0
AD
262 });
263
264 return rv;
91ff844a 265}
331900c6 266
91ff844a 267function getSelectedFilters() {
a740f4b5
AD
268 var tree = dijit.byId("filterTree");
269 var items = tree.model.getCheckedItems();
270 var rv = [];
271
272 items.each(function(item) {
273 rv.push(tree.model.store.getValue(item, 'bare_id'));
274 });
275
276 return rv;
277
91ff844a 278}
331900c6 279
da1f74c9 280/* function getSelectedFeedCats() {
e69fb880 281 return getSelectedTableRowIds("prefFeedCatList");
da1f74c9 282} */
c0ae0fdb 283
48f0adb0
AD
284function removeSelectedLabels() {
285
48f0adb0
AD
286 var sel_rows = getSelectedLabels();
287
288 if (sel_rows.length > 0) {
289
f56e3080 290 var ok = confirm(__("Remove selected labels?"));
48f0adb0 291
69668465 292 if (ok) {
42c32916 293 notify_progress("Removing selected labels...");
fb5662de 294
f30ef1fa 295 var query = "?op=pref-labels&method=remove&ids="+
a796bfc1
AD
296 param_escape(sel_rows.toString());
297
b4e75b2a
AD
298 new Ajax.Request("backend.php", {
299 parameters: query,
a796bfc1 300 onComplete: function(transport) {
cbe50c80 301 updateLabelList();
a796bfc1
AD
302 } });
303
69668465 304 }
48f0adb0 305 } else {
89cb787e 306 alert(__("No labels are selected."));
48f0adb0 307 }
90ac84df
AD
308
309 return false;
48f0adb0
AD
310}
311
e6cb77a0
AD
312function removeSelectedUsers() {
313
fbf7d545 314 try {
e6cb77a0 315
fbf7d545 316 var sel_rows = getSelectedUsers();
fb5662de 317
fbf7d545 318 if (sel_rows.length > 0) {
fb5662de 319
50e7dd7d 320 var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
fb5662de 321
fbf7d545
AD
322 if (ok) {
323 notify_progress("Removing selected users...");
fb5662de 324
f30ef1fa 325 var query = "?op=pref-users&method=remove&ids="+
fbf7d545 326 param_escape(sel_rows.toString());
fb5662de 327
b4e75b2a
AD
328 new Ajax.Request("backend.php", {
329 parameters: query,
fb5662de 330 onComplete: function(transport) {
66665fba 331 updateUsersList();
fbf7d545 332 } });
fb5662de 333
fbf7d545 334 }
fb5662de 335
fbf7d545
AD
336 } else {
337 alert(__("No users are selected."));
69668465 338 }
e6cb77a0 339
fbf7d545
AD
340 } catch (e) {
341 exception_error("removeSelectedUsers", e);
e6cb77a0 342 }
90ac84df
AD
343
344 return false;
e6cb77a0
AD
345}
346
48f0adb0
AD
347function removeSelectedFilters() {
348
23e51f40 349 try {
48f0adb0 350
23e51f40 351 var sel_rows = getSelectedFilters();
fb5662de 352
23e51f40 353 if (sel_rows.length > 0) {
fb5662de 354
23e51f40 355 var ok = confirm(__("Remove selected filters?"));
fb5662de 356
23e51f40
AD
357 if (ok) {
358 notify_progress("Removing selected filters...");
fb5662de 359
f30ef1fa 360 var query = "?op=pref-filters&method=remove&ids="+
23e51f40 361 param_escape(sel_rows.toString());
fb5662de 362
b4e75b2a
AD
363 new Ajax.Request("backend.php", {
364 parameters: query,
23e51f40 365 onComplete: function(transport) {
687d246b
AD
366 updateFilterList();
367 } });
23e51f40
AD
368 }
369 } else {
370 alert(__("No filters are selected."));
69668465 371 }
23e51f40
AD
372
373 } catch (e) {
374 exception_error("removeSelectedFilters", e);
48f0adb0 375 }
90ac84df
AD
376
377 return false;
48f0adb0
AD
378}
379
380
83fe4d6d
AD
381function removeSelectedFeeds() {
382
a796bfc1 383 try {
69668465 384
a796bfc1 385 var sel_rows = getSelectedFeeds();
fb5662de 386
a796bfc1 387 if (sel_rows.length > 0) {
fb5662de 388
a796bfc1 389 var ok = confirm(__("Unsubscribe from selected feeds?"));
fb5662de 390
a796bfc1 391 if (ok) {
fb5662de 392
b6a6e262 393 notify_progress("Unsubscribing from selected feeds...", true);
fb5662de 394
f30ef1fa 395 var query = "?op=pref-feeds&method=remove&ids="+
a796bfc1 396 param_escape(sel_rows.toString());
b6a6e262 397
84c7b824 398 console.log(query);
b6a6e262 399
b4e75b2a
AD
400 new Ajax.Request("backend.php", {
401 parameters: query,
a796bfc1 402 onComplete: function(transport) {
b6a6e262 403 updateFeedList();
a796bfc1
AD
404 } });
405 }
fb5662de 406
a796bfc1
AD
407 } else {
408 alert(__("No feeds are selected."));
69668465 409 }
71ad3959 410
a796bfc1
AD
411 } catch (e) {
412 exception_error("removeSelectedFeeds", e);
71ad3959 413 }
fb5662de 414
90ac84df 415 return false;
71ad3959 416}
007bda35 417
c4a36709
AD
418function clearSelectedFeeds() {
419
c4a36709
AD
420 var sel_rows = getSelectedFeeds();
421
422 if (sel_rows.length > 1) {
423 alert(__("Please select only one feed."));
424 return;
425 }
426
427 if (sel_rows.length > 0) {
428
429 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
430
431 if (ok) {
432 notify_progress("Clearing selected feed...");
433 clearFeedArticles(sel_rows[0]);
434 }
435
436 } else {
437
438 alert(__("No feeds are selected."));
439
440 }
fb5662de 441
c4a36709
AD
442 return false;
443}
444
e88a65f4
AD
445function purgeSelectedFeeds() {
446
e88a65f4
AD
447 var sel_rows = getSelectedFeeds();
448
449 if (sel_rows.length > 0) {
450
451 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
452
453 if (pr != undefined) {
454 notify_progress("Purging selected feed...");
455
f30ef1fa 456 var query = "?op=rpc&method=purge&ids="+
e88a65f4
AD
457 param_escape(sel_rows.toString()) + "&days=" + pr;
458
84c7b824 459 console.log(query);
e88a65f4 460
b4e75b2a
AD
461 new Ajax.Request("prefs.php", {
462 parameters: query,
e88a65f4
AD
463 onComplete: function(transport) {
464 notify('');
465 } });
466 }
467
468 } else {
469
470 alert(__("No feeds are selected."));
471
472 }
fb5662de 473
e88a65f4
AD
474 return false;
475}
476
e6cb77a0 477function userEditCancel() {
3c5783b7 478 closeInfoBox();
90ac84df 479 return false;
e6cb77a0 480}
48f0adb0 481
e6cb77a0
AD
482function userEditSave() {
483
fbf7d545 484 try {
e6cb77a0 485
fbf7d545 486 var login = document.forms["user_edit_form"].login.value;
fb5662de 487
fbf7d545
AD
488 if (login.length == 0) {
489 alert(__("Login field cannot be blank."));
490 return;
491 }
fb5662de 492
fbf7d545 493 notify_progress("Saving user...");
fb5662de 494
fbf7d545 495 closeInfoBox();
fb5662de 496
fbf7d545 497 var query = Form.serialize("user_edit_form");
fb5662de 498
fbf7d545
AD
499 new Ajax.Request("backend.php", {
500 parameters: query,
fb5662de 501 onComplete: function(transport) {
66665fba 502 updateUsersList();
fbf7d545 503 } });
fb5662de 504
fbf7d545
AD
505 } catch (e) {
506 exception_error("userEditSave", e);
507 }
90ac84df
AD
508
509 return false;
fbf7d545 510
e6cb77a0
AD
511}
512
513
e6cb77a0
AD
514function editSelectedUser() {
515 var rows = getSelectedUsers();
516
517 if (rows.length == 0) {
f3977cf5 518 alert(__("No users are selected."));
e6cb77a0
AD
519 return;
520 }
521
522 if (rows.length > 1) {
f3977cf5 523 alert(__("Please select only one user."));
e6cb77a0
AD
524 return;
525 }
526
dbd9e2f1
AD
527 notify("");
528
e6cb77a0
AD
529 editUser(rows[0]);
530}
531
532function resetSelectedUserPass() {
e6cb77a0 533
fbf7d545 534 try {
e6cb77a0 535
fbf7d545 536 var rows = getSelectedUsers();
fb5662de 537
fbf7d545
AD
538 if (rows.length == 0) {
539 alert(__("No users are selected."));
540 return;
541 }
fb5662de 542
fbf7d545
AD
543 if (rows.length > 1) {
544 alert(__("Please select only one user."));
545 return;
546 }
fb5662de 547
fbf7d545 548 var ok = confirm(__("Reset password of selected user?"));
fb5662de 549
fbf7d545
AD
550 if (ok) {
551 notify_progress("Resetting password for selected user...");
fb5662de 552
fbf7d545 553 var id = rows[0];
fb5662de 554
f30ef1fa 555 var query = "?op=pref-users&method=resetPass&id=" +
fbf7d545 556 param_escape(id);
fb5662de 557
b4e75b2a
AD
558 new Ajax.Request("backend.php", {
559 parameters: query,
fb5662de 560 onComplete: function(transport) {
66665fba 561 notify_info(transport.responseText);
fbf7d545 562 } });
fb5662de 563
fbf7d545
AD
564 }
565
566 } catch (e) {
567 exception_error("resetSelectedUserPass", e);
69668465 568 }
e6cb77a0
AD
569}
570
717f5e64 571function selectedUserDetails() {
e6cb77a0 572
350468d0 573 try {
717f5e64 574
350468d0 575 var rows = getSelectedUsers();
fb5662de 576
350468d0
AD
577 if (rows.length == 0) {
578 alert(__("No users are selected."));
579 return;
580 }
fb5662de 581
350468d0
AD
582 if (rows.length > 1) {
583 alert(__("Please select only one user."));
584 return;
585 }
fb5662de 586
350468d0 587 notify_progress("Loading, please wait...");
fb5662de 588
350468d0 589 var id = rows[0];
fb5662de 590
66665fba 591 var query = "?op=pref-users&method=userdetails&id=" + id;
717f5e64 592
b4e75b2a
AD
593 new Ajax.Request("backend.php", {
594 parameters: query,
350468d0
AD
595 onComplete: function(transport) {
596 infobox_callback2(transport);
597 } });
598 } catch (e) {
599 exception_error("selectedUserDetails", e);
717f5e64 600 }
c6c3a07f
AD
601}
602
a0d53889
AD
603
604function editSelectedFilter() {
605 var rows = getSelectedFilters();
606
607 if (rows.length == 0) {
f3977cf5 608 alert(__("No filters are selected."));
a0d53889
AD
609 return;
610 }
611
612 if (rows.length > 1) {
f3977cf5 613 alert(__("Please select only one filter."));
a0d53889
AD
614 return;
615 }
616
dbd9e2f1
AD
617 notify("");
618
a0d53889
AD
619 editFilter(rows[0]);
620
621}
622
6aff7845
AD
623function joinSelectedFilters() {
624 var rows = getSelectedFilters();
625
626 if (rows.length == 0) {
627 alert(__("No filters are selected."));
628 return;
629 }
630
631 var ok = confirm(__("Combine selected filters?"));
632
633 if (ok) {
634 notify_progress("Joining filters...");
635
636 var query = "?op=pref-filters&method=join&ids="+
637 param_escape(rows.toString());
638
639 console.log(query);
640
641 new Ajax.Request("backend.php", {
642 parameters: query,
643 onComplete: function(transport) {
644 updateFilterList();
645 } });
646 }
647}
a0d53889 648
508a81e1
AD
649function editSelectedFeed() {
650 var rows = getSelectedFeeds();
651
652 if (rows.length == 0) {
f3977cf5 653 alert(__("No feeds are selected."));
508a81e1
AD
654 return;
655 }
656
657 if (rows.length > 1) {
1e5548db 658 return editSelectedFeeds();
508a81e1
AD
659 }
660
dbd9e2f1
AD
661 notify("");
662
951906dc 663 editFeed(rows[0], {});
91ff844a
AD
664
665}
666
758e1c4a
AD
667function editSelectedFeeds() {
668
350468d0
AD
669 try {
670 var rows = getSelectedFeeds();
fb5662de 671
350468d0
AD
672 if (rows.length == 0) {
673 alert(__("No feeds are selected."));
674 return;
675 }
fb5662de 676
755c8f95 677 notify_progress("Loading, please wait...");
fb5662de 678
f30ef1fa 679 var query = "backend.php?op=pref-feeds&method=editfeeds&ids=" +
350468d0 680 param_escape(rows.toString());
758e1c4a 681
755c8f95
AD
682 console.log(query);
683
05acc0d6
AD
684 if (dijit.byId("feedEditDlg"))
685 dijit.byId("feedEditDlg").destroyRecursive();
686
755c8f95
AD
687 new Ajax.Request("backend.php", {
688 parameters: query,
689 onComplete: function(transport) {
05acc0d6 690
755c8f95
AD
691 notify("");
692
693 var dialog = new dijit.Dialog({
694 id: "feedEditDlg",
695 title: __("Edit Multiple Feeds"),
696 style: "width: 600px",
697 getChildByName: function (name) {
e331188f 698 var rv = null;
755c8f95
AD
699 this.getChildren().each(
700 function(child) {
701 if (child.name == name) {
702 rv = child;
703 return;
704 }
705 });
706 return rv;
707 },
708 toggleField: function (checkbox, elem, label) {
709 this.getChildByName(elem).attr('disabled', !checkbox.checked);
710
711 if ($(label))
712 if (checkbox.checked)
713 $(label).removeClassName('insensitive');
714 else
715 $(label).addClassName('insensitive');
716
717 },
718 execute: function() {
719 if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
720 var query = dojo.objectToQuery(this.attr('value'));
721
722 /* Form.serialize ignores unchecked checkboxes */
723
724 if (!query.match("&rtl_content=") &&
725 this.getChildByName('rtl_content').attr('disabled') == false) {
726 query = query + "&rtl_content=false";
727 }
05acc0d6 728
755c8f95
AD
729 if (!query.match("&private=") &&
730 this.getChildByName('private').attr('disabled') == false) {
731 query = query + "&private=false";
732 }
fb5662de 733
755c8f95
AD
734 try {
735 if (!query.match("&cache_images=") &&
736 this.getChildByName('cache_images').attr('disabled') == false) {
737 query = query + "&cache_images=false";
738 }
739 } catch (e) { }
fb5662de 740
755c8f95
AD
741 if (!query.match("&include_in_digest=") &&
742 this.getChildByName('include_in_digest').attr('disabled') == false) {
743 query = query + "&include_in_digest=false";
744 }
fb5662de 745
755c8f95
AD
746 if (!query.match("&always_display_enclosures=") &&
747 this.getChildByName('always_display_enclosures').attr('disabled') == false) {
748 query = query + "&always_display_enclosures=false";
749 }
05acc0d6 750
755c8f95
AD
751 if (!query.match("&mark_unread_on_update=") &&
752 this.getChildByName('mark_unread_on_update').attr('disabled') == false) {
753 query = query + "&mark_unread_on_update=false";
754 }
dd04ea81 755
755c8f95
AD
756 if (!query.match("&update_on_checksum_change=") &&
757 this.getChildByName('update_on_checksum_change').attr('disabled') == false) {
758 query = query + "&update_on_checksum_change=false";
759 }
dd04ea81 760
755c8f95 761 console.log(query);
dd04ea81 762
755c8f95 763 notify_progress("Saving data...", true);
fb5662de 764
755c8f95
AD
765 new Ajax.Request("backend.php", {
766 parameters: query,
767 onComplete: function(transport) {
768 dialog.hide();
769 updateFeedList();
e331188f 770 }});
755c8f95
AD
771 }
772 },
773 content: transport.responseText});
05acc0d6 774
755c8f95 775 dialog.show();
05acc0d6 776
755c8f95 777 } });
758e1c4a 778
350468d0
AD
779 } catch (e) {
780 exception_error("editSelectedFeeds", e);
758e1c4a 781 }
758e1c4a
AD
782}
783
eec498c3 784function piggie(enable) {
13ad9102 785 if (enable) {
84c7b824 786 console.log("I LOVEDED IT!");
acac8448 787 var piggie = $("piggie");
33377ef3 788
537625c6
AD
789 Element.show(piggie);
790 Position.Center(piggie);
791 Effect.Puff(piggie);
792
508a81e1 793 }
508a81e1
AD
794}
795
e1218480
AD
796function opmlImportComplete(iframe) {
797 try {
798 if (!iframe.contentDocument.body.innerHTML) return false;
799
55f34b81
AD
800 Element.show(iframe);
801
e1218480
AD
802 notify('');
803
804 if (dijit.byId('opmlImportDlg'))
805 dijit.byId('opmlImportDlg').destroyRecursive();
806
807 var content = iframe.contentDocument.body.innerHTML;
808
809 dialog = new dijit.Dialog({
810 id: "opmlImportDlg",
811 title: __("OPML Import"),
812 style: "width: 600px",
813 onCancel: function() {
fb5662de 814 updateFeedList();
34aa9e20
AD
815 updateFilterList();
816 updateLabelList();
817 },
818 execute: function() {
819 updateFeedList();
820 updateFilterList();
821 updateLabelList();
822 this.hide();
e1218480
AD
823 },
824 content: content});
825
826 dialog.show();
827
828 } catch (e) {
829 exception_error("opmlImportComplete", e);
830 }
831}
832
b6a6e262 833function opmlImport() {
fb5662de 834
acac8448 835 var opml_file = $("opml_file");
9f311df6
AD
836
837 if (opml_file.value.length == 0) {
d2d75353 838 alert(__("Please choose an OPML file first."));
9f311df6
AD
839 return false;
840 } else {
4d7cd9ed 841 notify_progress("Importing, please wait...", true);
55f34b81
AD
842
843 Element.show("upload_iframe");
844
9f311df6
AD
845 return true;
846 }
847}
848
55f34b81
AD
849function importData() {
850
851 var file = $("export_file");
852
853 if (file.value.length == 0) {
854 alert(__("Please choose the file first."));
855 return false;
856 } else {
857 notify_progress("Importing, please wait...", true);
858
859 Element.show("data_upload_iframe");
860
861 return true;
862 }
863}
864
865
05acc0d6 866function updateFilterList() {
310fa2dd
AD
867 var user_search = $("filter_search");
868 var search = "";
869 if (user_search) { search = user_search.value; }
870
05acc0d6 871 new Ajax.Request("backend.php", {
310fa2dd 872 parameters: "?op=pref-filters&search=" + param_escape(search),
05acc0d6 873 onComplete: function(transport) {
66665fba
AD
874 dijit.byId('filterConfigTab').attr('content', transport.responseText);
875 notify("");
05acc0d6 876 } });
a0d53889
AD
877}
878
05acc0d6
AD
879function updateLabelList() {
880 new Ajax.Request("backend.php", {
881 parameters: "?op=pref-labels",
882 onComplete: function(transport) {
cbe50c80
AD
883 dijit.byId('labelConfigTab').attr('content', transport.responseText);
884 notify("");
05acc0d6 885 } });
48f0adb0
AD
886}
887
4255b24c 888function updatePrefsList() {
b4e75b2a 889 new Ajax.Request("backend.php", {
05acc0d6 890 parameters: "?op=pref-prefs",
fb5662de 891 onComplete: function(transport) {
cbe50c80
AD
892 dijit.byId('genConfigTab').attr('content', transport.responseText);
893 notify("");
e9802ead 894 } });
4255b24c
AD
895}
896
f30ef1fa 897function selectTab(id, noupdate, method) {
b2caf812 898 try {
b2caf812 899 if (!noupdate) {
9e31e1b9 900 notify_progress("Loading, please wait...");
d15f8675 901
b2caf812
AD
902 if (id == "feedConfig") {
903 updateFeedList();
904 } else if (id == "filterConfig") {
905 updateFilterList();
906 } else if (id == "labelConfig") {
907 updateLabelList();
908 } else if (id == "genConfig") {
909 updatePrefsList();
910 } else if (id == "userConfig") {
911 updateUsersList();
b2caf812 912 }
d62796de
AD
913
914 var tab = dijit.byId(id + "Tab");
915 dijit.byId("pref-tabs").selectChild(tab);
916
f5a50b25 917 }
fb5662de 918
b2caf812
AD
919 } catch (e) {
920 exception_error("selectTab", e);
a7565293 921 }
a7565293
AD
922}
923
a7565293 924function init_second_stage() {
b2caf812 925 try {
4da47970 926
d437c8cf 927 document.onkeydown = pref_hotkey_handler;
fcc36744 928 loading_set_progress(50);
d62796de
AD
929 notify("");
930
556e5b46 931 dojo.addOnLoad(function() {
a8328019 932 var tab = getURLParam('tab');
556e5b46 933
a8328019
AD
934 if (tab) {
935 tab = dijit.byId(tab + "Tab");
936 if (tab) dijit.byId("pref-tabs").selectChild(tab);
937 }
b01b1b38 938
f30ef1fa 939 var method = getURLParam('method');
b01b1b38 940
f30ef1fa
AD
941 if (method == 'editFeed') {
942 var param = getURLParam('methodparam');
b01b1b38
AD
943
944 window.setTimeout('editFeed(' + param + ')', 100);
945 }
05acc0d6 946 });
556e5b46 947
78935092
AD
948 setTimeout("hotkey_prefix_timeout()", 5*1000);
949
b2caf812
AD
950 } catch (e) {
951 exception_error("init_second_stage", e);
952 }
a0d53889
AD
953}
954
007bda35 955function init() {
e2ec66a8 956
7719618b 957 try {
1985a5e0 958 dojo.registerModulePath("lib", "..");
107d0cf3 959 dojo.registerModulePath("fox", "../../js/");
1985a5e0 960
1354d172
AD
961 dojo.require("dijit.ColorPalette");
962 dojo.require("dijit.Dialog");
963 dojo.require("dijit.form.Button");
964 dojo.require("dijit.form.CheckBox");
965 dojo.require("dijit.form.DropDownButton");
966 dojo.require("dijit.form.FilteringSelect");
967 dojo.require("dijit.form.Form");
968 dojo.require("dijit.form.RadioButton");
969 dojo.require("dijit.form.Select");
970 dojo.require("dijit.form.SimpleTextarea");
971 dojo.require("dijit.form.TextBox");
972 dojo.require("dijit.form.ValidationTextBox");
973 dojo.require("dijit.InlineEditBox");
974 dojo.require("dijit.layout.AccordionContainer");
975 dojo.require("dijit.layout.BorderContainer");
976 dojo.require("dijit.layout.ContentPane");
977 dojo.require("dijit.layout.TabContainer");
978 dojo.require("dijit.Menu");
979 dojo.require("dijit.ProgressBar");
980 dojo.require("dijit.ProgressBar");
981 dojo.require("dijit.Toolbar");
982 dojo.require("dijit.Tree");
983 dojo.require("dijit.tree.dndSource");
984 dojo.require("dojo.data.ItemFileWriteStore");
985
1985a5e0 986 dojo.require("lib.CheckBoxTree");
2148e0d5 987 dojo.require("fox.PrefFeedTree");
a740f4b5 988 dojo.require("fox.PrefFilterTree");
fb8b2153 989 dojo.require("fox.PrefLabelTree");
fcf70c51 990
a089699c
AD
991 dojo.parser.parse();
992
df1c35f4
AD
993 dojo.addOnLoad(function() {
994 loading_set_progress(50);
fbf7d545 995
df1c35f4 996 new Ajax.Request("backend.php", {
f30ef1fa 997 parameters: {op: "rpc", method: "sanityCheck"},
fb5662de 998 onComplete: function(transport) {
df1c35f4
AD
999 backend_sanity_check_callback(transport);
1000 } });
1001 });
a7565293 1002
7719618b
AD
1003 } catch (e) {
1004 exception_error("init", e);
e2ec66a8 1005 }
007bda35 1006}
b1895692 1007
69668465 1008function validatePrefsReset() {
b652c1b7
AD
1009 try {
1010 var ok = confirm(__("Reset to defaults?"));
1011
1012 if (ok) {
1013
1395083e 1014 query = "?op=pref-prefs&method=resetconfig";
84c7b824 1015 console.log(query);
b652c1b7 1016
e9802ead
AD
1017 new Ajax.Request("backend.php", {
1018 parameters: query,
fb5662de 1019 onComplete: function(transport) {
1a697fa3
AD
1020 var msg = transport.responseText;
1021 if (msg.match("PREFS_THEME_CHANGED")) {
1022 window.location.reload();
1023 } else {
1024 notify_info(msg);
1025 selectTab();
1026 }
e9802ead
AD
1027 } });
1028
b652c1b7
AD
1029 }
1030
1031 } catch (e) {
d9084cf2 1032 exception_error("validatePrefsReset", e);
b652c1b7
AD
1033 }
1034
1035 return false;
1036
69668465 1037}
f9cb39ac 1038
d437c8cf
AD
1039
1040function pref_hotkey_handler(e) {
1041 try {
e33b0b80 1042 if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
18606807 1043
e331188f 1044 var keycode = false;
746dcf42
AD
1045 var shift_key = false;
1046
78935092
AD
1047 var cmdline = $('cmdline');
1048
746dcf42
AD
1049 try {
1050 shift_key = e.shiftKey;
1051 } catch (e) {
1052
1053 }
1054
d437c8cf
AD
1055 if (window.event) {
1056 keycode = window.event.keyCode;
1057 } else if (e) {
1058 keycode = e.which;
1059 }
746dcf42 1060
eec498c3
AD
1061 var keychar = String.fromCharCode(keycode);
1062
746dcf42
AD
1063 if (keycode == 27) { // escape
1064 if (Element.visible("hotkey_help_overlay")) {
1065 Element.hide("hotkey_help_overlay");
1066 }
1067 hotkey_prefix = false;
1068 closeInfoBox();
fb5662de 1069 }
746dcf42 1070
746dcf42 1071 if (keycode == 16) return; // ignore lone shift
49c6c279 1072 if (keycode == 17) return; // ignore lone ctrl
746dcf42 1073
6068d33b
AD
1074 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1075 hotkey_prefix = keycode;
78935092
AD
1076
1077 var date = new Date();
1078 var ts = Math.round(date.getTime() / 1000);
1079
1080 hotkey_prefix_pressed = ts;
1081
1082 cmdline.innerHTML = keychar;
1083 Element.show(cmdline);
1084
84c7b824 1085 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar);
6068d33b
AD
1086 return;
1087 }
1088
746dcf42
AD
1089 if (Element.visible("hotkey_help_overlay")) {
1090 Element.hide("hotkey_help_overlay");
1091 }
1092
d437c8cf
AD
1093 if (keycode == 13 || keycode == 27) {
1094 seq = "";
1095 } else {
1096 seq = seq + "" + keycode;
1097 }
1098
746dcf42 1099 /* Global hotkeys */
d437c8cf 1100
78935092
AD
1101 Element.hide(cmdline);
1102
746dcf42
AD
1103 if (!hotkey_prefix) {
1104
eec498c3 1105 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
66be620a 1106 showHelp();
eec498c3 1107 return false;
746dcf42
AD
1108 }
1109
eec498c3 1110 if (keycode == 191 || keychar == '/') { // /
fb5662de 1111 var search_boxes = new Array("label_search",
e8be0f5b 1112 "feed_search", "filter_search", "user_search", "feed_browser_search");
477402d8
AD
1113
1114 for (var i = 0; i < search_boxes.length; i++) {
acac8448 1115 var elem = $(search_boxes[i]);
477402d8 1116 if (elem) {
50eefedb 1117 $(search_boxes[i]).focus();
eec498c3 1118 return false;
477402d8
AD
1119 }
1120 }
477402d8 1121 }
6068d33b
AD
1122 }
1123
1124 /* Prefix c */
1125
1126 if (hotkey_prefix == 67) { // c
1127 hotkey_prefix = false;
1128
1129 if (keycode == 70) { // f
3393238d 1130 quickAddFilter();
eec498c3 1131 return false;
6068d33b
AD
1132 }
1133
1134 if (keycode == 83) { // s
3393238d 1135 quickAddFeed();
eec498c3 1136 return false;
6068d33b
AD
1137 }
1138
6068d33b
AD
1139 if (keycode == 85) { // u
1140 // no-op
1141 }
1142
57f734c8 1143 if (keycode == 67) { // c
eec498c3
AD
1144 editFeedCats();
1145 return false;
57f734c8
AD
1146 }
1147
a80b05ea 1148 if (keycode == 84 && shift_key) { // T
11b9d0be 1149 feedBrowser();
eec498c3 1150 return false;
a80b05ea
AD
1151 }
1152
6068d33b
AD
1153 }
1154
1155 /* Prefix g */
1156
1157 if (hotkey_prefix == 71) { // g
1158
1159 hotkey_prefix = false;
1160
acac8448 1161 if (keycode == 49 && $("genConfigTab")) { // 1
746dcf42 1162 selectTab("genConfig");
eec498c3 1163 return false;
746dcf42
AD
1164 }
1165
acac8448 1166 if (keycode == 50 && $("feedConfigTab")) { // 2
eec498c3
AD
1167 selectTab("feedConfig");
1168 return false;
746dcf42
AD
1169 }
1170
acac8448 1171 if (keycode == 51 && $("filterConfigTab")) { // 4
eec498c3
AD
1172 selectTab("filterConfig");
1173 return false;
746dcf42
AD
1174 }
1175
acac8448 1176 if (keycode == 52 && $("labelConfigTab")) { // 5
eec498c3
AD
1177 selectTab("labelConfig");
1178 return false;
746dcf42
AD
1179 }
1180
acac8448 1181 if (keycode == 53 && $("userConfigTab")) { // 6
eec498c3
AD
1182 selectTab("userConfig");
1183 return false;
746dcf42
AD
1184 }
1185
8d727bfc
AD
1186 if (keycode == 88) { // x
1187 return gotoMain();
1188 }
1189
746dcf42
AD
1190 }
1191
acac8448 1192 if ($("piggie")) {
a5ff2e77 1193 if (seq.match("8073717369")) {
746dcf42 1194 seq = "";
eec498c3 1195 piggie(true);
746dcf42 1196 } else {
eec498c3 1197 piggie(false);
746dcf42
AD
1198 }
1199 }
1200
1201 if (hotkey_prefix) {
84c7b824 1202 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1203 } else {
84c7b824 1204 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
d437c8cf 1205 }
d437c8cf
AD
1206
1207 } catch (e) {
1208 exception_error("pref_hotkey_handler", e);
1209 }
1210}
1211
5ef071e0 1212function removeCategory(id, item) {
a349077c 1213 try {
350468d0 1214
5ef071e0 1215 var ok = confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item.name));
da1f74c9 1216
5ef071e0 1217 if (ok) {
28537341 1218 var query = "?op=pref-feeds&method=removeCat&ids="+
5ef071e0 1219 param_escape(id);
fb5662de 1220
5ef071e0 1221 notify_progress("Removing category...");
fb5662de 1222
5ef071e0
AD
1223 new Ajax.Request("backend.php", {
1224 parameters: query,
1225 onComplete: function(transport) {
1226 notify('');
1227 updateFeedList();
1228 } });
1229 }
fb5662de 1230
5ef071e0
AD
1231 } catch (e) {
1232 exception_error("removeCategory", e);
1233 }
1234}
fb5662de 1235
5ef071e0
AD
1236function createCategory() {
1237 try {
1238 var title = prompt(__("Category title:"));
fb5662de 1239
5ef071e0 1240 if (title) {
da1f74c9 1241
5ef071e0 1242 notify_progress("Creating category...");
da1f74c9 1243
28537341 1244 var query = "?op=pref-feeds&method=addCat&cat=" +
5ef071e0 1245 param_escape(title);
da1f74c9 1246
5ef071e0
AD
1247 new Ajax.Request("backend.php", {
1248 parameters: query,
1249 onComplete: function(transport) {
1250 notify('');
1251 updateFeedList();
1252 } });
1253 }
5ba53dde 1254
a349077c 1255 } catch (e) {
5ef071e0 1256 exception_error("createCategory", e);
a349077c 1257 }
9c483746 1258}
a3656a41 1259
8ffd2011
AD
1260function showInactiveFeeds() {
1261 try {
3f363052 1262 var query = "backend.php?op=dlg&method=inactiveFeeds";
8ffd2011
AD
1263
1264 if (dijit.byId("inactiveFeedsDlg"))
1265 dijit.byId("inactiveFeedsDlg").destroyRecursive();
1266
1267 dialog = new dijit.Dialog({
1268 id: "inactiveFeedsDlg",
1269 title: __("Feeds without recent updates"),
1270 style: "width: 600px",
1271 getSelectedFeeds: function() {
1272 return getSelectedTableRowIds("prefInactiveFeedList");
1273 },
1274 removeSelected: function() {
1275 var sel_rows = this.getSelectedFeeds();
1276
1277 console.log(sel_rows);
1278
1279 if (sel_rows.length > 0) {
1280 var ok = confirm(__("Remove selected feeds?"));
1281
1282 if (ok) {
1283 notify_progress("Removing selected feeds...", true);
1284
f30ef1fa 1285 var query = "?op=pref-feeds&method=remove&ids="+
8ffd2011
AD
1286 param_escape(sel_rows.toString());
1287
1288 new Ajax.Request("backend.php", {
1289 parameters: query,
1290 onComplete: function(transport) {
1291 notify('');
1292 dialog.hide();
1293 updateFeedList();
1294 } });
1295 }
1296
1297 } else {
1298 alert(__("No feeds are selected."));
1299 }
1300 },
1301 execute: function() {
1302 if (this.validate()) {
1303 }
1304 },
1305 href: query});
1306
1307 dialog.show();
1308
1309 } catch (e) {
1310 exception_error("showInactiveFeeds", e);
1311 }
1312
1313}
1314
ef7b7bbd
MK
1315function opmlRegenKey() {
1316
1317 try {
1318 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
fb5662de 1319
ef7b7bbd 1320 if (ok) {
fb5662de 1321
ef7b7bbd 1322 notify_progress("Trying to change address...", true);
fb5662de 1323
f30ef1fa 1324 var query = "?op=rpc&method=regenOPMLKey";
fb5662de 1325
ef7b7bbd
MK
1326 new Ajax.Request("backend.php", {
1327 parameters: query,
1328 onComplete: function(transport) {
91d16ff1
AD
1329 var reply = JSON.parse(transport.responseText);
1330
1331 var new_link = reply.link;
fb5662de 1332
ef7b7bbd 1333 var e = $('pub_opml_url');
fb5662de 1334
ef7b7bbd 1335 if (new_link) {
91d16ff1
AD
1336 e.href = new_link;
1337 e.innerHTML = new_link;
fb5662de 1338
ef7b7bbd
MK
1339 new Effect.Highlight(e);
1340
1341 notify('');
fb5662de 1342
ef7b7bbd
MK
1343 } else {
1344 notify_error("Could not change feed URL.");
1345 }
1346 } });
1347 }
1348 } catch (e) {
1349 exception_error("opmlRegenKey", e);
1350 }
1351 return false;
1352}
c4a36709
AD
1353
1354function feedActionChange() {
1355 try {
acac8448 1356 var chooser = $("feedActionChooser");
c4a36709
AD
1357 var opid = chooser[chooser.selectedIndex].value;
1358
1359 chooser.selectedIndex = 0;
1360 feedActionGo(opid);
1361 } catch (e) {
1362 exception_error("feedActionChange", e);
1363 }
1364}
1365
fb5662de 1366function feedActionGo(op) {
c4a36709
AD
1367 try {
1368 if (op == "facEdit") {
cd935c42
AD
1369
1370 var rows = getSelectedFeeds();
1371
1372 if (rows.length > 1) {
1373 editSelectedFeeds();
1374 } else {
1375 editSelectedFeed();
1376 }
c4a36709
AD
1377 }
1378
1379 if (op == "facClear") {
1380 clearSelectedFeeds();
1381 }
1382
1383 if (op == "facPurge") {
1384 purgeSelectedFeeds();
1385 }
1386
e88a65f4
AD
1387 if (op == "facEditCats") {
1388 editFeedCats();
1389 }
1390
fee840fb
AD
1391 if (op == "facRescore") {
1392 rescoreSelectedFeeds();
1393 }
1394
c4a36709
AD
1395 if (op == "facUnsubscribe") {
1396 removeSelectedFeeds();
1397 }
1398
1399 } catch (e) {
1400 exception_error("feedActionGo", e);
1401
1402 }
1403}
1404
1405function clearFeedArticles(feed_id) {
1406
1407 notify_progress("Clearing feed...");
1408
f30ef1fa 1409 var query = "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id;
c4a36709 1410
b4e75b2a
AD
1411 new Ajax.Request("backend.php", {
1412 parameters: query,
c4a36709
AD
1413 onComplete: function(transport) {
1414 notify('');
1415 } });
1416
1417 return false;
1418}
1419
fee840fb
AD
1420function rescoreSelectedFeeds() {
1421
fee840fb
AD
1422 var sel_rows = getSelectedFeeds();
1423
1424 if (sel_rows.length > 0) {
1425
ef1b0366
AD
1426 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1427 var ok = confirm(__("Rescore articles in selected feeds?"));
fee840fb
AD
1428
1429 if (ok) {
3df4869b 1430 notify_progress("Rescoring selected feeds...", true);
fb5662de 1431
f30ef1fa 1432 var query = "?op=pref-feeds&method=rescore&quiet=1&ids="+
60715b53
AD
1433 param_escape(sel_rows.toString());
1434
b4e75b2a
AD
1435 new Ajax.Request("backend.php", {
1436 parameters: query,
60715b53
AD
1437 onComplete: function(transport) {
1438 notify_callback2(transport);
1439 } });
1440
fee840fb
AD
1441 }
1442 } else {
1443 alert(__("No feeds are selected."));
1444 }
1445
1446 return false;
1447}
c4a36709 1448
95a948a5 1449function rescore_all_feeds() {
60715b53 1450 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
95a948a5 1451
60715b53
AD
1452 if (ok) {
1453 notify_progress("Rescoring feeds...", true);
95a948a5 1454
f30ef1fa 1455 var query = "?op=pref-feeds&method=rescoreAll&quiet=1";
60715b53 1456
b4e75b2a
AD
1457 new Ajax.Request("backend.php", {
1458 parameters: query,
60715b53
AD
1459 onComplete: function(transport) {
1460 notify_callback2(transport);
1461 } });
1462 }
a80b05ea 1463}
a44db887 1464
b8776a07
AD
1465function labelColorReset() {
1466 try {
1467 var labels = getSelectedLabels();
1468
f695cdb2
AD
1469 if (labels.length > 0) {
1470 var ok = confirm(__("Reset selected labels to default colors?"));
b8776a07 1471
f695cdb2 1472 if (ok) {
cbe50c80 1473 var query = "?op=pref-labels&method=colorreset&ids="+
f695cdb2 1474 param_escape(labels.toString());
b8776a07 1475
f695cdb2
AD
1476 new Ajax.Request("backend.php", {
1477 parameters: query,
1478 onComplete: function(transport) {
cbe50c80 1479 updateLabelList();
b8776a07 1480 } });
f695cdb2
AD
1481 }
1482
1483 } else {
1484 alert(__("No labels are selected."));
b8776a07
AD
1485 }
1486
1487 } catch (e) {
1488 exception_error("labelColorReset", e);
1489 }
1490}
1491
b6ba48c1 1492
a5819bb3
AD
1493function inPreferences() {
1494 return true;
1495}
d9084cf2
AD
1496
1497function editProfiles() {
22988692
AD
1498 try {
1499
1500 if (dijit.byId("profileEditDlg"))
1501 dijit.byId("profileEditDlg").destroyRecursive();
1502
3f363052 1503 var query = "backend.php?op=dlg&method=editPrefProfiles";
22988692
AD
1504
1505 dialog = new dijit.Dialog({
1506 id: "profileEditDlg",
1507 title: __("Settings Profiles"),
1508 style: "width: 600px",
1509 getSelectedProfiles: function() {
1510 return getSelectedTableRowIds("prefFeedProfileList");
1511 },
1512 removeSelected: function() {
1513 var sel_rows = this.getSelectedProfiles();
fb5662de
AD
1514
1515 if (sel_rows.length > 0) {
22988692 1516 var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
fb5662de 1517
22988692
AD
1518 if (ok) {
1519 notify_progress("Removing selected profiles...", true);
fb5662de 1520
f30ef1fa 1521 var query = "?op=rpc&method=remprofiles&ids="+
22988692 1522 param_escape(sel_rows.toString());
fb5662de 1523
22988692
AD
1524 new Ajax.Request("backend.php", {
1525 parameters: query,
1526 onComplete: function(transport) {
1527 notify('');
1528 editProfiles();
1529 } });
fb5662de 1530
22988692 1531 }
fb5662de
AD
1532
1533 } else {
1534 alert(__("No profiles are selected."));
22988692
AD
1535 }
1536 },
1537 activateProfile: function() {
1538 var sel_rows = this.getSelectedProfiles();
fb5662de 1539
22988692 1540 if (sel_rows.length == 1) {
fb5662de 1541
22988692 1542 var ok = confirm(__("Activate selected profile?"));
fb5662de 1543
22988692
AD
1544 if (ok) {
1545 notify_progress("Loading, please wait...");
fb5662de 1546
f30ef1fa 1547 var query = "?op=rpc&method=setprofile&id="+
22988692 1548 param_escape(sel_rows.toString());
fb5662de 1549
22988692
AD
1550 new Ajax.Request("backend.php", {
1551 parameters: query,
1552 onComplete: function(transport) {
1553 window.location.reload();
1554 } });
1555 }
fb5662de 1556
22988692
AD
1557 } else {
1558 alert(__("Please choose a profile to activate."));
fb5662de
AD
1559 }
1560 },
22988692
AD
1561 addProfile: function() {
1562 if (this.validate()) {
1563 notify_progress("Creating profile...", true);
1564
f30ef1fa 1565 var query = "?op=rpc&method=addprofile&title=" +
22988692
AD
1566 param_escape(dialog.attr('value').newprofile);
1567
1568 new Ajax.Request("backend.php", {
1569 parameters: query,
1570 onComplete: function(transport) {
1571 notify('');
1572 editProfiles();
1573 } });
1574
1575 }
1576 },
1577 execute: function() {
1578 if (this.validate()) {
1579 }
1580 },
1581 href: query});
1582
1583 dialog.show();
1584 } catch (e) {
1585 exception_error("editProfiles", e);
1586 }
d9084cf2
AD
1587}
1588
1589function activatePrefProfile() {
1590
1591 var sel_rows = getSelectedFeedCats();
1592
1593 if (sel_rows.length == 1) {
1594
1595 var ok = confirm(__("Activate selected profile?"));
1596
1597 if (ok) {
1598 notify_progress("Loading, please wait...");
fb5662de 1599
f30ef1fa 1600 var query = "?op=rpc&method=setprofile&id="+
d9084cf2
AD
1601 param_escape(sel_rows.toString());
1602
1603 new Ajax.Request("backend.php", {
1604 parameters: query,
1605 onComplete: function(transport) {
1606 window.location.reload();
1607 } });
1608 }
1609
1610 } else {
1611 alert(__("Please choose a profile to activate."));
1612 }
1613
1614 return false;
1615}
1616
8d86f15f
AD
1617function clearFeedAccessKeys() {
1618
1619 var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
1620
1621 if (ok) {
1622 notify_progress("Clearing URLs...");
1623
f30ef1fa 1624 var query = "?op=rpc&method=clearKeys";
8d86f15f
AD
1625
1626 new Ajax.Request("backend.php", {
1627 parameters: query,
fb5662de 1628 onComplete: function(transport) {
8d86f15f
AD
1629 notify_info("Generated URLs cleared.");
1630 } });
1631 }
fb5662de 1632
8d86f15f
AD
1633 return false;
1634}
1635
83cd33fc
AD
1636function clearArticleAccessKeys() {
1637
1638 var ok = confirm(__("This will invalidate all previously shared article URLs. Continue?"));
1639
1640 if (ok) {
1641 notify_progress("Clearing URLs...");
1642
f30ef1fa 1643 var query = "?op=rpc&method=clearArticleKeys";
83cd33fc
AD
1644
1645 new Ajax.Request("backend.php", {
1646 parameters: query,
1647 onComplete: function(transport) {
1648 notify_info("Shared URLs cleared.");
1649 } });
1650 }
1651
1652 return false;
1653}
7b8a143f
AD
1654function resetFeedOrder() {
1655 try {
1656 notify_progress("Loading, please wait...");
1657
1658 new Ajax.Request("backend.php", {
f30ef1fa 1659 parameters: "?op=pref-feeds&method=feedsortreset",
7b8a143f 1660 onComplete: function(transport) {
fb5662de 1661 updateFeedList();
7b8a143f
AD
1662 } });
1663
1664
1665 } catch (e) {
1666 exception_error("resetFeedOrder");
1667 }
1668}
1669
1670function resetCatOrder() {
1671 try {
1672 notify_progress("Loading, please wait...");
1673
1674 new Ajax.Request("backend.php", {
f30ef1fa 1675 parameters: "?op=pref-feeds&method=catsortreset",
7b8a143f 1676 onComplete: function(transport) {
fb5662de 1677 updateFeedList();
7b8a143f
AD
1678 } });
1679
1680
1681 } catch (e) {
1682 exception_error("resetCatOrder");
1683 }
1684}
1685
5b7bd238
AD
1686function toggleHiddenFeedCats() {
1687 try {
1688 notify_progress("Loading, please wait...");
1689
1690 new Ajax.Request("backend.php", {
1691 parameters: "?op=pref-feeds&method=togglehiddenfeedcats",
1692 onComplete: function(transport) {
1693 updateFeedList();
1694 } });
1695
1696 } catch (e) {
1697 exception_error("toggleHiddenFeedCats");
1698 }
1699}
1700
7b8a143f
AD
1701function editCat(id, item, event) {
1702 try {
1703 var new_name = prompt(__('Rename category to:'), item.name);
1704
1705 if (new_name && new_name != item.name) {
1706
1707 notify_progress("Loading, please wait...");
1708
1709 new Ajax.Request("backend.php", {
1710 parameters: {
fb5662de 1711 op: 'pref-feeds',
f30ef1fa 1712 method: 'renamecat',
7b8a143f
AD
1713 id: id,
1714 title: new_name,
1715 },
1716 onComplete: function(transport) {
fb5662de 1717 updateFeedList();
7b8a143f
AD
1718 } });
1719 }
1720
1721 } catch (e) {
1722 exception_error("editCat", e);
1723 }
1724}
fb8b2153
AD
1725
1726function editLabel(id, event) {
1727 try {
f30ef1fa 1728 var query = "backend.php?op=pref-labels&method=edit&id=" +
fb8b2153
AD
1729 param_escape(id);
1730
48b05a29
AD
1731 if (dijit.byId("labelEditDlg"))
1732 dijit.byId("labelEditDlg").destroyRecursive();
1733
1734 dialog = new dijit.Dialog({
1735 id: "labelEditDlg",
1736 title: __("Label Editor"),
1737 style: "width: 600px",
05acc0d6
AD
1738 setLabelColor: function(id, fg, bg) {
1739
1740 var kind = '';
1741 var color = '';
fb5662de 1742
05acc0d6
AD
1743 if (fg && bg) {
1744 kind = 'both';
1745 } else if (fg) {
1746 kind = 'fg';
1747 color = fg;
1748 } else if (bg) {
1749 kind = 'bg';
1750 color = bg;
1751 }
fb5662de 1752
cbe50c80 1753 var query = "?op=pref-labels&method=colorset&kind="+kind+
fb5662de 1754 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
05acc0d6 1755 "&bg=" + param_escape(bg) + "&color=" + param_escape(color);
fb5662de 1756
05acc0d6 1757 // console.log(query);
fb5662de 1758
05acc0d6 1759 var e = $("LICID-" + id);
fb5662de
AD
1760
1761 if (e) {
05acc0d6
AD
1762 if (fg) e.style.color = fg;
1763 if (bg) e.style.backgroundColor = bg;
1764 }
fb5662de 1765
05acc0d6
AD
1766 new Ajax.Request("backend.php", { parameters: query });
1767
1768 updateFilterList();
1769 },
48b05a29
AD
1770 execute: function() {
1771 if (this.validate()) {
48b05a29
AD
1772 var caption = this.attr('value').caption;
1773 var fg_color = this.attr('value').fg_color;
1774 var bg_color = this.attr('value').bg_color;
1775 var query = dojo.objectToQuery(this.attr('value'));
1776
1777 dijit.byId('labelTree').setNameById(id, caption);
05acc0d6 1778 this.setLabelColor(id, fg_color, bg_color);
48b05a29
AD
1779 this.hide();
1780
1781 new Ajax.Request("backend.php", {
1782 parameters: query,
1783 onComplete: function(transport) {
fb5662de 1784 updateFilterList();
48b05a29
AD
1785 } });
1786 }
1787 },
1788 href: query});
fb8b2153 1789
48b05a29 1790 dialog.show();
fb8b2153
AD
1791
1792 } catch (e) {
1793 exception_error("editLabel", e);
1794 }
1795}
018caf6f 1796
57e24c82
AD
1797function clearTwitterCredentials() {
1798 try {
1799 var ok = confirm(__("This will clear your stored authentication information for Twitter. Continue?"));
1800
1801 if (ok) {
1802 notify_progress("Clearing credentials...");
1803
f30ef1fa 1804 var query = "?op=pref-feeds&method=remtwitterinfo";
018caf6f 1805
57e24c82
AD
1806 new Ajax.Request("backend.php", {
1807 parameters: query,
fb5662de 1808 onComplete: function(transport) {
57e24c82
AD
1809 notify_info("Twitter credentials have been cleared.");
1810 updateFeedList();
1811 } });
1812 }
1813
1814 } catch (e) {
1815 exception_error("clearTwitterCredentials", e);
1816 }
1817}
88e4e597
AD
1818
1819function customizeCSS() {
1820 try {
3f363052 1821 var query = "backend.php?op=dlg&method=customizeCSS";
88e4e597
AD
1822
1823 if (dijit.byId("cssEditDlg"))
1824 dijit.byId("cssEditDlg").destroyRecursive();
1825
1826 dialog = new dijit.Dialog({
1827 id: "cssEditDlg",
1828 title: __("Customize stylesheet"),
1829 style: "width: 600px",
1830 execute: function() {
1831 notify_progress('Saving data...', true);
1832 new Ajax.Request("backend.php", {
1833 parameters: dojo.objectToQuery(this.attr('value')),
fb5662de 1834 onComplete: function(transport) {
88e4e597
AD
1835 notify('');
1836 window.location.reload();
1837 } });
1838
1839 },
1840 href: query});
1841
1842 dialog.show();
1843
1844 } catch (e) {
1845 exception_error("customizeCSS", e);
1846 }
1847}
3d72afa1
AD
1848
1849function insertSSLserial(value) {
1850 try {
1851 dijit.byId("SSL_CERT_SERIAL").attr('value', value);
1852 } catch (e) {
1853 exception_error("insertSSLcerial", e);
1854 }
1855}
373266eb
AD
1856
1857function getSelectedInstances() {
1858 return getSelectedTableRowIds("prefInstanceList");
1859}
1860
1861function addInstance() {
1862 try {
3f363052 1863 var query = "backend.php?op=dlg&method=addInstance";
373266eb 1864
32310332
AD
1865 if (dijit.byId("instanceAddDlg"))
1866 dijit.byId("instanceAddDlg").destroyRecursive();
1867
1868 dialog = new dijit.Dialog({
1869 id: "instanceAddDlg",
1870 title: __("Link Instance"),
1871 style: "width: 600px",
1872 regenKey: function() {
1873 new Ajax.Request("backend.php", {
f30ef1fa 1874 parameters: "?op=rpc&method=genHash",
32310332
AD
1875 onComplete: function(transport) {
1876 var reply = JSON.parse(transport.responseText);
1877 if (reply)
1878 dijit.byId('instance_add_key').attr('value', reply.hash);
1879
1880 } });
1881 },
1882 execute: function() {
1883 if (this.validate()) {
1884 console.warn(dojo.objectToQuery(this.attr('value')));
1885
1886 notify_progress('Saving data...', true);
1887 new Ajax.Request("backend.php", {
1888 parameters: dojo.objectToQuery(this.attr('value')),
1889 onComplete: function(transport) {
1890 dialog.hide();
1891 notify('');
1892 updateInstanceList();
1893 } });
1894 }
1895 },
1896 href: query,
1897 });
1898
1899 dialog.show();
373266eb
AD
1900
1901 } catch (e) {
1902 exception_error("addInstance", e);
1903 }
1904}
1905
1906function editInstance(id, event) {
1907 try {
1908 if (!event || !event.ctrlKey) {
1909
1910 selectTableRows('prefInstanceList', 'none');
1911 selectTableRowById('LIRR-'+id, 'LICHK-'+id, true);
1912
f30ef1fa 1913 var query = "backend.php?op=pref-instances&method=edit&id=" +
373266eb
AD
1914 param_escape(id);
1915
1916 if (dijit.byId("instanceEditDlg"))
1917 dijit.byId("instanceEditDlg").destroyRecursive();
1918
1919 dialog = new dijit.Dialog({
1920 id: "instanceEditDlg",
1921 title: __("Edit Instance"),
1922 style: "width: 600px",
9104a3e6
AD
1923 regenKey: function() {
1924 new Ajax.Request("backend.php", {
f30ef1fa 1925 parameters: "?op=rpc&method=genHash",
9104a3e6
AD
1926 onComplete: function(transport) {
1927 var reply = JSON.parse(transport.responseText);
1928 if (reply)
1929 dijit.byId('instance_edit_key').attr('value', reply.hash);
1930
1931 } });
1932 },
1933 execute: function() {
1934 if (this.validate()) {
1935// console.warn(dojo.objectToQuery(this.attr('value')));
1936
1937 notify_progress('Saving data...', true);
1938 new Ajax.Request("backend.php", {
1939 parameters: dojo.objectToQuery(this.attr('value')),
1940 onComplete: function(transport) {
1941 dialog.hide();
1942 notify('');
1943 updateInstanceList();
1944 } });
1945 }
1946 },
373266eb
AD
1947 href: query,
1948 });
1949
1950 dialog.show();
1951
1952 } else if (event.ctrlKey) {
1953 var cb = $('LICHK-' + id);
1954 cb.checked = !cb.checked;
1955 toggleSelectRow(cb);
1956 }
1957
1958
1959 } catch (e) {
1960 exception_error("editInstance", e);
1961 }
1962}
1963
1964function removeSelectedInstances() {
1965 try {
32310332
AD
1966 var sel_rows = getSelectedInstances();
1967
1968 if (sel_rows.length > 0) {
1969
1970 var ok = confirm(__("Remove selected instances?"));
1971
1972 if (ok) {
1973 notify_progress("Removing selected instances...");
1974
f30ef1fa 1975 var query = "?op=pref-instances&method=remove&ids="+
32310332
AD
1976 param_escape(sel_rows.toString());
1977
1978 new Ajax.Request("backend.php", {
1979 parameters: query,
1980 onComplete: function(transport) {
1981 notify('');
1982 updateInstanceList();
1983 } });
1984 }
1985
1986 } else {
1987 alert(__("No instances are selected."));
1988 }
373266eb
AD
1989
1990 } catch (e) {
1991 exception_error("removeInstance", e);
1992 }
1993}
1994
1995function editSelectedInstance() {
1996 var rows = getSelectedInstances();
1997
1998 if (rows.length == 0) {
1999 alert(__("No instances are selected."));
2000 return;
2001 }
2002
2003 if (rows.length > 1) {
2004 alert(__("Please select only one instance."));
2005 return;
2006 }
2007
2008 notify("");
2009
2010 editInstance(rows[0]);
2011}
2012
66be620a
AD
2013function showHelp() {
2014 try {
2015 new Ajax.Request("backend.php", {
2016 parameters: "?op=backend&method=help&topic=prefs",
2017 onComplete: function(transport) {
2018 $("hotkey_help_overlay").innerHTML = transport.responseText;
2019 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
2020 } });
2021
2022 } catch (e) {
2023 exception_error("showHelp", e);
2024 }
2025}
566faa14
AD
2026
2027function exportData() {
2028 try {
2029
2030 var query = "backend.php?op=dlg&method=exportData";
2031
2032 if (dijit.byId("dataExportDlg"))
2033 dijit.byId("dataExportDlg").destroyRecursive();
2034
2035 var exported = 0;
2036
2037 dialog = new dijit.Dialog({
2038 id: "dataExportDlg",
2039 title: __("Export Data"),
2040 style: "width: 600px",
2041 prepare: function() {
2042
2043 notify_progress("Loading, please wait...");
2044
2045 new Ajax.Request("backend.php", {
2046 parameters: "?op=rpc&method=exportrun&offset=" + exported,
2047 onComplete: function(transport) {
2048 try {
2049 var rv = JSON.parse(transport.responseText);
2050
2051 if (rv && rv.exported != undefined) {
2052 if (rv.exported > 0) {
2053
2054 exported += rv.exported;
2055
2056 $("export_status_message").innerHTML =
2057 "<img src='images/indicator_tiny.gif'> " +
2058 "Exported %d articles, please wait...".replace("%d",
2059 exported);
2060
2061 setTimeout('dijit.byId("dataExportDlg").prepare()', 2000);
2062
2063 } else {
2064
2065 $("export_status_message").innerHTML =
2066 __("Finished, exported %d articles. You can download the data <a class='visibleLink' href='%u'>here</a>.")
2067 .replace("%d", exported)
2068 .replace("%u", "backend.php?op=rpc&subop=exportget");
2069
2070 exported = 0;
2071
2072 }
2073
2074 } else {
2075 $("export_status_message").innerHTML =
2076 "Error occured, could not export data.";
2077 }
2078 } catch (e) {
2079 exception_error("exportData", e, transport.responseText);
2080 }
2081
2082 notify('');
2083
2084 } });
2085
2086 },
2087 execute: function() {
2088 if (this.validate()) {
2089
2090
2091
2092 }
2093 },
2094 href: query});
2095
2096 dialog.show();
2097
2098
2099 } catch (e) {
2100 exception_error("exportData", e);
2101 }
2102}
2103
55f34b81
AD
2104function dataImportComplete(iframe) {
2105 try {
2106 if (!iframe.contentDocument.body.innerHTML) return false;
2107
2108 Element.hide(iframe);
2109
2110 notify('');
2111
2112 if (dijit.byId('dataImportDlg'))
2113 dijit.byId('dataImportDlg').destroyRecursive();
2114
2115 var content = iframe.contentDocument.body.innerHTML;
2116
2117 dialog = new dijit.Dialog({
2118 id: "dataImportDlg",
2119 title: __("Data Import"),
2120 style: "width: 600px",
2121 onCancel: function() {
2122
2123 },
2124 content: content});
2125
2126 dialog.show();
2127
2128 } catch (e) {
2129 exception_error("dataImportComplete", e);
2130 }
2131}
2132
41f68571
AD
2133function gotoExportOpml(filename, settings) {
2134 tmp = settings ? 1 : 0;
d75409bf 2135 document.location.href = "backend.php?op=opml&method=export&filename=" + filename + "&settings=" + tmp;
41f68571
AD
2136}
2137
2138
33f0fdd0
AD
2139function batchSubscribe() {
2140 try {
2141 var query = "backend.php?op=dlg&method=batchSubscribe";
2142
2143 if (dijit.byId("batchSubDlg"))
2144 dijit.byId("batchSubDlg").destroyRecursive();
2145
2146 var dialog = new dijit.Dialog({
2147 id: "batchSubDlg",
2148 title: __("Batch subscribe"),
2149 style: "width: 600px",
2150 execute: function() {
2151 if (this.validate()) {
2152 console.log(dojo.objectToQuery(this.attr('value')));
2153
2154 notify_progress(__("Subscribing to feeds..."), true);
2155
2156 new Ajax.Request("backend.php", {
2157 parameters: dojo.objectToQuery(this.attr('value')),
2158 onComplete: function(transport) {
4b298c86
AD
2159 notify("");
2160 updateFeedList();
2161 dialog.hide();
33f0fdd0
AD
2162 } });
2163 }
2164 },
2165 href: query});
2166
2167 dialog.show();
2168 } catch (e) {
2169 exception_error("batchSubscribe", e);
2170 }
2171}
55f34b81 2172
27211afe
AD
2173function updateSelf() {
2174 try {
2175 var query = "backend.php?op=pref-prefs&method=updateSelf";
2176
2177 if (dijit.byId("updateSelfDlg"))
2178 dijit.byId("updateSelfDlg").destroyRecursive();
2179
2180 var dialog = new dijit.Dialog({
2181 id: "updateSelfDlg",
2182 title: __("Update Tiny Tiny RSS"),
2183 style: "width: 600px",
2184 closable: false,
808dd053 2185 performUpdate: function(step) {
27211afe 2186 dijit.byId("self_update_start_btn").attr("disabled", true);
808dd053
AD
2187 dijit.byId("self_update_stop_btn").attr("disabled", true);
2188
27211afe
AD
2189 notify_progress("Loading, please wait...", true);
2190 new Ajax.Request("backend.php", {
808dd053
AD
2191 parameters: "?op=pref-prefs&method=performUpdate&step=" + step +
2192 "&params=" + param_escape(JSON.stringify(dialog.attr("update-params"))),
27211afe
AD
2193 onComplete: function(transport) {
2194 try {
808dd053
AD
2195 rv = JSON.parse(transport.responseText);
2196 if (rv) {
2197 notify('');
2198
2199 rv['log'].each(function(line) {
2200 $("self_update_log").innerHTML += "<li>" + line + "</li>";
2201 });
2202
2203 dialog.attr("update-params", rv['params']);
2204
2205 if (!rv['stop']) {
2206 window.setTimeout("dijit.byId('updateSelfDlg').performUpdate("+(step+1)+")", 500);
2207 } else {
2208 dijit.byId("self_update_stop_btn").attr("disabled", false);
2209 }
2210
2211 } else {
2212 console.log(transport.responseText);
2213 notify_error("Received invalid data from server.");
2214 }
2215
27211afe
AD
2216 dialog.attr("updated", true);
2217 } catch (e) {
2218 exception_error("updateSelf/inner", e);
2219 }
2220 } });
2221 },
2222 close: function() {
2223 if (dialog.attr("updated")) {
2224 window.location.reload();
2225 } else {
2226 dialog.hide();
2227 }
2228 },
2229 start: function() {
2230 if (prompt(__("Live updating is considered experimental. Backup your tt-rss directory before continuing. Please type 'yes' to continue.")) == 'yes') {
808dd053 2231 dialog.performUpdate(0);
27211afe
AD
2232 }
2233 },
2234 href: query});
2235
2236 dialog.show();
2237 } catch (e) {
2238 exception_error("batchSubscribe", e);
2239 }
2240}
2241
f9ebb32c
AD
2242function toggleAdvancedPrefs() {
2243 try {
2244 notify_progress("Loading, please wait...");
2245
2246 new Ajax.Request("backend.php", {
2247 parameters: "?op=pref-prefs&method=toggleadvanced",
2248 onComplete: function(transport) {
2249 updatePrefsList();
2250 } });
2251
2252 } catch (e) {
2253 exception_error("toggleAdvancedPrefs", e);
2254 }
2255}