]> git.wh0rd.org Git - tt-rss.git/blob - prefs.js
implement save in feed_cat editor (closes #6)
[tt-rss.git] / prefs.js
1 var xmlhttp = false;
2
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;
8
9 var active_tab = false;
10
11 /*@cc_on @*/
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.
15 try {
16         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
17 } catch (e) {
18         try {
19                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
20         } catch (E) {
21                 xmlhttp = false;
22         }
23 }
24 @end @*/
25
26 if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
27         xmlhttp = new XMLHttpRequest();
28 }
29
30 function feedlist_callback() {
31         if (xmlhttp.readyState == 4) {
32                 var container = document.getElementById('prefContent'); 
33                 container.innerHTML=xmlhttp.responseText;
34                 if (active_feed) {
35                         var row = document.getElementById("FEEDR-" + active_feed);
36                         if (row) {
37                                 if (!row.className.match("Selected")) {
38                                         row.className = row.className + "Selected";
39                                 }               
40                         }
41                         var checkbox = document.getElementById("FRCHK-" + active_feed);
42                         if (checkbox) {
43                                 checkbox.checked = true;
44                         }
45                 }
46                 p_notify("");
47         }
48 }
49
50 function filterlist_callback() {
51         var container = document.getElementById('prefContent');
52         if (xmlhttp.readyState == 4) {
53
54                 container.innerHTML=xmlhttp.responseText;
55
56                 if (active_filter) {
57                         var row = document.getElementById("FILRR-" + active_filter);
58                         if (row) {
59                                 if (!row.className.match("Selected")) {
60                                         row.className = row.className + "Selected";
61                                 }               
62                         }
63                         var checkbox = document.getElementById("FICHK-" + active_filter);
64                         
65                         if (checkbox) {
66                                 checkbox.checked = true;
67                         }
68                 }
69                 p_notify("");
70         }
71 }
72
73 function labellist_callback() {
74         var container = document.getElementById('prefContent');
75         if (xmlhttp.readyState == 4) {
76                 container.innerHTML=xmlhttp.responseText;
77
78                 if (active_label) {
79                         var row = document.getElementById("LILRR-" + active_label);
80                         if (row) {
81                                 if (!row.className.match("Selected")) {
82                                         row.className = row.className + "Selected";
83                                 }               
84                         }
85                         var checkbox = document.getElementById("LICHK-" + active_label);
86                         
87                         if (checkbox) {
88                                 checkbox.checked = true;
89                         }
90                 }
91                 p_notify("");
92         }
93 }
94
95 function userlist_callback() {
96         var container = document.getElementById('prefContent');
97         if (xmlhttp.readyState == 4) {
98                 container.innerHTML=xmlhttp.responseText;
99
100                 if (active_user) {
101                         var row = document.getElementById("UMRR-" + active_user);
102                         if (row) {
103                                 if (!row.className.match("Selected")) {
104                                         row.className = row.className + "Selected";
105                                 }               
106                         }
107                         var checkbox = document.getElementById("UMCHK-" + active_user);
108                         
109                         if (checkbox) {
110                                 checkbox.checked = true;
111                         }
112                 } 
113
114                 p_notify("");
115         }
116 }
117
118 function infobox_callback() {
119         if (xmlhttp.readyState == 4) {
120                 var box = document.getElementById('infoBox');
121                 var shadow = document.getElementById('infoBoxShadow');
122
123                 if (box) {
124                         box.innerHTML=xmlhttp.responseText;
125                         if (shadow) {
126                                 shadow.style.display = "block";
127                         } else {
128                                 box.style.display = "block";
129                         }
130                 }
131         }
132 }
133
134
135 function prefslist_callback() {
136         var container = document.getElementById('prefContent');
137         if (xmlhttp.readyState == 4) {
138
139                 container.innerHTML=xmlhttp.responseText;
140
141                 p_notify("");
142         }
143 }
144
145 function gethelp_callback() {
146         var container = document.getElementById('prefHelpBox');
147         if (xmlhttp.readyState == 4) {
148
149                 container.innerHTML = xmlhttp.responseText;
150                 container.style.display = "block";
151
152         }
153 }
154
155
156 function notify_callback() {
157         var container = document.getElementById('notify');
158         if (xmlhttp.readyState == 4) {
159                 container.innerHTML=xmlhttp.responseText;
160         }
161 }
162
163 function updateFeedList(sort_key) {
164
165         if (!xmlhttp_ready(xmlhttp)) {
166                 printLockingError();
167                 return
168         }
169
170 //      document.getElementById("prefContent").innerHTML = "Loading feeds, please wait...";
171
172         p_notify("Loading, please wait...");
173
174         var feed_search = document.getElementById("feed_search");
175         var search = "";
176         if (feed_search) { search = feed_search.value; }
177
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;
182         xmlhttp.send(null);
183
184 }
185
186 function updateUsersList() {
187
188         if (!xmlhttp_ready(xmlhttp)) {
189                 printLockingError();
190                 return
191         }
192
193 //      document.getElementById("prefContent").innerHTML = "Loading feeds, please wait...";
194
195         p_notify("Loading, please wait...");
196
197         xmlhttp.open("GET", "backend.php?op=pref-users", true);
198         xmlhttp.onreadystatechange=userlist_callback;
199         xmlhttp.send(null);
200
201 }
202
203 function addLabel() {
204
205         if (!xmlhttp_ready(xmlhttp)) {
206                 printLockingError();
207                 return
208         }
209
210         var sqlexp = document.getElementById("ladd_expr");
211
212         if (sqlexp.value.length == 0) {
213                 notify("Missing SQL expression.");
214         } else {
215                 notify("Adding label...");
216
217                 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=add&exp=" +
218                         param_escape(sqlexp.value), true);                      
219                         
220                 xmlhttp.onreadystatechange=labellist_callback;
221                 xmlhttp.send(null);
222
223                 sqlexp.value = "";
224         }
225
226 }
227
228 function addFilter() {
229
230         if (!xmlhttp_ready(xmlhttp)) {
231                 printLockingError();
232                 return
233         }
234
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");
239
240         if (regexp.value.length == 0) {
241                 notify("Missing filter expression.");
242         } else {
243                 notify("Adding filter...");
244
245                 var v_match = match[match.selectedIndex].text;
246                 var feed_id = feed[feed.selectedIndex].id;
247                 var action_id = action[action.selectedIndex].id;
248
249                 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=add&regexp=" +
250                         param_escape(regexp.value) + "&match=" + v_match +
251                         "&fid=" + param_escape(feed_id) + "&aid=" + param_escape(action_id), true);
252                         
253                 xmlhttp.onreadystatechange=filterlist_callback;
254                 xmlhttp.send(null);
255
256                 regexp.value = "";
257         }
258
259 }
260
261 function addFeed() {
262
263         if (!xmlhttp_ready(xmlhttp)) {
264                 printLockingError();
265                 return
266         }
267
268         var link = document.getElementById("fadd_link");
269
270         if (link.value.length == 0) {
271                 notify("Missing feed URL.");
272         } else {
273                 notify("Adding feed...");
274
275                 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=add&link=" +
276                         param_escape(link.value), true);
277                 xmlhttp.onreadystatechange=feedlist_callback;
278                 xmlhttp.send(null);
279
280                 link.value = "";
281
282         }
283
284 }
285
286 function addFeedCat() {
287
288         if (!xmlhttp_ready(xmlhttp)) {
289                 printLockingError();
290                 return
291         }
292
293         var cat = document.getElementById("fadd_cat");
294
295         if (cat.value.length == 0) {
296                 notify("Missing feed category.");
297         } else {
298                 notify("Adding feed category...");
299
300                 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=addCat&cat=" +
301                         param_escape(cat.value), true);
302                 xmlhttp.onreadystatechange=feedlist_callback;
303                 xmlhttp.send(null);
304
305                 link.value = "";
306
307         }
308
309 }
310 function addUser() {
311
312         if (!xmlhttp_ready(xmlhttp)) {
313                 printLockingError();
314                 return
315         }
316
317         var sqlexp = document.getElementById("uadd_box");
318
319         if (sqlexp.value.length == 0) {
320                 notify("Missing user login.");
321         } else {
322                 notify("Adding user...");
323
324                 xmlhttp.open("GET", "backend.php?op=pref-users&subop=add&login=" +
325                         param_escape(sqlexp.value), true);                      
326                         
327                 xmlhttp.onreadystatechange=userlist_callback;
328                 xmlhttp.send(null);
329
330                 sqlexp.value = "";
331         }
332
333 }
334
335 function editLabel(id) {
336
337         if (!xmlhttp_ready(xmlhttp)) {
338                 printLockingError();
339                 return
340         }
341
342         active_label = id;
343
344         xmlhttp.open("GET", "backend.php?op=pref-labels&subop=edit&id=" +
345                 param_escape(id), true);
346         xmlhttp.onreadystatechange=labellist_callback;
347         xmlhttp.send(null);
348
349 }
350
351 function editUser(id) {
352
353         if (!xmlhttp_ready(xmlhttp)) {
354                 printLockingError();
355                 return
356         }
357
358         active_user = id;
359
360         xmlhttp.open("GET", "backend.php?op=pref-users&subop=edit&id=" +
361                 param_escape(id), true);
362         xmlhttp.onreadystatechange=userlist_callback;
363         xmlhttp.send(null);
364
365 }
366
367 function editFilter(id) {
368
369         if (!xmlhttp_ready(xmlhttp)) {
370                 printLockingError();
371                 return
372         }
373
374         active_filter = id;
375
376         xmlhttp.open("GET", "backend.php?op=pref-filters&subop=edit&id=" +
377                 param_escape(id), true);
378         xmlhttp.onreadystatechange=filterlist_callback;
379         xmlhttp.send(null);
380
381 }
382
383 function editFeed(feed) {
384
385 //      notify("Editing feed...");
386
387         if (!xmlhttp_ready(xmlhttp)) {
388                 printLockingError();
389                 return
390         }
391
392         active_feed = feed;
393
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); */
398
399         selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
400         selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-'+feed, 'FRCHK-'+feed, true);
401
402         xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editfeed&id=" +
403                 param_escape(active_feed), true);
404
405         xmlhttp.onreadystatechange=infobox_callback;
406         xmlhttp.send(null);
407
408 }
409
410 function editFeedCat(cat) {
411
412         if (!xmlhttp_ready(xmlhttp)) {
413                 printLockingError();
414                 return
415         }
416
417         active_feed_cat = cat;
418
419         xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=editCat&id=" +
420                 param_escape(cat), true);
421         xmlhttp.onreadystatechange=feedlist_callback;
422         xmlhttp.send(null);
423
424 }
425
426 function getSelectedLabels() {
427         return getSelectedTableRowIds("prefLabelList", "LILRR");
428 }
429
430 function getSelectedUsers() {
431         return getSelectedTableRowIds("prefUserList", "UMRR");
432 }
433
434 function getSelectedFeeds() {
435         return getSelectedTableRowIds("prefFeedList", "FEEDR");
436 }
437
438 function getSelectedFilters() {
439         return getSelectedTableRowIds("prefFilterList", "FILRR");
440 }
441
442 function getSelectedFeedCats() {
443         return getSelectedTableRowIds("prefFeedCatList", "FCATR");
444 }
445
446
447 function readSelectedFeeds(read) {
448
449         if (!xmlhttp_ready(xmlhttp)) {
450                 printLockingError();
451                 return
452         }
453
454         var sel_rows = getSelectedFeeds();
455
456         if (sel_rows.length > 0) {
457
458                 if (!read) {
459                         op = "unread";
460                 } else {
461                         op = "read";
462                 }
463
464                 notify("Marking selected feeds as " + op + "...");
465
466                 xmlhttp.open("GET", "backend.php?op=pref-rpc&subop=" + op + "&ids="+
467                         param_escape(sel_rows.toString()), true);
468                 xmlhttp.onreadystatechange=notify_callback;
469                 xmlhttp.send(null);
470
471         } else {
472
473                 notify("Please select some feeds first.");
474
475         }
476 }
477
478 function removeSelectedLabels() {
479
480         if (!xmlhttp_ready(xmlhttp)) {
481                 printLockingError();
482                 return
483         }
484
485         var sel_rows = getSelectedLabels();
486
487         if (sel_rows.length > 0) {
488
489                 notify("Removing selected labels...");
490
491                 xmlhttp.open("GET", "backend.php?op=pref-labels&subop=remove&ids="+
492                         param_escape(sel_rows.toString()), true);
493                 xmlhttp.onreadystatechange=labellist_callback;
494                 xmlhttp.send(null);
495
496         } else {
497                 notify("Please select some labels first.");
498         }
499 }
500
501 function removeSelectedUsers() {
502
503         if (!xmlhttp_ready(xmlhttp)) {
504                 printLockingError();
505                 return
506         }
507
508         var sel_rows = getSelectedUsers();
509
510         if (sel_rows.length > 0) {
511
512                 notify("Removing selected users...");
513
514                 xmlhttp.open("GET", "backend.php?op=pref-users&subop=remove&ids="+
515                         param_escape(sel_rows.toString()), true);
516                 xmlhttp.onreadystatechange=userlist_callback;
517                 xmlhttp.send(null);
518
519         } else {
520                 notify("Please select some labels first.");
521         }
522 }
523
524 function removeSelectedFilters() {
525
526         if (!xmlhttp_ready(xmlhttp)) {
527                 printLockingError();
528                 return
529         }
530
531         var sel_rows = getSelectedFilters();
532
533         if (sel_rows.length > 0) {
534
535                 notify("Removing selected filters...");
536
537                 xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+
538                         param_escape(sel_rows.toString()), true);
539                 xmlhttp.onreadystatechange=filterlist_callback;
540                 xmlhttp.send(null);
541
542         } else {
543                 notify("Please select some filters first.");
544         }
545 }
546
547
548 function removeSelectedFeeds() {
549
550         if (!xmlhttp_ready(xmlhttp)) {
551                 printLockingError();
552                 return
553         }
554
555         var sel_rows = getSelectedFeeds();
556
557         if (sel_rows.length > 0) {
558
559                 notify("Removing selected feeds...");
560
561                 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=remove&ids="+
562                         param_escape(sel_rows.toString()), true);
563                 xmlhttp.onreadystatechange=feedlist_callback;
564                 xmlhttp.send(null);
565
566         } else {
567
568                 notify("Please select some feeds first.");
569
570         }
571
572 }
573
574 function removeSelectedFeedCats() {
575
576         if (!xmlhttp_ready(xmlhttp)) {
577                 printLockingError();
578                 return
579         }
580
581         var sel_rows = getSelectedFeedCats();
582
583         if (sel_rows.length > 0) {
584
585                 notify("Removing selected categories...");
586
587                 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=removeCats&ids="+
588                         param_escape(sel_rows.toString()), true);
589                 xmlhttp.onreadystatechange=feedlist_callback;
590                 xmlhttp.send(null);
591
592         } else {
593
594                 notify("Please select some feeds first.");
595
596         }
597
598 }
599
600 function feedEditCancel() {
601
602         if (!xmlhttp_ready(xmlhttp)) {
603                 printLockingError();
604                 return
605         }
606
607         closeInfoBox();
608
609         active_feed = false;
610
611         notify("Operation cancelled.");
612
613 /*      xmlhttp.open("GET", "backend.php?op=pref-feeds", true);
614         xmlhttp.onreadystatechange=feedlist_callback;
615         xmlhttp.send(null); */
616
617 }
618
619 function feedCatEditCancel() {
620
621         if (!xmlhttp_ready(xmlhttp)) {
622                 printLockingError();
623                 return
624         }
625
626         active_feed_cat = false;
627
628         notify("Operation cancelled.");
629
630         xmlhttp.open("GET", "backend.php?op=pref-feeds", true);
631         xmlhttp.onreadystatechange=feedlist_callback;
632         xmlhttp.send(null);
633
634 }
635
636 function feedEditSave() {
637
638         var feed = active_feed;
639
640         if (!xmlhttp_ready(xmlhttp)) {
641                 printLockingError();
642                 return
643         }
644
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");
650
651         var fcat_id = fcat[fcat.selectedIndex].id;
652
653 //      notify("Saving feed.");
654
655 /*      if (upd_intl < 0) {
656                 notify("Update interval must be &gt;= 0 (0 = default)");
657                 return;
658         }
659
660         if (purge_intl < 0) {
661                 notify("Purge days must be &gt;= 0 (0 = default)");
662                 return;
663         } */
664
665         if (link.length == 0) {
666                 notify("Feed link cannot be blank.");
667                 return;
668         }
669
670         if (title.length == 0) {
671                 notify("Feed title cannot be blank.");
672                 return;
673         }
674
675         active_feed = false;
676
677         notify("");
678
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;
684         xmlhttp.send(null);
685
686 }
687
688 function feedCatEditSave() {
689
690         if (!xmlhttp_ready(xmlhttp)) {
691                 printLockingError();
692                 return
693         }
694
695         notify("");
696
697         var cat_title = document.getElementById("iedit_title").value;
698
699         xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=saveCat&id=" +
700                 param_escape(active_feed_cat) + "&title=" + param_escape(cat_title), 
701                 true);
702         xmlhttp.onreadystatechange=feedlist_callback;
703         xmlhttp.send(null);
704
705         active_feed_cat = false;
706
707 }
708
709
710 function labelTest() {
711
712         var sqlexp = document.getElementById("iedit_expr").value;
713         var descr = document.getElementById("iedit_descr").value;
714
715         xmlhttp.open("GET", "backend.php?op=pref-labels&subop=test&expr=" +
716                 param_escape(sqlexp) + "&descr=" + param_escape(descr), true);
717
718         xmlhttp.onreadystatechange=infobox_callback;
719         xmlhttp.send(null);
720
721 }
722
723 function displayHelpInfobox(topic_id) {
724
725         xmlhttp.open("GET", "backend.php?op=help&tid=" +
726                 param_escape(topic_id) + "&noheaders=1", true);
727
728         xmlhttp.onreadystatechange=infobox_callback;
729         xmlhttp.send(null);
730
731 }
732
733 function labelEditCancel() {
734
735         if (!xmlhttp_ready(xmlhttp)) {
736                 printLockingError();
737                 return
738         }
739
740         active_label = false;
741
742         notify("Operation cancelled.");
743
744         xmlhttp.open("GET", "backend.php?op=pref-labels", true);
745         xmlhttp.onreadystatechange=labellist_callback;
746         xmlhttp.send(null);
747
748 }
749
750 function userEditCancel() {
751
752         if (!xmlhttp_ready(xmlhttp)) {
753                 printLockingError();
754                 return
755         }
756
757         active_user = false;
758
759         notify("Operation cancelled.");
760
761         xmlhttp.open("GET", "backend.php?op=pref-users", true);
762         xmlhttp.onreadystatechange=userlist_callback;
763         xmlhttp.send(null);
764
765 }
766
767 function filterEditCancel() {
768
769         if (!xmlhttp_ready(xmlhttp)) {
770                 printLockingError();
771                 return
772         }
773
774         active_filter = false;
775
776         notify("Operation cancelled.");
777
778         xmlhttp.open("GET", "backend.php?op=pref-filters", true);
779         xmlhttp.onreadystatechange=filterlist_callback;
780         xmlhttp.send(null);
781
782 }
783
784 function labelEditSave() {
785
786         var label = active_label;
787
788         if (!xmlhttp_ready(xmlhttp)) {
789                 printLockingError();
790                 return
791         }
792
793         var sqlexp = document.getElementById("iedit_expr").value;
794         var descr = document.getElementById("iedit_descr").value;
795
796 //      notify("Saving label " + sqlexp + ": " + descr);
797
798         if (sqlexp.length == 0) {
799                 notify("SQL expression cannot be blank.");
800                 return;
801         }
802
803         if (descr.length == 0) {
804                 notify("Caption cannot be blank.");
805                 return;
806         }
807
808         notify("");
809
810         active_label = false;
811
812         xmlhttp.open("GET", "backend.php?op=pref-labels&subop=editSave&id=" +
813                 label + "&s=" + param_escape(sqlexp) + "&d=" + param_escape(descr),
814                 true);
815                 
816         xmlhttp.onreadystatechange=labellist_callback;
817         xmlhttp.send(null);
818
819 }
820
821 function userEditSave() {
822
823         var user = active_user;
824
825         if (!xmlhttp_ready(xmlhttp)) {
826                 printLockingError();
827                 return
828         }
829
830         var login = document.getElementById("iedit_ulogin").value;
831         var level = document.getElementById("iedit_ulevel").value;
832
833         if (login.length == 0) {
834                 notify("Login cannot be blank.");
835                 return;
836         }
837
838         if (level.length == 0) {
839                 notify("User level cannot be blank.");
840                 return;
841         }
842
843         active_user = false;
844
845         notify("");
846
847         xmlhttp.open("GET", "backend.php?op=pref-users&subop=editSave&id=" +
848                 user + "&l=" + param_escape(login) + "&al=" + param_escape(level),
849                 true);
850                 
851         xmlhttp.onreadystatechange=userlist_callback;
852         xmlhttp.send(null);
853
854 }
855
856
857 function filterEditSave() {
858
859         var filter = active_filter;
860
861         if (!xmlhttp_ready(xmlhttp)) {
862                 printLockingError();
863                 return
864         }
865
866         var regexp = document.getElementById("iedit_regexp").value;
867         var descr = document.getElementById("iedit_descr").value;
868         var match = document.getElementById("iedit_match");
869
870         var v_match = match[match.selectedIndex].text;
871
872         var feed = document.getElementById("iedit_feed");
873         var feed_id = feed[feed.selectedIndex].id;
874
875         var action = document.getElementById("iedit_filter_action");
876         var action_id = action[action.selectedIndex].id;
877
878 //      notify("Saving filter " + filter + ": " + regexp + ", " + descr + ", " + match);
879
880         if (regexp.length == 0) {
881                 notify("Filter expression cannot be blank.");
882                 return;
883         }
884
885         active_filter = false;
886
887         xmlhttp.open("GET", "backend.php?op=pref-filters&subop=editSave&id=" +
888                 filter + "&r=" + param_escape(regexp) + "&d=" + param_escape(descr) +
889                 "&m=" + param_escape(v_match) + "&fid=" + param_escape(feed_id) + 
890                 "&aid=" + param_escape(action_id), true);
891
892         notify("");
893
894         xmlhttp.onreadystatechange=filterlist_callback;
895         xmlhttp.send(null); 
896
897 }
898
899 function editSelectedLabel() {
900         var rows = getSelectedLabels();
901
902         if (rows.length == 0) {
903                 notify("No labels are selected.");
904                 return;
905         }
906
907         if (rows.length > 1) {
908                 notify("Please select one label.");
909                 return;
910         }
911
912         notify("");
913
914         editLabel(rows[0]);
915
916 }
917
918 function editSelectedUser() {
919         var rows = getSelectedUsers();
920
921         if (rows.length == 0) {
922                 notify("No users are selected.");
923                 return;
924         }
925
926         if (rows.length > 1) {
927                 notify("Please select one user.");
928                 return;
929         }
930
931         notify("");
932
933         editUser(rows[0]);
934 }
935
936 function resetSelectedUserPass() {
937         var rows = getSelectedUsers();
938
939         if (rows.length == 0) {
940                 notify("No users are selected.");
941                 return;
942         }
943
944         if (rows.length > 1) {
945                 notify("Please select one user.");
946                 return;
947         }
948
949         notify("Resetting password for selected user...");
950
951         var id = rows[0];
952
953         xmlhttp.open("GET", "backend.php?op=pref-users&subop=resetPass&id=" +
954                 param_escape(id), true);
955         xmlhttp.onreadystatechange=userlist_callback;
956         xmlhttp.send(null);
957
958 }
959
960 function selectedUserDetails() {
961
962         if (!xmlhttp_ready(xmlhttp)) {
963                 printLockingError();
964                 return
965         }
966
967         var rows = getSelectedUsers();
968
969         if (rows.length == 0) {
970                 notify("No users are selected.");
971                 return;
972         }
973
974         if (rows.length > 1) {
975                 notify("Please select one user.");
976                 return;
977         }
978
979         var id = rows[0];
980
981         notify("");
982
983         xmlhttp.open("GET", "backend.php?op=user-details&id=" + id, true);
984         xmlhttp.onreadystatechange=infobox_callback;
985         xmlhttp.send(null);
986
987 }
988
989 function selectedFeedDetails() {
990
991         if (!xmlhttp_ready(xmlhttp)) {
992                 printLockingError();
993                 return
994         }
995
996         var rows = getSelectedFeeds();
997
998         if (rows.length == 0) {
999                 notify("No feeds are selected.");
1000                 return;
1001         }
1002
1003         if (rows.length > 1) {
1004                 notify("Please select one feed.");
1005                 return;
1006         }
1007
1008         var id = rows[0];
1009
1010         notify("");
1011
1012         xmlhttp.open("GET", "backend.php?op=feed-details&id=" + id, true);
1013         xmlhttp.onreadystatechange=infobox_callback;
1014         xmlhttp.send(null);
1015
1016 }
1017
1018 function editSelectedFilter() {
1019         var rows = getSelectedFilters();
1020
1021         if (rows.length == 0) {
1022                 notify("No filters are selected.");
1023                 return;
1024         }
1025
1026         if (rows.length > 1) {
1027                 notify("Please select one filter.");
1028                 return;
1029         }
1030
1031         notify("");
1032
1033         editFilter(rows[0]);
1034
1035 }
1036
1037
1038 function editSelectedFeed() {
1039         var rows = getSelectedFeeds();
1040
1041         if (rows.length == 0) {
1042                 notify("No feeds are selected.");
1043                 return;
1044         }
1045
1046         if (rows.length > 1) {
1047                 notify("Please select one feed.");
1048                 return;
1049         }
1050
1051         notify("");
1052
1053         editFeed(rows[0]);
1054
1055 }
1056
1057 function editSelectedFeedCat() {
1058         var rows = getSelectedFeedCats();
1059
1060         if (rows.length == 0) {
1061                 notify("No categories are selected.");
1062                 return;
1063         }
1064
1065         if (rows.length > 1) {
1066                 notify("Please select one category.");
1067                 return;
1068         }
1069
1070         notify("");
1071
1072         editFeedCat(rows[0]);
1073
1074 }
1075
1076 function localPiggieFunction(enable) {
1077         if (enable) {
1078                 piggie.style.display = "block";
1079                 seq = "";
1080                 notify("I loveded it!!!");
1081         } else {
1082                 piggie.style.display = "none";
1083                 notify("");
1084         }
1085 }
1086
1087 function validateOpmlImport() {
1088         
1089         var opml_file = document.getElementById("opml_file");
1090
1091         if (opml_file.value.length == 0) {
1092                 notify("Please select OPML file to upload.");
1093                 return false;
1094         } else {
1095                 return true;
1096         }
1097 }
1098
1099 function updateFilterList() {
1100
1101         if (!xmlhttp_ready(xmlhttp)) {
1102                 printLockingError();
1103                 return
1104         }
1105
1106 //      document.getElementById("prefContent").innerHTML = "Loading filters, please wait...";
1107
1108         p_notify("Loading, please wait...");
1109
1110         xmlhttp.open("GET", "backend.php?op=pref-filters", true);
1111         xmlhttp.onreadystatechange=filterlist_callback;
1112         xmlhttp.send(null);
1113
1114 }
1115
1116 function updateLabelList() {
1117
1118         if (!xmlhttp_ready(xmlhttp)) {
1119                 printLockingError();
1120                 return
1121         }
1122
1123         p_notify("Loading, please wait...");
1124
1125 //      document.getElementById("prefContent").innerHTML = "Loading labels, please wait...";
1126
1127         xmlhttp.open("GET", "backend.php?op=pref-labels", true);
1128         xmlhttp.onreadystatechange=labellist_callback;
1129         xmlhttp.send(null);
1130 }
1131
1132 function updatePrefsList() {
1133
1134         if (!xmlhttp_ready(xmlhttp)) {
1135                 printLockingError();
1136                 return
1137         }
1138
1139         p_notify("Loading, please wait...");
1140
1141         xmlhttp.open("GET", "backend.php?op=pref-prefs", true);
1142         xmlhttp.onreadystatechange=prefslist_callback;
1143         xmlhttp.send(null);
1144
1145 }
1146
1147 function selectTab(id) {
1148
1149         if (!xmlhttp_ready(xmlhttp)) {
1150                 printLockingError();
1151                 return
1152         }
1153
1154         if (id == "feedConfig") {
1155                 updateFeedList();
1156         } else if (id == "filterConfig") {
1157                 updateFilterList();
1158         } else if (id == "labelConfig") {
1159                 updateLabelList();
1160         } else if (id == "genConfig") {
1161                 updatePrefsList();
1162         } else if (id == "userConfig") {
1163                 updateUsersList();
1164         }
1165
1166         var tab = document.getElementById(active_tab + "Tab");
1167
1168         if (tab) {
1169                 if (tab.className.match("Selected")) {
1170                         tab.className = "prefsTab";
1171                 }
1172         }
1173
1174         tab = document.getElementById(id + "Tab");
1175
1176         if (tab) {
1177                 if (!tab.className.match("Selected")) {
1178                         tab.className = tab.className + "Selected";
1179                 }
1180         }
1181
1182         active_tab = id;
1183
1184 }
1185
1186 function init() {
1187
1188         try {
1189         
1190                 // IE kludge
1191                 if (!xmlhttp) {
1192                         document.getElementById("prefContent").innerHTML = 
1193                                 "<b>Fatal error:</b> This program needs XmlHttpRequest " + 
1194                                 "to function properly. Your browser doesn't seem to support it.";
1195                         return;
1196                 }
1197         
1198                 selectTab("genConfig");
1199         
1200                 document.onkeydown = hotkey_handler;
1201                 notify("");
1202         } catch (e) {
1203                 exception_error("init", e);
1204         }
1205 }
1206
1207 function closeInfoBox() {
1208         var box = document.getElementById('infoBox');
1209         var shadow = document.getElementById('infoBoxShadow');
1210
1211         if (shadow) {
1212                 shadow.style.display = "none";
1213         } else if (box) {
1214                 box.style.display = "none";
1215         }
1216 }
1217
1218 function categorizeSelectedFeeds() {
1219
1220         if (!xmlhttp_ready(xmlhttp)) {
1221                 printLockingError();
1222                 return
1223         }
1224
1225         var sel_rows = getSelectedFeeds();
1226
1227         var cat_sel = document.getElementById("sfeed_set_fcat");
1228         var cat_id = cat_sel[cat_sel.selectedIndex].id;
1229
1230         if (sel_rows.length > 0) {
1231
1232                 notify("Changing category of selected feeds...");
1233
1234                 xmlhttp.open("GET", "backend.php?op=pref-feeds&subop=categorize&ids="+
1235                         param_escape(sel_rows.toString()) + "&cat_id=" + param_escape(cat_id), true);
1236                 xmlhttp.onreadystatechange=feedlist_callback;
1237                 xmlhttp.send(null);
1238
1239         } else {
1240
1241                 notify("Please select some feeds first.");
1242
1243         }
1244
1245 }