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) {