]>
git.wh0rd.org - tt-rss.git/blob - prefs.js
1 var active_feed_cat
= false;
2 var active_tab
= false;
4 var init_params
= new Array();
6 var caller_subop
= false;
7 var sanity_check_done
= false;
8 var hotkey_prefix
= false;
10 function replace_pubkey_callback(transport
) {
12 var link
= document
.getElementById("pubGenAddress");
14 if (transport
.responseXML
) {
16 var new_link
= transport
.responseXML
.getElementsByTagName("link")[0];
19 link
.href
= new_link
.firstChild
.nodeValue
;
20 //link.innerHTML = new_link.firstChild.nodeValue;
22 new Effect
.Highlight(link
);
24 notify_info("Published feed URL changed.");
26 notify_error("Could not change feed URL.");
30 notify_error("Could not change feed URL.");
33 exception_error("replace_pubkey_callback", e
);
37 function feedlist_callback2(transport
) {
41 var container
= document
.getElementById('prefContent');
42 container
.innerHTML
=transport
.responseText
;
43 selectTab("feedConfig", true);
46 var tuple
= caller_subop
.split(":");
47 if (tuple
[0] == 'editFeed') {
48 window
.setTimeout('editFeed('+tuple
[1]+')', 100);
53 if (typeof correctPNG
!= 'undefined') {
60 exception_error("feedlist_callback2", e
);
64 /* stub for subscription dialog */
66 function dlg_frefresh_callback(transport
) {
67 return feedlist_callback2(transport
);
70 function filterlist_callback2(transport
) {
71 var container
= document
.getElementById('prefContent');
72 container
.innerHTML
=transport
.responseText
;
73 if (typeof correctPNG
!= 'undefined') {
80 function labellist_callback2(transport
) {
84 var container
= document
.getElementById('prefContent');
86 container
.innerHTML
=transport
.responseText
;
88 if (document
.getElementById("prefLabelList")) {
89 var elems
= document
.getElementById("prefLabelList").getElementsByTagName("SPAN");
91 for (var i
= 0; i
< elems
.length
; i
++) {
92 if (elems
[i
].id
&& elems
[i
].id
.match("LILT-")) {
94 var id
= elems
[i
].id
.replace("LILT-", "");
95 new Ajax
.InPlaceEditor(elems
[i
],
96 'backend.php?op=pref-labels&subop=save&id=' + id
,
102 if (typeof correctPNG
!= 'undefined') {
109 exception_error("labellist_callback2", e
);
113 function userlist_callback2(transport
) {
115 var container
= document
.getElementById('prefContent');
116 if (transport
.readyState
== 4) {
117 container
.innerHTML
=transport
.responseText
;
122 exception_error("userlist_callback2", e
);
126 function prefslist_callback2(transport
) {
128 var container
= document
.getElementById('prefContent');
129 container
.innerHTML
=transport
.responseText
;
133 exception_error("prefslist_callback2", e
);
137 function notify_callback2(transport
) {
138 notify_info(transport
.responseText
);
141 function prefs_reset_callback2(transport
) {
143 notify_info(transport
.responseText
);
146 exception_error("prefs_reset_callback2", e
);
151 function changepass_callback2(transport
) {
154 if (transport
.responseText
.indexOf("ERROR: ") == 0) {
155 notify_error(transport
.responseText
.replace("ERROR: ", ""));
157 notify_info(transport
.responseText
);
158 var warn
= document
.getElementById("default_pass_warning");
159 if (warn
) warn
.style
.display
= "none";
162 document
.forms
['change_pass_form'].reset();
165 exception_error("changepass_callback2", e
);
169 function init_cat_inline_editor() {
172 if (document
.getElementById("prefFeedCatList")) {
173 var elems
= document
.getElementById("prefFeedCatList").getElementsByTagName("SPAN");
175 for (var i
= 0; i
< elems
.length
; i
++) {
176 if (elems
[i
].id
&& elems
[i
].id
.match("FCATT-")) {
177 var cat_id
= elems
[i
].id
.replace("FCATT-", "");
178 new Ajax
.InPlaceEditor(elems
[i
],
179 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id
);
185 exception_error("init_cat_inline_editor", e
);
189 function infobox_feed_cat_callback2(transport
) {
191 infobox_callback2(transport
);
192 init_cat_inline_editor();
194 exception_error("infobox_feed_cat_callback2", e
);
198 function updateFeedList(sort_key
) {
202 var feed_search
= document
.getElementById("feed_search");
204 if (feed_search
) { search
= feed_search
.value
; }
206 var slat
= document
.getElementById("show_last_article_times");
208 var slat_checked
= false;
210 slat_checked
= slat
.checked
;
213 var query
= "backend.php?op=pref-feeds" +
214 "&sort=" + param_escape(sort_key
) +
215 "&slat=" + param_escape(slat_checked
) +
216 "&search=" + param_escape(search
);
218 new Ajax
.Request(query
, {
219 onComplete: function(transport
) {
220 feedlist_callback2(transport
);
223 exception_error("updateFeedList", e
);
227 function updateUsersList(sort_key
) {
231 var user_search
= document
.getElementById("user_search");
233 if (user_search
) { search
= user_search
.value
; }
235 var query
= "backend.php?op=pref-users&sort="
236 + param_escape(sort_key
) +
237 "&search=" + param_escape(search
);
239 new Ajax
.Request(query
, {
240 onComplete: function(transport
) {
241 userlist_callback2(transport
);
245 exception_error("updateUsersList", e
);
249 function addLabel() {
253 var caption
= prompt(__("Please enter label caption:"), "");
255 if (caption
== null) {
260 alert(__("Can't create label: missing caption."));
264 // we can be called from some other tab
265 active_tab
= "labelConfig";
267 query
= "backend.php?op=pref-labels&subop=add&caption=" +
268 param_escape(caption
);
270 new Ajax
.Request(query
, {
271 onComplete: function(transport
) {
272 infobox_submit_callback2(transport
);
276 exception_error("addLabel", e
);
284 var link
= document
.getElementById("fadd_link");
286 if (link
.value
.length
== 0) {
287 alert(__("Error: No feed URL given."));
288 } else if (!isValidURL(link
.value
)) {
289 alert(__("Error: Invalid feed URL."));
291 notify_progress("Adding feed...");
293 var query
= "backend.php?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
294 param_escape(link
.value
);
296 new Ajax
.Request(query
, {
297 onComplete: function(transport
) {
298 feedlist_callback2(transport
);
306 exception_error("addFeed", e
);
311 function addFeedCat() {
313 var cat
= document
.getElementById("fadd_cat");
315 if (cat
.value
.length
== 0) {
316 alert(__("Can't add category: no name specified."));
318 notify_progress("Adding feed category...");
320 var query
= "backend.php?op=pref-feeds&subop=editCats&action=add&cat=" +
321 param_escape(cat
.value
);
323 new Ajax
.Request(query
, {
324 onComplete: function(transport
) {
325 infobox_feed_cat_callback2(transport
);
337 var sqlexp
= document
.getElementById("uadd_box");
339 if (sqlexp
.value
.length
== 0) {
340 alert(__("Can't add user: no login specified."));
342 notify_progress("Adding user...");
344 var query
= "backend.php?op=pref-users&subop=add&login=" +
345 param_escape(sqlexp
.value
);
347 new Ajax
.Request(query
, {
348 onComplete: function(transport
) {
349 userlist_callback2(transport
);
356 exception_error("addUser", e
);
360 function editUser(id
) {
366 notify_progress("Loading, please wait...");
368 selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false);
369 selectTableRowById('UMRR-'+id
, 'UMCHK-'+id
, true);
371 disableContainerChildren("userOpToolbar", false);
373 var query
= "backend.php?op=pref-users&subop=edit&id=" +
376 new Ajax
.Request(query
, {
377 onComplete: function(transport
) {
378 infobox_callback2(transport
);
382 exception_error("editUser", e
);
387 function editFilter(id
) {
393 notify_progress("Loading, please wait...");
395 disableContainerChildren("filterOpToolbar", false);
397 selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false);
398 selectTableRowById('FILRR-'+id
, 'FICHK-'+id
, true);
400 var query
= "backend.php?op=pref-filters&subop=edit&id=" +
403 new Ajax
.Request(query
, {
404 onComplete: function(transport
) {
405 infobox_callback2(transport
);
408 exception_error("editFilter", e
);
412 function editFeed(feed
) {
418 notify_progress("Loading, please wait...");
420 // clean selection from all rows & select row being edited
421 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
422 selectTableRowById('FEEDR-'+feed
, 'FRCHK-'+feed
, true);
424 disableContainerChildren("feedOpToolbar", false);
426 var query
= "backend.php?op=pref-feeds&subop=editfeed&id=" +
429 new Ajax
.Request(query
, {
430 onComplete: function(transport
) {
431 infobox_callback2(transport
);
435 exception_error("editFeed", e
);
439 function getSelectedLabels() {
440 return getSelectedTableRowIds("prefLabelList", "LILRR");
443 function getSelectedUsers() {
444 return getSelectedTableRowIds("prefUserList", "UMRR");
447 function getSelectedFeeds() {
448 return getSelectedTableRowIds("prefFeedList", "FEEDR");
451 function getSelectedFilters() {
452 return getSelectedTableRowIds("prefFilterList", "FILRR");
455 function getSelectedFeedCats() {
456 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
460 function removeSelectedLabels() {
462 var sel_rows
= getSelectedLabels();
464 if (sel_rows
.length
> 0) {
466 var ok
= confirm(__("Remove selected labels?"));
469 notify_progress("Removing selected labels...");
471 var query
= "backend.php?op=pref-labels&subop=remove&ids="+
472 param_escape(sel_rows
.toString());
474 new Ajax
.Request(query
, {
475 onComplete: function(transport
) {
476 labellist_callback2(transport
);
481 alert(__("No labels are selected."));
487 function removeSelectedUsers() {
491 var sel_rows
= getSelectedUsers();
493 if (sel_rows
.length
> 0) {
495 var ok
= confirm(__("Remove selected users?"));
498 notify_progress("Removing selected users...");
500 var query
= "backend.php?op=pref-users&subop=remove&ids="+
501 param_escape(sel_rows
.toString());
503 new Ajax
.Request(query
, {
504 onComplete: function(transport
) {
505 userlist_callback2(transport
);
511 alert(__("No users are selected."));
515 exception_error("removeSelectedUsers", e
);
521 function removeSelectedFilters() {
525 var sel_rows
= getSelectedFilters();
527 if (sel_rows
.length
> 0) {
529 var ok
= confirm(__("Remove selected filters?"));
532 notify_progress("Removing selected filters...");
534 var query
= "backend.php?op=pref-filters&subop=remove&ids="+
535 param_escape(sel_rows
.toString());
537 new Ajax
.Request(query
, {
538 onComplete: function(transport
) {
539 filterlist_callback2(transport
);
544 alert(__("No filters are selected."));
548 exception_error("removeSelectedFilters", e
);
555 function removeSelectedFeeds() {
559 var sel_rows
= getSelectedFeeds();
561 if (sel_rows
.length
> 0) {
563 var ok
= confirm(__("Unsubscribe from selected feeds?"));
567 notify_progress("Unsubscribing from selected feeds...");
569 var query
= "backend.php?op=pref-feeds&subop=remove&ids="+
570 param_escape(sel_rows
.toString());
572 new Ajax
.Request(query
, {
573 onComplete: function(transport
) {
574 feedlist_callback2(transport
);
579 alert(__("No feeds are selected."));
583 exception_error("removeSelectedFeeds", e
);
589 function clearSelectedFeeds() {
591 var sel_rows
= getSelectedFeeds();
593 if (sel_rows
.length
> 1) {
594 alert(__("Please select only one feed."));
598 if (sel_rows
.length
> 0) {
600 var ok
= confirm(__("Erase all non-starred articles in selected feed?"));
603 notify_progress("Clearing selected feed...");
604 clearFeedArticles(sel_rows
[0]);
609 alert(__("No feeds are selected."));
616 function purgeSelectedFeeds() {
618 var sel_rows
= getSelectedFeeds();
620 if (sel_rows
.length
> 0) {
622 var pr
= prompt(__("How many days of articles to keep (0 - use default)?"), "0");
624 if (pr
!= undefined) {
625 notify_progress("Purging selected feed...");
627 var query
= "backend.php?op=rpc&subop=purge&ids="+
628 param_escape(sel_rows
.toString()) + "&days=" + pr
;
632 new Ajax
.Request(query
, {
633 onComplete: function(transport
) {
640 alert(__("No feeds are selected."));
647 function removeSelectedFeedCats() {
649 var sel_rows
= getSelectedFeedCats();
651 if (sel_rows
.length
> 0) {
653 var ok
= confirm(__("Remove selected categories?"));
656 notify_progress("Removing selected categories...");
658 var query
= "backend.php?op=pref-feeds&subop=editCats&action=remove&ids="+
659 param_escape(sel_rows
.toString());
661 new Ajax
.Request(query
, {
662 onComplete: function(transport
) {
663 infobox_feed_cat_callback2(transport
);
670 alert(__("No categories are selected."));
677 function feedEditCancel() {
680 document
.getElementById("subscribe_to_feed_btn").disabled
= false;
681 document
.getElementById("top25_feeds_btn").disabled
= false;
683 // this button is not always available, no-op if not found
688 selectPrefRows('feed', false); // cleanup feed selection
693 function feedEditSave() {
697 // FIXME: add parameter validation
699 var query
= Form
.serialize("edit_feed_form");
701 notify_progress("Saving feed...");
703 new Ajax
.Request("backend.php", {
705 onComplete: function(transport
) {
706 feedlist_callback2(transport
);
714 exception_error("feedEditSave", e
);
718 function userEditCancel() {
720 selectPrefRows('user', false); // cleanup feed selection
726 function filterEditCancel() {
729 document
.getElementById("create_filter_btn").disabled
= false;
730 selectPrefRows('filter', false); // cleanup feed selection
738 function userEditSave() {
742 var login
= document
.forms
["user_edit_form"].login
.value
;
744 if (login
.length
== 0) {
745 alert(__("Login field cannot be blank."));
749 notify_progress("Saving user...");
753 var query
= Form
.serialize("user_edit_form");
755 new Ajax
.Request("backend.php", {
757 onComplete: function(transport
) {
758 userlist_callback2(transport
);
762 exception_error("userEditSave", e
);
770 function filterEditSave() {
774 notify_progress("Saving filter...");
776 var query
= "backend.php?" + Form
.serialize("filter_edit_form");
780 document
.getElementById("create_filter_btn").disabled
= false;
782 new Ajax
.Request(query
, {
783 onComplete: function(transport
) {
784 filterlist_callback2(transport
);
788 exception_error("filterEditSave", e
);
795 function editSelectedUser() {
796 var rows
= getSelectedUsers();
798 if (rows
.length
== 0) {
799 alert(__("No users are selected."));
803 if (rows
.length
> 1) {
804 alert(__("Please select only one user."));
813 function resetSelectedUserPass() {
817 var rows
= getSelectedUsers();
819 if (rows
.length
== 0) {
820 alert(__("No users are selected."));
824 if (rows
.length
> 1) {
825 alert(__("Please select only one user."));
829 var ok
= confirm(__("Reset password of selected user?"));
832 notify_progress("Resetting password for selected user...");
836 var query
= "backend.php?op=pref-users&subop=resetPass&id=" +
839 new Ajax
.Request(query
, {
840 onComplete: function(transport
) {
841 userlist_callback2(transport
);
847 exception_error("resetSelectedUserPass", e
);
851 function selectedUserDetails() {
855 var rows
= getSelectedUsers();
857 if (rows
.length
== 0) {
858 alert(__("No users are selected."));
862 if (rows
.length
> 1) {
863 alert(__("Please select only one user."));
867 notify_progress("Loading, please wait...");
871 var query
= "backend.php?op=pref-users&subop=user-details&id=" + id
;
873 new Ajax
.Request(query
, {
874 onComplete: function(transport
) {
875 infobox_callback2(transport
);
878 exception_error("selectedUserDetails", e
);
883 function editSelectedFilter() {
884 var rows
= getSelectedFilters();
886 if (rows
.length
== 0) {
887 alert(__("No filters are selected."));
891 if (rows
.length
> 1) {
892 alert(__("Please select only one filter."));
903 function editSelectedFeed() {
904 var rows
= getSelectedFeeds();
906 if (rows
.length
== 0) {
907 alert(__("No feeds are selected."));
911 if (rows
.length
> 1) {
912 alert(__("Please select one feed."));
922 function editSelectedFeeds() {
925 var rows
= getSelectedFeeds();
927 if (rows
.length
== 0) {
928 alert(__("No feeds are selected."));
936 notify_progress("Loading, please wait...");
938 var query
= "backend.php?op=pref-feeds&subop=editfeeds&ids=" +
939 param_escape(rows
.toString());
941 new Ajax
.Request(query
, {
942 onComplete: function(transport
) {
943 infobox_callback2(transport
);
947 exception_error("editSelectedFeeds", e
);
951 function piggie(enable
) {
953 debug("I LOVEDED IT!");
954 var piggie
= document
.getElementById("piggie");
956 Element
.show(piggie
);
957 Position
.Center(piggie
);
963 function validateOpmlImport() {
965 var opml_file
= document
.getElementById("opml_file");
967 if (opml_file
.value
.length
== 0) {
968 alert(__("No OPML file to upload."));
975 function updateFilterList(sort_key
) {
978 var filter_search
= document
.getElementById("filter_search");
980 if (filter_search
) { search
= filter_search
.value
; }
982 var query
= "backend.php?op=pref-filters&sort=" +
983 param_escape(sort_key
) +
984 "&search=" + param_escape(search
);
986 new Ajax
.Request(query
, {
987 onComplete: function(transport
) {
988 filterlist_callback2(transport
);
992 exception_error("updateFilterList", e
);
997 function updateLabelList(sort_key
) {
1001 var label_search
= document
.getElementById("label_search");
1003 if (label_search
) { search
= label_search
.value
; }
1005 var query
= "backend.php?op=pref-labels&sort=" +
1006 param_escape(sort_key
) +
1007 "&search=" + param_escape(search
);
1009 new Ajax
.Request(query
, {
1010 onComplete: function(transport
) {
1011 labellist_callback2(transport
);
1015 exception_error("updateLabelList", e
);
1019 function updatePrefsList() {
1021 var query
= "backend.php?op=pref-prefs";
1023 new Ajax
.Request(query
, {
1024 onComplete: function(transport
) {
1025 prefslist_callback2(transport
);
1030 function selectTab(id
, noupdate
, subop
) {
1034 if (!id
) id
= active_tab
;
1039 var c
= document
.getElementById('prefContent');
1045 debug("selectTab: " + id
+ "(NU: " + noupdate
+ ")");
1047 notify_progress("Loading, please wait...");
1049 // close active infobox if needed
1052 // clean up all current selections, just in case
1053 active_feed_cat
= false;
1055 // Effect.Fade("prefContent", {duration: 1, to: 0.01,
1056 // queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1058 if (id
== "feedConfig") {
1060 } else if (id
== "filterConfig") {
1062 } else if (id
== "labelConfig") {
1064 } else if (id
== "genConfig") {
1066 } else if (id
== "userConfig") {
1071 /* clean selection from all tabs */
1073 var tabs_holder
= document
.getElementById("prefTabs");
1074 var tab
= tabs_holder
.firstChild
;
1077 if (tab
.className
&& tab
.className
.match("prefsTabSelected")) {
1078 tab
.className
= "prefsTab";
1080 tab
= tab
.nextSibling
;
1083 /* mark new tab as selected */
1085 tab
= document
.getElementById(id
+ "Tab");
1088 if (!tab
.className
.match("Selected")) {
1089 tab
.className
= tab
.className
+ "Selected";
1096 exception_error("selectTab", e
);
1100 function backend_sanity_check_callback2(transport
) {
1104 if (sanity_check_done
) {
1105 fatalError(11, "Sanity check request received twice. This can indicate "+
1106 "presence of Firebug or some other disrupting extension. "+
1107 "Please disable it and try again.");
1111 if (!transport
.responseXML
) {
1112 fatalError(3, "Sanity Check: Received reply is not XML",
1113 transport
.responseText
);
1117 var reply
= transport
.responseXML
.firstChild
.firstChild
;
1120 fatalError(3, "Sanity Check: Invalid RPC reply", transport
.responseText
);
1124 var error_code
= reply
.getAttribute("error-code");
1126 if (error_code
&& error_code
!= 0) {
1127 return fatalError(error_code
, reply
.getAttribute("error-msg"));
1130 debug("sanity check ok");
1132 var params
= reply
.nextSibling
;
1135 debug('reading init-params...');
1136 var param
= params
.firstChild
;
1139 var k
= param
.getAttribute("key");
1140 var v
= param
.getAttribute("value");
1141 debug(k
+ " => " + v
);
1143 param
= param
.nextSibling
;
1147 sanity_check_done
= true;
1149 init_second_stage();
1152 exception_error("backend_sanity_check_callback", e
);
1156 function init_second_stage() {
1159 active_tab
= getInitParam("prefs_active_tab");
1160 if (!document
.getElementById(active_tab
+"Tab")) active_tab
= "genConfig";
1161 if (!active_tab
|| active_tab
== '0') active_tab
= "genConfig";
1163 document
.onkeydown
= pref_hotkey_handler
;
1165 var tab
= getURLParam('tab');
1167 caller_subop
= getURLParam('subop');
1169 if (getURLParam("subopparam")) {
1170 caller_subop
= caller_subop
+ ":" + getURLParam("subopparam");
1177 if (navigator
.userAgent
.match("Opera")) {
1178 setTimeout("selectTab()", 500);
1180 selectTab(active_tab
);
1184 loading_set_progress(60);
1187 exception_error("init_second_stage", e
);
1195 if (arguments
.callee
.done
) return;
1196 arguments
.callee
.done
= true;
1198 if (getURLParam('debug')) {
1199 Element
.show("debug_output");
1200 debug('debug mode activated');
1203 loading_set_progress(30);
1205 var query
= "backend.php?op=rpc&subop=sanityCheck";
1207 new Ajax
.Request(query
, {
1208 onComplete: function(transport
) {
1209 backend_sanity_check_callback2(transport
);
1213 exception_error("init", e
);
1217 function categorizeSelectedFeeds() {
1219 var sel_rows
= getSelectedFeeds();
1221 var cat_sel
= document
.getElementById("sfeed_set_fcat");
1222 var cat_id
= cat_sel
[cat_sel
.selectedIndex
].value
;
1224 if (sel_rows
.length
> 0) {
1226 notify_progress("Changing category of selected feeds...");
1228 var query
= "backend.php?op=pref-feeds&subop=categorize&ids="+
1229 param_escape(sel_rows
.toString()) + "&cat_id=" + param_escape(cat_id
);
1231 new Ajax
.Request(query
, {
1232 onComplete: function(transport
) {
1233 feedlist_callback2(transport
);
1238 alert(__("No feeds are selected."));
1244 function validatePrefsReset() {
1246 var ok
= confirm(__("Reset to defaults?"));
1250 var query
= Form
.serialize("pref_prefs_form");
1251 query
= query
+ "&subop=reset-config";
1254 new Ajax
.Request("backend.php", {
1256 onComplete: function(transport
) {
1257 prefs_reset_callback2(transport
);
1263 exception_error("validatePrefsSave", e
);
1270 function feedBrowserSubscribe() {
1273 var selected
= getSelectedFeedsFromBrowser();
1275 if (selected
.length
> 0) {
1278 var query
= "backend.php?op=pref-feeds&subop=massSubscribe&ids="+
1279 param_escape(selected
.toString());
1281 new Ajax
.Request(query
, {
1282 onComplete: function(transport
) {
1283 feedlist_callback2(transport
);
1287 alert(__("No feeds are selected."));
1291 exception_error("feedBrowserSubscribe", e
);
1295 function updateBigFeedBrowserBtn() {
1296 notify_progress("Loading, please wait...");
1297 return updateBigFeedBrowser();
1300 function selectPrefRows(kind
, select
) {
1303 var opbarid
= false;
1308 if (kind
== "feed") {
1309 opbarid
= "feedOpToolbar";
1312 lname
= "prefFeedList";
1313 } else if (kind
== "fcat") {
1314 opbarid
= "catOpToolbar";
1317 lname
= "prefFeedCatList";
1318 } else if (kind
== "filter") {
1319 opbarid
= "filterOpToolbar";
1322 lname
= "prefFilterList";
1323 } else if (kind
== "label") {
1324 opbarid
= "labelOpToolbar";
1327 lname
= "prefLabelList";
1328 } else if (kind
== "user") {
1329 opbarid
= "userOpToolbar";
1332 lname
= "prefUserList";
1336 selectTableRowsByIdPrefix(lname
, nrow
, nchk
, select
);
1337 disableContainerChildren(opbarid
, !select
);
1344 function toggleSelectPrefRow(sender
, kind
) {
1346 toggleSelectRow(sender
);
1349 var opbarid
= false;
1352 if (kind
== "feed") {
1353 opbarid
= "feedOpToolbar";
1354 nsel
= getSelectedFeeds();
1355 } else if (kind
== "fcat") {
1356 opbarid
= "catOpToolbar";
1357 nsel
= getSelectedFeedCats();
1358 } else if (kind
== "filter") {
1359 opbarid
= "filterOpToolbar";
1360 nsel
= getSelectedFilters();
1361 } else if (kind
== "label") {
1362 opbarid
= "labelOpToolbar";
1363 nsel
= getSelectedLabels();
1364 } else if (kind
== "user") {
1365 opbarid
= "userOpToolbar";
1366 nsel
= getSelectedUsers();
1369 if (opbarid
&& nsel
!= -1) {
1370 disableContainerChildren(opbarid
, nsel
== false);
1376 function toggleSelectFBListRow(sender
) {
1377 toggleSelectListRow(sender
);
1378 disableContainerChildren("fbrOpToolbar", getSelectedFeedsFromBrowser() == 0);
1383 function pref_hotkey_handler(e
) {
1387 var shift_key
= false;
1390 shift_key
= e
.shiftKey
;
1396 keycode
= window
.event
.keyCode
;
1401 var keychar
= String
.fromCharCode(keycode
);
1403 if (keycode
== 27) { // escape
1404 if (Element
.visible("hotkey_help_overlay")) {
1405 Element
.hide("hotkey_help_overlay");
1407 hotkey_prefix
= false;
1411 if (!hotkeys_enabled
) {
1412 debug("hotkeys disabled");
1416 if (keycode
== 16) return; // ignore lone shift
1418 if ((keycode
== 67 || keycode
== 71) && !hotkey_prefix
) {
1419 hotkey_prefix
= keycode
;
1420 debug("KP: PREFIX=" + keycode
+ " CHAR=" + keychar
);
1424 if (Element
.visible("hotkey_help_overlay")) {
1425 Element
.hide("hotkey_help_overlay");
1428 if (keycode
== 13 || keycode
== 27) {
1431 seq
= seq
+ "" + keycode
;
1434 /* Global hotkeys */
1436 if (!hotkey_prefix
) {
1438 if (keycode
== 68 && shift_key
) { // d
1439 if (!Element
.visible("debug_output")) {
1440 Element
.show("debug_output");
1441 debug('debug mode activated');
1443 Element
.hide("debug_output");
1448 if ((keycode
== 191 || keychar
== '?') && shift_key
) { // ?
1449 if (!Element
.visible("hotkey_help_overlay")) {
1450 //Element.show("hotkey_help_overlay");
1451 Effect
.Appear("hotkey_help_overlay", {duration
: 0.3});
1453 Element
.hide("hotkey_help_overlay");
1458 if (keycode
== 191 || keychar
== '/') { // /
1459 var search_boxes
= new Array("label_search",
1460 "feed_search", "filter_search", "user_search", "feed_browser_search");
1462 for (var i
= 0; i
< search_boxes
.length
; i
++) {
1463 var elem
= document
.getElementById(search_boxes
[i
]);
1465 focus_element(search_boxes
[i
]);
1474 if (hotkey_prefix
== 67) { // c
1475 hotkey_prefix
= false;
1477 if (keycode
== 70) { // f
1478 displayDlg("quickAddFilter");
1482 if (keycode
== 83) { // s
1483 displayDlg("quickAddFeed");
1487 /* if (keycode == 76) { // l
1488 displayDlg("quickAddLabel");
1492 if (keycode
== 85) { // u
1496 if (keycode
== 67) { // c
1501 if (keycode
== 84 && shift_key
) { // T
1510 if (hotkey_prefix
== 71) { // g
1512 hotkey_prefix
= false;
1514 if (keycode
== 49 && document
.getElementById("genConfigTab")) { // 1
1515 selectTab("genConfig");
1519 if (keycode
== 50 && document
.getElementById("feedConfigTab")) { // 2
1520 selectTab("feedConfig");
1524 if (keycode
== 51 && document
.getElementById("filterConfigTab")) { // 4
1525 selectTab("filterConfig");
1529 if (keycode
== 52 && document
.getElementById("labelConfigTab")) { // 5
1530 selectTab("labelConfig");
1534 if (keycode
== 53 && document
.getElementById("userConfigTab")) { // 6
1535 selectTab("userConfig");
1539 if (keycode
== 88) { // x
1545 if (document
.getElementById("piggie")) {
1547 if (seq
.match("807371717369")) {
1555 if (hotkey_prefix
) {
1556 debug("KP: PREFIX=" + hotkey_prefix
+ " CODE=" + keycode
+ " CHAR=" + keychar
);
1558 debug("KP: CODE=" + keycode
+ " CHAR=" + keychar
);
1562 exception_error("pref_hotkey_handler", e
);
1566 function editFeedCats() {
1568 document
.getElementById("subscribe_to_feed_btn").disabled
= true;
1571 document
.getElementById("top25_feeds_btn").disabled
= true;
1573 // this button is not always available, no-op if not found
1576 var query
= "backend.php?op=pref-feeds&subop=editCats";
1578 new Ajax
.Request(query
, {
1579 onComplete: function(transport
) {
1580 infobox_feed_cat_callback2(transport
);
1583 exception_error("editFeedCats", e
);
1587 function showFeedsWithErrors() {
1588 displayDlg('feedUpdateErrors');
1591 function changeUserPassword() {
1595 var f
= document
.forms
["change_pass_form"];
1598 if (f
.OLD_PASSWORD
.value
== "") {
1599 new Effect
.Highlight(f
.OLD_PASSWORD
);
1600 notify_error("Old password cannot be blank.");
1604 if (f
.NEW_PASSWORD
.value
== "") {
1605 new Effect
.Highlight(f
.NEW_PASSWORD
);
1606 notify_error("New password cannot be blank.");
1610 if (f
.CONFIRM_PASSWORD
.value
== "") {
1611 new Effect
.Highlight(f
.CONFIRM_PASSWORD
);
1612 notify_error("Entered passwords do not match.");
1616 if (f
.CONFIRM_PASSWORD
.value
!= f
.NEW_PASSWORD
.value
) {
1617 new Effect
.Highlight(f
.CONFIRM_PASSWORD
);
1618 new Effect
.Highlight(f
.NEW_PASSWORD
);
1619 notify_error("Entered passwords do not match.");
1625 var query
= Form
.serialize("change_pass_form");
1627 notify_progress("Trying to change password...");
1629 new Ajax
.Request("backend.php", {
1631 onComplete: function(transport
) {
1632 changepass_callback2(transport
);
1637 exception_error("changeUserPassword", e
);
1643 function changeUserEmail() {
1647 var query
= Form
.serialize("change_email_form");
1649 notify_progress("Trying to change e-mail...");
1651 new Ajax
.Request("backend.php", {
1653 onComplete: function(transport
) {
1654 notify_callback2(transport
);
1658 exception_error("changeUserPassword", e
);
1665 function feedlistToggleSLAT() {
1666 notify_progress("Loading, please wait...");
1670 function pubRegenKey() {
1672 var ok
= confirm(__("Replace current publishing address with a new one?"));
1676 notify_progress("Trying to change address...");
1678 var query
= "backend.php?op=rpc&subop=regenPubKey";
1680 new Ajax
.Request(query
, {
1681 onComplete: function(transport
) {
1682 replace_pubkey_callback(transport
);
1690 function validatePrefsSave() {
1693 var ok
= confirm(__("Save current configuration?"));
1697 var query
= Form
.serialize("pref_prefs_form");
1698 query
= query
+ "&subop=save-config";
1701 new Ajax
.Request("backend.php", {
1703 onComplete: function(transport
) {
1704 notify_callback2(transport
);
1710 exception_error("validatePrefsSave", e
);
1716 function feedActionChange() {
1718 var chooser
= document
.getElementById("feedActionChooser");
1719 var opid
= chooser
[chooser
.selectedIndex
].value
;
1721 chooser
.selectedIndex
= 0;
1724 exception_error("feedActionChange", e
);
1728 function feedActionGo(op
) {
1730 if (op
== "facEdit") {
1732 var rows
= getSelectedFeeds();
1734 if (rows
.length
> 1) {
1735 editSelectedFeeds();
1741 if (op
== "facClear") {
1742 clearSelectedFeeds();
1745 if (op
== "facPurge") {
1746 purgeSelectedFeeds();
1749 if (op
== "facEditCats") {
1753 if (op
== "facRescore") {
1754 rescoreSelectedFeeds();
1757 if (op
== "facUnsubscribe") {
1758 removeSelectedFeeds();
1762 exception_error("feedActionGo", e
);
1767 function clearFeedArticles(feed_id
) {
1769 notify_progress("Clearing feed...");
1771 var query
= "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id
;
1773 new Ajax
.Request(query
, {
1774 onComplete: function(transport
) {
1781 function rescoreSelectedFeeds() {
1783 var sel_rows
= getSelectedFeeds();
1785 if (sel_rows
.length
> 0) {
1787 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1788 var ok
= confirm(__("Rescore articles in selected feeds?"));
1791 notify_progress("Rescoring selected feeds...", true);
1793 var query
= "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids="+
1794 param_escape(sel_rows
.toString());
1796 new Ajax
.Request(query
, {
1797 onComplete: function(transport
) {
1798 notify_callback2(transport
);
1803 alert(__("No feeds are selected."));
1809 function rescore_all_feeds() {
1810 var ok
= confirm(__("Rescore all articles? This operation may take a lot of time."));
1813 notify_progress("Rescoring feeds...", true);
1815 var query
= "backend.php?op=pref-feeds&subop=rescoreAll&quiet=1";
1817 new Ajax
.Request(query
, {
1818 onComplete: function(transport
) {
1819 notify_callback2(transport
);
1824 function removeFilter(id
, title
) {
1828 var msg
= __("Remove filter %s?").replace("%s", title
);
1830 var ok
= confirm(msg
);
1835 notify_progress("Removing filter...");
1837 var query
= "backend.php?op=pref-filters&subop=remove&ids="+
1840 new Ajax
.Request(query
, {
1841 onComplete: function(transport
) {
1842 filterlist_callback2(transport
);
1848 exception_error("removeFilter", e
);
1854 function unsubscribeFeed(id
, title
) {
1858 var msg
= __("Unsubscribe from %s?").replace("%s", title
);
1860 var ok
= confirm(msg
);
1865 notify_progress("Removing feed...");
1867 var query
= "backend.php?op=pref-feeds&subop=remove&ids="+
1870 new Ajax
.Request(query
, {
1871 onComplete: function(transport
) {
1872 feedlist_callback2(transport
);
1877 exception_error("unsubscribeFeed", e
);
1884 function feedsEditSave() {
1887 var ok
= confirm(__("Save changes to selected feeds?"));
1891 var f
= document
.forms
["batch_edit_feed_form"];
1893 var query
= Form
.serialize("batch_edit_feed_form");
1895 /* Form.serialize ignores unchecked checkboxes */
1897 if (!query
.match("&hidden=") &&
1898 f
.hidden
.disabled
== false) {
1899 query
= query
+ "&hidden=false";
1902 if (!query
.match("&rtl_content=") &&
1903 f
.rtl_content
.disabled
== false) {
1904 query
= query
+ "&rtl_content=false";
1907 if (!query
.match("&private=") &&
1908 f
.private.disabled
== false) {
1909 query
= query
+ "&private=false";
1912 if (!query
.match("&cache_images=") &&
1913 f
.cache_images
.disabled
== false) {
1914 query
= query
+ "&cache_images=false";
1917 if (!query
.match("&include_in_digest=") &&
1918 f
.include_in_digest
.disabled
== false) {
1919 query
= query
+ "&include_in_digest=false";
1924 notify_progress("Saving feeds...");
1926 new Ajax
.Request("backend.php", {
1928 onComplete: function(transport
) {
1929 feedlist_callback2(transport
);
1936 exception_error("feedsEditSave", e
);
1940 function batchFeedsToggleField(cb
, elem
, label
) {
1942 var f
= document
.forms
["batch_edit_feed_form"];
1943 var l
= document
.getElementById(label
);
1946 f
[elem
].disabled
= false;
1952 // new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1953 // queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1956 f
[elem
].disabled
= true;
1959 l
.className
= "insensitive";
1964 exception_error("batchFeedsToggleField", e
);