3 var active_feed_cat = false;
4 var active_label = false;
5 var active_tab = false;
6 var feed_to_expand = false;
11 var xmlhttp = Ajax.getTransport();
13 var init_params = new Array();
15 var caller_subop = false;
17 function expand_feed_callback() {
18 if (xmlhttp.readyState == 4) {
20 var container = document.getElementById("BRDET-" + feed_to_expand);
21 container.innerHTML=xmlhttp.responseText;
22 container.style.display = "block";
25 exception_error("expand_feed_callback", e);
30 function feedlist_callback() {
31 if (xmlhttp.readyState == 4) {
33 var container = document.getElementById('prefContent');
34 container.innerHTML=xmlhttp.responseText;
35 selectTab("feedConfig", true);
38 var tuple = caller_subop.split(":");
39 if (tuple[0] == 'editFeed') {
40 window.setTimeout('editFeed('+tuple[1]+')', 100);
48 exception_error("feedlist_callback", e);
53 function filterlist_callback() {
54 var container = document.getElementById('prefContent');
55 if (xmlhttp.readyState == 4) {
56 container.innerHTML=xmlhttp.responseText;
61 function labellist_callback() {
62 var container = document.getElementById('prefContent');
63 if (xmlhttp.readyState == 4) {
65 container.innerHTML=xmlhttp.responseText;
67 var row = document.getElementById("LILRR-" + active_label);
69 if (!row.className.match("Selected")) {
70 row.className = row.className + "Selected";
73 var checkbox = document.getElementById("LICHK-" + active_label);
76 checkbox.checked = true;
83 function labeltest_callback() {
84 var container = document.getElementById('label_test_result');
85 if (xmlhttp.readyState == 4) {
86 container.innerHTML=xmlhttp.responseText;
91 function feed_browser_callback() {
92 var container = document.getElementById('prefContent');
93 if (xmlhttp.readyState == 4) {
94 container.innerHTML=xmlhttp.responseText;
99 function userlist_callback() {
100 var container = document.getElementById('prefContent');
101 if (xmlhttp.readyState == 4) {
102 container.innerHTML=xmlhttp.responseText;
107 function prefslist_callback() {
108 var container = document.getElementById('prefContent');
109 if (xmlhttp.readyState == 4) {
111 container.innerHTML=xmlhttp.responseText;
117 function gethelp_callback() {
118 var container = document.getElementById('prefHelpBox');
119 if (xmlhttp.readyState == 4) {
121 container.innerHTML = xmlhttp.responseText;
122 container.style.display = "block";
128 function notify_callback() {
129 if (xmlhttp.readyState == 4) {
130 notify_info(xmlhttp.responseText);
134 function updateFeedList(sort_key) {
136 if (!xmlhttp_ready(xmlhttp)) {
141 // document.getElementById("prefContent").innerHTML = "Loading feeds, please wait...";
143 // p_notify("Loading, please wait...");
145 var feed_search = document.getElementById("feed_search");
147 if (feed_search) { search = feed_search.value; }
149 xmlhttp.open("GET", "backend.php?op=pref-feeds" +
150 "&sort=" + param_escape(sort_key) +
151 "&search=" + param_escape(search), true);
152 xmlhttp.onreadystatechange=feedlist_callback;
157 function updateUsersList(sort_key) {
159 if (!xmlhttp_ready(xmlhttp)) {
164 // document.getElementById("prefContent").innerHTML = "Loading feeds, please wait...";
166 // p_notify("Loading, please wait...");
168 xmlhttp.open("GET", "backend.php?op=pref-users&sort="
169 + param_escape(sort_key), true);
170 xmlhttp.onreadystatechange=userlist_callback;
175 function addLabel() {
177 if (!xmlhttp_ready(xmlhttp)) {
182 var form = document.forms['label_edit_form'];
184 var sql_exp = form.sql_exp.value;
185 var description = form.description.value;
188 alert("Can't create label: missing SQL expression.");
192 if (description == "") {
193 alert("Can't create label: missing caption.");
197 var query = Form.serialize("label_edit_form");
199 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=add&" + query, true);
200 xmlhttp.onreadystatechange=infobox_submit_callback;
206 if (!xmlhttp_ready(xmlhttp)) {
211 var link = document.getElementById("fadd_link");
213 if (link.value.length == 0) {
214 alert("Error: No feed URL given.");
215 } else if (!isValidURL(link.value)) {
216 alert("Error: Invalid feed URL.");
218 notify_progress("Adding feed...");
220 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
221 param_escape(link.value), true);
222 xmlhttp.onreadystatechange=feedlist_callback;
231 function addFeedCat() {
233 if (!xmlhttp_ready(xmlhttp)) {
238 var cat = document.getElementById("fadd_cat");
240 if (cat.value.length == 0) {
241 alert("Can't add category: no name specified.");
243 notify_progress("Adding feed category...");
245 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" +
246 param_escape(cat.value), true);
247 xmlhttp.onreadystatechange=infobox_callback;
257 if (!xmlhttp_ready(xmlhttp)) {
262 var sqlexp = document.getElementById("uadd_box");
264 if (sqlexp.value.length == 0) {
265 alert("Can't add user: no login specified.");
267 notify_progress("Adding user...");
269 xmlhttp.open("GET", "backend.php?op=pref-users&subop=add&login=" +
270 param_escape(sqlexp.value), true);
272 xmlhttp.onreadystatechange=userlist_callback;
280 function editLabel(id) {
282 if (!xmlhttp_ready(xmlhttp)) {
287 document.getElementById("label_create_btn").disabled = true;
291 selectTableRowsByIdPrefix('prefLabelList', 'LILRR-', 'LICHK-', false);
292 selectTableRowById('LILRR-'+id, 'LICHK-'+id, true);
294 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=edit&id=" +
295 param_escape(id), true);
296 xmlhttp.onreadystatechange=infobox_callback;
301 function editUser(id) {
303 if (!xmlhttp_ready(xmlhttp)) {
308 selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false);
309 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
311 xmlhttp.open("GET", "backend.php?op=pref-users&subop=edit&id=" +
312 param_escape(id), true);
313 xmlhttp.onreadystatechange=infobox_callback;
318 function editFilter(id) {
320 if (!xmlhttp_ready(xmlhttp)) {
325 document.getElementById("create_filter_btn").disabled = true;
327 selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false);
328 selectTableRowById('FILRR-'+id, 'FICHK-'+id, true);
330 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=edit&id=" + param_escape(id), true);
331 xmlhttp.onreadystatechange=infobox_callback;
335 function editFeed(feed) {
337 // notify("Editing feed...");
339 if (!xmlhttp_ready(xmlhttp)) {
344 // clean selection from all rows & select row being edited
345 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
346 selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true);
348 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editfeed&id=" +
349 param_escape(feed), true);
351 xmlhttp.onreadystatechange=infobox_callback;
356 function editFeedCat(cat) {
358 if (!xmlhttp_ready(xmlhttp)) {
363 active_feed_cat = cat;
365 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=edit&id=" +
366 param_escape(cat), true);
367 xmlhttp.onreadystatechange=infobox_callback;
372 function getSelectedLabels() {
373 return getSelectedTableRowIds("prefLabelList", "LILRR");
376 function getSelectedUsers() {
377 return getSelectedTableRowIds("prefUserList", "UMRR");
380 function getSelectedFeeds() {
381 return getSelectedTableRowIds("prefFeedList", "FEEDR");
384 function getSelectedFilters() {
385 return getSelectedTableRowIds("prefFilterList", "FILRR");
388 function getSelectedFeedCats() {
389 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
392 function getSelectedFeedsFromBrowser() {
394 var list = document.getElementById("browseFeedList");
395 if (!list) list = document.getElementById("browseBigFeedList");
397 var selected = new Array();
399 for (i = 0; i < list.childNodes.length; i++) {
400 var child = list.childNodes[i];
401 if (child.id && child.id.match("FBROW-")) {
402 var id = child.id.replace("FBROW-", "");
404 var cb = document.getElementById("FBCHK-" + id);
415 function removeSelectedLabels() {
417 if (!xmlhttp_ready(xmlhttp)) {
422 var sel_rows = getSelectedLabels();
424 if (sel_rows.length > 0) {
426 var ok = confirm("Remove selected labels?");
429 notify_progress("Removing selected labels...");
431 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=remove&ids="+
432 param_escape(sel_rows.toString()), true);
433 xmlhttp.onreadystatechange=labellist_callback;
437 alert("No labels are selected.");
443 function removeSelectedUsers() {
445 if (!xmlhttp_ready(xmlhttp)) {
450 var sel_rows = getSelectedUsers();
452 if (sel_rows.length > 0) {
454 var ok = confirm("Remove selected users?");
457 notify_progress("Removing selected users...");
459 xmlhttp.open("GET", "backend.php?op=pref-users&subop=remove&ids="+
460 param_escape(sel_rows.toString()), true);
461 xmlhttp.onreadystatechange=userlist_callback;
466 alert("No users are selected.");
472 function removeSelectedFilters() {
474 if (!xmlhttp_ready(xmlhttp)) {
479 var sel_rows = getSelectedFilters();
481 if (sel_rows.length > 0) {
483 var ok = confirm("Remove selected filters?");
486 notify_progress("Removing selected filters...");
488 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+
489 param_escape(sel_rows.toString()), true);
490 xmlhttp.onreadystatechange=filterlist_callback;
494 alert("No filters are selected.");
501 function removeSelectedFeeds() {
503 if (!xmlhttp_ready(xmlhttp)) {
508 var sel_rows = getSelectedFeeds();
510 if (sel_rows.length > 0) {
512 var ok = confirm("Unsubscribe from selected feeds?");
516 notify_progress("Unsubscribing from selected feeds...");
518 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=remove&ids="+
519 param_escape(sel_rows.toString()), true);
520 xmlhttp.onreadystatechange=feedlist_callback;
526 alert("No feeds are selected.");
533 function removeSelectedFeedCats() {
535 if (!xmlhttp_ready(xmlhttp)) {
540 var sel_rows = getSelectedFeedCats();
542 if (sel_rows.length > 0) {
544 var ok = confirm("Remove selected categories?");
547 notify_progress("Removing selected categories...");
549 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+
550 param_escape(sel_rows.toString()), true);
551 xmlhttp.onreadystatechange=infobox_callback;
557 alert("No categories are selected.");
564 function feedEditCancel() {
566 if (!xmlhttp_ready(xmlhttp)) {
573 selectPrefRows('feed', false); // cleanup feed selection
578 function feedCatEditCancel() {
580 if (!xmlhttp_ready(xmlhttp)) {
585 active_feed_cat = false;
587 // notify("Operation cancelled.");
589 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true);
590 xmlhttp.onreadystatechange=infobox_callback;
596 function feedEditSave() {
600 if (!xmlhttp_ready(xmlhttp)) {
605 // FIXME: add parameter validation
607 var query = Form.serialize("edit_feed_form");
609 notify_progress("Saving feed...");
611 xmlhttp.open("POST", "backend.php", true);
612 xmlhttp.onreadystatechange=feedlist_callback;
613 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
621 exception_error("feedEditSave", e);
625 function feedCatEditSave() {
627 if (!xmlhttp_ready(xmlhttp)) {
632 notify_progress("Saving category...");
634 var query = Form.serialize("feed_cat_edit_form");
636 xmlhttp.open("GET", "backend.php?" + query, true);
637 xmlhttp.onreadystatechange=infobox_callback;
640 active_feed_cat = false;
646 function labelTest() {
648 var container = document.getElementById('label_test_result');
649 container.style.display = "block";
650 container.innerHTML = "<p>Loading, please wait...</p>";
652 var form = document.forms['label_edit_form'];
654 var sql_exp = form.sql_exp.value;
655 var description = form.description.value;
657 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=test&expr=" +
658 param_escape(sql_exp) + "&descr=" + param_escape(description), true);
660 xmlhttp.onreadystatechange=labeltest_callback;
666 function displayHelpInfobox(topic_id) {
668 xmlhttp.open("GET", "backend.php?op=help&tid=" +
669 param_escape(topic_id) + "&noheaders=1", true);
671 xmlhttp.onreadystatechange=infobox_callback;
676 function labelEditCancel() {
678 if (!xmlhttp_ready(xmlhttp)) {
683 document.getElementById("label_create_btn").disabled = false;
685 active_label = false;
687 selectPrefRows('label', false); // cleanup feed selection
693 function userEditCancel() {
695 if (!xmlhttp_ready(xmlhttp)) {
700 selectPrefRows('user', false); // cleanup feed selection
706 function filterEditCancel() {
708 if (!xmlhttp_ready(xmlhttp)) {
713 document.getElementById("create_filter_btn").disabled = false;
715 selectPrefRows('filter', false); // cleanup feed selection
721 function labelEditSave() {
723 var label = active_label;
725 if (!xmlhttp_ready(xmlhttp)) {
730 /* if (!is_opera()) {
732 var sql_exp = document.forms["label_edit_form"].sql_exp.value;
733 var description = document.forms["label_edit_form"].description.value;
735 if (sql_exp.length == 0) {
736 alert("SQL Expression cannot be blank.");
740 if (description.length == 0) {
741 alert("Caption field cannot be blank.");
748 notify_progress("Saving label...");
750 active_label = false;
752 query = Form.serialize("label_edit_form");
754 xmlhttp.open("GET", "backend.php?" + query, true);
755 xmlhttp.onreadystatechange=labellist_callback;
761 function userEditSave() {
763 if (!xmlhttp_ready(xmlhttp)) {
768 var login = document.forms["user_edit_form"].login.value;
770 if (login.length == 0) {
771 alert("Login field cannot be blank.");
775 notify_progress("Saving user...");
779 var query = Form.serialize("user_edit_form");
781 xmlhttp.open("GET", "backend.php?" + query, true);
782 xmlhttp.onreadystatechange=userlist_callback;
789 function filterEditSave() {
791 if (!xmlhttp_ready(xmlhttp)) {
796 /* if (!is_opera()) {
797 var reg_exp = document.forms["filter_edit_form"].reg_exp.value;
799 if (reg_exp.length == 0) {
800 alert("Filter expression field cannot be blank.");
805 notify_progress("Saving filter...");
807 var query = Form.serialize("filter_edit_form");
811 document.getElementById("create_filter_btn").disabled = false;
813 xmlhttp.open("GET", "backend.php?" + query, true);
814 xmlhttp.onreadystatechange=filterlist_callback;
820 function editSelectedLabel() {
821 var rows = getSelectedLabels();
823 if (rows.length == 0) {
824 alert("No labels are selected.");
828 if (rows.length > 1) {
829 alert("Please select only one label.");
839 function editSelectedUser() {
840 var rows = getSelectedUsers();
842 if (rows.length == 0) {
843 alert("No users are selected.");
847 if (rows.length > 1) {
848 alert("Please select only one user.");
857 function resetSelectedUserPass() {
858 var rows = getSelectedUsers();
860 if (rows.length == 0) {
861 alert("No users are selected.");
865 if (rows.length > 1) {
866 alert("Please select only one user.");
870 var ok = confirm("Reset password of selected user?");
873 notify_progress("Resetting password for selected user...");
877 xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
878 param_escape(id), true);
879 xmlhttp.onreadystatechange=userlist_callback;
884 function selectedUserDetails() {
886 if (!xmlhttp_ready(xmlhttp)) {
891 var rows = getSelectedUsers();
893 if (rows.length == 0) {
894 alert("No users are selected.");
898 if (rows.length > 1) {
899 alert("Please select only one user.");
907 xmlhttp.open("GET", "backend.php?op=user-details&id=" + id, true);
908 xmlhttp.onreadystatechange=infobox_callback;
913 function selectedFeedDetails() {
915 if (!xmlhttp_ready(xmlhttp)) {
920 var rows = getSelectedFeeds();
922 if (rows.length == 0) {
923 alert("No feeds are selected.");
927 if (rows.length > 1) {
928 alert("Please select only one feed.");
936 xmlhttp.open("GET", "backend.php?op=feed-details&id=" +
937 param_escape(rows.toString()), true);
938 xmlhttp.onreadystatechange=infobox_callback;
943 function editSelectedFilter() {
944 var rows = getSelectedFilters();
946 if (rows.length == 0) {
947 alert("No filters are selected.");
951 if (rows.length > 1) {
952 alert("Please select only one filter.");
963 function editSelectedFeed() {
964 var rows = getSelectedFeeds();
966 if (rows.length == 0) {
967 alert("No feeds are selected.");
971 if (rows.length > 1) {
972 alert("Please select one feed.");
982 function editSelectedFeedCat() {
983 var rows = getSelectedFeedCats();
985 if (rows.length == 0) {
986 alert("No categories are selected.");
990 if (rows.length > 1) {
991 alert("Please select only one category.");
997 editFeedCat(rows[0]);
1001 function piggie_callback() {
1002 var piggie = document.getElementById("piggie");
1004 piggie.style.top = piggie_top;
1005 piggie.style.backgroundColor = "white";
1006 piggie.style.borderWidth = "1px";
1008 if (piggie_fwd && piggie_top < 0) {
1009 setTimeout("piggie_callback()", 50);
1010 piggie_top = piggie_top + 10;
1011 } else if (piggie_fwd && piggie_top >= 0) {
1013 setTimeout("piggie_callback()", 50);
1014 } else if (!piggie_fwd && piggie_top > -400) {
1015 setTimeout("piggie_callback()", 50);
1016 piggie_top = piggie_top - 10;
1017 } else if (!piggie_fwd && piggie_top <= -400) {
1018 piggie.style.display = "none";
1023 var piggie_opacity = 0;
1025 function piggie2_callback() {
1026 var piggie = document.getElementById("piggie");
1027 piggie.style.top = 0;
1028 piggie.style.opacity = piggie_opacity;
1029 piggie.style.backgroundColor = "transparent";
1030 piggie.style.borderWidth = "0px";
1032 if (piggie_fwd && piggie_opacity < 1) {
1033 setTimeout("piggie2_callback()", 50);
1034 piggie_opacity = piggie_opacity + 0.03;
1035 } else if (piggie_fwd && piggie_opacity >= 1) {
1037 setTimeout("piggie2_callback()", 50);
1038 } else if (!piggie_fwd && piggie_opacity > 0) {
1039 setTimeout("piggie2_callback()", 50);
1040 piggie_opacity = piggie_opacity - 0.03;
1041 } else if (!piggie_fwd && piggie_opacity <= 0) {
1042 piggie.style.display = "none";
1047 function localPiggieFunction(enable) {
1049 debug("I LOVEDED IT!");
1050 var piggie = document.getElementById("piggie");
1051 piggie.style.display = "block";
1053 if (navigator.userAgent.match("Gecko") && Math.random(1) > 0.5) {
1061 function validateOpmlImport() {
1063 var opml_file = document.getElementById("opml_file");
1065 if (opml_file.value.length == 0) {
1066 alert("No OPML file to upload.");
1073 function updateFilterList(sort_key) {
1075 if (!xmlhttp_ready(xmlhttp)) {
1076 printLockingError();
1080 // document.getElementById("prefContent").innerHTML = "Loading filters, please wait...";
1082 // p_notify("Loading, please wait...");
1084 xmlhttp.open("GET", "backend.php?op=pref-filters&sort=" +
1085 param_escape(sort_key), true);
1086 xmlhttp.onreadystatechange=filterlist_callback;
1091 function updateLabelList(sort_key) {
1093 if (!xmlhttp_ready(xmlhttp)) {
1094 printLockingError();
1098 // p_notify("Loading, please wait...");
1100 // document.getElementById("prefContent").innerHTML = "Loading labels, please wait...";
1102 xmlhttp.open("GET", "backend.php?op=pref-labels&sort=" +
1103 param_escape(sort_key), true);
1104 xmlhttp.onreadystatechange=labellist_callback;
1108 function updatePrefsList() {
1110 if (!xmlhttp_ready(xmlhttp)) {
1111 printLockingError();
1115 // p_notify("Loading, please wait...");
1117 xmlhttp.open("GET", "backend.php?op=pref-prefs", true);
1118 xmlhttp.onreadystatechange=prefslist_callback;
1123 function selectTab(id, noupdate, subop) {
1127 if (!id) id = active_tab;
1131 if (!xmlhttp_ready(xmlhttp)) {
1132 printLockingError();
1137 var c = document.getElementById('prefContent');
1143 debug("selectTab: " + id + "(NU: " + noupdate + ")");
1145 notify_progress("Loading, please wait...", true);
1147 // close active infobox if needed
1150 // clean up all current selections, just in case
1151 active_feed_cat = false;
1152 active_label = false;
1154 if (id == "feedConfig") {
1156 } else if (id == "filterConfig") {
1158 } else if (id == "labelConfig") {
1160 } else if (id == "genConfig") {
1162 } else if (id == "userConfig") {
1164 } else if (id == "feedBrowser") {
1165 updateBigFeedBrowser();
1169 var tab = document.getElementById(active_tab + "Tab");
1172 if (tab.className.match("Selected")) {
1173 tab.className = "prefsTab";
1177 tab = document.getElementById(id + "Tab");
1180 if (!tab.className.match("Selected")) {
1181 tab.className = tab.className + "Selected";
1185 if (active_tab != id) {
1186 storeInitParam("prefs_active_tab", id);
1192 exception_error("selectTab", e);
1196 function backend_sanity_check_callback() {
1198 if (xmlhttp.readyState == 4) {
1202 if (!xmlhttp.responseXML) {
1203 fatalError(3, "[D001, Received reply is not XML]: " + xmlhttp.responseText);
1207 var reply = xmlhttp.responseXML.firstChild.firstChild;
1210 fatalError(3, "[D002, Invalid RPC reply]: " + xmlhttp.responseText);
1214 var error_code = reply.getAttribute("error-code");
1216 if (error_code && error_code != 0) {
1217 return fatalError(error_code, reply.getAttribute("error-msg"));
1220 debug("sanity check ok");
1222 var params = reply.nextSibling;
1225 debug('reading init-params...');
1226 var param = params.firstChild;
1229 var k = param.getAttribute("key");
1230 var v = param.getAttribute("value");
1231 debug(k + " => " + v);
1233 param = param.nextSibling;
1237 init_second_stage();
1240 exception_error("backend_sanity_check_callback", e);
1245 function init_second_stage() {
1248 active_tab = getInitParam("prefs_active_tab");
1249 if (!active_tab) active_tab = "genConfig";
1251 document.onkeydown = pref_hotkey_handler;
1253 var tab = getURLParam('tab');
1255 caller_subop = getURLParam('subop');
1261 if (navigator.userAgent.match("Opera")) {
1262 setTimeout("selectTab()", 500);
1264 selectTab(active_tab);
1268 exception_error("init_second_stage", e);
1276 if (arguments.callee.done) return;
1277 arguments.callee.done = true;
1279 if (getURLParam('debug')) {
1280 document.getElementById('debug_output').style.display = 'block';
1281 debug('debug mode activated');
1286 document.getElementById("prefContent").innerHTML =
1287 "<b>Fatal error:</b> This program needs XmlHttpRequest " +
1288 "to function properly. Your browser doesn't seem to support it.";
1292 xmlhttp.open("GET", "backend.php?op=rpc&subop=sanityCheck", true);
1293 xmlhttp.onreadystatechange=backend_sanity_check_callback;
1297 exception_error("init", e);
1301 function categorizeSelectedFeeds() {
1303 if (!xmlhttp_ready(xmlhttp)) {
1304 printLockingError();
1308 var sel_rows = getSelectedFeeds();
1310 var cat_sel = document.getElementById("sfeed_set_fcat");
1311 var cat_id = cat_sel[cat_sel.selectedIndex].value;
1313 if (sel_rows.length > 0) {
1315 notify_progress("Changing category of selected feeds...");
1317 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=categorize&ids="+
1318 param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id), true);
1319 xmlhttp.onreadystatechange=feedlist_callback;
1324 alert("No feeds are selected.");
1330 function validatePrefsReset() {
1331 return confirm("Reset to defaults?");
1334 function browseFeeds(limit) {
1336 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=browse", true);
1337 xmlhttp.onreadystatechange=infobox_callback;
1342 function feedBrowserSubscribe() {
1345 var selected = getSelectedFeedsFromBrowser();
1347 if (selected.length > 0) {
1349 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=massSubscribe&ids="+
1350 param_escape(selected.toString()), true);
1351 xmlhttp.onreadystatechange=feedlist_callback;
1354 alert("No feeds are selected.");
1358 exception_error("feedBrowserSubscribe", e);
1362 function updateBigFeedBrowser(limit) {
1364 if (!xmlhttp_ready(xmlhttp)) {
1365 printLockingError();
1369 // p_notify("Loading, please wait...");
1371 var query = "backend.php?op=pref-feed-browser";
1373 var limit_sel = document.getElementById("feedBrowserLimit");
1376 var limit = limit_sel[limit_sel.selectedIndex].value;
1377 query = query + "&limit=" + param_escape(limit);
1380 xmlhttp.open("GET", query, true);
1381 xmlhttp.onreadystatechange=feed_browser_callback;
1385 function browserToggleExpand(id) {
1387 /* if (feed_to_expand && feed_to_expand != id) {
1388 var d = document.getElementById("BRDET-" + feed_to_expand);
1389 d.style.display = "none";
1392 if (!xmlhttp_ready(xmlhttp)) {
1393 printLockingError();
1397 var d = document.getElementById("BRDET-" + id);
1399 if (d.style.display == "block") {
1400 d.style.display = "none";
1404 feed_to_expand = id;
1406 d.style.display = "block";
1407 d.innerHTML = "Loading, please wait...";
1409 xmlhttp.open("GET", "backend.php?op=pref-feed-browser&subop=details&id="
1410 + param_escape(id), true);
1411 xmlhttp.onreadystatechange=expand_feed_callback;
1416 exception_error("browserExpand", e);
1420 function validateNewPassword(form) {
1421 if (form.OLD_PASSWORD.value == "") {
1422 alert("Old password cannot be blank");
1425 if (form.NEW_PASSWORD.value == "") {
1426 alert("New password cannot be blank");
1432 function selectPrefRows(kind, select) {
1435 var opbarid = false;
1440 if (kind == "feed") {
1441 opbarid = "feedOpToolbar";
1444 lname = "prefFeedList";
1445 } else if (kind == "fcat") {
1446 opbarid = "catOpToolbar";
1449 lname = "prefFeedCatList";
1450 } else if (kind == "filter") {
1451 opbarid = "filterOpToolbar";
1454 lname = "prefFilterList";
1455 } else if (kind == "label") {
1456 opbarid = "labelOpToolbar";
1459 lname = "prefLabelList";
1460 } else if (kind == "user") {
1461 opbarid = "userOpToolbar";
1464 lname = "prefUserList";
1468 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
1469 disableContainerChildren(opbarid, !select);
1476 function toggleSelectPrefRow(sender, kind) {
1478 toggleSelectRow(sender);
1481 var opbarid = false;
1484 if (kind == "feed") {
1485 opbarid = "feedOpToolbar";
1486 nsel = getSelectedFeeds();
1487 } else if (kind == "fcat") {
1488 opbarid = "catOpToolbar";
1489 nsel = getSelectedFeedCats();
1490 } else if (kind == "filter") {
1491 opbarid = "filterOpToolbar";
1492 nsel = getSelectedFilters();
1493 } else if (kind == "label") {
1494 opbarid = "labelOpToolbar";
1495 nsel = getSelectedLabels();
1496 } else if (kind == "user") {
1497 opbarid = "userOpToolbar";
1498 nsel = getSelectedUsers();
1501 if (opbarid && nsel != -1) {
1502 disableContainerChildren(opbarid, nsel == false);
1508 function toggleSelectFBListRow(sender) {
1509 toggleSelectListRow(sender);
1510 disableContainerChildren("fbrOpToolbar", getSelectedFeedsFromBrowser() == 0);
1515 function pref_hotkey_handler(e) {
1520 if (!hotkeys_enabled) return;
1523 keycode = window.event.keyCode;
1528 if (keycode == 13 || keycode == 27) {
1531 seq = seq + "" + keycode;
1535 if (document.getElementById("piggie")) {
1537 if (seq.match("807371717369")) {
1539 localPiggieFunction(true);
1541 localPiggieFunction(false);
1546 exception_error("pref_hotkey_handler", e);
1550 function userSwitch() {
1551 var chooser = document.getElementById("userSwitch");
1552 var user = chooser[chooser.selectedIndex].value;
1553 window.location = "prefs.php?swu=" + user;
1556 function editFeedCats() {
1557 if (!xmlhttp_ready(xmlhttp)) {
1558 printLockingError();
1562 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCats", true);
1563 xmlhttp.onreadystatechange=infobox_callback;
1567 function showFeedsWithErrors() {
1568 displayDlg('feedUpdateErrors');