]>
git.wh0rd.org - tt-rss.git/blob - js/prefs.js
1 var init_params
= new Array();
3 var hotkey_prefix
= false;
4 var hotkey_prefix_pressed
= false;
8 function notify_callback2(transport
, sticky
) {
9 notify_info(transport
.responseText
, sticky
);
12 function updateFeedList(sort_key
) {
14 var user_search
= $("feed_search");
16 if (user_search
) { search
= user_search
.value
; }
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);
27 function checkInactiveFeeds() {
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
);
38 exception_error("checkInactiveFeeds", e
);
42 function updateUsersList(sort_key
) {
44 var user_search
= $("user_search");
46 if (user_search
) { search
= user_search
.value
; }
48 var query
= "?op=pref-users&sort="
49 + param_escape(sort_key
) +
50 "&search=" + param_escape(search
);
52 new Ajax
.Request("backend.php", {
54 onComplete: function(transport
) {
55 dijit
.byId('userConfigTab').attr('content', transport
.responseText
);
56 selectTab("userConfig", true)
61 exception_error("updateUsersList", e
);
69 var login
= prompt(__("Please enter login:"), "");
76 alert(__("Can't create user: no login specified."));
80 notify_progress("Adding user...");
82 var query
= "?op=pref-users&method=add&login=" +
85 new Ajax
.Request("backend.php", {
87 onComplete: function(transport
) {
88 notify_callback2(transport
);
93 exception_error("addUser", e
);
97 function editUser(id
, event
) {
100 var query
= "backend.php?op=pref-users&method=edit&id=" +
103 if (dijit
.byId("userEditDlg"))
104 dijit
.byId("userEditDlg").destroyRecursive();
106 dialog
= new dijit
.Dialog({
108 title
: __("User Editor"),
109 style
: "width: 600px",
110 execute: function() {
111 if (this.validate()) {
112 notify_progress("Saving data...", true);
114 var query
= dojo
.formToQuery("user_edit_form");
116 new Ajax
.Request("backend.php", {
118 onComplete: function(transport
) {
129 exception_error("editUser", e
);
134 function editFilterTest(query
) {
137 if (dijit
.byId("filterTestDlg"))
138 dijit
.byId("filterTestDlg").destroyRecursive();
140 var test_dlg
= new dijit
.Dialog({
142 title
: "Test Filter",
143 style
: "width: 600px",
147 getTestResults: function(query
, offset
) {
148 var updquery
= query
+ "&offset=" + offset
+ "&limit=" + test_dlg
.limit
;
150 console
.log("getTestResults:" + offset
);
152 new Ajax
.Request("backend.php", {
153 parameters
: updquery
,
154 onComplete: function (transport
) {
156 var result
= JSON
.parse(transport
.responseText
);
158 if (result
&& dijit
.byId("filterTestDlg") && dijit
.byId("filterTestDlg").open
) {
159 test_dlg
.results
+= result
.size();
161 console
.log("got results:" + result
.size());
163 $("prefFilterProgressMsg").innerHTML
= __("Looking for articles (%d processed, %f found)...")
164 .replace("%f", test_dlg
.results
)
165 .replace("%d", offset
);
167 console
.log(offset
+ " " + test_dlg
.max_offset
);
169 for (var i
= 0; i
< result
.size(); i
++) {
170 var tmp
= new Element("table");
171 tmp
.innerHTML
= result
[i
];
172 dojo
.parser
.parse(tmp
);
174 $("prefFilterTestResultList").innerHTML
+= tmp
.innerHTML
;
177 if (test_dlg
.results
< 30 && offset
< test_dlg
.max_offset
) {
179 // get the next batch
180 window
.setTimeout(function () {
181 test_dlg
.getTestResults(query
, offset
+ test_dlg
.limit
);
187 Element
.hide("prefFilterLoadingIndicator");
189 if (test_dlg
.results
== 0) {
190 $("prefFilterTestResultList").innerHTML
= "<tr><td align='center'>No recent articles matching this filter have been found.</td></tr>";
191 $("prefFilterProgressMsg").innerHTML
= "Articles matching this filter:";
193 $("prefFilterProgressMsg").innerHTML
= __("Found %d articles matching this filter:")
194 .replace("%d", test_dlg
.results
);
199 } else if (!result
) {
200 console
.log("getTestResults: can't parse results object");
202 Element
.hide("prefFilterLoadingIndicator");
204 notify_error("Error while trying to get filter test results.");
207 console
.log("getTestResults: dialog closed, bailing out.");
210 exception_error("editFilterTest/inner", e
);
217 dojo
.connect(test_dlg
, "onLoad", null, function(e
) {
218 test_dlg
.getTestResults(query
, 0);
224 exception_error("editFilterTest", e
);
228 function editFilter(id
) {
231 var query
= "backend.php?op=pref-filters&method=edit&id=" + param_escape(id
);
233 if (dijit
.byId("feedEditDlg"))
234 dijit
.byId("feedEditDlg").destroyRecursive();
236 if (dijit
.byId("filterEditDlg"))
237 dijit
.byId("filterEditDlg").destroyRecursive();
239 dialog
= new dijit
.Dialog({
241 title
: __("Edit Filter"),
242 style
: "width: 600px",
245 var query
= "backend.php?" + dojo
.formToQuery("filter_edit_form") + "&savemode=test";
247 editFilterTest(query
);
249 selectRules: function(select
) {
250 $$("#filterDlg_Matches input[type=checkbox]").each(function(e
) {
253 e
.parentNode
.addClassName("Selected");
255 e
.parentNode
.removeClassName("Selected");
258 selectActions: function(select
) {
259 $$("#filterDlg_Actions input[type=checkbox]").each(function(e
) {
263 e
.parentNode
.addClassName("Selected");
265 e
.parentNode
.removeClassName("Selected");
269 editRule: function(e
) {
270 var li
= e
.parentNode
;
271 var rule
= li
.getElementsByTagName("INPUT")[1].value
;
272 addFilterRule(li
, rule
);
274 editAction: function(e
) {
275 var li
= e
.parentNode
;
276 var action
= li
.getElementsByTagName("INPUT")[1].value
;
277 addFilterAction(li
, action
);
279 removeFilter: function() {
280 var msg
= __("Remove filter?");
285 notify_progress("Removing filter...");
287 var id
= this.attr('value').id
;
289 var query
= "?op=pref-filters&method=remove&ids="+
292 new Ajax
.Request("backend.php", {
294 onComplete: function(transport
) {
299 addAction: function() { addFilterAction(); },
300 addRule: function() { addFilterRule(); },
301 deleteAction: function() {
302 $$("#filterDlg_Actions li.[class*=Selected]").each(function(e
) { e
.parentNode
.removeChild(e
) });
304 deleteRule: function() {
305 $$("#filterDlg_Matches li.[class*=Selected]").each(function(e
) { e
.parentNode
.removeChild(e
) });
307 execute: function() {
308 if (this.validate()) {
310 notify_progress("Saving data...", true);
312 var query
= dojo
.formToQuery("filter_edit_form");
316 new Ajax
.Request("backend.php", {
318 onComplete: function(transport
) {
330 exception_error("editFilter", e
);
334 function getSelectedLabels() {
335 var tree
= dijit
.byId("labelTree");
336 var items
= tree
.model
.getCheckedItems();
339 items
.each(function(item
) {
340 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
346 function getSelectedUsers() {
347 return getSelectedTableRowIds("prefUserList");
350 function getSelectedFeeds() {
351 var tree
= dijit
.byId("feedTree");
352 var items
= tree
.model
.getCheckedItems();
355 items
.each(function(item
) {
356 if (item
.id
[0].match("FEED:"))
357 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
363 function getSelectedCategories() {
364 var tree
= dijit
.byId("feedTree");
365 var items
= tree
.model
.getCheckedItems();
368 items
.each(function(item
) {
369 if (item
.id
[0].match("CAT:"))
370 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
376 function getSelectedFilters() {
377 var tree
= dijit
.byId("filterTree");
378 var items
= tree
.model
.getCheckedItems();
381 items
.each(function(item
) {
382 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
389 function removeSelectedLabels() {
391 var sel_rows
= getSelectedLabels();
393 if (sel_rows
.length
> 0) {
395 var ok
= confirm(__("Remove selected labels?"));
398 notify_progress("Removing selected labels...");
400 var query
= "?op=pref-labels&method=remove&ids="+
401 param_escape(sel_rows
.toString());
403 new Ajax
.Request("backend.php", {
405 onComplete: function(transport
) {
411 alert(__("No labels are selected."));
417 function removeSelectedUsers() {
421 var sel_rows
= getSelectedUsers();
423 if (sel_rows
.length
> 0) {
425 var ok
= confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
428 notify_progress("Removing selected users...");
430 var query
= "?op=pref-users&method=remove&ids="+
431 param_escape(sel_rows
.toString());
433 new Ajax
.Request("backend.php", {
435 onComplete: function(transport
) {
442 alert(__("No users are selected."));
446 exception_error("removeSelectedUsers", e
);
452 function removeSelectedFilters() {
456 var sel_rows
= getSelectedFilters();
458 if (sel_rows
.length
> 0) {
460 var ok
= confirm(__("Remove selected filters?"));
463 notify_progress("Removing selected filters...");
465 var query
= "?op=pref-filters&method=remove&ids="+
466 param_escape(sel_rows
.toString());
468 new Ajax
.Request("backend.php", {
470 onComplete: function(transport
) {
475 alert(__("No filters are selected."));
479 exception_error("removeSelectedFilters", e
);
486 function removeSelectedFeeds() {
490 var sel_rows
= getSelectedFeeds();
492 if (sel_rows
.length
> 0) {
494 var ok
= confirm(__("Unsubscribe from selected feeds?"));
498 notify_progress("Unsubscribing from selected feeds...", true);
500 var query
= "?op=pref-feeds&method=remove&ids="+
501 param_escape(sel_rows
.toString());
505 new Ajax
.Request("backend.php", {
507 onComplete: function(transport
) {
513 alert(__("No feeds are selected."));
517 exception_error("removeSelectedFeeds", e
);
523 function clearSelectedFeeds() {
525 var sel_rows
= getSelectedFeeds();
527 if (sel_rows
.length
> 1) {
528 alert(__("Please select only one feed."));
532 if (sel_rows
.length
> 0) {
534 var ok
= confirm(__("Erase all non-starred articles in selected feed?"));
537 notify_progress("Clearing selected feed...");
538 clearFeedArticles(sel_rows
[0]);
543 alert(__("No feeds are selected."));
550 function purgeSelectedFeeds() {
552 var sel_rows
= getSelectedFeeds();
554 if (sel_rows
.length
> 0) {
556 var pr
= prompt(__("How many days of articles to keep (0 - use default)?"), "0");
558 if (pr
!= undefined) {
559 notify_progress("Purging selected feed...");
561 var query
= "?op=rpc&method=purge&ids="+
562 param_escape(sel_rows
.toString()) + "&days=" + pr
;
566 new Ajax
.Request("prefs.php", {
568 onComplete: function(transport
) {
575 alert(__("No feeds are selected."));
582 function editSelectedUser() {
583 var rows
= getSelectedUsers();
585 if (rows
.length
== 0) {
586 alert(__("No users are selected."));
590 if (rows
.length
> 1) {
591 alert(__("Please select only one user."));
600 function resetSelectedUserPass() {
604 var rows
= getSelectedUsers();
606 if (rows
.length
== 0) {
607 alert(__("No users are selected."));
611 if (rows
.length
> 1) {
612 alert(__("Please select only one user."));
616 var ok
= confirm(__("Reset password of selected user?"));
619 notify_progress("Resetting password for selected user...");
623 var query
= "?op=pref-users&method=resetPass&id=" +
626 new Ajax
.Request("backend.php", {
628 onComplete: function(transport
) {
629 notify_info(transport
.responseText
, true);
635 exception_error("resetSelectedUserPass", e
);
639 function selectedUserDetails() {
643 var rows
= getSelectedUsers();
645 if (rows
.length
== 0) {
646 alert(__("No users are selected."));
650 if (rows
.length
> 1) {
651 alert(__("Please select only one user."));
657 var query
= "backend.php?op=pref-users&method=userdetails&id=" + id
;
659 if (dijit
.byId("userDetailsDlg"))
660 dijit
.byId("userDetailsDlg").destroyRecursive();
662 dialog
= new dijit
.Dialog({
663 id
: "userDetailsDlg",
664 title
: __("User details"),
665 style
: "width: 600px",
666 execute: function() {
674 exception_error("selectedUserDetails", e
);
679 function editSelectedFilter() {
680 var rows
= getSelectedFilters();
682 if (rows
.length
== 0) {
683 alert(__("No filters are selected."));
687 if (rows
.length
> 1) {
688 alert(__("Please select only one filter."));
698 function joinSelectedFilters() {
699 var rows
= getSelectedFilters();
701 if (rows
.length
== 0) {
702 alert(__("No filters are selected."));
706 var ok
= confirm(__("Combine selected filters?"));
709 notify_progress("Joining filters...");
711 var query
= "?op=pref-filters&method=join&ids="+
712 param_escape(rows
.toString());
716 new Ajax
.Request("backend.php", {
718 onComplete: function(transport
) {
724 function editSelectedFeed() {
725 var rows
= getSelectedFeeds();
727 if (rows
.length
== 0) {
728 alert(__("No feeds are selected."));
732 if (rows
.length
> 1) {
733 return editSelectedFeeds();
738 editFeed(rows
[0], {});
742 function editSelectedFeeds() {
745 var rows
= getSelectedFeeds();
747 if (rows
.length
== 0) {
748 alert(__("No feeds are selected."));
752 notify_progress("Loading, please wait...");
754 var query
= "backend.php?op=pref-feeds&method=editfeeds&ids=" +
755 param_escape(rows
.toString());
759 if (dijit
.byId("feedEditDlg"))
760 dijit
.byId("feedEditDlg").destroyRecursive();
762 new Ajax
.Request("backend.php", {
764 onComplete: function(transport
) {
768 var dialog
= new dijit
.Dialog({
770 title
: __("Edit Multiple Feeds"),
771 style
: "width: 600px",
772 getChildByName: function (name
) {
774 this.getChildren().each(
776 if (child
.name
== name
) {
783 toggleField: function (checkbox
, elem
, label
) {
784 this.getChildByName(elem
).attr('disabled', !checkbox
.checked
);
787 if (checkbox
.checked
)
788 $(label
).removeClassName('insensitive');
790 $(label
).addClassName('insensitive');
793 execute: function() {
794 if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
795 var query
= dojo
.objectToQuery(this.attr('value'));
797 /* Form.serialize ignores unchecked checkboxes */
799 if (!query
.match("&private=") &&
800 this.getChildByName('private').attr('disabled') == false) {
801 query
= query
+ "&private=false";
805 if (!query
.match("&cache_images=") &&
806 this.getChildByName('cache_images').attr('disabled') == false) {
807 query
= query
+ "&cache_images=false";
812 if (!query
.match("&hide_images=") &&
813 this.getChildByName('hide_images').attr('disabled') == false) {
814 query
= query
+ "&hide_images=false";
818 if (!query
.match("&include_in_digest=") &&
819 this.getChildByName('include_in_digest').attr('disabled') == false) {
820 query
= query
+ "&include_in_digest=false";
823 if (!query
.match("&always_display_enclosures=") &&
824 this.getChildByName('always_display_enclosures').attr('disabled') == false) {
825 query
= query
+ "&always_display_enclosures=false";
828 if (!query
.match("&mark_unread_on_update=") &&
829 this.getChildByName('mark_unread_on_update').attr('disabled') == false) {
830 query
= query
+ "&mark_unread_on_update=false";
835 notify_progress("Saving data...", true);
837 new Ajax
.Request("backend.php", {
839 onComplete: function(transport
) {
845 content
: transport
.responseText
});
852 exception_error("editSelectedFeeds", e
);
856 function opmlImportComplete(iframe
) {
858 if (!iframe
.contentDocument
.body
.innerHTML
) return false;
860 Element
.show(iframe
);
864 if (dijit
.byId('opmlImportDlg'))
865 dijit
.byId('opmlImportDlg').destroyRecursive();
867 var content
= iframe
.contentDocument
.body
.innerHTML
;
869 dialog
= new dijit
.Dialog({
871 title
: __("OPML Import"),
872 style
: "width: 600px",
873 onCancel: function() {
878 execute: function() {
889 exception_error("opmlImportComplete", e
);
893 function opmlImport() {
895 var opml_file
= $("opml_file");
897 if (opml_file
.value
.length
== 0) {
898 alert(__("Please choose an OPML file first."));
901 notify_progress("Importing, please wait...", true);
903 Element
.show("upload_iframe");
910 function updateFilterList() {
911 var user_search
= $("filter_search");
913 if (user_search
) { search
= user_search
.value
; }
915 new Ajax
.Request("backend.php", {
916 parameters
: "?op=pref-filters&search=" + param_escape(search
),
917 onComplete: function(transport
) {
918 dijit
.byId('filterConfigTab').attr('content', transport
.responseText
);
923 function updateLabelList() {
924 new Ajax
.Request("backend.php", {
925 parameters
: "?op=pref-labels",
926 onComplete: function(transport
) {
927 dijit
.byId('labelConfigTab').attr('content', transport
.responseText
);
932 function updatePrefsList() {
933 new Ajax
.Request("backend.php", {
934 parameters
: "?op=pref-prefs",
935 onComplete: function(transport
) {
936 dijit
.byId('genConfigTab').attr('content', transport
.responseText
);
941 function updateSystemList() {
942 new Ajax
.Request("backend.php", {
943 parameters
: "?op=pref-system",
944 onComplete: function(transport
) {
945 dijit
.byId('systemConfigTab').attr('content', transport
.responseText
);
950 function selectTab(id
, noupdate
, method
) {
953 notify_progress("Loading, please wait...");
955 if (id
== "feedConfig") {
957 } else if (id
== "filterConfig") {
959 } else if (id
== "labelConfig") {
961 } else if (id
== "genConfig") {
963 } else if (id
== "userConfig") {
965 } else if (id
== "systemConfig") {
969 var tab
= dijit
.byId(id
+ "Tab");
970 dijit
.byId("pref-tabs").selectChild(tab
);
975 exception_error("selectTab", e
);
979 function init_second_stage() {
982 document
.onkeydown
= pref_hotkey_handler
;
983 loading_set_progress(50);
986 dojo
.addOnLoad(function() {
987 var tab
= getURLParam('tab');
990 tab
= dijit
.byId(tab
+ "Tab");
991 if (tab
) dijit
.byId("pref-tabs").selectChild(tab
);
994 var method
= getURLParam('method');
996 if (method
== 'editFeed') {
997 var param
= getURLParam('methodparam');
999 window
.setTimeout('editFeed(' + param
+ ')', 100);
1003 setTimeout("hotkey_prefix_timeout()", 5*1000);
1006 exception_error("init_second_stage", e
);
1013 dojo
.registerModulePath("lib", "..");
1014 dojo
.registerModulePath("fox", "../../js/");
1016 dojo
.require("dijit.ColorPalette");
1017 dojo
.require("dijit.Dialog");
1018 dojo
.require("dijit.form.Button");
1019 dojo
.require("dijit.form.CheckBox");
1020 dojo
.require("dijit.form.DropDownButton");
1021 dojo
.require("dijit.form.FilteringSelect");
1022 dojo
.require("dijit.form.Form");
1023 dojo
.require("dijit.form.RadioButton");
1024 dojo
.require("dijit.form.Select");
1025 dojo
.require("dijit.form.SimpleTextarea");
1026 dojo
.require("dijit.form.TextBox");
1027 dojo
.require("dijit.form.ValidationTextBox");
1028 dojo
.require("dijit.InlineEditBox");
1029 dojo
.require("dijit.layout.AccordionContainer");
1030 dojo
.require("dijit.layout.BorderContainer");
1031 dojo
.require("dijit.layout.ContentPane");
1032 dojo
.require("dijit.layout.TabContainer");
1033 dojo
.require("dijit.Menu");
1034 dojo
.require("dijit.ProgressBar");
1035 dojo
.require("dijit.ProgressBar");
1036 dojo
.require("dijit.Toolbar");
1037 dojo
.require("dijit.Tree");
1038 dojo
.require("dijit.tree.dndSource");
1039 dojo
.require("dojo.data.ItemFileWriteStore");
1041 dojo
.require("lib.CheckBoxTree");
1042 dojo
.require("fox.PrefFeedTree");
1043 dojo
.require("fox.PrefFilterTree");
1044 dojo
.require("fox.PrefLabelTree");
1046 dojo
.parser
.parse();
1048 dojo
.addOnLoad(function() {
1049 loading_set_progress(50);
1051 var clientTzOffset
= new Date().getTimezoneOffset() * 60;
1053 new Ajax
.Request("backend.php", {
1054 parameters
: {op
: "rpc", method
: "sanityCheck",
1055 clientTzOffset
: clientTzOffset
},
1056 onComplete: function(transport
) {
1057 backend_sanity_check_callback(transport
);
1062 exception_error("init", e
);
1066 function validatePrefsReset() {
1068 var ok
= confirm(__("Reset to defaults?"));
1072 query
= "?op=pref-prefs&method=resetconfig";
1075 new Ajax
.Request("backend.php", {
1077 onComplete: function(transport
) {
1079 notify_info(transport
.responseText
);
1085 exception_error("validatePrefsReset", e
);
1092 function pref_hotkey_handler(e
) {
1095 if (e
.target
.nodeName
== "INPUT" || e
.target
.nodeName
== "TEXTAREA") return;
1097 var keycode
= false;
1098 var shift_key
= false;
1100 var cmdline
= $('cmdline');
1103 shift_key
= e
.shiftKey
;
1109 keycode
= window
.event
.keyCode
;
1114 var keychar
= String
.fromCharCode(keycode
);
1116 if (keycode
== 27) { // escape
1117 hotkey_prefix
= false;
1120 if (keycode
== 16) return; // ignore lone shift
1121 if (keycode
== 17) return; // ignore lone ctrl
1123 if (!shift_key
) keychar
= keychar
.toLowerCase();
1125 var hotkeys
= getInitParam("hotkeys");
1127 if (!hotkey_prefix
&& hotkeys
[0].indexOf(keychar
) != -1) {
1129 var date
= new Date();
1130 var ts
= Math
.round(date
.getTime() / 1000);
1132 hotkey_prefix
= keychar
;
1133 hotkey_prefix_pressed
= ts
;
1135 cmdline
.innerHTML
= keychar
;
1136 Element
.show(cmdline
);
1141 Element
.hide(cmdline
);
1143 var hotkey
= keychar
.search(/[a-zA-Z0-9]/) != -1 ? keychar
: "(" + keycode
+ ")";
1144 hotkey
= hotkey_prefix
? hotkey_prefix
+ " " + hotkey
: hotkey
;
1145 hotkey_prefix
= false;
1147 var hotkey_action
= false;
1148 var hotkeys
= getInitParam("hotkeys");
1150 for (sequence
in hotkeys
[1]) {
1151 if (sequence
== hotkey
) {
1152 hotkey_action
= hotkeys
[1][sequence
];
1157 switch (hotkey_action
) {
1158 case "feed_subscribe":
1161 case "create_label":
1164 case "create_filter":
1168 //helpDialog("prefs");
1171 console
.log("unhandled action: " + hotkey_action
+ "; hotkey: " + hotkey
);
1175 exception_error("hotkey_handler", e
);
1179 function removeCategory(id
, item
) {
1182 var ok
= confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item
.name
));
1185 var query
= "?op=pref-feeds&method=removeCat&ids="+
1188 notify_progress("Removing category...");
1190 new Ajax
.Request("backend.php", {
1192 onComplete: function(transport
) {
1199 exception_error("removeCategory", e
);
1203 function removeSelectedCategories() {
1205 var sel_rows
= getSelectedCategories();
1207 if (sel_rows
.length
> 0) {
1209 var ok
= confirm(__("Remove selected categories?"));
1212 notify_progress("Removing selected categories...");
1214 var query
= "?op=pref-feeds&method=removeCat&ids="+
1215 param_escape(sel_rows
.toString());
1217 new Ajax
.Request("backend.php", {
1219 onComplete: function(transport
) {
1225 alert(__("No categories are selected."));
1231 function createCategory() {
1233 var title
= prompt(__("Category title:"));
1237 notify_progress("Creating category...");
1239 var query
= "?op=pref-feeds&method=addCat&cat=" +
1240 param_escape(title
);
1242 new Ajax
.Request("backend.php", {
1244 onComplete: function(transport
) {
1251 exception_error("createCategory", e
);
1255 function showInactiveFeeds() {
1257 var query
= "backend.php?op=pref-feeds&method=inactiveFeeds";
1259 if (dijit
.byId("inactiveFeedsDlg"))
1260 dijit
.byId("inactiveFeedsDlg").destroyRecursive();
1262 dialog
= new dijit
.Dialog({
1263 id
: "inactiveFeedsDlg",
1264 title
: __("Feeds without recent updates"),
1265 style
: "width: 600px",
1266 getSelectedFeeds: function() {
1267 return getSelectedTableRowIds("prefInactiveFeedList");
1269 removeSelected: function() {
1270 var sel_rows
= this.getSelectedFeeds();
1272 console
.log(sel_rows
);
1274 if (sel_rows
.length
> 0) {
1275 var ok
= confirm(__("Remove selected feeds?"));
1278 notify_progress("Removing selected feeds...", true);
1280 var query
= "?op=pref-feeds&method=remove&ids="+
1281 param_escape(sel_rows
.toString());
1283 new Ajax
.Request("backend.php", {
1285 onComplete: function(transport
) {
1293 alert(__("No feeds are selected."));
1296 execute: function() {
1297 if (this.validate()) {
1305 exception_error("showInactiveFeeds", e
);
1310 function opmlRegenKey() {
1313 var ok
= confirm(__("Replace current OPML publishing address with a new one?"));
1317 notify_progress("Trying to change address...", true);
1319 var query
= "?op=pref-feeds&method=regenOPMLKey";
1321 new Ajax
.Request("backend.php", {
1323 onComplete: function(transport
) {
1324 var reply
= JSON
.parse(transport
.responseText
);
1326 var new_link
= reply
.link
;
1328 var e
= $('pub_opml_url');
1332 e
.innerHTML
= new_link
;
1334 new Effect
.Highlight(e
);
1339 notify_error("Could not change feed URL.");
1344 exception_error("opmlRegenKey", e
);
1349 function feedActionChange() {
1351 var chooser
= $("feedActionChooser");
1352 var opid
= chooser
[chooser
.selectedIndex
].value
;
1354 chooser
.selectedIndex
= 0;
1357 exception_error("feedActionChange", e
);
1361 function feedActionGo(op
) {
1363 if (op
== "facEdit") {
1365 var rows
= getSelectedFeeds();
1367 if (rows
.length
> 1) {
1368 editSelectedFeeds();
1374 if (op
== "facClear") {
1375 clearSelectedFeeds();
1378 if (op
== "facPurge") {
1379 purgeSelectedFeeds();
1382 if (op
== "facEditCats") {
1386 if (op
== "facRescore") {
1387 rescoreSelectedFeeds();
1390 if (op
== "facUnsubscribe") {
1391 removeSelectedFeeds();
1395 exception_error("feedActionGo", e
);
1400 function clearFeedArticles(feed_id
) {
1402 notify_progress("Clearing feed...");
1404 var query
= "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id
;
1406 new Ajax
.Request("backend.php", {
1408 onComplete: function(transport
) {
1415 function rescoreSelectedFeeds() {
1417 var sel_rows
= getSelectedFeeds();
1419 if (sel_rows
.length
> 0) {
1421 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1422 var ok
= confirm(__("Rescore articles in selected feeds?"));
1425 notify_progress("Rescoring selected feeds...", true);
1427 var query
= "?op=pref-feeds&method=rescore&quiet=1&ids="+
1428 param_escape(sel_rows
.toString());
1430 new Ajax
.Request("backend.php", {
1432 onComplete: function(transport
) {
1433 notify_callback2(transport
);
1438 alert(__("No feeds are selected."));
1444 function rescore_all_feeds() {
1445 var ok
= confirm(__("Rescore all articles? This operation may take a lot of time."));
1448 notify_progress("Rescoring feeds...", true);
1450 var query
= "?op=pref-feeds&method=rescoreAll&quiet=1";
1452 new Ajax
.Request("backend.php", {
1454 onComplete: function(transport
) {
1455 notify_callback2(transport
);
1460 function labelColorReset() {
1462 var labels
= getSelectedLabels();
1464 if (labels
.length
> 0) {
1465 var ok
= confirm(__("Reset selected labels to default colors?"));
1468 var query
= "?op=pref-labels&method=colorreset&ids="+
1469 param_escape(labels
.toString());
1471 new Ajax
.Request("backend.php", {
1473 onComplete: function(transport
) {
1479 alert(__("No labels are selected."));
1483 exception_error("labelColorReset", e
);
1488 function inPreferences() {
1492 function editProfiles() {
1495 if (dijit
.byId("profileEditDlg"))
1496 dijit
.byId("profileEditDlg").destroyRecursive();
1498 var query
= "backend.php?op=pref-prefs&method=editPrefProfiles";
1500 dialog
= new dijit
.Dialog({
1501 id
: "profileEditDlg",
1502 title
: __("Settings Profiles"),
1503 style
: "width: 600px",
1504 getSelectedProfiles: function() {
1505 return getSelectedTableRowIds("prefFeedProfileList");
1507 removeSelected: function() {
1508 var sel_rows
= this.getSelectedProfiles();
1510 if (sel_rows
.length
> 0) {
1511 var ok
= confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
1514 notify_progress("Removing selected profiles...", true);
1516 var query
= "?op=rpc&method=remprofiles&ids="+
1517 param_escape(sel_rows
.toString());
1519 new Ajax
.Request("backend.php", {
1521 onComplete: function(transport
) {
1529 alert(__("No profiles are selected."));
1532 activateProfile: function() {
1533 var sel_rows
= this.getSelectedProfiles();
1535 if (sel_rows
.length
== 1) {
1537 var ok
= confirm(__("Activate selected profile?"));
1540 notify_progress("Loading, please wait...");
1542 var query
= "?op=rpc&method=setprofile&id="+
1543 param_escape(sel_rows
.toString());
1545 new Ajax
.Request("backend.php", {
1547 onComplete: function(transport
) {
1548 window
.location
.reload();
1553 alert(__("Please choose a profile to activate."));
1556 addProfile: function() {
1557 if (this.validate()) {
1558 notify_progress("Creating profile...", true);
1560 var query
= "?op=rpc&method=addprofile&title=" +
1561 param_escape(dialog
.attr('value').newprofile
);
1563 new Ajax
.Request("backend.php", {
1565 onComplete: function(transport
) {
1572 execute: function() {
1573 if (this.validate()) {
1580 exception_error("editProfiles", e
);
1584 function activatePrefProfile() {
1586 var sel_rows
= getSelectedFeedCats();
1588 if (sel_rows
.length
== 1) {
1590 var ok
= confirm(__("Activate selected profile?"));
1593 notify_progress("Loading, please wait...");
1595 var query
= "?op=rpc&method=setprofile&id="+
1596 param_escape(sel_rows
.toString());
1598 new Ajax
.Request("backend.php", {
1600 onComplete: function(transport
) {
1601 window
.location
.reload();
1606 alert(__("Please choose a profile to activate."));
1612 function clearFeedAccessKeys() {
1614 var ok
= confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
1617 notify_progress("Clearing URLs...");
1619 var query
= "?op=pref-feeds&method=clearKeys";
1621 new Ajax
.Request("backend.php", {
1623 onComplete: function(transport
) {
1624 notify_info("Generated URLs cleared.");
1631 function resetFilterOrder() {
1633 notify_progress("Loading, please wait...");
1635 new Ajax
.Request("backend.php", {
1636 parameters
: "?op=pref-filters&method=filtersortreset",
1637 onComplete: function(transport
) {
1643 exception_error("resetFilterOrder");
1648 function resetFeedOrder() {
1650 notify_progress("Loading, please wait...");
1652 new Ajax
.Request("backend.php", {
1653 parameters
: "?op=pref-feeds&method=feedsortreset",
1654 onComplete: function(transport
) {
1660 exception_error("resetFeedOrder");
1664 function resetCatOrder() {
1666 notify_progress("Loading, please wait...");
1668 new Ajax
.Request("backend.php", {
1669 parameters
: "?op=pref-feeds&method=catsortreset",
1670 onComplete: function(transport
) {
1676 exception_error("resetCatOrder");
1680 function editCat(id
, item
, event
) {
1682 var new_name
= prompt(__('Rename category to:'), item
.name
);
1684 if (new_name
&& new_name
!= item
.name
) {
1686 notify_progress("Loading, please wait...");
1688 new Ajax
.Request("backend.php", {
1691 method
: 'renamecat',
1695 onComplete: function(transport
) {
1701 exception_error("editCat", e
);
1705 function editLabel(id
, event
) {
1707 var query
= "backend.php?op=pref-labels&method=edit&id=" +
1710 if (dijit
.byId("labelEditDlg"))
1711 dijit
.byId("labelEditDlg").destroyRecursive();
1713 dialog
= new dijit
.Dialog({
1715 title
: __("Label Editor"),
1716 style
: "width: 600px",
1717 setLabelColor: function(id
, fg
, bg
) {
1732 var query
= "?op=pref-labels&method=colorset&kind="+kind
+
1733 "&ids=" + param_escape(id
) + "&fg=" + param_escape(fg
) +
1734 "&bg=" + param_escape(bg
) + "&color=" + param_escape(color
);
1736 // console.log(query);
1738 var e
= $("LICID-" + id
);
1741 if (fg
) e
.style
.color
= fg
;
1742 if (bg
) e
.style
.backgroundColor
= bg
;
1745 new Ajax
.Request("backend.php", { parameters
: query
});
1749 execute: function() {
1750 if (this.validate()) {
1751 var caption
= this.attr('value').caption
;
1752 var fg_color
= this.attr('value').fg_color
;
1753 var bg_color
= this.attr('value').bg_color
;
1754 var query
= dojo
.objectToQuery(this.attr('value'));
1756 dijit
.byId('labelTree').setNameById(id
, caption
);
1757 this.setLabelColor(id
, fg_color
, bg_color
);
1760 new Ajax
.Request("backend.php", {
1762 onComplete: function(transport
) {
1772 exception_error("editLabel", e
);
1777 function customizeCSS() {
1779 var query
= "backend.php?op=pref-prefs&method=customizeCSS";
1781 if (dijit
.byId("cssEditDlg"))
1782 dijit
.byId("cssEditDlg").destroyRecursive();
1784 dialog
= new dijit
.Dialog({
1786 title
: __("Customize stylesheet"),
1787 style
: "width: 600px",
1788 execute: function() {
1789 notify_progress('Saving data...', true);
1790 new Ajax
.Request("backend.php", {
1791 parameters
: dojo
.objectToQuery(this.attr('value')),
1792 onComplete: function(transport
) {
1794 window
.location
.reload();
1803 exception_error("customizeCSS", e
);
1807 function insertSSLserial(value
) {
1809 dijit
.byId("SSL_CERT_SERIAL").attr('value', value
);
1811 exception_error("insertSSLcerial", e
);
1815 function gotoExportOpml(filename
, settings
) {
1816 tmp
= settings
? 1 : 0;
1817 document
.location
.href
= "backend.php?op=opml&method=export&filename=" + filename
+ "&settings=" + tmp
;
1821 function batchSubscribe() {
1823 var query
= "backend.php?op=pref-feeds&method=batchSubscribe";
1825 // overlapping widgets
1826 if (dijit
.byId("batchSubDlg")) dijit
.byId("batchSubDlg").destroyRecursive();
1827 if (dijit
.byId("feedAddDlg")) dijit
.byId("feedAddDlg").destroyRecursive();
1829 var dialog
= new dijit
.Dialog({
1831 title
: __("Batch subscribe"),
1832 style
: "width: 600px",
1833 execute: function() {
1834 if (this.validate()) {
1835 console
.log(dojo
.objectToQuery(this.attr('value')));
1837 notify_progress(__("Subscribing to feeds..."), true);
1839 new Ajax
.Request("backend.php", {
1840 parameters
: dojo
.objectToQuery(this.attr('value')),
1841 onComplete: function(transport
) {
1852 exception_error("batchSubscribe", e
);
1857 function toggleAdvancedPrefs() {
1859 notify_progress("Loading, please wait...");
1861 new Ajax
.Request("backend.php", {
1862 parameters
: "?op=pref-prefs&method=toggleadvanced",
1863 onComplete: function(transport
) {
1868 exception_error("toggleAdvancedPrefs", e
);
1872 function clearPluginData(name
) {
1874 if (confirm(__("Clear stored data for this plugin?"))) {
1875 notify_progress("Loading, please wait...");
1877 new Ajax
.Request("backend.php", {
1878 parameters
: "?op=pref-prefs&method=clearplugindata&name=" + param_escape(name
),
1879 onComplete: function(transport
) {
1885 exception_error("clearPluginData", e
);
1889 function clearSqlLog() {
1891 if (confirm(__("Clear all messages in the error log?"))) {
1893 notify_progress("Loading, please wait...");
1894 var query
= "?op=pref-system&method=clearLog";
1896 new Ajax
.Request("backend.php", {
1898 onComplete: function(transport
) {