1 var active_feed_cat = false;
2 var active_tab = false;
4 var init_params = new Array();
6 var caller_subop = false;
7 var hotkey_prefix = false;
8 var hotkey_prefix_pressed = false;
10 var color_picker_active = false;
11 var selection_disabled = false;
12 var mouse_is_down = false;
17 function feedlist_callback2(transport) {
21 var container = $('prefContent');
22 container.innerHTML=transport.responseText;
23 selectTab("feedConfig", true);
26 var tuple = caller_subop.split(":");
27 if (tuple[0] == 'editFeed') {
28 window.setTimeout('editFeed('+tuple[1]+')', 100);
37 exception_error("feedlist_callback2", e);
41 function filterlist_callback2(transport) {
42 var container = $('prefContent');
43 container.innerHTML=transport.responseText;
48 function init_label_inline_editor() {
50 if ($("prefLabelList")) {
51 var elems = $("prefLabelList").getElementsByTagName("SPAN");
53 for (var i = 0; i < elems.length; i++) {
54 if (elems[i].id && elems[i].id.match("LILT-")) {
56 var id = elems[i].id.replace("LILT-", "");
58 new Ajax.InPlaceEditor(elems[i],
59 'backend.php?op=pref-labels&subop=save&id=' + id,
67 exception_error("init_label_inline_editor", e);
71 function labellist_callback2(transport) {
75 var container = $('prefContent');
77 container.innerHTML=transport.responseText;
79 init_label_inline_editor();
85 exception_error("labellist_callback2", e);
89 function userlist_callback2(transport) {
91 var container = $('prefContent');
92 if (transport.readyState == 4) {
93 container.innerHTML=transport.responseText;
98 exception_error("userlist_callback2", e);
102 function prefslist_callback2(transport) {
104 var container = $('prefContent');
105 container.innerHTML=transport.responseText;
109 exception_error("prefslist_callback2", e);
113 function notify_callback2(transport) {
114 notify_info(transport.responseText);
117 function init_profile_inline_editor() {
120 if ($("prefFeedCatList")) {
121 var elems = $("prefFeedCatList").getElementsByTagName("SPAN");
123 for (var i = 0; i < elems.length; i++) {
124 if (elems[i].id && elems[i].id.match("FCATT-")) {
125 var id = elems[i].id.replace("FCATT-", "");
126 new Ajax.InPlaceEditor(elems[i],
127 'backend.php?op=rpc&subop=saveprofile&id=' + id);
133 exception_error("init_profile_inline_editor", e);
137 function init_cat_inline_editor() {
140 if ($("prefFeedCatList")) {
141 var elems = $("prefFeedCatList").getElementsByTagName("SPAN");
143 for (var i = 0; i < elems.length; i++) {
144 if (elems[i].id && elems[i].id.match("FCATT-")) {
145 var cat_id = elems[i].id.replace("FCATT-", "");
146 new Ajax.InPlaceEditor(elems[i],
147 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id);
153 exception_error("init_cat_inline_editor", e);
157 function infobox_feed_cat_callback2(transport) {
159 infobox_callback2(transport);
160 init_cat_inline_editor();
161 $('fadd_cat').focus();
163 exception_error("infobox_feed_cat_callback2", e);
167 function updateFeedList(sort_key) {
171 var feed_search = $("feed_search");
173 if (feed_search) { search = feed_search.value; }
175 var slat = $("show_last_article_times");
177 var slat_checked = false;
179 slat_checked = slat.checked;
182 var query = "?op=pref-feeds" +
183 "&sort=" + param_escape(sort_key) +
184 "&slat=" + param_escape(slat_checked) +
185 "&search=" + param_escape(search);
187 new Ajax.Request("backend.php", {
189 onComplete: function(transport) {
190 feedlist_callback2(transport);
193 exception_error("updateFeedList", e);
197 function updateUsersList(sort_key) {
201 var user_search = $("user_search");
203 if (user_search) { search = user_search.value; }
205 var query = "?op=pref-users&sort="
206 + param_escape(sort_key) +
207 "&search=" + param_escape(search);
209 new Ajax.Request("backend.php", {
211 onComplete: function(transport) {
212 userlist_callback2(transport);
216 exception_error("updateUsersList", e);
224 var link = $("fadd_link");
226 if (link.value.length == 0) {
227 alert(__("Error: No feed URL given."));
228 } else if (!isValidURL(link.value)) {
229 alert(__("Error: Invalid feed URL."));
231 notify_progress("Adding feed...");
233 var query = "?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
234 param_escape(link.value);
236 new Ajax.Request("backend.php", {
238 onComplete: function(transport) {
239 feedlist_callback2(transport);
247 exception_error("addFeed", e);
252 function addPrefProfile() {
254 var profile = $("fadd_profile");
256 if (profile.value.length == 0) {
257 alert(__("Can't add profile: no name specified."));
259 notify_progress("Adding profile...");
261 var query = "?op=rpc&subop=addprofile&title=" +
262 param_escape(profile.value);
264 new Ajax.Request("backend.php", {
266 onComplete: function(transport) {
274 function addFeedCat() {
276 var cat = $("fadd_cat");
278 if (cat.value.length == 0) {
279 alert(__("Can't add category: no name specified."));
281 notify_progress("Adding feed category...");
283 var query = "?op=pref-feeds&subop=editCats&action=add&cat=" +
284 param_escape(cat.value);
286 new Ajax.Request("backend.php", {
288 onComplete: function(transport) {
289 infobox_feed_cat_callback2(transport);
301 var login = prompt(__("Please enter login:"), "");
308 alert(__("Can't create user: no login specified."));
312 notify_progress("Adding user...");
314 var query = "?op=pref-users&subop=add&login=" +
317 new Ajax.Request("backend.php", {
319 onComplete: function(transport) {
320 userlist_callback2(transport);
324 exception_error("addUser", e);
328 function editUser(id) {
334 notify_progress("Loading, please wait...");
336 selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false);
337 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
339 var query = "?op=pref-users&subop=edit&id=" +
342 new Ajax.Request("backend.php", {
344 onComplete: function(transport) {
345 infobox_callback2(transport);
346 document.forms['user_edit_form'].login.focus();
350 exception_error("editUser", e);
355 function editFilter(id) {
361 notify_progress("Loading, please wait...");
363 selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false);
364 selectTableRowById('FILRR-'+id, 'FICHK-'+id, true);
366 var query = "?op=pref-filters&subop=edit&id=" +
369 new Ajax.Request("backend.php", {
371 onComplete: function(transport) {
372 infobox_callback2(transport);
373 document.forms['filter_edit_form'].reg_exp.focus();
376 exception_error("editFilter", e);
380 function editFeed(feed) {
386 notify_progress("Loading, please wait...");
388 // clean selection from all rows & select row being edited
389 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
390 selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true);
392 var query = "?op=pref-feeds&subop=editfeed&id=" +
395 new Ajax.Request("backend.php", {
397 onComplete: function(transport) {
398 infobox_callback2(transport);
399 document.forms["edit_feed_form"].title.focus();
403 exception_error("editFeed", e);
407 function getSelectedLabels() {
408 return getSelectedTableRowIds("prefLabelList", "LILRR");
411 function getSelectedUsers() {
412 return getSelectedTableRowIds("prefUserList", "UMRR");
415 function getSelectedFeeds() {
416 return getSelectedTableRowIds("prefFeedList", "FEEDR");
419 function getSelectedFilters() {
420 return getSelectedTableRowIds("prefFilterList", "FILRR");
423 function getSelectedFeedCats() {
424 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
428 function removeSelectedLabels() {
430 var sel_rows = getSelectedLabels();
432 if (sel_rows.length > 0) {
434 var ok = confirm(__("Remove selected labels?"));
437 notify_progress("Removing selected labels...");
439 var query = "?op=pref-labels&subop=remove&ids="+
440 param_escape(sel_rows.toString());
442 new Ajax.Request("backend.php", {
444 onComplete: function(transport) {
445 labellist_callback2(transport);
450 alert(__("No labels are selected."));
456 function removeSelectedUsers() {
460 var sel_rows = getSelectedUsers();
462 if (sel_rows.length > 0) {
464 var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
467 notify_progress("Removing selected users...");
469 var query = "?op=pref-users&subop=remove&ids="+
470 param_escape(sel_rows.toString());
472 new Ajax.Request("backend.php", {
474 onComplete: function(transport) {
475 userlist_callback2(transport);
481 alert(__("No users are selected."));
485 exception_error("removeSelectedUsers", e);
491 function removeSelectedFilters() {
495 var sel_rows = getSelectedFilters();
497 if (sel_rows.length > 0) {
499 var ok = confirm(__("Remove selected filters?"));
502 notify_progress("Removing selected filters...");
504 var query = "?op=pref-filters&subop=remove&ids="+
505 param_escape(sel_rows.toString());
507 new Ajax.Request("backend.php", {
509 onComplete: function(transport) {
510 filterlist_callback2(transport);
515 alert(__("No filters are selected."));
519 exception_error("removeSelectedFilters", e);
526 function removeSelectedFeeds() {
530 var sel_rows = getSelectedFeeds();
532 if (sel_rows.length > 0) {
534 var ok = confirm(__("Unsubscribe from selected feeds?"));
538 notify_progress("Unsubscribing from selected feeds...", true);
540 var query = "?op=pref-feeds&subop=remove&ids="+
541 param_escape(sel_rows.toString());
545 new Ajax.Request("backend.php", {
547 onComplete: function(transport) {
553 alert(__("No feeds are selected."));
557 exception_error("removeSelectedFeeds", e);
563 function clearSelectedFeeds() {
565 var sel_rows = getSelectedFeeds();
567 if (sel_rows.length > 1) {
568 alert(__("Please select only one feed."));
572 if (sel_rows.length > 0) {
574 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
577 notify_progress("Clearing selected feed...");
578 clearFeedArticles(sel_rows[0]);
583 alert(__("No feeds are selected."));
590 function purgeSelectedFeeds() {
592 var sel_rows = getSelectedFeeds();
594 if (sel_rows.length > 0) {
596 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
598 if (pr != undefined) {
599 notify_progress("Purging selected feed...");
601 var query = "?op=rpc&subop=purge&ids="+
602 param_escape(sel_rows.toString()) + "&days=" + pr;
606 new Ajax.Request("prefs.php", {
608 onComplete: function(transport) {
615 alert(__("No feeds are selected."));
622 function removeSelectedPrefProfiles() {
624 var sel_rows = getSelectedFeedCats();
626 if (sel_rows.length > 0) {
628 var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
631 notify_progress("Removing selected profiles...");
633 var query = "?op=rpc&subop=remprofiles&ids="+
634 param_escape(sel_rows.toString());
636 new Ajax.Request("backend.php", {
638 onComplete: function(transport) {
644 alert(__("No profiles selected."));
650 function removeSelectedFeedCats() {
652 var sel_rows = getSelectedFeedCats();
654 if (sel_rows.length > 0) {
656 var ok = confirm(__("Remove selected categories?"));
659 notify_progress("Removing selected categories...");
661 var query = "?op=pref-feeds&subop=editCats&action=remove&ids="+
662 param_escape(sel_rows.toString());
664 new Ajax.Request("backend.php", {
666 onComplete: function(transport) {
667 infobox_feed_cat_callback2(transport);
674 alert(__("No categories are selected."));
681 function feedEditCancel() {
685 selectPrefRows('feed', false); // cleanup feed selection
690 function feedEditSave() {
694 // FIXME: add parameter validation
696 var query = Form.serialize("edit_feed_form");
698 notify_progress("Saving feed...");
700 new Ajax.Request("backend.php", {
702 onComplete: function(transport) {
703 feedlist_callback2(transport);
711 exception_error("feedEditSave", e);
715 function userEditCancel() {
717 selectPrefRows('user', false); // cleanup feed selection
723 function filterEditCancel() {
726 selectPrefRows('filter', false); // cleanup feed selection
734 function userEditSave() {
738 var login = document.forms["user_edit_form"].login.value;
740 if (login.length == 0) {
741 alert(__("Login field cannot be blank."));
745 notify_progress("Saving user...");
749 var query = Form.serialize("user_edit_form");
751 new Ajax.Request("backend.php", {
753 onComplete: function(transport) {
754 userlist_callback2(transport);
758 exception_error("userEditSave", e);
766 function filterEditSave() {
770 notify_progress("Saving filter...");
772 var query = "?" + Form.serialize("filter_edit_form");
776 new Ajax.Request("backend.php", {
778 onComplete: function(transport) {
779 filterlist_callback2(transport);
783 exception_error("filterEditSave", e);
790 function editSelectedUser() {
791 var rows = getSelectedUsers();
793 if (rows.length == 0) {
794 alert(__("No users are selected."));
798 if (rows.length > 1) {
799 alert(__("Please select only one user."));
808 function resetSelectedUserPass() {
812 var rows = getSelectedUsers();
814 if (rows.length == 0) {
815 alert(__("No users are selected."));
819 if (rows.length > 1) {
820 alert(__("Please select only one user."));
824 var ok = confirm(__("Reset password of selected user?"));
827 notify_progress("Resetting password for selected user...");
831 var query = "?op=pref-users&subop=resetPass&id=" +
834 new Ajax.Request("backend.php", {
836 onComplete: function(transport) {
837 userlist_callback2(transport);
843 exception_error("resetSelectedUserPass", e);
847 function selectedUserDetails() {
851 var rows = getSelectedUsers();
853 if (rows.length == 0) {
854 alert(__("No users are selected."));
858 if (rows.length > 1) {
859 alert(__("Please select only one user."));
863 notify_progress("Loading, please wait...");
867 var query = "?op=pref-users&subop=user-details&id=" + id;
869 new Ajax.Request("backend.php", {
871 onComplete: function(transport) {
872 infobox_callback2(transport);
875 exception_error("selectedUserDetails", e);
880 function editSelectedFilter() {
881 var rows = getSelectedFilters();
883 if (rows.length == 0) {
884 alert(__("No filters are selected."));
888 if (rows.length > 1) {
889 alert(__("Please select only one filter."));
900 function editSelectedFeed() {
901 var rows = getSelectedFeeds();
903 if (rows.length == 0) {
904 alert(__("No feeds are selected."));
908 if (rows.length > 1) {
909 return editSelectedFeeds();
918 function editSelectedFeeds() {
921 var rows = getSelectedFeeds();
923 if (rows.length == 0) {
924 alert(__("No feeds are selected."));
932 notify_progress("Loading, please wait...");
934 var query = "?op=pref-feeds&subop=editfeeds&ids=" +
935 param_escape(rows.toString());
937 new Ajax.Request("backend.php", {
939 onComplete: function(transport) {
940 infobox_callback2(transport);
944 exception_error("editSelectedFeeds", e);
948 function piggie(enable) {
950 console.log("I LOVEDED IT!");
951 var piggie = $("piggie");
953 Element.show(piggie);
954 Position.Center(piggie);
960 function opmlImport() {
962 var opml_file = $("opml_file");
964 if (opml_file.value.length == 0) {
965 alert(__("No OPML file to upload."));
968 notify_progress("Importing, please wait...", true);
973 function updateFilterList(sort_key) {
976 var filter_search = $("filter_search");
978 if (filter_search) { search = filter_search.value; }
980 var query = "?op=pref-filters&sort=" +
981 param_escape(sort_key) +
982 "&search=" + param_escape(search);
984 new Ajax.Request("backend.php", {
986 onComplete: function(transport) {
987 filterlist_callback2(transport);
991 exception_error("updateFilterList", e);
996 function updateLabelList(sort_key) {
1000 var label_search = $("label_search");
1002 if (label_search) { search = label_search.value; }
1004 var query = "?op=pref-labels&sort=" +
1005 param_escape(sort_key) +
1006 "&search=" + param_escape(search);
1008 new Ajax.Request("backend.php", {
1010 onComplete: function(transport) {
1011 labellist_callback2(transport);
1015 exception_error("updateLabelList", e);
1019 function updatePrefsList() {
1021 var query = "?op=pref-prefs";
1023 new Ajax.Request("backend.php", {
1025 onComplete: function(transport) {
1026 prefslist_callback2(transport);
1031 function selectTab(id, noupdate, subop) {
1035 if (!id) id = active_tab;
1040 if (id != active_tab) {
1041 var c = $('prefContent');
1048 console.log("selectTab: " + id + "(NU: " + noupdate + ")");
1050 notify_progress("Loading, please wait...");
1052 // close active infobox if needed
1055 // clean up all current selections, just in case
1056 active_feed_cat = false;
1058 // Effect.Fade("prefContent", {duration: 1, to: 0.01,
1059 // queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1061 if (id == "feedConfig") {
1063 } else if (id == "filterConfig") {
1065 } else if (id == "labelConfig") {
1067 } else if (id == "genConfig") {
1069 } else if (id == "userConfig") {
1074 /* clean selection from all tabs */
1076 var tabs_holder = $("prefTabs");
1077 var tab = tabs_holder.firstChild;
1080 if (tab.className && tab.className.match("prefsTabSelected")) {
1081 tab.className = "prefsTab";
1083 tab = tab.nextSibling;
1086 /* mark new tab as selected */
1088 tab = $(id + "Tab");
1091 if (!tab.className.match("Selected")) {
1092 tab.className = tab.className + "Selected";
1099 exception_error("selectTab", e);
1103 function init_second_stage() {
1106 active_tab = getInitParam("prefs_active_tab");
1107 if (!$(active_tab+"Tab")) active_tab = "genConfig";
1108 if (!active_tab || active_tab == '0') active_tab = "genConfig";
1110 document.onkeydown = pref_hotkey_handler;
1111 document.onmousedown = mouse_down_handler;
1112 document.onmouseup = mouse_up_handler;
1114 var tab = getURLParam('tab');
1116 caller_subop = getURLParam('subop');
1118 if (getURLParam("subopparam")) {
1119 caller_subop = caller_subop + ":" + getURLParam("subopparam");
1126 if (navigator.userAgent.match("Opera")) {
1127 setTimeout("selectTab()", 500);
1129 selectTab(active_tab);
1133 loading_set_progress(60);
1135 setTimeout("hotkey_prefix_timeout()", 5*1000);
1138 exception_error("init_second_stage", e);
1146 loading_set_progress(30);
1148 var query = "?op=rpc&subop=sanityCheck";
1150 new Ajax.Request("backend.php", {
1152 onComplete: function(transport) {
1153 backend_sanity_check_callback(transport);
1157 exception_error("init", e);
1161 function validatePrefsReset() {
1163 var ok = confirm(__("Reset to defaults?"));
1167 var query = Form.serialize("pref_prefs_form");
1168 query = query + "&subop=reset-config";
1171 new Ajax.Request("backend.php", {
1173 onComplete: function(transport) {
1174 var msg = transport.responseText;
1175 if (msg.match("PREFS_THEME_CHANGED")) {
1176 window.location.reload();
1186 exception_error("validatePrefsReset", e);
1193 function selectPrefRows(kind, select) {
1196 var opbarid = false;
1201 if (kind == "feed") {
1202 opbarid = "feedOpToolbar";
1205 lname = "prefFeedList";
1206 } else if (kind == "fcat") {
1207 opbarid = "catOpToolbar";
1210 lname = "prefFeedCatList";
1211 } else if (kind == "filter") {
1212 opbarid = "filterOpToolbar";
1215 lname = "prefFilterList";
1216 } else if (kind == "label") {
1217 opbarid = "labelOpToolbar";
1220 lname = "prefLabelList";
1221 } else if (kind == "user") {
1222 opbarid = "userOpToolbar";
1225 lname = "prefUserList";
1226 } else if (kind == "fbrowse") {
1227 opbarid = "browseOpToolbar";
1230 lname = "browseFeedList";
1234 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
1241 function toggleSelectPrefRow(sender, kind) {
1243 toggleSelectRow(sender);
1246 var opbarid = false;
1249 if (kind == "feed") {
1250 opbarid = "feedOpToolbar";
1251 nsel = getSelectedFeeds();
1252 } else if (kind == "fcat") {
1253 opbarid = "catOpToolbar";
1254 nsel = getSelectedFeedCats();
1255 } else if (kind == "filter") {
1256 opbarid = "filterOpToolbar";
1257 nsel = getSelectedFilters();
1258 } else if (kind == "label") {
1259 opbarid = "labelOpToolbar";
1260 nsel = getSelectedLabels();
1261 } else if (kind == "user") {
1262 opbarid = "userOpToolbar";
1263 nsel = getSelectedUsers();
1269 function toggleSelectFBListRow(sender) {
1270 toggleSelectListRow(sender);
1275 function pref_hotkey_handler(e) {
1279 var shift_key = false;
1281 var cmdline = $('cmdline');
1284 shift_key = e.shiftKey;
1290 keycode = window.event.keyCode;
1295 var keychar = String.fromCharCode(keycode);
1297 if (keycode == 27) { // escape
1298 if (Element.visible("hotkey_help_overlay")) {
1299 Element.hide("hotkey_help_overlay");
1301 colorPickerHideAll();
1302 hotkey_prefix = false;
1306 if (!hotkeys_enabled) {
1307 console.log("hotkeys disabled");
1311 if (keycode == 16) return; // ignore lone shift
1313 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1314 hotkey_prefix = keycode;
1316 var date = new Date();
1317 var ts = Math.round(date.getTime() / 1000);
1319 hotkey_prefix_pressed = ts;
1321 cmdline.innerHTML = keychar;
1322 Element.show(cmdline);
1324 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar);
1328 if (Element.visible("hotkey_help_overlay")) {
1329 Element.hide("hotkey_help_overlay");
1332 if (keycode == 13 || keycode == 27) {
1335 seq = seq + "" + keycode;
1338 /* Global hotkeys */
1340 Element.hide(cmdline);
1342 if (!hotkey_prefix) {
1344 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
1345 if (!Element.visible("hotkey_help_overlay")) {
1346 //Element.show("hotkey_help_overlay");
1347 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
1349 Element.hide("hotkey_help_overlay");
1354 if (keycode == 191 || keychar == '/') { // /
1355 var search_boxes = new Array("label_search",
1356 "feed_search", "filter_search", "user_search", "feed_browser_search");
1358 for (var i = 0; i < search_boxes.length; i++) {
1359 var elem = $(search_boxes[i]);
1361 $(search_boxes[i]).focus();
1370 if (hotkey_prefix == 67) { // c
1371 hotkey_prefix = false;
1373 if (keycode == 70) { // f
1378 if (keycode == 83) { // s
1383 if (keycode == 85) { // u
1387 if (keycode == 67) { // c
1392 if (keycode == 84 && shift_key) { // T
1393 displayDlg('feedBrowser');
1401 if (hotkey_prefix == 71) { // g
1403 hotkey_prefix = false;
1405 if (keycode == 49 && $("genConfigTab")) { // 1
1406 selectTab("genConfig");
1410 if (keycode == 50 && $("feedConfigTab")) { // 2
1411 selectTab("feedConfig");
1415 if (keycode == 51 && $("filterConfigTab")) { // 4
1416 selectTab("filterConfig");
1420 if (keycode == 52 && $("labelConfigTab")) { // 5
1421 selectTab("labelConfig");
1425 if (keycode == 53 && $("userConfigTab")) { // 6
1426 selectTab("userConfig");
1430 if (keycode == 88) { // x
1437 if (seq.match("8073717369")) {
1445 if (hotkey_prefix) {
1446 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
1448 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
1452 exception_error("pref_hotkey_handler", e);
1456 function editFeedCats() {
1458 var query = "?op=pref-feeds&subop=editCats";
1460 notify_progress("Loading, please wait...");
1462 new Ajax.Request("backend.php", {
1464 onComplete: function(transport) {
1465 infobox_feed_cat_callback2(transport);
1468 exception_error("editFeedCats", e);
1472 function showFeedsWithErrors() {
1473 displayDlg('feedUpdateErrors');
1476 function changeUserPassword() {
1480 var f = document.forms["change_pass_form"];
1483 if (f.OLD_PASSWORD.value == "") {
1484 new Effect.Highlight(f.OLD_PASSWORD);
1485 notify_error("Old password cannot be blank.");
1489 if (f.NEW_PASSWORD.value == "") {
1490 new Effect.Highlight(f.NEW_PASSWORD);
1491 notify_error("New password cannot be blank.");
1495 if (f.CONFIRM_PASSWORD.value == "") {
1496 new Effect.Highlight(f.CONFIRM_PASSWORD);
1497 notify_error("Entered passwords do not match.");
1501 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1502 new Effect.Highlight(f.CONFIRM_PASSWORD);
1503 new Effect.Highlight(f.NEW_PASSWORD);
1504 notify_error("Entered passwords do not match.");
1510 var query = Form.serialize("change_pass_form");
1512 notify_progress("Changing password...");
1514 new Ajax.Request("backend.php", {
1516 onComplete: function(transport) {
1517 if (transport.responseText.indexOf("ERROR: ") == 0) {
1518 notify_error(transport.responseText.replace("ERROR: ", ""));
1520 notify_info(transport.responseText);
1521 var warn = $("default_pass_warning");
1522 if (warn) warn.style.display = "none";
1525 document.forms['change_pass_form'].reset();
1530 exception_error("changeUserPassword", e);
1536 function changeUserEmail() {
1540 var query = Form.serialize("change_email_form");
1542 notify_progress("Saving...");
1544 new Ajax.Request("backend.php", {
1546 onComplete: function(transport) {
1547 notify_callback2(transport);
1551 exception_error("changeUserPassword", e);
1558 function feedlistToggleSLAT() {
1559 notify_progress("Loading, please wait...");
1563 function opmlRegenKey() {
1566 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
1570 notify_progress("Trying to change address...", true);
1572 var query = "?op=rpc&subop=regenOPMLKey";
1574 new Ajax.Request("backend.php", {
1576 onComplete: function(transport) {
1577 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1579 var e = $('pub_opml_url');
1582 e.href = new_link.firstChild.nodeValue;
1583 e.innerHTML = new_link.firstChild.nodeValue;
1585 new Effect.Highlight(e);
1590 notify_error("Could not change feed URL.");
1595 exception_error("opmlRegenKey", e);
1599 function validatePrefsSave() {
1602 var ok = confirm(__("Save current configuration?"));
1606 var query = Form.serialize("pref_prefs_form");
1607 query = query + "&subop=save-config";
1610 new Ajax.Request("backend.php", {
1612 onComplete: function(transport) {
1613 var msg = transport.responseText;
1614 if (msg.match("PREFS_THEME_CHANGED")) {
1615 window.location.reload();
1624 exception_error("validatePrefsSave", e);
1630 function feedActionChange() {
1632 var chooser = $("feedActionChooser");
1633 var opid = chooser[chooser.selectedIndex].value;
1635 chooser.selectedIndex = 0;
1638 exception_error("feedActionChange", e);
1642 function feedActionGo(op) {
1644 if (op == "facEdit") {
1646 var rows = getSelectedFeeds();
1648 if (rows.length > 1) {
1649 editSelectedFeeds();
1655 if (op == "facClear") {
1656 clearSelectedFeeds();
1659 if (op == "facPurge") {
1660 purgeSelectedFeeds();
1663 if (op == "facEditCats") {
1667 if (op == "facRescore") {
1668 rescoreSelectedFeeds();
1671 if (op == "facUnsubscribe") {
1672 removeSelectedFeeds();
1676 exception_error("feedActionGo", e);
1681 function clearFeedArticles(feed_id) {
1683 notify_progress("Clearing feed...");
1685 var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
1687 new Ajax.Request("backend.php", {
1689 onComplete: function(transport) {
1696 function rescoreSelectedFeeds() {
1698 var sel_rows = getSelectedFeeds();
1700 if (sel_rows.length > 0) {
1702 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1703 var ok = confirm(__("Rescore articles in selected feeds?"));
1706 notify_progress("Rescoring selected feeds...", true);
1708 var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+
1709 param_escape(sel_rows.toString());
1711 new Ajax.Request("backend.php", {
1713 onComplete: function(transport) {
1714 notify_callback2(transport);
1719 alert(__("No feeds are selected."));
1725 function rescore_all_feeds() {
1726 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
1729 notify_progress("Rescoring feeds...", true);
1731 var query = "?op=pref-feeds&subop=rescoreAll&quiet=1";
1733 new Ajax.Request("backend.php", {
1735 onComplete: function(transport) {
1736 notify_callback2(transport);
1741 function removeFilter(id, title) {
1745 var msg = __("Remove filter %s?").replace("%s", title);
1747 var ok = confirm(msg);
1752 notify_progress("Removing filter...");
1754 var query = "?op=pref-filters&subop=remove&ids="+
1757 new Ajax.Request("backend.php", {
1759 onComplete: function(transport) {
1760 filterlist_callback2(transport);
1766 exception_error("removeFilter", e);
1772 /*function unsubscribeFeed(id, title) {
1776 var msg = __("Unsubscribe from %s?").replace("%s", title);
1778 var ok = confirm(msg);
1783 notify_progress("Removing feed...");
1785 var query = "?op=pref-feeds&subop=remove&ids="+
1788 new Ajax.Request("backend.php", {
1790 onComplete: function(transport) {
1791 feedlist_callback2(transport);
1796 exception_error("unsubscribeFeed", e);
1803 function feedsEditSave() {
1806 var ok = confirm(__("Save changes to selected feeds?"));
1810 var f = document.forms["batch_edit_feed_form"];
1812 var query = Form.serialize("batch_edit_feed_form");
1814 /* Form.serialize ignores unchecked checkboxes */
1816 if (!query.match("&rtl_content=") &&
1817 f.rtl_content.disabled == false) {
1818 query = query + "&rtl_content=false";
1821 if (!query.match("&private=") &&
1822 f.private.disabled == false) {
1823 query = query + "&private=false";
1826 if (!query.match("&cache_images=") &&
1827 f.cache_images.disabled == false) {
1828 query = query + "&cache_images=false";
1831 if (!query.match("&include_in_digest=") &&
1832 f.include_in_digest.disabled == false) {
1833 query = query + "&include_in_digest=false";
1838 notify_progress("Saving feeds...");
1840 new Ajax.Request("backend.php", {
1842 onComplete: function(transport) {
1843 feedlist_callback2(transport);
1850 exception_error("feedsEditSave", e);
1854 function batchFeedsToggleField(cb, elem, label) {
1856 var f = document.forms["batch_edit_feed_form"];
1860 f[elem].disabled = false;
1866 // new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1867 // queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1870 f[elem].disabled = true;
1873 l.className = "insensitive";
1878 exception_error("batchFeedsToggleField", e);
1882 function labelColorReset() {
1884 var labels = getSelectedLabels();
1886 var ok = confirm(__("Reset label colors to default?"));
1890 var query = "?op=pref-labels&subop=color-reset&ids="+
1891 param_escape(labels.toString());
1893 new Ajax.Request("backend.php", {
1895 onComplete: function(transport) {
1896 labellist_callback2(transport);
1901 exception_error("labelColorReset", e);
1905 function labelColorAsk(id, kind) {
1911 p = prompt(__("Please enter new label foreground color:"));
1913 p = prompt(__("Please enter new label background color:"));
1918 var query = "?op=pref-labels&subop=color-set&kind=" + kind +
1919 "&ids="+ param_escape(id) + "&color=" + param_escape(p);
1921 selectPrefRows('label', false);
1923 var e = $("LICID-" + id);
1929 e.style.backgroundColor = p;
1933 new Ajax.Request("backend.php", { parameters: query });
1937 exception_error("labelColorReset", e);
1942 function colorPicker(id, fg, bg) {
1944 var picker = $("colorPicker-" + id);
1946 if (picker) Element.show(picker);
1949 exception_error("colorPicker", e);
1953 function colorPickerHideAll() {
1955 if ($("prefLabelList")) {
1957 var elems = $("prefLabelList").getElementsByTagName("DIV");
1959 for (var i = 0; i < elems.length; i++) {
1960 if (elems[i].id && elems[i].id.match("colorPicker-")) {
1961 Element.hide(elems[i]);
1967 exception_error("colorPickerHideAll", e);
1971 function colorPickerDo(id, fg, bg) {
1974 var query = "?op=pref-labels&subop=color-set&kind=both"+
1975 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
1976 "&bg=" + param_escape(bg);
1978 var e = $("LICID-" + id);
1982 e.style.backgroundColor = bg;
1985 new Ajax.Request("backend.php", { parameters: query });
1988 exception_error("colorPickerDo", e);
1992 function colorPickerActive(b) {
1993 color_picker_active = b;
1996 function mouse_down_handler(e) {
1999 /* do not prevent right click */
2000 if (e && e.button && e.button == 2) return;
2002 if (selection_disabled) {
2003 document.onselectstart = function() { return false; };
2008 exception_error("mouse_down_handler", e);
2012 function mouse_up_handler(e) {
2014 mouse_is_down = false;
2016 if (!selection_disabled) {
2017 document.onselectstart = null;
2020 if (!color_picker_active) {
2021 colorPickerHideAll();
2025 exception_error("mouse_up_handler", e);
2029 function inPreferences() {
2033 function editProfiles() {
2034 displayDlg('editPrefProfiles', false, function() {
2035 init_profile_inline_editor();
2039 function activatePrefProfile() {
2041 var sel_rows = getSelectedFeedCats();
2043 if (sel_rows.length == 1) {
2045 var ok = confirm(__("Activate selected profile?"));
2048 notify_progress("Loading, please wait...");
2050 var query = "?op=rpc&subop=setprofile&id="+
2051 param_escape(sel_rows.toString());
2053 new Ajax.Request("backend.php", {
2055 onComplete: function(transport) {
2056 window.location.reload();
2061 alert(__("Please choose a profile to activate."));
2067 function opmlImportDone() {
2072 function opmlImportHandler(iframe) {
2074 var tmp = new Object();
2075 tmp.responseText = iframe.document.body.innerHTML;
2077 infobox_callback2(tmp);
2079 exception_error("opml_import_handler", e);
2083 function clearFeedAccessKeys() {
2085 var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
2088 notify_progress("Clearing URLs...");
2090 var query = "?op=rpc&subop=clearKeys";
2092 new Ajax.Request("backend.php", {
2094 onComplete: function(transport) {
2095 notify_info("Generated URLs cleared.");