1 var active_feed_cat = false;
3 var init_params = new Array();
5 var caller_subop = false;
6 var hotkey_prefix = false;
7 var hotkey_prefix_pressed = false;
11 function feedlist_callback2(transport) {
15 dijit.byId('feedConfigTab').attr('content', transport.responseText);
17 selectTab("feedConfig", true);
20 var tuple = caller_subop.split(":");
21 if (tuple[0] == 'editFeed') {
22 window.setTimeout('editFeed('+tuple[1]+')', 100);
30 exception_error("feedlist_callback2", e);
34 function filterlist_callback2(transport) {
35 dijit.byId('filterConfigTab').attr('content', transport.responseText);
39 function labellist_callback2(transport) {
43 dijit.byId('labelConfigTab').attr('content', transport.responseText);
49 exception_error("labellist_callback2", e);
53 function userlist_callback2(transport) {
55 dijit.byId('userConfigTab').attr('content', transport.responseText);
59 exception_error("userlist_callback2", e);
63 function prefslist_callback2(transport) {
65 dijit.byId('genConfigTab').attr('content', transport.responseText);
69 exception_error("prefslist_callback2", e);
73 function notify_callback2(transport) {
74 notify_info(transport.responseText);
77 function init_profile_inline_editor() {
80 if ($("prefFeedCatList")) {
81 var elems = $("prefFeedCatList").getElementsByTagName("SPAN");
83 for (var i = 0; i < elems.length; i++) {
84 if (elems[i].id && elems[i].id.match("FCATT-")) {
85 var id = elems[i].id.replace("FCATT-", "");
86 new Ajax.InPlaceEditor(elems[i],
87 'backend.php?op=rpc&subop=saveprofile&id=' + id);
93 exception_error("init_profile_inline_editor", e);
97 function updateFeedList(sort_key) {
101 var feed_search = $("feed_search");
103 if (feed_search) { search = feed_search.value; }
105 var slat = $("show_last_article_times");
107 var slat_checked = false;
109 slat_checked = slat.checked;
112 var query = "?op=pref-feeds" +
113 "&sort=" + param_escape(sort_key) +
114 "&slat=" + param_escape(slat_checked) +
115 "&search=" + param_escape(search);
117 new Ajax.Request("backend.php", {
119 onComplete: function(transport) {
120 feedlist_callback2(transport);
123 exception_error("updateFeedList", e);
127 function updateUsersList(sort_key) {
131 var user_search = $("user_search");
133 if (user_search) { search = user_search.value; }
135 var query = "?op=pref-users&sort="
136 + param_escape(sort_key) +
137 "&search=" + param_escape(search);
139 new Ajax.Request("backend.php", {
141 onComplete: function(transport) {
142 userlist_callback2(transport);
146 exception_error("updateUsersList", e);
154 var link = $("fadd_link");
156 if (link.value.length == 0) {
157 alert(__("Error: No feed URL given."));
158 } else if (!isValidURL(link.value)) {
159 alert(__("Error: Invalid feed URL."));
161 notify_progress("Adding feed...");
163 var query = "?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
164 param_escape(link.value);
166 new Ajax.Request("backend.php", {
168 onComplete: function(transport) {
169 feedlist_callback2(transport);
177 exception_error("addFeed", e);
182 function addPrefProfile() {
184 var profile = $("fadd_profile");
186 if (profile.value.length == 0) {
187 alert(__("Can't add profile: no name specified."));
189 notify_progress("Adding profile...");
191 var query = "?op=rpc&subop=addprofile&title=" +
192 param_escape(profile.value);
194 new Ajax.Request("backend.php", {
196 onComplete: function(transport) {
204 function addFeedCat() {
206 var cat = $("fadd_cat");
208 if (cat.value.length == 0) {
209 alert(__("Can't add category: no name specified."));
211 notify_progress("Adding feed category...");
213 var query = "?op=pref-feeds&subop=editCats&action=add&cat=" +
214 param_escape(cat.value);
216 new Ajax.Request("backend.php", {
218 onComplete: function(transport) {
219 infobox_callback2(transport);
231 var login = prompt(__("Please enter login:"), "");
238 alert(__("Can't create user: no login specified."));
242 notify_progress("Adding user...");
244 var query = "?op=pref-users&subop=add&login=" +
247 new Ajax.Request("backend.php", {
249 onComplete: function(transport) {
250 userlist_callback2(transport);
254 exception_error("addUser", e);
258 function editUser(id, event) {
261 if (!event || !event.ctrlKey) {
263 notify_progress("Loading, please wait...");
265 selectTableRows('prefUserList', 'none');
266 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
268 var query = "?op=pref-users&subop=edit&id=" +
271 new Ajax.Request("backend.php", {
273 onComplete: function(transport) {
274 infobox_callback2(transport);
275 document.forms['user_edit_form'].login.focus();
278 } else if (event.ctrlKey) {
279 var cb = $('UMCHK-' + id);
280 cb.checked = !cb.checked;
285 exception_error("editUser", e);
290 function editFilter(id, event) {
293 var query = "backend.php?op=pref-filters&subop=edit&id=" + param_escape(id);
295 if (dijit.byId("filterEditDlg"))
296 dijit.byId("filterEditDlg").destroyRecursive();
298 dialog = new dijit.Dialog({
300 title: __("Edit Filter"),
301 style: "width: 600px",
302 execute: function() {
303 if (this.validate()) {
305 var query = "?op=rpc&subop=verifyRegexp®_exp=" +
306 param_escape(dialog.attr('value').reg_exp);
308 notify_progress("Verifying regular expression...");
310 new Ajax.Request("backend.php", {
312 onComplete: function(transport) {
313 handle_rpc_reply(transport);
314 var response = transport.responseXML;
317 var s = response.getElementsByTagName("status")[0].firstChild.nodeValue;
321 if (s == "INVALID") {
322 alert("Match regular expression seems to be invalid.");
325 notify_progress("Saving data...", true);
327 console.log(dojo.objectToQuery(dialog.attr('value')));
329 new Ajax.Request("backend.php", {
330 parameters: dojo.objectToQuery(dialog.attr('value')),
331 onComplete: function(transport) {
346 exception_error("editFilter", e);
350 function getSelectedLabels() {
351 var tree = dijit.byId("labelTree");
352 var items = tree.model.getCheckedItems();
355 items.each(function(item) {
356 rv.push(tree.model.store.getValue(item, 'bare_id'));
362 function getSelectedUsers() {
363 return getSelectedTableRowIds("prefUserList");
366 function getSelectedFeeds() {
367 var tree = dijit.byId("feedTree");
368 var items = tree.model.getCheckedItems();
371 items.each(function(item) {
372 rv.push(tree.model.store.getValue(item, 'bare_id'));
378 function getSelectedFilters() {
379 var tree = dijit.byId("filterTree");
380 var items = tree.model.getCheckedItems();
383 items.each(function(item) {
384 rv.push(tree.model.store.getValue(item, 'bare_id'));
391 function getSelectedFeedCats() {
392 return getSelectedTableRowIds("prefFeedCatList");
396 function removeSelectedLabels() {
398 var sel_rows = getSelectedLabels();
400 if (sel_rows.length > 0) {
402 var ok = confirm(__("Remove selected labels?"));
405 notify_progress("Removing selected labels...");
407 var query = "?op=pref-labels&subop=remove&ids="+
408 param_escape(sel_rows.toString());
410 new Ajax.Request("backend.php", {
412 onComplete: function(transport) {
413 labellist_callback2(transport);
418 alert(__("No labels are selected."));
424 function removeSelectedUsers() {
428 var sel_rows = getSelectedUsers();
430 if (sel_rows.length > 0) {
432 var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
435 notify_progress("Removing selected users...");
437 var query = "?op=pref-users&subop=remove&ids="+
438 param_escape(sel_rows.toString());
440 new Ajax.Request("backend.php", {
442 onComplete: function(transport) {
443 userlist_callback2(transport);
449 alert(__("No users are selected."));
453 exception_error("removeSelectedUsers", e);
459 function removeSelectedFilters() {
463 var sel_rows = getSelectedFilters();
465 if (sel_rows.length > 0) {
467 var ok = confirm(__("Remove selected filters?"));
470 notify_progress("Removing selected filters...");
472 var query = "?op=pref-filters&subop=remove&ids="+
473 param_escape(sel_rows.toString());
475 new Ajax.Request("backend.php", {
477 onComplete: function(transport) {
478 filterlist_callback2(transport);
483 alert(__("No filters are selected."));
487 exception_error("removeSelectedFilters", e);
494 function removeSelectedFeeds() {
498 var sel_rows = getSelectedFeeds();
500 if (sel_rows.length > 0) {
502 var ok = confirm(__("Unsubscribe from selected feeds?"));
506 notify_progress("Unsubscribing from selected feeds...", true);
508 var query = "?op=pref-feeds&subop=remove&ids="+
509 param_escape(sel_rows.toString());
513 new Ajax.Request("backend.php", {
515 onComplete: function(transport) {
521 alert(__("No feeds are selected."));
525 exception_error("removeSelectedFeeds", e);
531 function clearSelectedFeeds() {
533 var sel_rows = getSelectedFeeds();
535 if (sel_rows.length > 1) {
536 alert(__("Please select only one feed."));
540 if (sel_rows.length > 0) {
542 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
545 notify_progress("Clearing selected feed...");
546 clearFeedArticles(sel_rows[0]);
551 alert(__("No feeds are selected."));
558 function purgeSelectedFeeds() {
560 var sel_rows = getSelectedFeeds();
562 if (sel_rows.length > 0) {
564 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
566 if (pr != undefined) {
567 notify_progress("Purging selected feed...");
569 var query = "?op=rpc&subop=purge&ids="+
570 param_escape(sel_rows.toString()) + "&days=" + pr;
574 new Ajax.Request("prefs.php", {
576 onComplete: function(transport) {
583 alert(__("No feeds are selected."));
590 function removeSelectedPrefProfiles() {
592 var sel_rows = getSelectedFeedCats();
594 if (sel_rows.length > 0) {
596 var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
599 notify_progress("Removing selected profiles...");
601 var query = "?op=rpc&subop=remprofiles&ids="+
602 param_escape(sel_rows.toString());
604 new Ajax.Request("backend.php", {
606 onComplete: function(transport) {
612 alert(__("No profiles selected."));
618 function removeSelectedFeedCats() {
620 var sel_rows = getSelectedFeedCats();
622 if (sel_rows.length > 0) {
624 var ok = confirm(__("Remove selected categories?"));
627 notify_progress("Removing selected categories...");
629 var query = "?op=pref-feeds&subop=editCats&action=remove&ids="+
630 param_escape(sel_rows.toString());
632 new Ajax.Request("backend.php", {
634 onComplete: function(transport) {
635 infobox_callback2(transport);
642 alert(__("No categories are selected."));
649 function userEditCancel() {
654 function userEditSave() {
658 var login = document.forms["user_edit_form"].login.value;
660 if (login.length == 0) {
661 alert(__("Login field cannot be blank."));
665 notify_progress("Saving user...");
669 var query = Form.serialize("user_edit_form");
671 new Ajax.Request("backend.php", {
673 onComplete: function(transport) {
674 userlist_callback2(transport);
678 exception_error("userEditSave", e);
686 function editSelectedUser() {
687 var rows = getSelectedUsers();
689 if (rows.length == 0) {
690 alert(__("No users are selected."));
694 if (rows.length > 1) {
695 alert(__("Please select only one user."));
704 function resetSelectedUserPass() {
708 var rows = getSelectedUsers();
710 if (rows.length == 0) {
711 alert(__("No users are selected."));
715 if (rows.length > 1) {
716 alert(__("Please select only one user."));
720 var ok = confirm(__("Reset password of selected user?"));
723 notify_progress("Resetting password for selected user...");
727 var query = "?op=pref-users&subop=resetPass&id=" +
730 new Ajax.Request("backend.php", {
732 onComplete: function(transport) {
733 userlist_callback2(transport);
739 exception_error("resetSelectedUserPass", e);
743 function selectedUserDetails() {
747 var rows = getSelectedUsers();
749 if (rows.length == 0) {
750 alert(__("No users are selected."));
754 if (rows.length > 1) {
755 alert(__("Please select only one user."));
759 notify_progress("Loading, please wait...");
763 var query = "?op=pref-users&subop=user-details&id=" + id;
765 new Ajax.Request("backend.php", {
767 onComplete: function(transport) {
768 infobox_callback2(transport);
771 exception_error("selectedUserDetails", e);
776 function editSelectedFilter() {
777 var rows = getSelectedFilters();
779 if (rows.length == 0) {
780 alert(__("No filters are selected."));
784 if (rows.length > 1) {
785 alert(__("Please select only one filter."));
796 function editSelectedFeed() {
797 var rows = getSelectedFeeds();
799 if (rows.length == 0) {
800 alert(__("No feeds are selected."));
804 if (rows.length > 1) {
805 return editSelectedFeeds();
810 editFeed(rows[0], {});
814 function editSelectedFeeds() {
817 var rows = getSelectedFeeds();
819 if (rows.length == 0) {
820 alert(__("No feeds are selected."));
826 notify_progress("Loading, please wait...", true);
828 var query = "?op=pref-feeds&subop=editfeeds&ids=" +
829 param_escape(rows.toString());
831 new Ajax.Request("backend.php", {
833 onComplete: function(transport) {
834 infobox_callback2(transport);
838 exception_error("editSelectedFeeds", e);
842 function piggie(enable) {
844 console.log("I LOVEDED IT!");
845 var piggie = $("piggie");
847 Element.show(piggie);
848 Position.Center(piggie);
854 function opmlImport() {
856 var opml_file = $("opml_file");
858 if (opml_file.value.length == 0) {
859 alert(__("No OPML file to upload."));
862 notify_progress("Importing, please wait...", true);
867 function updateFilterList(sort_key) {
870 var filter_search = $("filter_search");
872 if (filter_search) { search = filter_search.value; }
874 var query = "?op=pref-filters&sort=" +
875 param_escape(sort_key) +
876 "&search=" + param_escape(search);
878 new Ajax.Request("backend.php", {
880 onComplete: function(transport) {
881 filterlist_callback2(transport);
885 exception_error("updateFilterList", e);
890 function updateLabelList(sort_key) {
894 var label_search = $("label_search");
896 if (label_search) { search = label_search.value; }
898 var query = "?op=pref-labels&sort=" +
899 param_escape(sort_key) +
900 "&search=" + param_escape(search);
902 new Ajax.Request("backend.php", {
904 onComplete: function(transport) {
905 labellist_callback2(transport);
909 exception_error("updateLabelList", e);
913 function updatePrefsList() {
915 var query = "?op=pref-prefs";
917 new Ajax.Request("backend.php", {
919 onComplete: function(transport) {
920 prefslist_callback2(transport);
925 function selectTab(id, noupdate, subop) {
930 console.log("selectTab: " + id + "(NU: " + noupdate + ")");
932 notify_progress("Loading, please wait...");
934 // close active infobox if needed
937 // clean up all current selections, just in case
938 active_feed_cat = false;
940 // Effect.Fade("prefContent", {duration: 1, to: 0.01,
941 // queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
943 if (id == "feedConfig") {
945 } else if (id == "filterConfig") {
947 } else if (id == "labelConfig") {
949 } else if (id == "genConfig") {
951 } else if (id == "userConfig") {
955 var tab = dijit.byId(id + "Tab");
956 dijit.byId("pref-tabs").selectChild(tab);
960 /* clean selection from all tabs */
962 $$("#prefTabs div").invoke('removeClassName', 'Selected');
964 /* mark new tab as selected */
966 $(id + "Tab").addClassName("Selected");
969 exception_error("selectTab", e);
973 function init_second_stage() {
977 document.onkeydown = pref_hotkey_handler;
979 caller_subop = getURLParam('subop');
981 if (getURLParam("subopparam")) {
982 caller_subop = caller_subop + ":" + getURLParam("subopparam");
985 loading_set_progress(50);
989 dojo.addOnLoad(function() {
991 var tab = getURLParam('tab');
994 tab = dijit.byId(tab + "Tab");
995 if (tab) dijit.byId("pref-tabs").selectChild(tab);
1000 setTimeout("hotkey_prefix_timeout()", 5*1000);
1003 exception_error("init_second_stage", e);
1011 dojo.require("dijit.layout.TabContainer");
1012 dojo.require("dijit.layout.BorderContainer");
1013 dojo.require("dijit.layout.AccordionContainer");
1014 dojo.require("dijit.layout.ContentPane");
1015 dojo.require("dijit.Dialog");
1016 dojo.require("dijit.form.Button");
1017 dojo.require("dijit.form.Select");
1018 dojo.require("dijit.form.FilteringSelect");
1019 dojo.require("dijit.form.TextBox");
1020 dojo.require("dijit.form.CheckBox");
1021 dojo.require("dijit.form.ValidationTextBox");
1022 dojo.require("dijit.form.RadioButton");
1023 dojo.require("dijit.form.Select");
1024 dojo.require("dijit.Toolbar");
1025 dojo.require("dojo.data.ItemFileWriteStore");
1026 dojo.require("dijit.Tree");
1027 dojo.require("dijit.form.DropDownButton");
1028 dojo.require("dijit.form.Form");
1029 dojo.require("dijit.Menu");
1030 dojo.require("dijit.tree.dndSource");
1031 dojo.require("dijit.InlineEditBox");
1032 dojo.require("dijit.ColorPalette");
1033 dojo.require("dijit.ProgressBar");
1035 dojo.registerModulePath("lib", "..");
1036 dojo.registerModulePath("fox", "../..");
1038 dojo.require("lib.CheckBoxTree");
1039 dojo.require("fox.PrefFeedTree");
1040 dojo.require("fox.PrefFilterTree");
1041 dojo.require("fox.PrefLabelTree");
1043 dojo.addOnLoad(function() {
1044 loading_set_progress(50);
1046 new Ajax.Request("backend.php", {
1047 parameters: {op: "rpc", subop: "sanityCheck"},
1048 onComplete: function(transport) {
1049 backend_sanity_check_callback(transport);
1054 exception_error("init", e);
1058 function validatePrefsReset() {
1060 var ok = confirm(__("Reset to defaults?"));
1064 var query = Form.serialize("pref_prefs_form");
1065 query = query + "&subop=reset-config";
1068 new Ajax.Request("backend.php", {
1070 onComplete: function(transport) {
1071 var msg = transport.responseText;
1072 if (msg.match("PREFS_THEME_CHANGED")) {
1073 window.location.reload();
1083 exception_error("validatePrefsReset", e);
1091 function pref_hotkey_handler(e) {
1095 var shift_key = false;
1097 var cmdline = $('cmdline');
1100 shift_key = e.shiftKey;
1106 keycode = window.event.keyCode;
1111 var keychar = String.fromCharCode(keycode);
1113 if (keycode == 27) { // escape
1114 if (Element.visible("hotkey_help_overlay")) {
1115 Element.hide("hotkey_help_overlay");
1117 hotkey_prefix = false;
1121 var dialog = dijit.byId("infoBox");
1122 var dialog_visible = false;
1125 dialog_visible = Element.visible(dialog.domNode);
1127 if (dialog_visible || !hotkeys_enabled) {
1128 console.log("hotkeys disabled");
1132 if (keycode == 16) return; // ignore lone shift
1133 if (keycode == 17) return; // ignore lone ctrl
1135 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1136 hotkey_prefix = keycode;
1138 var date = new Date();
1139 var ts = Math.round(date.getTime() / 1000);
1141 hotkey_prefix_pressed = ts;
1143 cmdline.innerHTML = keychar;
1144 Element.show(cmdline);
1146 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar);
1150 if (Element.visible("hotkey_help_overlay")) {
1151 Element.hide("hotkey_help_overlay");
1154 if (keycode == 13 || keycode == 27) {
1157 seq = seq + "" + keycode;
1160 /* Global hotkeys */
1162 Element.hide(cmdline);
1164 if (!hotkey_prefix) {
1166 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
1167 if (!Element.visible("hotkey_help_overlay")) {
1168 //Element.show("hotkey_help_overlay");
1169 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
1171 Element.hide("hotkey_help_overlay");
1176 if (keycode == 191 || keychar == '/') { // /
1177 var search_boxes = new Array("label_search",
1178 "feed_search", "filter_search", "user_search", "feed_browser_search");
1180 for (var i = 0; i < search_boxes.length; i++) {
1181 var elem = $(search_boxes[i]);
1183 $(search_boxes[i]).focus();
1192 if (hotkey_prefix == 67) { // c
1193 hotkey_prefix = false;
1195 if (keycode == 70) { // f
1200 if (keycode == 83) { // s
1205 if (keycode == 85) { // u
1209 if (keycode == 67) { // c
1214 if (keycode == 84 && shift_key) { // T
1215 displayDlg('feedBrowser');
1223 if (hotkey_prefix == 71) { // g
1225 hotkey_prefix = false;
1227 if (keycode == 49 && $("genConfigTab")) { // 1
1228 selectTab("genConfig");
1232 if (keycode == 50 && $("feedConfigTab")) { // 2
1233 selectTab("feedConfig");
1237 if (keycode == 51 && $("filterConfigTab")) { // 4
1238 selectTab("filterConfig");
1242 if (keycode == 52 && $("labelConfigTab")) { // 5
1243 selectTab("labelConfig");
1247 if (keycode == 53 && $("userConfigTab")) { // 6
1248 selectTab("userConfig");
1252 if (keycode == 88) { // x
1259 if (seq.match("8073717369")) {
1267 if (hotkey_prefix) {
1268 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
1270 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
1274 exception_error("pref_hotkey_handler", e);
1278 function editFeedCats() {
1280 var query = "?op=pref-feeds&subop=editCats";
1282 notify_progress("Loading, please wait...");
1284 new Ajax.Request("backend.php", {
1286 onComplete: function(transport) {
1287 infobox_callback2(transport);
1290 exception_error("editFeedCats", e);
1294 function showFeedsWithErrors() {
1295 displayDlg('feedUpdateErrors');
1298 function changeUserPassword() {
1302 var f = document.forms["change_pass_form"];
1305 if (f.OLD_PASSWORD.value == "") {
1306 new Effect.Highlight(f.OLD_PASSWORD);
1307 notify_error("Old password cannot be blank.");
1311 if (f.NEW_PASSWORD.value == "") {
1312 new Effect.Highlight(f.NEW_PASSWORD);
1313 notify_error("New password cannot be blank.");
1317 if (f.CONFIRM_PASSWORD.value == "") {
1318 new Effect.Highlight(f.CONFIRM_PASSWORD);
1319 notify_error("Entered passwords do not match.");
1323 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1324 new Effect.Highlight(f.CONFIRM_PASSWORD);
1325 new Effect.Highlight(f.NEW_PASSWORD);
1326 notify_error("Entered passwords do not match.");
1332 var query = Form.serialize("change_pass_form");
1334 notify_progress("Changing password...");
1336 new Ajax.Request("backend.php", {
1338 onComplete: function(transport) {
1339 if (transport.responseText.indexOf("ERROR: ") == 0) {
1340 notify_error(transport.responseText.replace("ERROR: ", ""));
1342 notify_info(transport.responseText);
1343 var warn = $("default_pass_warning");
1344 if (warn) warn.style.display = "none";
1347 document.forms['change_pass_form'].reset();
1352 exception_error("changeUserPassword", e);
1358 function changeUserEmail() {
1362 var query = Form.serialize("change_email_form");
1364 notify_progress("Saving...");
1366 new Ajax.Request("backend.php", {
1368 onComplete: function(transport) {
1369 notify_callback2(transport);
1373 exception_error("changeUserPassword", e);
1380 function opmlRegenKey() {
1383 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
1387 notify_progress("Trying to change address...", true);
1389 var query = "?op=rpc&subop=regenOPMLKey";
1391 new Ajax.Request("backend.php", {
1393 onComplete: function(transport) {
1394 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1396 var e = $('pub_opml_url');
1399 e.href = new_link.firstChild.nodeValue;
1400 e.innerHTML = new_link.firstChild.nodeValue;
1402 new Effect.Highlight(e);
1407 notify_error("Could not change feed URL.");
1412 exception_error("opmlRegenKey", e);
1416 function validatePrefsSave() {
1419 var ok = confirm(__("Save current configuration?"));
1423 var query = Form.serialize("pref_prefs_form");
1424 query = query + "&subop=save-config";
1427 new Ajax.Request("backend.php", {
1429 onComplete: function(transport) {
1430 var msg = transport.responseText;
1431 if (msg.match("PREFS_THEME_CHANGED")) {
1432 window.location.reload();
1441 exception_error("validatePrefsSave", e);
1447 function feedActionChange() {
1449 var chooser = $("feedActionChooser");
1450 var opid = chooser[chooser.selectedIndex].value;
1452 chooser.selectedIndex = 0;
1455 exception_error("feedActionChange", e);
1459 function feedActionGo(op) {
1461 if (op == "facEdit") {
1463 var rows = getSelectedFeeds();
1465 if (rows.length > 1) {
1466 editSelectedFeeds();
1472 if (op == "facClear") {
1473 clearSelectedFeeds();
1476 if (op == "facPurge") {
1477 purgeSelectedFeeds();
1480 if (op == "facEditCats") {
1484 if (op == "facRescore") {
1485 rescoreSelectedFeeds();
1488 if (op == "facUnsubscribe") {
1489 removeSelectedFeeds();
1493 exception_error("feedActionGo", e);
1498 function clearFeedArticles(feed_id) {
1500 notify_progress("Clearing feed...");
1502 var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
1504 new Ajax.Request("backend.php", {
1506 onComplete: function(transport) {
1513 function rescoreSelectedFeeds() {
1515 var sel_rows = getSelectedFeeds();
1517 if (sel_rows.length > 0) {
1519 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1520 var ok = confirm(__("Rescore articles in selected feeds?"));
1523 notify_progress("Rescoring selected feeds...", true);
1525 var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+
1526 param_escape(sel_rows.toString());
1528 new Ajax.Request("backend.php", {
1530 onComplete: function(transport) {
1531 notify_callback2(transport);
1536 alert(__("No feeds are selected."));
1542 function rescore_all_feeds() {
1543 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
1546 notify_progress("Rescoring feeds...", true);
1548 var query = "?op=pref-feeds&subop=rescoreAll&quiet=1";
1550 new Ajax.Request("backend.php", {
1552 onComplete: function(transport) {
1553 notify_callback2(transport);
1558 function removeFilter(id, title) {
1562 var msg = __("Remove filter %s?").replace("%s", title);
1564 var ok = confirm(msg);
1567 dijit.byId("filterEditDlg").hide();
1569 notify_progress("Removing filter...");
1571 var query = "?op=pref-filters&subop=remove&ids="+
1574 new Ajax.Request("backend.php", {
1576 onComplete: function(transport) {
1577 filterlist_callback2(transport);
1583 exception_error("removeFilter", e);
1589 function feedsEditSave() {
1592 var ok = confirm(__("Save changes to selected feeds?"));
1596 var f = document.forms["batch_edit_feed_form"];
1598 var query = Form.serialize("batch_edit_feed_form");
1600 /* Form.serialize ignores unchecked checkboxes */
1602 if (!query.match("&rtl_content=") &&
1603 f.rtl_content.disabled == false) {
1604 query = query + "&rtl_content=false";
1607 if (!query.match("&private=") &&
1608 f.private.disabled == false) {
1609 query = query + "&private=false";
1612 if (!query.match("&cache_images=") &&
1613 f.cache_images.disabled == false) {
1614 query = query + "&cache_images=false";
1617 if (!query.match("&include_in_digest=") &&
1618 f.include_in_digest.disabled == false) {
1619 query = query + "&include_in_digest=false";
1624 notify_progress("Saving feeds...");
1626 new Ajax.Request("backend.php", {
1628 onComplete: function(transport) {
1629 feedlist_callback2(transport);
1636 exception_error("feedsEditSave", e);
1640 function batchFeedsToggleField(cb, elem, label) {
1642 var f = document.forms["batch_edit_feed_form"];
1646 f[elem].disabled = false;
1652 // new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1653 // queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1656 f[elem].disabled = true;
1659 l.className = "insensitive";
1664 exception_error("batchFeedsToggleField", e);
1668 function labelColorReset() {
1670 var labels = getSelectedLabels();
1672 var ok = confirm(__("Reset label colors to default?"));
1676 var query = "?op=pref-labels&subop=color-reset&ids="+
1677 param_escape(labels.toString());
1679 new Ajax.Request("backend.php", {
1681 onComplete: function(transport) {
1682 labellist_callback2(transport);
1687 exception_error("labelColorReset", e);
1691 function setLabelColor(id, fg, bg) {
1707 var query = "?op=pref-labels&subop=color-set&kind="+kind+
1708 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
1709 "&bg=" + param_escape(bg) + "&color=" + param_escape(color);
1711 // console.log(query);
1713 var e = $("LICID-" + id);
1716 if (fg) e.style.color = fg;
1717 if (bg) e.style.backgroundColor = bg;
1720 new Ajax.Request("backend.php", { parameters: query });
1725 exception_error("colorPickerDo", e);
1729 function inPreferences() {
1733 function editProfiles() {
1734 displayDlg('editPrefProfiles', false, function() {
1735 init_profile_inline_editor();
1739 function activatePrefProfile() {
1741 var sel_rows = getSelectedFeedCats();
1743 if (sel_rows.length == 1) {
1745 var ok = confirm(__("Activate selected profile?"));
1748 notify_progress("Loading, please wait...");
1750 var query = "?op=rpc&subop=setprofile&id="+
1751 param_escape(sel_rows.toString());
1753 new Ajax.Request("backend.php", {
1755 onComplete: function(transport) {
1756 window.location.reload();
1761 alert(__("Please choose a profile to activate."));
1767 function opmlImportDone() {
1772 function opmlImportHandler(iframe) {
1774 var tmp = new Object();
1775 tmp.responseText = iframe.document.body.innerHTML;
1777 infobox_callback2(tmp);
1779 exception_error("opml_import_handler", e);
1783 function clearFeedAccessKeys() {
1785 var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
1788 notify_progress("Clearing URLs...");
1790 var query = "?op=rpc&subop=clearKeys";
1792 new Ajax.Request("backend.php", {
1794 onComplete: function(transport) {
1795 notify_info("Generated URLs cleared.");
1802 function handle_rpc_reply(transport, scheduled_call) {
1804 if (transport.responseXML) {
1806 if (!transport_error_check(transport)) return false;
1809 notify_error("Error communicating with server.");
1813 exception_error("handle_rpc_reply", e, transport);
1819 function resetFeedOrder() {
1821 notify_progress("Loading, please wait...");
1823 new Ajax.Request("backend.php", {
1824 parameters: "?op=pref-feeds&subop=feedsortreset",
1825 onComplete: function(transport) {
1831 exception_error("resetFeedOrder");
1835 function resetCatOrder() {
1837 notify_progress("Loading, please wait...");
1839 new Ajax.Request("backend.php", {
1840 parameters: "?op=pref-feeds&subop=catsortreset",
1841 onComplete: function(transport) {
1847 exception_error("resetCatOrder");
1851 function editCat(id, item, event) {
1853 var new_name = prompt(__('Rename category to:'), item.name);
1855 if (new_name && new_name != item.name) {
1857 notify_progress("Loading, please wait...");
1859 new Ajax.Request("backend.php", {
1866 onComplete: function(transport) {
1872 exception_error("editCat", e);
1876 function editLabel(id, event) {
1878 var query = "backend.php?op=pref-labels&subop=edit&id=" +
1881 if (dijit.byId("labelEditDlg"))
1882 dijit.byId("labelEditDlg").destroyRecursive();
1884 dialog = new dijit.Dialog({
1886 title: __("Label Editor"),
1887 style: "width: 600px",
1888 execute: function() {
1889 if (this.validate()) {
1890 var caption = this.attr('value').id;
1891 var caption = this.attr('value').caption;
1892 var fg_color = this.attr('value').fg_color;
1893 var bg_color = this.attr('value').bg_color;
1894 var query = dojo.objectToQuery(this.attr('value'));
1896 dijit.byId('labelTree').setNameById(id, caption);
1897 setLabelColor(id, fg_color, bg_color);
1900 new Ajax.Request("backend.php", {
1902 onComplete: function(transport) {
1912 exception_error("editLabel", e);