]> git.wh0rd.org Git - tt-rss.git/blob - js/prefs.js
prefs: use dojo asynchronously
[tt-rss.git] / js / prefs.js
1 var init_params = new Array();
2
3 var hotkey_prefix = false;
4 var hotkey_prefix_pressed = false;
5
6 var seq = "";
7
8 function notify_callback2(transport, sticky) {
9         notify_info(transport.responseText, sticky);
10 }
11
12 function updateFeedList(sort_key) {
13
14         var user_search = $("feed_search");
15         var search = "";
16         if (user_search) { search = user_search.value; }
17
18         new Ajax.Request("backend.php", {
19                 parameters: "?op=pref-feeds&search=" + param_escape(search),
20                 onComplete: function(transport) {
21                         dijit.byId('feedConfigTab').attr('content', transport.responseText);
22                         selectTab("feedConfig", true);
23                         notify("");
24                 } });
25 }
26
27 function checkInactiveFeeds() {
28         try {
29                 new Ajax.Request("backend.php", {
30                         parameters: "?op=pref-feeds&method=getinactivefeeds",
31                         onComplete: function(transport) {
32                                 if (parseInt(transport.responseText) > 0) {
33                                         Element.show(dijit.byId("pref_feeds_inactive_btn").domNode);
34                                 }
35                         } });
36
37         } catch (e) {
38                 exception_error("checkInactiveFeeds", e);
39         }
40 }
41
42 function updateUsersList(sort_key) {
43         try {
44                 var user_search = $("user_search");
45                 var search = "";
46                 if (user_search) { search = user_search.value; }
47
48                 var query = "?op=pref-users&sort="
49                         + param_escape(sort_key) +
50                         "&search=" + param_escape(search);
51
52                 new Ajax.Request("backend.php", {
53                         parameters: query,
54                         onComplete: function(transport) {
55                                 dijit.byId('userConfigTab').attr('content', transport.responseText);
56                                 selectTab("userConfig", true)
57                                 notify("");
58                         } });
59
60         } catch (e) {
61                 exception_error("updateUsersList", e);
62         }
63 }
64
65 function addUser() {
66
67         try {
68
69                 var login = prompt(__("Please enter login:"), "");
70
71                 if (login == null) {
72                         return false;
73                 }
74
75                 if (login == "") {
76                         alert(__("Can't create user: no login specified."));
77                         return false;
78                 }
79
80                 notify_progress("Adding user...");
81
82                 var query = "?op=pref-users&method=add&login=" +
83                         param_escape(login);
84
85                 new Ajax.Request("backend.php", {
86                         parameters: query,
87                         onComplete: function(transport) {
88                                 notify_callback2(transport);
89                                 updateUsersList();
90                         } });
91
92         } catch (e) {
93                 exception_error("addUser", e);
94         }
95 }
96
97 function editUser(id, event) {
98
99         try {
100                 var query = "backend.php?op=pref-users&method=edit&id=" +
101                         param_escape(id);
102
103                 if (dijit.byId("userEditDlg"))
104                         dijit.byId("userEditDlg").destroyRecursive();
105
106                 dialog = new dijit.Dialog({
107                         id: "userEditDlg",
108                         title: __("User Editor"),
109                         style: "width: 600px",
110                         execute: function() {
111                                 if (this.validate()) {
112                                         notify_progress("Saving data...", true);
113
114                                         var query = dojo.formToQuery("user_edit_form");
115
116                                         new Ajax.Request("backend.php", {
117                                                 parameters: query,
118                                                 onComplete: function(transport) {
119                                                         dialog.hide();
120                                                         updateUsersList();
121                                                 }});
122                                 }
123                         },
124                         href: query});
125
126                 dialog.show();
127
128         } catch (e) {
129                 exception_error("editUser", e);
130         }
131
132 }
133
134 function editFilter(id) {
135         try {
136
137                 var query = "backend.php?op=pref-filters&method=edit&id=" + param_escape(id);
138
139                 if (dijit.byId("feedEditDlg"))
140                         dijit.byId("feedEditDlg").destroyRecursive();
141
142                 if (dijit.byId("filterEditDlg"))
143                         dijit.byId("filterEditDlg").destroyRecursive();
144
145                 dialog = new dijit.Dialog({
146                         id: "filterEditDlg",
147                         title: __("Edit Filter"),
148                         style: "width: 600px",
149
150                         test: function() {
151                                 var query = "backend.php?" + dojo.formToQuery("filter_edit_form") + "&savemode=test";
152
153                                 editFilterTest(query);
154                         },
155                         selectRules: function(select) {
156                                 $$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
157                                         e.checked = select;
158                                         if (select)
159                                                 e.parentNode.addClassName("Selected");
160                                         else
161                                                 e.parentNode.removeClassName("Selected");
162                                 });
163                         },
164                         selectActions: function(select) {
165                                 $$("#filterDlg_Actions input[type=checkbox]").each(function(e) {
166                                         e.checked = select;
167
168                                         if (select)
169                                                 e.parentNode.addClassName("Selected");
170                                         else
171                                                 e.parentNode.removeClassName("Selected");
172
173                                 });
174                         },
175                         editRule: function(e) {
176                                 var li = e.parentNode;
177                                 var rule = li.getElementsByTagName("INPUT")[1].value;
178                                 addFilterRule(li, rule);
179                         },
180                         editAction: function(e) {
181                                 var li = e.parentNode;
182                                 var action = li.getElementsByTagName("INPUT")[1].value;
183                                 addFilterAction(li, action);
184                         },
185                         removeFilter: function() {
186                                 var msg = __("Remove filter?");
187
188                                 if (confirm(msg)) {
189                                         this.hide();
190
191                                         notify_progress("Removing filter...");
192
193                                         var id = this.attr('value').id;
194
195                                         var query = "?op=pref-filters&method=remove&ids="+
196                                                 param_escape(id);
197
198                                         new Ajax.Request("backend.php", {
199                                                 parameters: query,
200                                                 onComplete: function(transport) {
201                                                         updateFilterList();
202                                                 } });
203                                 }
204                         },
205                         addAction: function() { addFilterAction(); },
206                         addRule: function() { addFilterRule(); },
207                         deleteAction: function() {
208                                 $$("#filterDlg_Actions li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
209                         },
210                         deleteRule: function() {
211                                 $$("#filterDlg_Matches li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) });
212                         },
213                         execute: function() {
214                                 if (this.validate()) {
215
216                                         notify_progress("Saving data...", true);
217
218                                         var query = dojo.formToQuery("filter_edit_form");
219
220                                         console.log(query);
221
222                                         new Ajax.Request("backend.php", {
223                                                 parameters: query,
224                                                 onComplete: function(transport) {
225                                                         dialog.hide();
226                                                         updateFilterList();
227                                                 }});
228                                 }
229                         },
230                         href: query});
231
232                 dialog.show();
233
234
235         } catch (e) {
236                 exception_error("editFilter", e);
237         }
238 }
239
240 function getSelectedLabels() {
241         var tree = dijit.byId("labelTree");
242         var items = tree.model.getCheckedItems();
243         var rv = [];
244
245         items.each(function(item) {
246                 rv.push(tree.model.store.getValue(item, 'bare_id'));
247         });
248
249         return rv;
250 }
251
252 function getSelectedUsers() {
253         return getSelectedTableRowIds("prefUserList");
254 }
255
256 function getSelectedFeeds() {
257         var tree = dijit.byId("feedTree");
258         var items = tree.model.getCheckedItems();
259         var rv = [];
260
261         items.each(function(item) {
262                 if (item.id[0].match("FEED:"))
263                         rv.push(tree.model.store.getValue(item, 'bare_id'));
264         });
265
266         return rv;
267 }
268
269 function getSelectedCategories() {
270         var tree = dijit.byId("feedTree");
271         var items = tree.model.getCheckedItems();
272         var rv = [];
273
274         items.each(function(item) {
275                 if (item.id[0].match("CAT:"))
276                         rv.push(tree.model.store.getValue(item, 'bare_id'));
277         });
278
279         return rv;
280 }
281
282 function getSelectedFilters() {
283         var tree = dijit.byId("filterTree");
284         var items = tree.model.getCheckedItems();
285         var rv = [];
286
287         items.each(function(item) {
288                 rv.push(tree.model.store.getValue(item, 'bare_id'));
289         });
290
291         return rv;
292
293 }
294
295 function removeSelectedLabels() {
296
297         var sel_rows = getSelectedLabels();
298
299         if (sel_rows.length > 0) {
300
301                 var ok = confirm(__("Remove selected labels?"));
302
303                 if (ok) {
304                         notify_progress("Removing selected labels...");
305
306                         var query = "?op=pref-labels&method=remove&ids="+
307                                 param_escape(sel_rows.toString());
308
309                         new Ajax.Request("backend.php", {
310                                 parameters: query,
311                                 onComplete: function(transport) {
312                                                 updateLabelList();
313                                         } });
314
315                 }
316         } else {
317                 alert(__("No labels are selected."));
318         }
319
320         return false;
321 }
322
323 function removeSelectedUsers() {
324
325         try {
326
327                 var sel_rows = getSelectedUsers();
328
329                 if (sel_rows.length > 0) {
330
331                         var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
332
333                         if (ok) {
334                                 notify_progress("Removing selected users...");
335
336                                 var query = "?op=pref-users&method=remove&ids="+
337                                         param_escape(sel_rows.toString());
338
339                                 new Ajax.Request("backend.php", {
340                                         parameters: query,
341                                         onComplete: function(transport) {
342                                                 updateUsersList();
343                                         } });
344
345                         }
346
347                 } else {
348                         alert(__("No users are selected."));
349                 }
350
351         } catch (e) {
352                 exception_error("removeSelectedUsers", e);
353         }
354
355         return false;
356 }
357
358 function removeSelectedFilters() {
359
360         try {
361
362                 var sel_rows = getSelectedFilters();
363
364                 if (sel_rows.length > 0) {
365
366                         var ok = confirm(__("Remove selected filters?"));
367
368                         if (ok) {
369                                 notify_progress("Removing selected filters...");
370
371                                 var query = "?op=pref-filters&method=remove&ids="+
372                                         param_escape(sel_rows.toString());
373
374                                 new Ajax.Request("backend.php", {
375                                                 parameters: query,
376                                                 onComplete: function(transport) {
377                                                         updateFilterList();
378                                                 } });
379                         }
380                 } else {
381                         alert(__("No filters are selected."));
382                 }
383
384         } catch (e) {
385                 exception_error("removeSelectedFilters", e);
386         }
387
388         return false;
389 }
390
391
392 function removeSelectedFeeds() {
393
394         try {
395
396                 var sel_rows = getSelectedFeeds();
397
398                 if (sel_rows.length > 0) {
399
400                         var ok = confirm(__("Unsubscribe from selected feeds?"));
401
402                         if (ok) {
403
404                                 notify_progress("Unsubscribing from selected feeds...", true);
405
406                                 var query = "?op=pref-feeds&method=remove&ids="+
407                                         param_escape(sel_rows.toString());
408
409                                 console.log(query);
410
411                                 new Ajax.Request("backend.php", {
412                                         parameters: query,
413                                         onComplete: function(transport) {
414                                                 updateFeedList();
415                                                 } });
416                         }
417
418                 } else {
419                         alert(__("No feeds are selected."));
420                 }
421
422         } catch (e) {
423                 exception_error("removeSelectedFeeds", e);
424         }
425
426         return false;
427 }
428
429 function clearSelectedFeeds() {
430
431         var sel_rows = getSelectedFeeds();
432
433         if (sel_rows.length > 1) {
434                 alert(__("Please select only one feed."));
435                 return;
436         }
437
438         if (sel_rows.length > 0) {
439
440                 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
441
442                 if (ok) {
443                         notify_progress("Clearing selected feed...");
444                         clearFeedArticles(sel_rows[0]);
445                 }
446
447         } else {
448
449                 alert(__("No feeds are selected."));
450
451         }
452
453         return false;
454 }
455
456 function purgeSelectedFeeds() {
457
458         var sel_rows = getSelectedFeeds();
459
460         if (sel_rows.length > 0) {
461
462                 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
463
464                 if (pr != undefined) {
465                         notify_progress("Purging selected feed...");
466
467                         var query = "?op=rpc&method=purge&ids="+
468                                 param_escape(sel_rows.toString()) + "&days=" + pr;
469
470                         console.log(query);
471
472                         new Ajax.Request("prefs.php",   {
473                                 parameters: query,
474                                 onComplete: function(transport) {
475                                         notify('');
476                                 } });
477                 }
478
479         } else {
480
481                 alert(__("No feeds are selected."));
482
483         }
484
485         return false;
486 }
487
488 function editSelectedUser() {
489         var rows = getSelectedUsers();
490
491         if (rows.length == 0) {
492                 alert(__("No users are selected."));
493                 return;
494         }
495
496         if (rows.length > 1) {
497                 alert(__("Please select only one user."));
498                 return;
499         }
500
501         notify("");
502
503         editUser(rows[0]);
504 }
505
506 function resetSelectedUserPass() {
507
508         try {
509
510                 var rows = getSelectedUsers();
511
512                 if (rows.length == 0) {
513                         alert(__("No users are selected."));
514                         return;
515                 }
516
517                 if (rows.length > 1) {
518                         alert(__("Please select only one user."));
519                         return;
520                 }
521
522                 var ok = confirm(__("Reset password of selected user?"));
523
524                 if (ok) {
525                         notify_progress("Resetting password for selected user...");
526
527                         var id = rows[0];
528
529                         var query = "?op=pref-users&method=resetPass&id=" +
530                                 param_escape(id);
531
532                         new Ajax.Request("backend.php", {
533                                 parameters: query,
534                                 onComplete: function(transport) {
535                                         notify_info(transport.responseText, true);
536                                 } });
537
538                 }
539
540         } catch (e) {
541                 exception_error("resetSelectedUserPass", e);
542         }
543 }
544
545 function selectedUserDetails() {
546
547         try {
548
549                 var rows = getSelectedUsers();
550
551                 if (rows.length == 0) {
552                         alert(__("No users are selected."));
553                         return;
554                 }
555
556                 if (rows.length > 1) {
557                         alert(__("Please select only one user."));
558                         return;
559                 }
560
561                 var id = rows[0];
562
563                 var query = "backend.php?op=pref-users&method=userdetails&id=" + id;
564
565                 if (dijit.byId("userDetailsDlg"))
566                         dijit.byId("userDetailsDlg").destroyRecursive();
567
568                 dialog = new dijit.Dialog({
569                         id: "userDetailsDlg",
570                         title: __("User details"),
571                         style: "width: 600px",
572                         execute: function() {
573                                 dialog.hide();
574                         },
575                         href: query});
576
577                 dialog.show();
578
579         } catch (e) {
580                 exception_error("selectedUserDetails", e);
581         }
582 }
583
584
585 function editSelectedFilter() {
586         var rows = getSelectedFilters();
587
588         if (rows.length == 0) {
589                 alert(__("No filters are selected."));
590                 return;
591         }
592
593         if (rows.length > 1) {
594                 alert(__("Please select only one filter."));
595                 return;
596         }
597
598         notify("");
599
600         editFilter(rows[0]);
601
602 }
603
604 function joinSelectedFilters() {
605         var rows = getSelectedFilters();
606
607         if (rows.length == 0) {
608                 alert(__("No filters are selected."));
609                 return;
610         }
611
612         var ok = confirm(__("Combine selected filters?"));
613
614         if (ok) {
615                 notify_progress("Joining filters...");
616
617                 var query = "?op=pref-filters&method=join&ids="+
618                         param_escape(rows.toString());
619
620                 console.log(query);
621
622                 new Ajax.Request("backend.php", {
623                         parameters: query,
624                         onComplete: function(transport) {
625                                         updateFilterList();
626                         } });
627         }
628 }
629
630 function editSelectedFeed() {
631         var rows = getSelectedFeeds();
632
633         if (rows.length == 0) {
634                 alert(__("No feeds are selected."));
635                 return;
636         }
637
638         if (rows.length > 1) {
639                 return editSelectedFeeds();
640         }
641
642         notify("");
643
644         editFeed(rows[0], {});
645
646 }
647
648 function editSelectedFeeds() {
649
650         try {
651                 var rows = getSelectedFeeds();
652
653                 if (rows.length == 0) {
654                         alert(__("No feeds are selected."));
655                         return;
656                 }
657
658                 notify_progress("Loading, please wait...");
659
660                 var query = "backend.php?op=pref-feeds&method=editfeeds&ids=" +
661                         param_escape(rows.toString());
662
663                 console.log(query);
664
665                 if (dijit.byId("feedEditDlg"))
666                         dijit.byId("feedEditDlg").destroyRecursive();
667
668                 new Ajax.Request("backend.php", {
669                         parameters: query,
670                         onComplete: function(transport) {
671
672                                 notify("");
673
674                                 var dialog = new dijit.Dialog({
675                                         id: "feedEditDlg",
676                                         title: __("Edit Multiple Feeds"),
677                                         style: "width: 600px",
678                                         getChildByName: function (name) {
679                                                 var rv = null;
680                                                 this.getChildren().each(
681                                                         function(child) {
682                                                                 if (child.name == name) {
683                                                                         rv = child;
684                                                                         return;
685                                                                 }
686                                                         });
687                                                 return rv;
688                                         },
689                                         toggleField: function (checkbox, elem, label) {
690                                                 this.getChildByName(elem).attr('disabled', !checkbox.checked);
691
692                                                 if ($(label))
693                                                         if (checkbox.checked)
694                                                                 $(label).removeClassName('insensitive');
695                                                         else
696                                                                 $(label).addClassName('insensitive');
697
698                                         },
699                                         execute: function() {
700                                                 if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
701                                                         var query = dojo.objectToQuery(this.attr('value'));
702
703                                                         /* Form.serialize ignores unchecked checkboxes */
704
705                                                         if (!query.match("&private=") &&
706                                                                         this.getChildByName('private').attr('disabled') == false) {
707                                                                 query = query + "&private=false";
708                                                         }
709
710                                                         try {
711                                                                 if (!query.match("&cache_images=") &&
712                                                                                 this.getChildByName('cache_images').attr('disabled') == false) {
713                                                                         query = query + "&cache_images=false";
714                                                                 }
715                                                         } catch (e) { }
716
717                                                         try {
718                                                                 if (!query.match("&hide_images=") &&
719                                                                                 this.getChildByName('hide_images').attr('disabled') == false) {
720                                                                         query = query + "&hide_images=false";
721                                                                 }
722                                                         } catch (e) { }
723
724                                                         if (!query.match("&include_in_digest=") &&
725                                                                         this.getChildByName('include_in_digest').attr('disabled') == false) {
726                                                                 query = query + "&include_in_digest=false";
727                                                         }
728
729                                                         if (!query.match("&always_display_enclosures=") &&
730                                                                         this.getChildByName('always_display_enclosures').attr('disabled') == false) {
731                                                                 query = query + "&always_display_enclosures=false";
732                                                         }
733
734                                                         if (!query.match("&mark_unread_on_update=") &&
735                                                                         this.getChildByName('mark_unread_on_update').attr('disabled') == false) {
736                                                                 query = query + "&mark_unread_on_update=false";
737                                                         }
738
739                                                         console.log(query);
740
741                                                         notify_progress("Saving data...", true);
742
743                                                         new Ajax.Request("backend.php", {
744                                                                 parameters: query,
745                                                                 onComplete: function(transport) {
746                                                                         dialog.hide();
747                                                                         updateFeedList();
748                                                         }});
749                                                 }
750                                         },
751                                         content: transport.responseText});
752
753                                         dialog.show();
754
755                         } });
756
757         } catch (e) {
758                 exception_error("editSelectedFeeds", e);
759         }
760 }
761
762 function opmlImportComplete(iframe) {
763         try {
764                 if (!iframe.contentDocument.body.innerHTML) return false;
765
766                 Element.show(iframe);
767
768                 notify('');
769
770                 if (dijit.byId('opmlImportDlg'))
771                         dijit.byId('opmlImportDlg').destroyRecursive();
772
773                 var content = iframe.contentDocument.body.innerHTML;
774
775                 dialog = new dijit.Dialog({
776                         id: "opmlImportDlg",
777                         title: __("OPML Import"),
778                         style: "width: 600px",
779                         onCancel: function() {
780                                 updateFeedList();
781                                 updateFilterList();
782                                 updateLabelList();
783                         },
784                         execute: function() {
785                                 updateFeedList();
786                                 updateFilterList();
787                                 updateLabelList();
788                                 this.hide();
789                         },
790                         content: content});
791
792                 dialog.show();
793
794         } catch (e) {
795                 exception_error("opmlImportComplete", e);
796         }
797 }
798
799 function opmlImport() {
800
801         var opml_file = $("opml_file");
802
803         if (opml_file.value.length == 0) {
804                 alert(__("Please choose an OPML file first."));
805                 return false;
806         } else {
807                 notify_progress("Importing, please wait...", true);
808
809                 Element.show("upload_iframe");
810
811                 return true;
812         }
813 }
814
815
816 function updateFilterList() {
817         var user_search = $("filter_search");
818         var search = "";
819         if (user_search) { search = user_search.value; }
820
821         new Ajax.Request("backend.php", {
822                 parameters: "?op=pref-filters&search=" + param_escape(search),
823                 onComplete: function(transport) {
824                         dijit.byId('filterConfigTab').attr('content', transport.responseText);
825                         notify("");
826                 } });
827 }
828
829 function updateLabelList() {
830         new Ajax.Request("backend.php", {
831                 parameters: "?op=pref-labels",
832                 onComplete: function(transport) {
833                         dijit.byId('labelConfigTab').attr('content', transport.responseText);
834                         notify("");
835                 } });
836 }
837
838 function updatePrefsList() {
839         new Ajax.Request("backend.php", {
840                 parameters: "?op=pref-prefs",
841                 onComplete: function(transport) {
842                         dijit.byId('genConfigTab').attr('content', transport.responseText);
843                         notify("");
844                 } });
845 }
846
847 function updateSystemList() {
848         new Ajax.Request("backend.php", {
849                 parameters: "?op=pref-system",
850                 onComplete: function(transport) {
851                         dijit.byId('systemConfigTab').attr('content', transport.responseText);
852                         notify("");
853                 } });
854 }
855
856 function selectTab(id, noupdate, method) {
857         try {
858                 if (!noupdate) {
859                         notify_progress("Loading, please wait...");
860
861                         if (id == "feedConfig") {
862                                 updateFeedList();
863                         } else if (id == "filterConfig") {
864                                 updateFilterList();
865                         } else if (id == "labelConfig") {
866                                 updateLabelList();
867                         } else if (id == "genConfig") {
868                                 updatePrefsList();
869                         } else if (id == "userConfig") {
870                                 updateUsersList();
871                         } else if (id == "systemConfig") {
872                                 updateSystemList();
873                         }
874
875                         var tab = dijit.byId(id + "Tab");
876                         dijit.byId("pref-tabs").selectChild(tab);
877
878                 }
879
880         } catch (e) {
881                 exception_error("selectTab", e);
882         }
883 }
884
885 function init_second_stage() {
886         try {
887
888                 document.onkeydown = pref_hotkey_handler;
889                 loading_set_progress(50);
890                 notify("");
891
892                 var tab = getURLParam('tab');
893
894                 if (tab) {
895                         tab = dijit.byId(tab + "Tab");
896                         if (tab) dijit.byId("pref-tabs").selectChild(tab);
897                 }
898
899                 var method = getURLParam('method');
900
901                 if (method == 'editFeed') {
902                         var param = getURLParam('methodparam');
903
904                         window.setTimeout('editFeed(' + param + ')', 100);
905                 }
906
907                 setTimeout("hotkey_prefix_timeout()", 5*1000);
908
909         } catch (e) {
910                 exception_error("init_second_stage", e);
911         }
912 }
913
914 function init() {
915
916         try {
917
918                 require(["dojo/_base/kernel",
919                         "dojo/ready",
920                         "dojo/parser",
921                         "dojo/_base/loader",
922                         "dijit/ColorPalette",
923                         "dijit/Dialog",
924                         "dijit/form/Button",
925                         "dijit/form/CheckBox",
926                         "dijit/form/DropDownButton",
927                         "dijit/form/FilteringSelect",
928                         "dijit/form/Form",
929                         "dijit/form/RadioButton",
930                         "dijit/form/ComboButton",
931                         "dijit/form/Select",
932                         "dijit/form/SimpleTextarea",
933                         "dijit/form/TextBox",
934                         "dijit/form/ValidationTextBox",
935                         "dijit/InlineEditBox",
936                         "dijit/layout/AccordionContainer",
937                         "dijit/layout/AccordionPane",
938                         "dijit/layout/BorderContainer",
939                         "dijit/layout/ContentPane",
940                         "dijit/layout/TabContainer",
941                         "dijit/Menu",
942                         "dijit/ProgressBar",
943                         "dijit/Toolbar",
944                         "dijit/Tree",
945                         "dijit/tree/dndSource",
946                         "dojo/data/ItemFileWriteStore"], function (dojo, ready, parser) {
947
948                                 ready(function() {
949
950                                         dojo.require("lib.CheckBoxTree");
951                                         dojo.require("fox.PrefFeedTree");
952                                         dojo.require("fox.PrefFilterTree");
953                                         dojo.require("fox.PrefLabelTree");
954
955                                         parser.parse();
956
957                                         loading_set_progress(50);
958
959                                         var clientTzOffset = new Date().getTimezoneOffset() * 60;
960
961                                         new Ajax.Request("backend.php", {
962                                                 parameters: {op: "rpc", method: "sanityCheck",
963                                                         clientTzOffset: clientTzOffset },
964                                                 onComplete: function(transport) {
965                                                         backend_sanity_check_callback(transport);
966                                                 } });
967                                 });
968                         });
969
970         } catch (e) {
971                 exception_error("init", e);
972         }
973 }
974
975 function validatePrefsReset() {
976         try {
977                 var ok = confirm(__("Reset to defaults?"));
978
979                 if (ok) {
980
981                         query = "?op=pref-prefs&method=resetconfig";
982                         console.log(query);
983
984                         new Ajax.Request("backend.php", {
985                                 parameters: query,
986                                 onComplete: function(transport) {
987                                         updatePrefsList();
988                                         notify_info(transport.responseText);
989                                 } });
990
991                 }
992
993         } catch (e) {
994                 exception_error("validatePrefsReset", e);
995         }
996
997         return false;
998
999 }
1000
1001 function pref_hotkey_handler(e) {
1002         try {
1003
1004                 if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
1005
1006                 var keycode = false;
1007                 var shift_key = false;
1008
1009                 var cmdline = $('cmdline');
1010
1011                 try {
1012                         shift_key = e.shiftKey;
1013                 } catch (e) {
1014
1015                 }
1016
1017                 if (window.event) {
1018                         keycode = window.event.keyCode;
1019                 } else if (e) {
1020                         keycode = e.which;
1021                 }
1022
1023                 var keychar = String.fromCharCode(keycode);
1024
1025                 if (keycode == 27) { // escape
1026                         hotkey_prefix = false;
1027                 }
1028
1029                 if (keycode == 16) return; // ignore lone shift
1030                 if (keycode == 17) return; // ignore lone ctrl
1031
1032                 if (!shift_key) keychar = keychar.toLowerCase();
1033
1034                 var hotkeys = getInitParam("hotkeys");
1035
1036                 if (!hotkey_prefix && hotkeys[0].indexOf(keychar) != -1) {
1037
1038                         var date = new Date();
1039                         var ts = Math.round(date.getTime() / 1000);
1040
1041                         hotkey_prefix = keychar;
1042                         hotkey_prefix_pressed = ts;
1043
1044                         cmdline.innerHTML = keychar;
1045                         Element.show(cmdline);
1046
1047                         return true;
1048                 }
1049
1050                 Element.hide(cmdline);
1051
1052                 var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
1053                 hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
1054                 hotkey_prefix = false;
1055
1056                 var hotkey_action = false;
1057                 var hotkeys = getInitParam("hotkeys");
1058
1059                 for (sequence in hotkeys[1]) {
1060                         if (sequence == hotkey) {
1061                                 hotkey_action = hotkeys[1][sequence];
1062                                 break;
1063                         }
1064                 }
1065
1066                 switch (hotkey_action) {
1067                 case "feed_subscribe":
1068                         quickAddFeed();
1069                         return false;
1070                 case "create_label":
1071                         addLabel();
1072                         return false;
1073                 case "create_filter":
1074                         quickAddFilter();
1075                         return false;
1076                 case "help_dialog":
1077                         //helpDialog("prefs");
1078                         return false;
1079                 default:
1080                         console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey);
1081                 }
1082
1083         } catch (e) {
1084                 exception_error("hotkey_handler", e);
1085         }
1086 }
1087
1088 function removeCategory(id, item) {
1089         try {
1090
1091                 var ok = confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item.name));
1092
1093                 if (ok) {
1094                         var query = "?op=pref-feeds&method=removeCat&ids="+
1095                                 param_escape(id);
1096
1097                         notify_progress("Removing category...");
1098
1099                         new Ajax.Request("backend.php", {
1100                                 parameters: query,
1101                                 onComplete: function(transport) {
1102                                         notify('');
1103                                         updateFeedList();
1104                                 } });
1105                         }
1106
1107         } catch (e) {
1108                 exception_error("removeCategory", e);
1109         }
1110 }
1111
1112 function removeSelectedCategories() {
1113
1114         var sel_rows = getSelectedCategories();
1115
1116         if (sel_rows.length > 0) {
1117
1118                 var ok = confirm(__("Remove selected categories?"));
1119
1120                 if (ok) {
1121                         notify_progress("Removing selected categories...");
1122
1123                         var query = "?op=pref-feeds&method=removeCat&ids="+
1124                                 param_escape(sel_rows.toString());
1125
1126                         new Ajax.Request("backend.php", {
1127                                 parameters: query,
1128                                 onComplete: function(transport) {
1129                                                 updateFeedList();
1130                                         } });
1131
1132                 }
1133         } else {
1134                 alert(__("No categories are selected."));
1135         }
1136
1137         return false;
1138 }
1139
1140 function createCategory() {
1141         try {
1142                 var title = prompt(__("Category title:"));
1143
1144                 if (title) {
1145
1146                         notify_progress("Creating category...");
1147
1148                         var query = "?op=pref-feeds&method=addCat&cat=" +
1149                                 param_escape(title);
1150
1151                         new Ajax.Request("backend.php", {
1152                                 parameters: query,
1153                                 onComplete: function(transport) {
1154                                         notify('');
1155                                         updateFeedList();
1156                                 } });
1157                 }
1158
1159         } catch (e) {
1160                 exception_error("createCategory", e);
1161         }
1162 }
1163
1164 function showInactiveFeeds() {
1165         try {
1166                 var query = "backend.php?op=pref-feeds&method=inactiveFeeds";
1167
1168                 if (dijit.byId("inactiveFeedsDlg"))
1169                         dijit.byId("inactiveFeedsDlg").destroyRecursive();
1170
1171                 dialog = new dijit.Dialog({
1172                         id: "inactiveFeedsDlg",
1173                         title: __("Feeds without recent updates"),
1174                         style: "width: 600px",
1175                         getSelectedFeeds: function() {
1176                                 return getSelectedTableRowIds("prefInactiveFeedList");
1177                         },
1178                         removeSelected: function() {
1179                                 var sel_rows = this.getSelectedFeeds();
1180
1181                                 console.log(sel_rows);
1182
1183                                 if (sel_rows.length > 0) {
1184                                         var ok = confirm(__("Remove selected feeds?"));
1185
1186                                         if (ok) {
1187                                                 notify_progress("Removing selected feeds...", true);
1188
1189                                                 var query = "?op=pref-feeds&method=remove&ids="+
1190                                                         param_escape(sel_rows.toString());
1191
1192                                                 new Ajax.Request("backend.php", {
1193                                                         parameters: query,
1194                                                         onComplete: function(transport) {
1195                                                                 notify('');
1196                                                                 dialog.hide();
1197                                                                 updateFeedList();
1198                                                         } });
1199                                         }
1200
1201                                 } else {
1202                                         alert(__("No feeds are selected."));
1203                                 }
1204                         },
1205                         execute: function() {
1206                                 if (this.validate()) {
1207                                 }
1208                         },
1209                         href: query});
1210
1211                 dialog.show();
1212
1213         } catch (e) {
1214                 exception_error("showInactiveFeeds", e);
1215         }
1216
1217 }
1218
1219 function opmlRegenKey() {
1220
1221         try {
1222                 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
1223
1224                 if (ok) {
1225
1226                         notify_progress("Trying to change address...", true);
1227
1228                         var query = "?op=pref-feeds&method=regenOPMLKey";
1229
1230                         new Ajax.Request("backend.php", {
1231                                 parameters: query,
1232                                 onComplete: function(transport) {
1233                                                 var reply = JSON.parse(transport.responseText);
1234
1235                                                 var new_link = reply.link;
1236
1237                                                 var e = $('pub_opml_url');
1238
1239                                                 if (new_link) {
1240                                                         e.href = new_link;
1241                                                         e.innerHTML = new_link;
1242
1243                                                         new Effect.Highlight(e);
1244
1245                                                         notify('');
1246
1247                                                 } else {
1248                                                         notify_error("Could not change feed URL.");
1249                                                 }
1250                                 } });
1251                 }
1252         } catch (e) {
1253                 exception_error("opmlRegenKey", e);
1254         }
1255         return false;
1256 }
1257
1258 function feedActionChange() {
1259         try {
1260                 var chooser = $("feedActionChooser");
1261                 var opid = chooser[chooser.selectedIndex].value;
1262
1263                 chooser.selectedIndex = 0;
1264                 feedActionGo(opid);
1265         } catch (e) {
1266                 exception_error("feedActionChange", e);
1267         }
1268 }
1269
1270 function feedActionGo(op) {
1271         try {
1272                 if (op == "facEdit") {
1273
1274                         var rows = getSelectedFeeds();
1275
1276                         if (rows.length > 1) {
1277                                 editSelectedFeeds();
1278                         } else {
1279                                 editSelectedFeed();
1280                         }
1281                 }
1282
1283                 if (op == "facClear") {
1284                         clearSelectedFeeds();
1285                 }
1286
1287                 if (op == "facPurge") {
1288                         purgeSelectedFeeds();
1289                 }
1290
1291                 if (op == "facEditCats") {
1292                         editFeedCats();
1293                 }
1294
1295                 if (op == "facRescore") {
1296                         rescoreSelectedFeeds();
1297                 }
1298
1299                 if (op == "facUnsubscribe") {
1300                         removeSelectedFeeds();
1301                 }
1302
1303         } catch (e) {
1304                 exception_error("feedActionGo", e);
1305
1306         }
1307 }
1308
1309 function clearFeedArticles(feed_id) {
1310
1311         notify_progress("Clearing feed...");
1312
1313         var query = "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id;
1314
1315         new Ajax.Request("backend.php", {
1316                 parameters: query,
1317                 onComplete: function(transport) {
1318                                 notify('');
1319                         } });
1320
1321         return false;
1322 }
1323
1324 function rescoreSelectedFeeds() {
1325
1326         var sel_rows = getSelectedFeeds();
1327
1328         if (sel_rows.length > 0) {
1329
1330                 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1331                 var ok = confirm(__("Rescore articles in selected feeds?"));
1332
1333                 if (ok) {
1334                         notify_progress("Rescoring selected feeds...", true);
1335
1336                         var query = "?op=pref-feeds&method=rescore&quiet=1&ids="+
1337                                 param_escape(sel_rows.toString());
1338
1339                         new Ajax.Request("backend.php", {
1340                                 parameters: query,
1341                                 onComplete: function(transport) {
1342                                                 notify_callback2(transport);
1343                         } });
1344
1345                 }
1346         } else {
1347                 alert(__("No feeds are selected."));
1348         }
1349
1350         return false;
1351 }
1352
1353 function rescore_all_feeds() {
1354         var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
1355
1356         if (ok) {
1357                 notify_progress("Rescoring feeds...", true);
1358
1359                 var query = "?op=pref-feeds&method=rescoreAll&quiet=1";
1360
1361                 new Ajax.Request("backend.php", {
1362                         parameters: query,
1363                         onComplete: function(transport) {
1364                                         notify_callback2(transport);
1365                 } });
1366         }
1367 }
1368
1369 function labelColorReset() {
1370         try {
1371                 var labels = getSelectedLabels();
1372
1373                 if (labels.length > 0) {
1374                         var ok = confirm(__("Reset selected labels to default colors?"));
1375
1376                         if (ok) {
1377                                 var query = "?op=pref-labels&method=colorreset&ids="+
1378                                         param_escape(labels.toString());
1379
1380                                 new Ajax.Request("backend.php", {
1381                                         parameters: query,
1382                                         onComplete: function(transport) {
1383                                                 updateLabelList();
1384                                         } });
1385                         }
1386
1387                 } else {
1388                         alert(__("No labels are selected."));
1389                 }
1390
1391         } catch (e) {
1392                 exception_error("labelColorReset", e);
1393         }
1394 }
1395
1396
1397 function inPreferences() {
1398         return true;
1399 }
1400
1401 function editProfiles() {
1402         try {
1403
1404                 if (dijit.byId("profileEditDlg"))
1405                         dijit.byId("profileEditDlg").destroyRecursive();
1406
1407                 var query = "backend.php?op=pref-prefs&method=editPrefProfiles";
1408
1409                 dialog = new dijit.Dialog({
1410                         id: "profileEditDlg",
1411                         title: __("Settings Profiles"),
1412                         style: "width: 600px",
1413                         getSelectedProfiles: function() {
1414                                 return getSelectedTableRowIds("prefFeedProfileList");
1415                         },
1416                         removeSelected: function() {
1417                                 var sel_rows = this.getSelectedProfiles();
1418
1419                                 if (sel_rows.length > 0) {
1420                                         var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
1421
1422                                         if (ok) {
1423                                                 notify_progress("Removing selected profiles...", true);
1424
1425                                                 var query = "?op=rpc&method=remprofiles&ids="+
1426                                                         param_escape(sel_rows.toString());
1427
1428                                                 new Ajax.Request("backend.php", {
1429                                                         parameters: query,
1430                                                         onComplete: function(transport) {
1431                                                                 notify('');
1432                                                                 editProfiles();
1433                                                         } });
1434
1435                                         }
1436
1437                                 } else {
1438                                         alert(__("No profiles are selected."));
1439                                 }
1440                         },
1441                         activateProfile: function() {
1442                                 var sel_rows = this.getSelectedProfiles();
1443
1444                                 if (sel_rows.length == 1) {
1445
1446                                         var ok = confirm(__("Activate selected profile?"));
1447
1448                                         if (ok) {
1449                                                 notify_progress("Loading, please wait...");
1450
1451                                                 var query = "?op=rpc&method=setprofile&id="+
1452                                                         param_escape(sel_rows.toString());
1453
1454                                                 new Ajax.Request("backend.php", {
1455                                                         parameters: query,
1456                                                         onComplete: function(transport) {
1457                                                                 window.location.reload();
1458                                                         } });
1459                                         }
1460
1461                                 } else {
1462                                         alert(__("Please choose a profile to activate."));
1463                                 }
1464                         },
1465                         addProfile: function() {
1466                                 if (this.validate()) {
1467                                         notify_progress("Creating profile...", true);
1468
1469                                         var query = "?op=rpc&method=addprofile&title=" +
1470                                                 param_escape(dialog.attr('value').newprofile);
1471
1472                                         new Ajax.Request("backend.php", {
1473                                                 parameters: query,
1474                                                 onComplete: function(transport) {
1475                                                         notify('');
1476                                                         editProfiles();
1477                                                 } });
1478
1479                                 }
1480                         },
1481                         execute: function() {
1482                                 if (this.validate()) {
1483                                 }
1484                         },
1485                         href: query});
1486
1487                 dialog.show();
1488         } catch (e) {
1489                 exception_error("editProfiles", e);
1490         }
1491 }
1492
1493 function activatePrefProfile() {
1494
1495         var sel_rows = getSelectedFeedCats();
1496
1497         if (sel_rows.length == 1) {
1498
1499                 var ok = confirm(__("Activate selected profile?"));
1500
1501                 if (ok) {
1502                         notify_progress("Loading, please wait...");
1503
1504                         var query = "?op=rpc&method=setprofile&id="+
1505                                 param_escape(sel_rows.toString());
1506
1507                         new Ajax.Request("backend.php", {
1508                                 parameters: query,
1509                                 onComplete: function(transport) {
1510                                         window.location.reload();
1511                                 } });
1512                 }
1513
1514         } else {
1515                 alert(__("Please choose a profile to activate."));
1516         }
1517
1518         return false;
1519 }
1520
1521 function clearFeedAccessKeys() {
1522
1523         var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
1524
1525         if (ok) {
1526                 notify_progress("Clearing URLs...");
1527
1528                 var query = "?op=pref-feeds&method=clearKeys";
1529
1530                 new Ajax.Request("backend.php", {
1531                         parameters: query,
1532                         onComplete: function(transport) {
1533                                 notify_info("Generated URLs cleared.");
1534                         } });
1535         }
1536
1537         return false;
1538 }
1539
1540 function resetFilterOrder() {
1541         try {
1542                 notify_progress("Loading, please wait...");
1543
1544                 new Ajax.Request("backend.php", {
1545                         parameters: "?op=pref-filters&method=filtersortreset",
1546                         onComplete: function(transport) {
1547                                 updateFilterList();
1548                         } });
1549
1550
1551         } catch (e) {
1552                 exception_error("resetFilterOrder");
1553         }
1554 }
1555
1556
1557 function resetFeedOrder() {
1558         try {
1559                 notify_progress("Loading, please wait...");
1560
1561                 new Ajax.Request("backend.php", {
1562                         parameters: "?op=pref-feeds&method=feedsortreset",
1563                         onComplete: function(transport) {
1564                                 updateFeedList();
1565                         } });
1566
1567
1568         } catch (e) {
1569                 exception_error("resetFeedOrder");
1570         }
1571 }
1572
1573 function resetCatOrder() {
1574         try {
1575                 notify_progress("Loading, please wait...");
1576
1577                 new Ajax.Request("backend.php", {
1578                         parameters: "?op=pref-feeds&method=catsortreset",
1579                         onComplete: function(transport) {
1580                                 updateFeedList();
1581                         } });
1582
1583
1584         } catch (e) {
1585                 exception_error("resetCatOrder");
1586         }
1587 }
1588
1589 function editCat(id, item, event) {
1590         try {
1591                 var new_name = prompt(__('Rename category to:'), item.name);
1592
1593                 if (new_name && new_name != item.name) {
1594
1595                         notify_progress("Loading, please wait...");
1596
1597                         new Ajax.Request("backend.php", {
1598                         parameters: {
1599                                 op: 'pref-feeds',
1600                                 method: 'renamecat',
1601                                 id: id,
1602                                 title: new_name,
1603                         },
1604                         onComplete: function(transport) {
1605                                 updateFeedList();
1606                         } });
1607                 }
1608
1609         } catch (e) {
1610                 exception_error("editCat", e);
1611         }
1612 }
1613
1614 function editLabel(id, event) {
1615         try {
1616                 var query = "backend.php?op=pref-labels&method=edit&id=" +
1617                         param_escape(id);
1618
1619                 if (dijit.byId("labelEditDlg"))
1620                         dijit.byId("labelEditDlg").destroyRecursive();
1621
1622                 dialog = new dijit.Dialog({
1623                         id: "labelEditDlg",
1624                         title: __("Label Editor"),
1625                         style: "width: 600px",
1626                         setLabelColor: function(id, fg, bg) {
1627
1628                                 var kind = '';
1629                                 var color = '';
1630
1631                                 if (fg && bg) {
1632                                         kind = 'both';
1633                                 } else if (fg) {
1634                                         kind = 'fg';
1635                                         color = fg;
1636                                 } else if (bg) {
1637                                         kind = 'bg';
1638                                         color = bg;
1639                                 }
1640
1641                                 var query = "?op=pref-labels&method=colorset&kind="+kind+
1642                                         "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
1643                                         "&bg=" + param_escape(bg) + "&color=" + param_escape(color);
1644
1645                 //              console.log(query);
1646
1647                                 var e = $("LICID-" + id);
1648
1649                                 if (e) {
1650                                         if (fg) e.style.color = fg;
1651                                         if (bg) e.style.backgroundColor = bg;
1652                                 }
1653
1654                                 new Ajax.Request("backend.php", { parameters: query });
1655
1656                                 updateFilterList();
1657                         },
1658                         execute: function() {
1659                                 if (this.validate()) {
1660                                         var caption = this.attr('value').caption;
1661                                         var fg_color = this.attr('value').fg_color;
1662                                         var bg_color = this.attr('value').bg_color;
1663                                         var query = dojo.objectToQuery(this.attr('value'));
1664
1665                                         dijit.byId('labelTree').setNameById(id, caption);
1666                                         this.setLabelColor(id, fg_color, bg_color);
1667                                         this.hide();
1668
1669                                         new Ajax.Request("backend.php", {
1670                                                 parameters: query,
1671                                                 onComplete: function(transport) {
1672                                                         updateFilterList();
1673                                         } });
1674                                 }
1675                         },
1676                         href: query});
1677
1678                 dialog.show();
1679
1680         } catch (e) {
1681                 exception_error("editLabel", e);
1682         }
1683 }
1684
1685
1686 function customizeCSS() {
1687         try {
1688                 var query = "backend.php?op=pref-prefs&method=customizeCSS";
1689
1690                 if (dijit.byId("cssEditDlg"))
1691                         dijit.byId("cssEditDlg").destroyRecursive();
1692
1693                 dialog = new dijit.Dialog({
1694                         id: "cssEditDlg",
1695                         title: __("Customize stylesheet"),
1696                         style: "width: 600px",
1697                         execute: function() {
1698                                 notify_progress('Saving data...', true);
1699                                 new Ajax.Request("backend.php", {
1700                                         parameters: dojo.objectToQuery(this.attr('value')),
1701                                         onComplete: function(transport) {
1702                                                 notify('');
1703                                                 window.location.reload();
1704                                 } });
1705
1706                         },
1707                         href: query});
1708
1709                 dialog.show();
1710
1711         } catch (e) {
1712                 exception_error("customizeCSS", e);
1713         }
1714 }
1715
1716 function insertSSLserial(value) {
1717         try {
1718                 dijit.byId("SSL_CERT_SERIAL").attr('value', value);
1719         } catch (e) {
1720                 exception_error("insertSSLcerial", e);
1721         }
1722 }
1723
1724 function gotoExportOpml(filename, settings) {
1725         tmp = settings ? 1 : 0;
1726         document.location.href = "backend.php?op=opml&method=export&filename=" + filename + "&settings=" + tmp;
1727 }
1728
1729
1730 function batchSubscribe() {
1731         try {
1732                 var query = "backend.php?op=pref-feeds&method=batchSubscribe";
1733
1734                 // overlapping widgets
1735                 if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
1736                 if (dijit.byId("feedAddDlg"))   dijit.byId("feedAddDlg").destroyRecursive();
1737
1738                 var dialog = new dijit.Dialog({
1739                         id: "batchSubDlg",
1740                         title: __("Batch subscribe"),
1741                         style: "width: 600px",
1742                         execute: function() {
1743                                 if (this.validate()) {
1744                                         console.log(dojo.objectToQuery(this.attr('value')));
1745
1746                                         notify_progress(__("Subscribing to feeds..."), true);
1747
1748                                         new Ajax.Request("backend.php", {
1749                                                 parameters: dojo.objectToQuery(this.attr('value')),
1750                                                 onComplete: function(transport) {
1751                                                         notify("");
1752                                                         updateFeedList();
1753                                                         dialog.hide();
1754                                                 } });
1755                                         }
1756                         },
1757                         href: query});
1758
1759                 dialog.show();
1760         } catch (e) {
1761                 exception_error("batchSubscribe", e);
1762         }
1763 }
1764
1765
1766 function toggleAdvancedPrefs() {
1767         try {
1768                 notify_progress("Loading, please wait...");
1769
1770                 new Ajax.Request("backend.php", {
1771                         parameters: "?op=pref-prefs&method=toggleadvanced",
1772                         onComplete: function(transport) {
1773                                 updatePrefsList();
1774                         } });
1775
1776         } catch (e) {
1777                 exception_error("toggleAdvancedPrefs", e);
1778         }
1779 }
1780
1781 function clearPluginData(name) {
1782         try {
1783                 if (confirm(__("Clear stored data for this plugin?"))) {
1784                         notify_progress("Loading, please wait...");
1785
1786                         new Ajax.Request("backend.php", {
1787                                 parameters: "?op=pref-prefs&method=clearplugindata&name=" + param_escape(name),
1788                                 onComplete: function(transport) {
1789                                         notify('');
1790                                         updatePrefsList();
1791                                 } });
1792                 }
1793         } catch (e) {
1794                 exception_error("clearPluginData", e);
1795         }
1796 }
1797
1798 function clearSqlLog() {
1799
1800         if (confirm(__("Clear all messages in the error log?"))) {
1801
1802                 notify_progress("Loading, please wait...");
1803                 var query = "?op=pref-system&method=clearLog";
1804
1805                 new Ajax.Request("backend.php", {
1806                         parameters: query,
1807                         onComplete: function(transport) {
1808                                 updateSystemList();
1809                         } });
1810
1811         }
1812 }
1813
1814