]>
git.wh0rd.org - tt-rss.git/blob - prefs.js
3 var active_feed
= false;
4 var active_feed_cat
= false;
5 var active_filter
= false;
6 var active_label
= false;
7 var active_user
= false;
9 var active_tab
= false;
12 /*@if (@_jscript_version >= 5)
13 // JScript gives us Conditional compilation, we can cope with old IE versions.
14 // and security blocked creation of the objects.
16 xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
19 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
26 if (!xmlhttp
&& typeof XMLHttpRequest
!='undefined') {
27 xmlhttp
= new XMLHttpRequest();
30 function feedlist_callback() {
31 if (xmlhttp
.readyState
== 4) {
32 var container
= document
.getElementById('prefContent');
33 container
.innerHTML
=xmlhttp
.responseText
;
35 var row
= document
.getElementById("FEEDR-" + active_feed
);
37 if (!row
.className
.match("Selected")) {
38 row
.className
= row
.className
+ "Selected";
41 var checkbox
= document
.getElementById("FRCHK-" + active_feed
);
43 checkbox
.checked
= true;
50 function filterlist_callback() {
51 var container
= document
.getElementById('prefContent');
52 if (xmlhttp
.readyState
== 4) {
54 container
.innerHTML
=xmlhttp
.responseText
;
57 var row
= document
.getElementById("FILRR-" + active_filter
);
59 if (!row
.className
.match("Selected")) {
60 row
.className
= row
.className
+ "Selected";
63 var checkbox
= document
.getElementById("FICHK-" + active_filter
);
66 checkbox
.checked
= true;
73 function labellist_callback() {
74 var container
= document
.getElementById('prefContent');
75 if (xmlhttp
.readyState
== 4) {
76 container
.innerHTML
=xmlhttp
.responseText
;
79 var row
= document
.getElementById("LILRR-" + active_label
);
81 if (!row
.className
.match("Selected")) {
82 row
.className
= row
.className
+ "Selected";
85 var checkbox
= document
.getElementById("LICHK-" + active_label
);
88 checkbox
.checked
= true;
95 function userlist_callback() {
96 var container
= document
.getElementById('prefContent');
97 if (xmlhttp
.readyState
== 4) {
98 container
.innerHTML
=xmlhttp
.responseText
;
101 var row
= document
.getElementById("UMRR-" + active_user
);
103 if (!row
.className
.match("Selected")) {
104 row
.className
= row
.className
+ "Selected";
107 var checkbox
= document
.getElementById("UMCHK-" + active_user
);
110 checkbox
.checked
= true;
118 function infobox_callback() {
119 if (xmlhttp
.readyState
== 4) {
120 var box
= document
.getElementById('infoBox');
121 var shadow
= document
.getElementById('infoBoxShadow');
124 box
.innerHTML
=xmlhttp
.responseText
;
126 shadow
.style
.display
= "block";
128 box
.style
.display
= "block";
135 function prefslist_callback() {
136 var container
= document
.getElementById('prefContent');
137 if (xmlhttp
.readyState
== 4) {
139 container
.innerHTML
=xmlhttp
.responseText
;
145 function gethelp_callback() {
146 var container
= document
.getElementById('prefHelpBox');
147 if (xmlhttp
.readyState
== 4) {
149 container
.innerHTML
= xmlhttp
.responseText
;
150 container
.style
.display
= "block";
156 function notify_callback() {
157 var container
= document
.getElementById('notify');
158 if (xmlhttp
.readyState
== 4) {
159 container
.innerHTML
=xmlhttp
.responseText
;
163 function updateFeedList(sort_key
) {
165 if (!xmlhttp_ready(xmlhttp
)) {
170 // document.getElementById("prefContent").innerHTML = "Loading feeds, please wait...";
172 p_notify("Loading, please wait...");
174 var feed_search
= document
.getElementById("feed_search");
176 if (feed_search
) { search
= feed_search
.value
; }
178 xmlhttp
.open("GET", "backend.php?op=pref-feeds" +
179 "&sort=" + param_escape(sort_key
) +
180 "&search=" + param_escape(search
), true);
181 xmlhttp
.onreadystatechange
=feedlist_callback
;
186 function updateUsersList() {
188 if (!xmlhttp_ready(xmlhttp
)) {
193 // document.getElementById("prefContent").innerHTML = "Loading feeds, please wait...";
195 p_notify("Loading, please wait...");
197 xmlhttp
.open("GET", "backend.php?op=pref-users", true);
198 xmlhttp
.onreadystatechange
=userlist_callback
;
203 function addLabel() {
205 if (!xmlhttp_ready(xmlhttp
)) {
210 var sqlexp
= document
.getElementById("ladd_expr");
212 if (sqlexp
.value
.length
== 0) {
213 notify("Missing SQL expression.");
215 notify("Adding label...");
217 xmlhttp
.open("GET", "backend.php?op=pref-labels&subop=add&exp=" +
218 param_escape(sqlexp
.value
), true);
220 xmlhttp
.onreadystatechange
=labellist_callback
;
228 function addFilter() {
230 if (!xmlhttp_ready(xmlhttp
)) {
235 var regexp
= document
.getElementById("fadd_regexp");
236 var match
= document
.getElementById("fadd_match");
237 var feed
= document
.getElementById("fadd_feed");
238 var action
= document
.getElementById("fadd_action");
240 if (regexp
.value
.length
== 0) {
241 notify("Missing filter expression.");
243 notify("Adding filter...");
245 var v_match
= match
[match
.selectedIndex
].text
;
246 var feed_id
= feed
[feed
.selectedIndex
].id
;
247 var action_id
= action
[action
.selectedIndex
].id
;
249 xmlhttp
.open("GET", "backend.php?op=pref-filters&subop=add®exp=" +
250 param_escape(regexp
.value
) + "&match=" + v_match
+
251 "&fid=" + param_escape(feed_id
) + "&aid=" + param_escape(action_id
), true);
253 xmlhttp
.onreadystatechange
=filterlist_callback
;
263 if (!xmlhttp_ready(xmlhttp
)) {
268 var link
= document
.getElementById("fadd_link");
270 if (link
.value
.length
== 0) {
271 notify("Missing feed URL.");
273 notify("Adding feed...");
275 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=add&link=" +
276 param_escape(link
.value
), true);
277 xmlhttp
.onreadystatechange
=feedlist_callback
;
286 function addFeedCat() {
288 if (!xmlhttp_ready(xmlhttp
)) {
293 var cat
= document
.getElementById("fadd_cat");
295 if (cat
.value
.length
== 0) {
296 notify("Missing feed category.");
298 notify("Adding feed category...");
300 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=addCat&cat=" +
301 param_escape(cat
.value
), true);
302 xmlhttp
.onreadystatechange
=feedlist_callback
;
312 if (!xmlhttp_ready(xmlhttp
)) {
317 var sqlexp
= document
.getElementById("uadd_box");
319 if (sqlexp
.value
.length
== 0) {
320 notify("Missing user login.");
322 notify("Adding user...");
324 xmlhttp
.open("GET", "backend.php?op=pref-users&subop=add&login=" +
325 param_escape(sqlexp
.value
), true);
327 xmlhttp
.onreadystatechange
=userlist_callback
;
335 function editLabel(id
) {
337 if (!xmlhttp_ready(xmlhttp
)) {
344 xmlhttp
.open("GET", "backend.php?op=pref-labels&subop=edit&id=" +
345 param_escape(id
), true);
346 xmlhttp
.onreadystatechange
=labellist_callback
;
351 function editUser(id
) {
353 if (!xmlhttp_ready(xmlhttp
)) {
360 xmlhttp
.open("GET", "backend.php?op=pref-users&subop=edit&id=" +
361 param_escape(id
), true);
362 xmlhttp
.onreadystatechange
=userlist_callback
;
367 function editFilter(id
) {
369 if (!xmlhttp_ready(xmlhttp
)) {
376 xmlhttp
.open("GET", "backend.php?op=pref-filters&subop=edit&id=" +
377 param_escape(id
), true);
378 xmlhttp
.onreadystatechange
=filterlist_callback
;
383 function editFeed(feed
) {
385 // notify("Editing feed...");
387 if (!xmlhttp_ready(xmlhttp
)) {
394 /* xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=edit&id=" +
395 param_escape(feed), true);
396 xmlhttp.onreadystatechange=feedlist_callback;
397 xmlhttp.send(null); */
399 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
400 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-'+feed
, 'FRCHK-'+feed
, true);
402 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=editfeed&id=" +
403 param_escape(active_feed
), true);
405 xmlhttp
.onreadystatechange
=infobox_callback
;
410 function editFeedCat(cat
) {
412 if (!xmlhttp_ready(xmlhttp
)) {
417 active_feed_cat
= cat
;
419 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=editCat&id=" +
420 param_escape(cat
), true);
421 xmlhttp
.onreadystatechange
=feedlist_callback
;
426 function getSelectedLabels() {
427 return getSelectedTableRowIds("prefLabelList", "LILRR");
430 function getSelectedUsers() {
431 return getSelectedTableRowIds("prefUserList", "UMRR");
434 function getSelectedFeeds() {
435 return getSelectedTableRowIds("prefFeedList", "FEEDR");
438 function getSelectedFilters() {
439 return getSelectedTableRowIds("prefFilterList", "FILRR");
442 function getSelectedFeedCats() {
443 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
447 function readSelectedFeeds(read
) {
449 if (!xmlhttp_ready(xmlhttp
)) {
454 var sel_rows
= getSelectedFeeds();
456 if (sel_rows
.length
> 0) {
464 notify("Marking selected feeds as " + op
+ "...");
466 xmlhttp
.open("GET", "backend.php?op=pref-rpc&subop=" + op
+ "&ids="+
467 param_escape(sel_rows
.toString()), true);
468 xmlhttp
.onreadystatechange
=notify_callback
;
473 notify("Please select some feeds first.");
478 function removeSelectedLabels() {
480 if (!xmlhttp_ready(xmlhttp
)) {
485 var sel_rows
= getSelectedLabels();
487 if (sel_rows
.length
> 0) {
489 notify("Removing selected labels...");
491 xmlhttp
.open("GET", "backend.php?op=pref-labels&subop=remove&ids="+
492 param_escape(sel_rows
.toString()), true);
493 xmlhttp
.onreadystatechange
=labellist_callback
;
497 notify("Please select some labels first.");
501 function removeSelectedUsers() {
503 if (!xmlhttp_ready(xmlhttp
)) {
508 var sel_rows
= getSelectedUsers();
510 if (sel_rows
.length
> 0) {
512 notify("Removing selected users...");
514 xmlhttp
.open("GET", "backend.php?op=pref-users&subop=remove&ids="+
515 param_escape(sel_rows
.toString()), true);
516 xmlhttp
.onreadystatechange
=userlist_callback
;
520 notify("Please select some labels first.");
524 function removeSelectedFilters() {
526 if (!xmlhttp_ready(xmlhttp
)) {
531 var sel_rows
= getSelectedFilters();
533 if (sel_rows
.length
> 0) {
535 notify("Removing selected filters...");
537 xmlhttp
.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+
538 param_escape(sel_rows
.toString()), true);
539 xmlhttp
.onreadystatechange
=filterlist_callback
;
543 notify("Please select some filters first.");
548 function removeSelectedFeeds() {
550 if (!xmlhttp_ready(xmlhttp
)) {
555 var sel_rows
= getSelectedFeeds();
557 if (sel_rows
.length
> 0) {
559 notify("Removing selected feeds...");
561 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=remove&ids="+
562 param_escape(sel_rows
.toString()), true);
563 xmlhttp
.onreadystatechange
=feedlist_callback
;
568 notify("Please select some feeds first.");
574 function removeSelectedFeedCats() {
576 if (!xmlhttp_ready(xmlhttp
)) {
581 var sel_rows
= getSelectedFeedCats();
583 if (sel_rows
.length
> 0) {
585 notify("Removing selected categories...");
587 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=removeCats&ids="+
588 param_escape(sel_rows
.toString()), true);
589 xmlhttp
.onreadystatechange
=feedlist_callback
;
594 notify("Please select some feeds first.");
600 function feedEditCancel() {
602 if (!xmlhttp_ready(xmlhttp
)) {
611 notify("Operation cancelled.");
613 /* xmlhttp.open("GET", "backend.php?op=pref-feeds", true);
614 xmlhttp.onreadystatechange=feedlist_callback;
615 xmlhttp.send(null); */
619 function feedCatEditCancel() {
621 if (!xmlhttp_ready(xmlhttp
)) {
626 active_feed_cat
= false;
628 notify("Operation cancelled.");
630 xmlhttp
.open("GET", "backend.php?op=pref-feeds", true);
631 xmlhttp
.onreadystatechange
=feedlist_callback
;
636 function feedEditSave() {
638 var feed
= active_feed
;
640 if (!xmlhttp_ready(xmlhttp
)) {
645 var link
= document
.getElementById("iedit_link").value
;
646 var title
= document
.getElementById("iedit_title").value
;
647 var upd_intl
= document
.getElementById("iedit_updintl").value
;
648 var purge_intl
= document
.getElementById("iedit_purgintl").value
;
649 var fcat
= document
.getElementById("iedit_fcat");
651 var fcat_id
= fcat
[fcat
.selectedIndex
].id
;
653 // notify("Saving feed.");
655 /* if (upd_intl < 0) {
656 notify("Update interval must be >= 0 (0 = default)");
660 if (purge_intl < 0) {
661 notify("Purge days must be >= 0 (0 = default)");
665 if (link
.length
== 0) {
666 notify("Feed link cannot be blank.");
670 if (title
.length
== 0) {
671 notify("Feed title cannot be blank.");
679 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=editSave&id=" +
680 feed
+ "&l=" + param_escape(link
) + "&t=" + param_escape(title
) +
681 "&ui=" + param_escape(upd_intl
) + "&pi=" + param_escape(purge_intl
) +
682 "&catid=" + param_escape(fcat_id
), true);
683 xmlhttp
.onreadystatechange
=feedlist_callback
;
688 function labelTest() {
690 var sqlexp
= document
.getElementById("iedit_expr").value
;
691 var descr
= document
.getElementById("iedit_descr").value
;
693 xmlhttp
.open("GET", "backend.php?op=pref-labels&subop=test&expr=" +
694 param_escape(sqlexp
) + "&descr=" + param_escape(descr
), true);
696 xmlhttp
.onreadystatechange
=infobox_callback
;
701 function displayHelpInfobox(topic_id
) {
703 xmlhttp
.open("GET", "backend.php?op=help&tid=" +
704 param_escape(topic_id
) + "&noheaders=1", true);
706 xmlhttp
.onreadystatechange
=infobox_callback
;
711 function labelEditCancel() {
713 if (!xmlhttp_ready(xmlhttp
)) {
718 active_label
= false;
720 notify("Operation cancelled.");
722 xmlhttp
.open("GET", "backend.php?op=pref-labels", true);
723 xmlhttp
.onreadystatechange
=labellist_callback
;
728 function userEditCancel() {
730 if (!xmlhttp_ready(xmlhttp
)) {
737 notify("Operation cancelled.");
739 xmlhttp
.open("GET", "backend.php?op=pref-users", true);
740 xmlhttp
.onreadystatechange
=userlist_callback
;
745 function filterEditCancel() {
747 if (!xmlhttp_ready(xmlhttp
)) {
752 active_filter
= false;
754 notify("Operation cancelled.");
756 xmlhttp
.open("GET", "backend.php?op=pref-filters", true);
757 xmlhttp
.onreadystatechange
=filterlist_callback
;
762 function labelEditSave() {
764 var label
= active_label
;
766 if (!xmlhttp_ready(xmlhttp
)) {
771 var sqlexp
= document
.getElementById("iedit_expr").value
;
772 var descr
= document
.getElementById("iedit_descr").value
;
774 // notify("Saving label " + sqlexp + ": " + descr);
776 if (sqlexp
.length
== 0) {
777 notify("SQL expression cannot be blank.");
781 if (descr
.length
== 0) {
782 notify("Caption cannot be blank.");
788 active_label
= false;
790 xmlhttp
.open("GET", "backend.php?op=pref-labels&subop=editSave&id=" +
791 label
+ "&s=" + param_escape(sqlexp
) + "&d=" + param_escape(descr
),
794 xmlhttp
.onreadystatechange
=labellist_callback
;
799 function userEditSave() {
801 var user
= active_user
;
803 if (!xmlhttp_ready(xmlhttp
)) {
808 var login
= document
.getElementById("iedit_ulogin").value
;
809 var level
= document
.getElementById("iedit_ulevel").value
;
811 if (login
.length
== 0) {
812 notify("Login cannot be blank.");
816 if (level
.length
== 0) {
817 notify("User level cannot be blank.");
825 xmlhttp
.open("GET", "backend.php?op=pref-users&subop=editSave&id=" +
826 user
+ "&l=" + param_escape(login
) + "&al=" + param_escape(level
),
829 xmlhttp
.onreadystatechange
=userlist_callback
;
835 function filterEditSave() {
837 var filter
= active_filter
;
839 if (!xmlhttp_ready(xmlhttp
)) {
844 var regexp
= document
.getElementById("iedit_regexp").value
;
845 var descr
= document
.getElementById("iedit_descr").value
;
846 var match
= document
.getElementById("iedit_match");
848 var v_match
= match
[match
.selectedIndex
].text
;
850 var feed
= document
.getElementById("iedit_feed");
851 var feed_id
= feed
[feed
.selectedIndex
].id
;
853 var action
= document
.getElementById("iedit_filter_action");
854 var action_id
= action
[action
.selectedIndex
].id
;
856 // notify("Saving filter " + filter + ": " + regexp + ", " + descr + ", " + match);
858 if (regexp
.length
== 0) {
859 notify("Filter expression cannot be blank.");
863 active_filter
= false;
865 xmlhttp
.open("GET", "backend.php?op=pref-filters&subop=editSave&id=" +
866 filter
+ "&r=" + param_escape(regexp
) + "&d=" + param_escape(descr
) +
867 "&m=" + param_escape(v_match
) + "&fid=" + param_escape(feed_id
) +
868 "&aid=" + param_escape(action_id
), true);
872 xmlhttp
.onreadystatechange
=filterlist_callback
;
877 function editSelectedLabel() {
878 var rows
= getSelectedLabels();
880 if (rows
.length
== 0) {
881 notify("No labels are selected.");
885 if (rows
.length
> 1) {
886 notify("Please select one label.");
896 function editSelectedUser() {
897 var rows
= getSelectedUsers();
899 if (rows
.length
== 0) {
900 notify("No users are selected.");
904 if (rows
.length
> 1) {
905 notify("Please select one user.");
914 function resetSelectedUserPass() {
915 var rows
= getSelectedUsers();
917 if (rows
.length
== 0) {
918 notify("No users are selected.");
922 if (rows
.length
> 1) {
923 notify("Please select one user.");
927 notify("Resetting password for selected user...");
931 xmlhttp
.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
932 param_escape(id
), true);
933 xmlhttp
.onreadystatechange
=userlist_callback
;
938 function selectedUserDetails() {
940 if (!xmlhttp_ready(xmlhttp
)) {
945 var rows
= getSelectedUsers();
947 if (rows
.length
== 0) {
948 notify("No users are selected.");
952 if (rows
.length
> 1) {
953 notify("Please select one user.");
961 xmlhttp
.open("GET", "backend.php?op=user-details&id=" + id
, true);
962 xmlhttp
.onreadystatechange
=infobox_callback
;
967 function selectedFeedDetails() {
969 if (!xmlhttp_ready(xmlhttp
)) {
974 var rows
= getSelectedFeeds();
976 if (rows
.length
== 0) {
977 notify("No feeds are selected.");
981 if (rows
.length
> 1) {
982 notify("Please select one feed.");
990 xmlhttp
.open("GET", "backend.php?op=feed-details&id=" + id
, true);
991 xmlhttp
.onreadystatechange
=infobox_callback
;
996 function editSelectedFilter() {
997 var rows
= getSelectedFilters();
999 if (rows
.length
== 0) {
1000 notify("No filters are selected.");
1004 if (rows
.length
> 1) {
1005 notify("Please select one filter.");
1011 editFilter(rows
[0]);
1016 function editSelectedFeed() {
1017 var rows
= getSelectedFeeds();
1019 if (rows
.length
== 0) {
1020 notify("No feeds are selected.");
1024 if (rows
.length
> 1) {
1025 notify("Please select one feed.");
1035 function editSelectedFeedCat() {
1036 var rows
= getSelectedFeedCats();
1038 if (rows
.length
== 0) {
1039 notify("No categories are selected.");
1043 if (rows
.length
> 1) {
1044 notify("Please select one category.");
1050 editFeedCat(rows
[0]);
1054 function localPiggieFunction(enable
) {
1056 piggie
.style
.display
= "block";
1058 notify("I loveded it!!!");
1060 piggie
.style
.display
= "none";
1065 function validateOpmlImport() {
1067 var opml_file
= document
.getElementById("opml_file");
1069 if (opml_file
.value
.length
== 0) {
1070 notify("Please select OPML file to upload.");
1077 function updateFilterList() {
1079 if (!xmlhttp_ready(xmlhttp
)) {
1080 printLockingError();
1084 // document.getElementById("prefContent").innerHTML = "Loading filters, please wait...";
1086 p_notify("Loading, please wait...");
1088 xmlhttp
.open("GET", "backend.php?op=pref-filters", true);
1089 xmlhttp
.onreadystatechange
=filterlist_callback
;
1094 function updateLabelList() {
1096 if (!xmlhttp_ready(xmlhttp
)) {
1097 printLockingError();
1101 p_notify("Loading, please wait...");
1103 // document.getElementById("prefContent").innerHTML = "Loading labels, please wait...";
1105 xmlhttp
.open("GET", "backend.php?op=pref-labels", true);
1106 xmlhttp
.onreadystatechange
=labellist_callback
;
1110 function updatePrefsList() {
1112 if (!xmlhttp_ready(xmlhttp
)) {
1113 printLockingError();
1117 p_notify("Loading, please wait...");
1119 xmlhttp
.open("GET", "backend.php?op=pref-prefs", true);
1120 xmlhttp
.onreadystatechange
=prefslist_callback
;
1125 function selectTab(id
) {
1127 if (!xmlhttp_ready(xmlhttp
)) {
1128 printLockingError();
1132 if (id
== "feedConfig") {
1134 } else if (id
== "filterConfig") {
1136 } else if (id
== "labelConfig") {
1138 } else if (id
== "genConfig") {
1140 } else if (id
== "userConfig") {
1144 var tab
= document
.getElementById(active_tab
+ "Tab");
1147 if (tab
.className
.match("Selected")) {
1148 tab
.className
= "prefsTab";
1152 tab
= document
.getElementById(id
+ "Tab");
1155 if (!tab
.className
.match("Selected")) {
1156 tab
.className
= tab
.className
+ "Selected";
1170 document
.getElementById("prefContent").innerHTML
=
1171 "<b>Fatal error:</b> This program needs XmlHttpRequest " +
1172 "to function properly. Your browser doesn't seem to support it.";
1176 selectTab("genConfig");
1178 document
.onkeydown
= hotkey_handler
;
1181 exception_error("init", e
);
1185 function closeInfoBox() {
1186 var box
= document
.getElementById('infoBox');
1187 var shadow
= document
.getElementById('infoBoxShadow');
1190 shadow
.style
.display
= "none";
1192 box
.style
.display
= "none";
1196 function categorizeSelectedFeeds() {
1198 if (!xmlhttp_ready(xmlhttp
)) {
1199 printLockingError();
1203 var sel_rows
= getSelectedFeeds();
1205 var cat_sel
= document
.getElementById("sfeed_set_fcat");
1206 var cat_id
= cat_sel
[cat_sel
.selectedIndex
].id
;
1208 if (sel_rows
.length
> 0) {
1210 notify("Changing category of selected feeds...");
1212 xmlhttp
.open("GET", "backend.php?op=pref-feeds&subop=categorize&ids="+
1213 param_escape(sel_rows
.toString()) + "&cat_id=" + param_escape(cat_id
), true);
1214 xmlhttp
.onreadystatechange
=feedlist_callback
;
1219 notify("Please select some feeds first.");