]>
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 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.");