]> git.wh0rd.org - tt-rss.git/blame_incremental - prefs.js
filter editor: focus match inputbox on show
[tt-rss.git] / prefs.js
... / ...
CommitLineData
1var active_feed_cat = false;
2var active_tab = false;
3
4var init_params = new Array();
5
6var caller_subop = false;
7var hotkey_prefix = false;
8var hotkey_prefix_pressed = false;
9
10var color_picker_active = false;
11var selection_disabled = false;
12var mouse_is_down = false;
13
14var db = false;
15var store = false;
16
17function feedlist_callback2(transport) {
18
19 try {
20
21 var container = $('prefContent');
22 container.innerHTML=transport.responseText;
23 selectTab("feedConfig", true);
24
25 if (caller_subop) {
26 var tuple = caller_subop.split(":");
27 if (tuple[0] == 'editFeed') {
28 window.setTimeout('editFeed('+tuple[1]+')', 100);
29 }
30
31 caller_subop = false;
32 }
33 if (typeof correctPNG != 'undefined') {
34 correctPNG();
35 }
36 notify("");
37 remove_splash();
38
39 } catch (e) {
40 exception_error("feedlist_callback2", e);
41 }
42}
43
44function filterlist_callback2(transport) {
45 var container = $('prefContent');
46 container.innerHTML=transport.responseText;
47 if (typeof correctPNG != 'undefined') {
48 correctPNG();
49 }
50 notify("");
51 remove_splash();
52}
53
54function init_label_inline_editor() {
55 try {
56 if ($("prefLabelList")) {
57 var elems = $("prefLabelList").getElementsByTagName("SPAN");
58
59 for (var i = 0; i < elems.length; i++) {
60 if (elems[i].id && elems[i].id.match("LILT-")) {
61
62 var id = elems[i].id.replace("LILT-", "");
63
64 new Ajax.InPlaceEditor(elems[i],
65 'backend.php?op=pref-labels&subop=save&id=' + id,
66 {cols: 20, rows: 1});
67
68 }
69 }
70 }
71
72 } catch (e) {
73 exception_error("init_label_inline_editor", e);
74 }
75}
76
77function labellist_callback2(transport) {
78
79 try {
80
81 var container = $('prefContent');
82 closeInfoBox();
83 container.innerHTML=transport.responseText;
84
85 init_label_inline_editor();
86
87 if (typeof correctPNG != 'undefined') {
88 correctPNG();
89 }
90 notify("");
91 remove_splash();
92
93 } catch (e) {
94 exception_error("labellist_callback2", e);
95 }
96}
97
98function userlist_callback2(transport) {
99 try {
100 var container = $('prefContent');
101 if (transport.readyState == 4) {
102 container.innerHTML=transport.responseText;
103 notify("");
104 remove_splash();
105 }
106 } catch (e) {
107 exception_error("userlist_callback2", e);
108 }
109}
110
111function prefslist_callback2(transport) {
112 try {
113 var container = $('prefContent');
114 container.innerHTML=transport.responseText;
115 notify("");
116 remove_splash();
117 } catch (e) {
118 exception_error("prefslist_callback2", e);
119 }
120}
121
122function notify_callback2(transport) {
123 notify_info(transport.responseText);
124}
125
126function init_profile_inline_editor() {
127 try {
128
129 if ($("prefFeedCatList")) {
130 var elems = $("prefFeedCatList").getElementsByTagName("SPAN");
131
132 for (var i = 0; i < elems.length; i++) {
133 if (elems[i].id && elems[i].id.match("FCATT-")) {
134 var id = elems[i].id.replace("FCATT-", "");
135 new Ajax.InPlaceEditor(elems[i],
136 'backend.php?op=rpc&subop=saveprofile&id=' + id);
137 }
138 }
139 }
140
141 } catch (e) {
142 exception_error("init_profile_inline_editor", e);
143 }
144}
145
146function init_cat_inline_editor() {
147 try {
148
149 if ($("prefFeedCatList")) {
150 var elems = $("prefFeedCatList").getElementsByTagName("SPAN");
151
152 for (var i = 0; i < elems.length; i++) {
153 if (elems[i].id && elems[i].id.match("FCATT-")) {
154 var cat_id = elems[i].id.replace("FCATT-", "");
155 new Ajax.InPlaceEditor(elems[i],
156 'backend.php?op=pref-feeds&subop=editCats&action=save&cid=' + cat_id);
157 }
158 }
159 }
160
161 } catch (e) {
162 exception_error("init_cat_inline_editor", e);
163 }
164}
165
166function infobox_feed_cat_callback2(transport) {
167 try {
168 infobox_callback2(transport);
169 init_cat_inline_editor();
170 $('fadd_cat').focus();
171 } catch (e) {
172 exception_error("infobox_feed_cat_callback2", e);
173 }
174}
175
176function updateFeedList(sort_key) {
177
178 try {
179
180 var feed_search = $("feed_search");
181 var search = "";
182 if (feed_search) { search = feed_search.value; }
183
184 var slat = $("show_last_article_times");
185
186 var slat_checked = false;
187 if (slat) {
188 slat_checked = slat.checked;
189 }
190
191 var query = "?op=pref-feeds" +
192 "&sort=" + param_escape(sort_key) +
193 "&slat=" + param_escape(slat_checked) +
194 "&search=" + param_escape(search);
195
196 new Ajax.Request("backend.php", {
197 parameters: query,
198 onComplete: function(transport) {
199 feedlist_callback2(transport);
200 } });
201 } catch (e) {
202 exception_error("updateFeedList", e);
203 }
204}
205
206function updateUsersList(sort_key) {
207
208 try {
209
210 var user_search = $("user_search");
211 var search = "";
212 if (user_search) { search = user_search.value; }
213
214 var query = "?op=pref-users&sort="
215 + param_escape(sort_key) +
216 "&search=" + param_escape(search);
217
218 new Ajax.Request("backend.php", {
219 parameters: query,
220 onComplete: function(transport) {
221 userlist_callback2(transport);
222 } });
223
224 } catch (e) {
225 exception_error("updateUsersList", e);
226 }
227}
228
229function addFeed() {
230
231 try {
232
233 var link = $("fadd_link");
234
235 if (link.value.length == 0) {
236 alert(__("Error: No feed URL given."));
237 } else if (!isValidURL(link.value)) {
238 alert(__("Error: Invalid feed URL."));
239 } else {
240 notify_progress("Adding feed...");
241
242 var query = "?op=pref-feeds&subop=add&from=tt-rss&feed_url=" +
243 param_escape(link.value);
244
245 new Ajax.Request("backend.php", {
246 parameters: query,
247 onComplete: function(transport) {
248 feedlist_callback2(transport);
249 } });
250
251 link.value = "";
252
253 }
254
255 } catch (e) {
256 exception_error("addFeed", e);
257 }
258
259}
260
261function addPrefProfile() {
262
263 var profile = $("fadd_profile");
264
265 if (profile.value.length == 0) {
266 alert(__("Can't add profile: no name specified."));
267 } else {
268 notify_progress("Adding profile...");
269
270 var query = "?op=rpc&subop=addprofile&title=" +
271 param_escape(profile.value);
272
273 new Ajax.Request("backend.php", {
274 parameters: query,
275 onComplete: function(transport) {
276 editProfiles();
277 } });
278
279 }
280}
281
282
283function addFeedCat() {
284
285 var cat = $("fadd_cat");
286
287 if (cat.value.length == 0) {
288 alert(__("Can't add category: no name specified."));
289 } else {
290 notify_progress("Adding feed category...");
291
292 var query = "?op=pref-feeds&subop=editCats&action=add&cat=" +
293 param_escape(cat.value);
294
295 new Ajax.Request("backend.php", {
296 parameters: query,
297 onComplete: function(transport) {
298 infobox_feed_cat_callback2(transport);
299 } });
300
301 link.value = "";
302
303 }
304}
305
306function addUser() {
307
308 try {
309
310 var login = prompt(__("Please enter login:"), "");
311
312 if (login == null) {
313 return false;
314 }
315
316 if (login == "") {
317 alert(__("Can't create user: no login specified."));
318 return false;
319 }
320
321 notify_progress("Adding user...");
322
323 var query = "?op=pref-users&subop=add&login=" +
324 param_escape(login);
325
326 new Ajax.Request("backend.php", {
327 parameters: query,
328 onComplete: function(transport) {
329 userlist_callback2(transport);
330 } });
331
332 } catch (e) {
333 exception_error("addUser", e);
334 }
335}
336
337function editUser(id) {
338
339 try {
340
341 disableHotkeys();
342
343 notify_progress("Loading, please wait...");
344
345 selectTableRowsByIdPrefix('prefUserList', 'UMRR-', 'UMCHK-', false);
346 selectTableRowById('UMRR-'+id, 'UMCHK-'+id, true);
347
348 var query = "?op=pref-users&subop=edit&id=" +
349 param_escape(id);
350
351 new Ajax.Request("backend.php", {
352 parameters: query,
353 onComplete: function(transport) {
354 infobox_callback2(transport);
355 } });
356
357 } catch (e) {
358 exception_error("editUser", e);
359 }
360
361}
362
363function editFilter(id) {
364
365 try {
366
367 disableHotkeys();
368
369 notify_progress("Loading, please wait...");
370
371 selectTableRowsByIdPrefix('prefFilterList', 'FILRR-', 'FICHK-', false);
372 selectTableRowById('FILRR-'+id, 'FICHK-'+id, true);
373
374 var query = "?op=pref-filters&subop=edit&id=" +
375 param_escape(id);
376
377 new Ajax.Request("backend.php", {
378 parameters: query,
379 onComplete: function(transport) {
380 infobox_callback2(transport);
381 document.forms['filter_edit_form'].reg_exp.focus();
382 } });
383 } catch (e) {
384 exception_error("editFilter", e);
385 }
386}
387
388function editFeed(feed) {
389
390 try {
391
392 disableHotkeys();
393
394 notify_progress("Loading, please wait...");
395
396 // clean selection from all rows & select row being edited
397 selectTableRowsByIdPrefix('prefFeedList', 'FEEDR-', 'FRCHK-', false);
398 selectTableRowById('FEEDR-'+feed, 'FRCHK-'+feed, true);
399
400 var query = "?op=pref-feeds&subop=editfeed&id=" +
401 param_escape(feed);
402
403 new Ajax.Request("backend.php", {
404 parameters: query,
405 onComplete: function(transport) {
406 infobox_callback2(transport);
407 document.forms["edit_feed_form"].title.focus();
408 } });
409
410 } catch (e) {
411 exception_error("editFeed", e);
412 }
413}
414
415function getSelectedLabels() {
416 return getSelectedTableRowIds("prefLabelList", "LILRR");
417}
418
419function getSelectedUsers() {
420 return getSelectedTableRowIds("prefUserList", "UMRR");
421}
422
423function getSelectedFeeds() {
424 return getSelectedTableRowIds("prefFeedList", "FEEDR");
425}
426
427function getSelectedFilters() {
428 return getSelectedTableRowIds("prefFilterList", "FILRR");
429}
430
431function getSelectedFeedCats() {
432 return getSelectedTableRowIds("prefFeedCatList", "FCATR");
433}
434
435
436function removeSelectedLabels() {
437
438 var sel_rows = getSelectedLabels();
439
440 if (sel_rows.length > 0) {
441
442 var ok = confirm(__("Remove selected labels?"));
443
444 if (ok) {
445 notify_progress("Removing selected labels...");
446
447 var query = "?op=pref-labels&subop=remove&ids="+
448 param_escape(sel_rows.toString());
449
450 new Ajax.Request("backend.php", {
451 parameters: query,
452 onComplete: function(transport) {
453 labellist_callback2(transport);
454 } });
455
456 }
457 } else {
458 alert(__("No labels are selected."));
459 }
460
461 return false;
462}
463
464function removeSelectedUsers() {
465
466 try {
467
468 var sel_rows = getSelectedUsers();
469
470 if (sel_rows.length > 0) {
471
472 var ok = confirm(__("Remove selected users? Neither default admin nor your account will be removed."));
473
474 if (ok) {
475 notify_progress("Removing selected users...");
476
477 var query = "?op=pref-users&subop=remove&ids="+
478 param_escape(sel_rows.toString());
479
480 new Ajax.Request("backend.php", {
481 parameters: query,
482 onComplete: function(transport) {
483 userlist_callback2(transport);
484 } });
485
486 }
487
488 } else {
489 alert(__("No users are selected."));
490 }
491
492 } catch (e) {
493 exception_error("removeSelectedUsers", e);
494 }
495
496 return false;
497}
498
499function removeSelectedFilters() {
500
501 try {
502
503 var sel_rows = getSelectedFilters();
504
505 if (sel_rows.length > 0) {
506
507 var ok = confirm(__("Remove selected filters?"));
508
509 if (ok) {
510 notify_progress("Removing selected filters...");
511
512 var query = "?op=pref-filters&subop=remove&ids="+
513 param_escape(sel_rows.toString());
514
515 new Ajax.Request("backend.php", {
516 parameters: query,
517 onComplete: function(transport) {
518 filterlist_callback2(transport);
519 } });
520
521 }
522 } else {
523 alert(__("No filters are selected."));
524 }
525
526 } catch (e) {
527 exception_error("removeSelectedFilters", e);
528 }
529
530 return false;
531}
532
533
534function removeSelectedFeeds() {
535
536 try {
537
538 var sel_rows = getSelectedFeeds();
539
540 if (sel_rows.length > 0) {
541
542 var ok = confirm(__("Unsubscribe from selected feeds?"));
543
544 if (ok) {
545
546 notify_progress("Unsubscribing from selected feeds...", true);
547
548 var query = "?op=pref-feeds&subop=remove&ids="+
549 param_escape(sel_rows.toString());
550
551 console.log(query);
552
553 new Ajax.Request("backend.php", {
554 parameters: query,
555 onComplete: function(transport) {
556 updateFeedList();
557 } });
558 }
559
560 } else {
561 alert(__("No feeds are selected."));
562 }
563
564 } catch (e) {
565 exception_error("removeSelectedFeeds", e);
566 }
567
568 return false;
569}
570
571function clearSelectedFeeds() {
572
573 var sel_rows = getSelectedFeeds();
574
575 if (sel_rows.length > 1) {
576 alert(__("Please select only one feed."));
577 return;
578 }
579
580 if (sel_rows.length > 0) {
581
582 var ok = confirm(__("Erase all non-starred articles in selected feed?"));
583
584 if (ok) {
585 notify_progress("Clearing selected feed...");
586 clearFeedArticles(sel_rows[0]);
587 }
588
589 } else {
590
591 alert(__("No feeds are selected."));
592
593 }
594
595 return false;
596}
597
598function purgeSelectedFeeds() {
599
600 var sel_rows = getSelectedFeeds();
601
602 if (sel_rows.length > 0) {
603
604 var pr = prompt(__("How many days of articles to keep (0 - use default)?"), "0");
605
606 if (pr != undefined) {
607 notify_progress("Purging selected feed...");
608
609 var query = "?op=rpc&subop=purge&ids="+
610 param_escape(sel_rows.toString()) + "&days=" + pr;
611
612 console.log(query);
613
614 new Ajax.Request("prefs.php", {
615 parameters: query,
616 onComplete: function(transport) {
617 notify('');
618 } });
619 }
620
621 } else {
622
623 alert(__("No feeds are selected."));
624
625 }
626
627 return false;
628}
629
630function removeSelectedPrefProfiles() {
631
632 var sel_rows = getSelectedFeedCats();
633
634 if (sel_rows.length > 0) {
635
636 var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
637
638 if (ok) {
639 notify_progress("Removing selected profiles...");
640
641 var query = "?op=rpc&subop=remprofiles&ids="+
642 param_escape(sel_rows.toString());
643
644 new Ajax.Request("backend.php", {
645 parameters: query,
646 onComplete: function(transport) {
647 editProfiles();
648 } });
649 }
650
651 } else {
652 alert(__("No profiles selected."));
653 }
654
655 return false;
656}
657
658function removeSelectedFeedCats() {
659
660 var sel_rows = getSelectedFeedCats();
661
662 if (sel_rows.length > 0) {
663
664 var ok = confirm(__("Remove selected categories?"));
665
666 if (ok) {
667 notify_progress("Removing selected categories...");
668
669 var query = "?op=pref-feeds&subop=editCats&action=remove&ids="+
670 param_escape(sel_rows.toString());
671
672 new Ajax.Request("backend.php", {
673 parameters: query,
674 onComplete: function(transport) {
675 infobox_feed_cat_callback2(transport);
676 } });
677
678 }
679
680 } else {
681
682 alert(__("No categories are selected."));
683
684 }
685
686 return false;
687}
688
689function feedEditCancel() {
690
691 closeInfoBox();
692
693 selectPrefRows('feed', false); // cleanup feed selection
694
695 return false;
696}
697
698function feedEditSave() {
699
700 try {
701
702 // FIXME: add parameter validation
703
704 var query = Form.serialize("edit_feed_form");
705
706 notify_progress("Saving feed...");
707
708 new Ajax.Request("backend.php", {
709 parameters: query,
710 onComplete: function(transport) {
711 feedlist_callback2(transport);
712 } });
713
714 closeInfoBox();
715
716 return false;
717
718 } catch (e) {
719 exception_error("feedEditSave", e);
720 }
721}
722
723function userEditCancel() {
724
725 selectPrefRows('user', false); // cleanup feed selection
726 closeInfoBox();
727
728 return false;
729}
730
731function filterEditCancel() {
732
733 try {
734 selectPrefRows('filter', false); // cleanup feed selection
735 } catch (e) { }
736
737 closeInfoBox();
738
739 return false;
740}
741
742function userEditSave() {
743
744 try {
745
746 var login = document.forms["user_edit_form"].login.value;
747
748 if (login.length == 0) {
749 alert(__("Login field cannot be blank."));
750 return;
751 }
752
753 notify_progress("Saving user...");
754
755 closeInfoBox();
756
757 var query = Form.serialize("user_edit_form");
758
759 new Ajax.Request("backend.php", {
760 parameters: query,
761 onComplete: function(transport) {
762 userlist_callback2(transport);
763 } });
764
765 } catch (e) {
766 exception_error("userEditSave", e);
767 }
768
769 return false;
770
771}
772
773
774function filterEditSave() {
775
776 try {
777
778 notify_progress("Saving filter...");
779
780 var query = "?" + Form.serialize("filter_edit_form");
781
782 closeInfoBox();
783
784 new Ajax.Request("backend.php", {
785 parameters: query,
786 onComplete: function(transport) {
787 filterlist_callback2(transport);
788 } });
789
790 } catch (e) {
791 exception_error("filterEditSave", e);
792 }
793
794 return false;
795}
796
797
798function editSelectedUser() {
799 var rows = getSelectedUsers();
800
801 if (rows.length == 0) {
802 alert(__("No users are selected."));
803 return;
804 }
805
806 if (rows.length > 1) {
807 alert(__("Please select only one user."));
808 return;
809 }
810
811 notify("");
812
813 editUser(rows[0]);
814}
815
816function resetSelectedUserPass() {
817
818 try {
819
820 var rows = getSelectedUsers();
821
822 if (rows.length == 0) {
823 alert(__("No users are selected."));
824 return;
825 }
826
827 if (rows.length > 1) {
828 alert(__("Please select only one user."));
829 return;
830 }
831
832 var ok = confirm(__("Reset password of selected user?"));
833
834 if (ok) {
835 notify_progress("Resetting password for selected user...");
836
837 var id = rows[0];
838
839 var query = "?op=pref-users&subop=resetPass&id=" +
840 param_escape(id);
841
842 new Ajax.Request("backend.php", {
843 parameters: query,
844 onComplete: function(transport) {
845 userlist_callback2(transport);
846 } });
847
848 }
849
850 } catch (e) {
851 exception_error("resetSelectedUserPass", e);
852 }
853}
854
855function selectedUserDetails() {
856
857 try {
858
859 var rows = getSelectedUsers();
860
861 if (rows.length == 0) {
862 alert(__("No users are selected."));
863 return;
864 }
865
866 if (rows.length > 1) {
867 alert(__("Please select only one user."));
868 return;
869 }
870
871 notify_progress("Loading, please wait...");
872
873 var id = rows[0];
874
875 var query = "?op=pref-users&subop=user-details&id=" + id;
876
877 new Ajax.Request("backend.php", {
878 parameters: query,
879 onComplete: function(transport) {
880 infobox_callback2(transport);
881 } });
882 } catch (e) {
883 exception_error("selectedUserDetails", e);
884 }
885}
886
887
888function editSelectedFilter() {
889 var rows = getSelectedFilters();
890
891 if (rows.length == 0) {
892 alert(__("No filters are selected."));
893 return;
894 }
895
896 if (rows.length > 1) {
897 alert(__("Please select only one filter."));
898 return;
899 }
900
901 notify("");
902
903 editFilter(rows[0]);
904
905}
906
907
908function editSelectedFeed() {
909 var rows = getSelectedFeeds();
910
911 if (rows.length == 0) {
912 alert(__("No feeds are selected."));
913 return;
914 }
915
916 if (rows.length > 1) {
917 return editSelectedFeeds();
918 }
919
920 notify("");
921
922 editFeed(rows[0]);
923
924}
925
926function editSelectedFeeds() {
927
928 try {
929 var rows = getSelectedFeeds();
930
931 if (rows.length == 0) {
932 alert(__("No feeds are selected."));
933 return;
934 }
935
936 notify("");
937
938 disableHotkeys();
939
940 notify_progress("Loading, please wait...");
941
942 var query = "?op=pref-feeds&subop=editfeeds&ids=" +
943 param_escape(rows.toString());
944
945 new Ajax.Request("backend.php", {
946 parameters: query,
947 onComplete: function(transport) {
948 infobox_callback2(transport);
949 } });
950
951 } catch (e) {
952 exception_error("editSelectedFeeds", e);
953 }
954}
955
956function piggie(enable) {
957 if (enable) {
958 console.log("I LOVEDED IT!");
959 var piggie = $("piggie");
960
961 Element.show(piggie);
962 Position.Center(piggie);
963 Effect.Puff(piggie);
964
965 }
966}
967
968function opmlImport() {
969
970 var opml_file = $("opml_file");
971
972 if (opml_file.value.length == 0) {
973 alert(__("No OPML file to upload."));
974 return false;
975 } else {
976 notify_progress("Importing, please wait...", true);
977 return true;
978 }
979}
980
981function updateFilterList(sort_key) {
982 try {
983
984 var filter_search = $("filter_search");
985 var search = "";
986 if (filter_search) { search = filter_search.value; }
987
988 var query = "?op=pref-filters&sort=" +
989 param_escape(sort_key) +
990 "&search=" + param_escape(search);
991
992 new Ajax.Request("backend.php", {
993 parameters: query,
994 onComplete: function(transport) {
995 filterlist_callback2(transport);
996 } });
997
998 } catch (e) {
999 exception_error("updateFilterList", e);
1000 }
1001
1002}
1003
1004function updateLabelList(sort_key) {
1005
1006 try {
1007
1008 var label_search = $("label_search");
1009 var search = "";
1010 if (label_search) { search = label_search.value; }
1011
1012 var query = "?op=pref-labels&sort=" +
1013 param_escape(sort_key) +
1014 "&search=" + param_escape(search);
1015
1016 new Ajax.Request("backend.php", {
1017 parameters: query,
1018 onComplete: function(transport) {
1019 labellist_callback2(transport);
1020 } });
1021
1022 } catch (e) {
1023 exception_error("updateLabelList", e);
1024 }
1025}
1026
1027function updatePrefsList() {
1028
1029 var query = "?op=pref-prefs";
1030
1031 new Ajax.Request("backend.php", {
1032 parameters: query,
1033 onComplete: function(transport) {
1034 prefslist_callback2(transport);
1035 } });
1036
1037}
1038
1039function selectTab(id, noupdate, subop) {
1040
1041// alert(id);
1042
1043 if (!id) id = active_tab;
1044
1045 try {
1046
1047 try {
1048 if (id != active_tab) {
1049 var c = $('prefContent');
1050 c.scrollTop = 0;
1051 }
1052 } catch (e) { };
1053
1054 if (!noupdate) {
1055
1056 console.log("selectTab: " + id + "(NU: " + noupdate + ")");
1057
1058 notify_progress("Loading, please wait...");
1059
1060 // close active infobox if needed
1061 closeInfoBox();
1062
1063 // clean up all current selections, just in case
1064 active_feed_cat = false;
1065
1066// Effect.Fade("prefContent", {duration: 1, to: 0.01,
1067// queue: { position:'end', scope: 'FEED_TAB', limit: 1 } } );
1068
1069 if (id == "feedConfig") {
1070 updateFeedList();
1071 } else if (id == "filterConfig") {
1072 updateFilterList();
1073 } else if (id == "labelConfig") {
1074 updateLabelList();
1075 } else if (id == "genConfig") {
1076 updatePrefsList();
1077 } else if (id == "userConfig") {
1078 updateUsersList();
1079 }
1080 }
1081
1082 /* clean selection from all tabs */
1083
1084 var tabs_holder = $("prefTabs");
1085 var tab = tabs_holder.firstChild;
1086
1087 while (tab) {
1088 if (tab.className && tab.className.match("prefsTabSelected")) {
1089 tab.className = "prefsTab";
1090 }
1091 tab = tab.nextSibling;
1092 }
1093
1094 /* mark new tab as selected */
1095
1096 tab = $(id + "Tab");
1097
1098 if (tab) {
1099 if (!tab.className.match("Selected")) {
1100 tab.className = tab.className + "Selected";
1101 }
1102 }
1103
1104 active_tab = id;
1105
1106 } catch (e) {
1107 exception_error("selectTab", e);
1108 }
1109}
1110
1111function init_second_stage() {
1112
1113 try {
1114 active_tab = getInitParam("prefs_active_tab");
1115 if (!$(active_tab+"Tab")) active_tab = "genConfig";
1116 if (!active_tab || active_tab == '0') active_tab = "genConfig";
1117
1118 document.onkeydown = pref_hotkey_handler;
1119 document.onmousedown = mouse_down_handler;
1120 document.onmouseup = mouse_up_handler;
1121
1122 var tab = getURLParam('tab');
1123
1124 caller_subop = getURLParam('subop');
1125
1126 if (getURLParam("subopparam")) {
1127 caller_subop = caller_subop + ":" + getURLParam("subopparam");
1128 }
1129
1130 if (tab) {
1131 active_tab = tab;
1132 }
1133
1134 if (navigator.userAgent.match("Opera")) {
1135 setTimeout("selectTab()", 500);
1136 } else {
1137 selectTab(active_tab);
1138 }
1139 notify("");
1140
1141 loading_set_progress(60);
1142
1143 setTimeout("hotkey_prefix_timeout()", 5*1000);
1144
1145 } catch (e) {
1146 exception_error("init_second_stage", e);
1147 }
1148}
1149
1150function init() {
1151
1152 try {
1153
1154 loading_set_progress(30);
1155
1156 var query = "?op=rpc&subop=sanityCheck";
1157
1158 new Ajax.Request("backend.php", {
1159 parameters: query,
1160 onComplete: function(transport) {
1161 backend_sanity_check_callback(transport);
1162 } });
1163
1164 } catch (e) {
1165 exception_error("init", e);
1166 }
1167}
1168
1169function validatePrefsReset() {
1170 try {
1171 var ok = confirm(__("Reset to defaults?"));
1172
1173 if (ok) {
1174
1175 var query = Form.serialize("pref_prefs_form");
1176 query = query + "&subop=reset-config";
1177 console.log(query);
1178
1179 new Ajax.Request("backend.php", {
1180 parameters: query,
1181 onComplete: function(transport) {
1182 var msg = transport.responseText;
1183 if (msg.match("PREFS_THEME_CHANGED")) {
1184 window.location.reload();
1185 } else {
1186 notify_info(msg);
1187 selectTab();
1188 }
1189 } });
1190
1191 }
1192
1193 } catch (e) {
1194 exception_error("validatePrefsReset", e);
1195 }
1196
1197 return false;
1198
1199}
1200
1201function selectPrefRows(kind, select) {
1202
1203 if (kind) {
1204 var opbarid = false;
1205 var nchk = false;
1206 var nrow = false;
1207 var lname = false;
1208
1209 if (kind == "feed") {
1210 opbarid = "feedOpToolbar";
1211 nrow = "FEEDR-";
1212 nchk = "FRCHK-";
1213 lname = "prefFeedList";
1214 } else if (kind == "fcat") {
1215 opbarid = "catOpToolbar";
1216 nrow = "FCATR-";
1217 nchk = "FCCHK-";
1218 lname = "prefFeedCatList";
1219 } else if (kind == "filter") {
1220 opbarid = "filterOpToolbar";
1221 nrow = "FILRR-";
1222 nchk = "FICHK-";
1223 lname = "prefFilterList";
1224 } else if (kind == "label") {
1225 opbarid = "labelOpToolbar";
1226 nrow = "LILRR-";
1227 nchk = "LICHK-";
1228 lname = "prefLabelList";
1229 } else if (kind == "user") {
1230 opbarid = "userOpToolbar";
1231 nrow = "UMRR-";
1232 nchk = "UMCHK-";
1233 lname = "prefUserList";
1234 } else if (kind == "fbrowse") {
1235 opbarid = "browseOpToolbar";
1236 nrow = "FBROW-";
1237 nchk = "FBCHK-";
1238 lname = "browseFeedList";
1239 }
1240
1241 if (opbarid) {
1242 selectTableRowsByIdPrefix(lname, nrow, nchk, select);
1243 }
1244
1245 }
1246}
1247
1248
1249function toggleSelectPrefRow(sender, kind) {
1250
1251 toggleSelectRow(sender);
1252
1253 if (kind) {
1254 var opbarid = false;
1255 var nsel = -1;
1256
1257 if (kind == "feed") {
1258 opbarid = "feedOpToolbar";
1259 nsel = getSelectedFeeds();
1260 } else if (kind == "fcat") {
1261 opbarid = "catOpToolbar";
1262 nsel = getSelectedFeedCats();
1263 } else if (kind == "filter") {
1264 opbarid = "filterOpToolbar";
1265 nsel = getSelectedFilters();
1266 } else if (kind == "label") {
1267 opbarid = "labelOpToolbar";
1268 nsel = getSelectedLabels();
1269 } else if (kind == "user") {
1270 opbarid = "userOpToolbar";
1271 nsel = getSelectedUsers();
1272 }
1273
1274 }
1275}
1276
1277function toggleSelectFBListRow(sender) {
1278 toggleSelectListRow(sender);
1279}
1280
1281var seq = "";
1282
1283function pref_hotkey_handler(e) {
1284 try {
1285
1286 var keycode;
1287 var shift_key = false;
1288
1289 var cmdline = $('cmdline');
1290
1291 try {
1292 shift_key = e.shiftKey;
1293 } catch (e) {
1294
1295 }
1296
1297 if (window.event) {
1298 keycode = window.event.keyCode;
1299 } else if (e) {
1300 keycode = e.which;
1301 }
1302
1303 var keychar = String.fromCharCode(keycode);
1304
1305 if (keycode == 27) { // escape
1306 if (Element.visible("hotkey_help_overlay")) {
1307 Element.hide("hotkey_help_overlay");
1308 }
1309 colorPickerHideAll();
1310 hotkey_prefix = false;
1311 closeInfoBox();
1312 }
1313
1314 if (!hotkeys_enabled) {
1315 console.log("hotkeys disabled");
1316 return;
1317 }
1318
1319 if (keycode == 16) return; // ignore lone shift
1320
1321 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1322 hotkey_prefix = keycode;
1323
1324 var date = new Date();
1325 var ts = Math.round(date.getTime() / 1000);
1326
1327 hotkey_prefix_pressed = ts;
1328
1329 cmdline.innerHTML = keychar;
1330 Element.show(cmdline);
1331
1332 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar);
1333 return;
1334 }
1335
1336 if (Element.visible("hotkey_help_overlay")) {
1337 Element.hide("hotkey_help_overlay");
1338 }
1339
1340 if (keycode == 13 || keycode == 27) {
1341 seq = "";
1342 } else {
1343 seq = seq + "" + keycode;
1344 }
1345
1346 /* Global hotkeys */
1347
1348 Element.hide(cmdline);
1349
1350 if (!hotkey_prefix) {
1351
1352 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
1353 if (!Element.visible("hotkey_help_overlay")) {
1354 //Element.show("hotkey_help_overlay");
1355 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
1356 } else {
1357 Element.hide("hotkey_help_overlay");
1358 }
1359 return false;
1360 }
1361
1362 if (keycode == 191 || keychar == '/') { // /
1363 var search_boxes = new Array("label_search",
1364 "feed_search", "filter_search", "user_search", "feed_browser_search");
1365
1366 for (var i = 0; i < search_boxes.length; i++) {
1367 var elem = $(search_boxes[i]);
1368 if (elem) {
1369 $(search_boxes[i]).focus();
1370 return false;
1371 }
1372 }
1373 }
1374 }
1375
1376 /* Prefix c */
1377
1378 if (hotkey_prefix == 67) { // c
1379 hotkey_prefix = false;
1380
1381 if (keycode == 70) { // f
1382 quickAddFilter();
1383 return false;
1384 }
1385
1386 if (keycode == 83) { // s
1387 quickAddFeed();
1388 return false;
1389 }
1390
1391 if (keycode == 85) { // u
1392 // no-op
1393 }
1394
1395 if (keycode == 67) { // c
1396 editFeedCats();
1397 return false;
1398 }
1399
1400 if (keycode == 84 && shift_key) { // T
1401 displayDlg('feedBrowser');
1402 return false;
1403 }
1404
1405 }
1406
1407 /* Prefix g */
1408
1409 if (hotkey_prefix == 71) { // g
1410
1411 hotkey_prefix = false;
1412
1413 if (keycode == 49 && $("genConfigTab")) { // 1
1414 selectTab("genConfig");
1415 return false;
1416 }
1417
1418 if (keycode == 50 && $("feedConfigTab")) { // 2
1419 selectTab("feedConfig");
1420 return false;
1421 }
1422
1423 if (keycode == 51 && $("filterConfigTab")) { // 4
1424 selectTab("filterConfig");
1425 return false;
1426 }
1427
1428 if (keycode == 52 && $("labelConfigTab")) { // 5
1429 selectTab("labelConfig");
1430 return false;
1431 }
1432
1433 if (keycode == 53 && $("userConfigTab")) { // 6
1434 selectTab("userConfig");
1435 return false;
1436 }
1437
1438 if (keycode == 88) { // x
1439 return gotoMain();
1440 }
1441
1442 }
1443
1444 if ($("piggie")) {
1445 if (seq.match("8073717369")) {
1446 seq = "";
1447 piggie(true);
1448 } else {
1449 piggie(false);
1450 }
1451 }
1452
1453 if (hotkey_prefix) {
1454 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
1455 } else {
1456 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
1457 }
1458
1459 } catch (e) {
1460 exception_error("pref_hotkey_handler", e);
1461 }
1462}
1463
1464function editFeedCats() {
1465 try {
1466 var query = "?op=pref-feeds&subop=editCats";
1467
1468 notify_progress("Loading, please wait...");
1469
1470 new Ajax.Request("backend.php", {
1471 parameters: query,
1472 onComplete: function(transport) {
1473 infobox_feed_cat_callback2(transport);
1474 } });
1475 } catch (e) {
1476 exception_error("editFeedCats", e);
1477 }
1478}
1479
1480function showFeedsWithErrors() {
1481 displayDlg('feedUpdateErrors');
1482}
1483
1484function changeUserPassword() {
1485
1486 try {
1487
1488 var f = document.forms["change_pass_form"];
1489
1490 if (f) {
1491 if (f.OLD_PASSWORD.value == "") {
1492 new Effect.Highlight(f.OLD_PASSWORD);
1493 notify_error("Old password cannot be blank.");
1494 return false;
1495 }
1496
1497 if (f.NEW_PASSWORD.value == "") {
1498 new Effect.Highlight(f.NEW_PASSWORD);
1499 notify_error("New password cannot be blank.");
1500 return false;
1501 }
1502
1503 if (f.CONFIRM_PASSWORD.value == "") {
1504 new Effect.Highlight(f.CONFIRM_PASSWORD);
1505 notify_error("Entered passwords do not match.");
1506 return false;
1507 }
1508
1509 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1510 new Effect.Highlight(f.CONFIRM_PASSWORD);
1511 new Effect.Highlight(f.NEW_PASSWORD);
1512 notify_error("Entered passwords do not match.");
1513 return false;
1514 }
1515
1516 }
1517
1518 var query = Form.serialize("change_pass_form");
1519
1520 notify_progress("Changing password...");
1521
1522 new Ajax.Request("backend.php", {
1523 parameters: query,
1524 onComplete: function(transport) {
1525 if (transport.responseText.indexOf("ERROR: ") == 0) {
1526 notify_error(transport.responseText.replace("ERROR: ", ""));
1527 } else {
1528 notify_info(transport.responseText);
1529 var warn = $("default_pass_warning");
1530 if (warn) warn.style.display = "none";
1531 }
1532
1533 document.forms['change_pass_form'].reset();
1534 } });
1535
1536
1537 } catch (e) {
1538 exception_error("changeUserPassword", e);
1539 }
1540
1541 return false;
1542}
1543
1544function changeUserEmail() {
1545
1546 try {
1547
1548 var query = Form.serialize("change_email_form");
1549
1550 notify_progress("Trying to change e-mail...");
1551
1552 new Ajax.Request("backend.php", {
1553 parameters: query,
1554 onComplete: function(transport) {
1555 notify_callback2(transport);
1556 } });
1557
1558 } catch (e) {
1559 exception_error("changeUserPassword", e);
1560 }
1561
1562 return false;
1563
1564}
1565
1566function feedlistToggleSLAT() {
1567 notify_progress("Loading, please wait...");
1568 updateFeedList()
1569}
1570
1571function pubRegenKey() {
1572
1573 try {
1574 var ok = confirm(__("Replace current publishing address with a new one?"));
1575
1576 if (ok) {
1577
1578 notify_progress("Trying to change address...", true);
1579
1580 var query = "?op=rpc&subop=regenPubKey";
1581
1582 new Ajax.Request("backend.php", {
1583 parameters: query,
1584 onComplete: function(transport) {
1585 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1586
1587 var e = $('pub_feed_url');
1588
1589 if (new_link) {
1590 e.href = new_link.firstChild.nodeValue;
1591 e.innerHTML = new_link.firstChild.nodeValue;
1592
1593 new Effect.Highlight(e);
1594
1595 notify('');
1596
1597 } else {
1598 notify_error("Could not change feed URL.");
1599 }
1600 } });
1601 }
1602 } catch (e) {
1603 exception_error("pubRegenKey", e);
1604 }
1605 return false;
1606}
1607
1608function opmlRegenKey() {
1609
1610 try {
1611 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
1612
1613 if (ok) {
1614
1615 notify_progress("Trying to change address...", true);
1616
1617 var query = "?op=rpc&subop=regenOPMLKey";
1618
1619 new Ajax.Request("backend.php", {
1620 parameters: query,
1621 onComplete: function(transport) {
1622 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1623
1624 var e = $('pub_opml_url');
1625
1626 if (new_link) {
1627 e.href = new_link.firstChild.nodeValue;
1628 e.innerHTML = new_link.firstChild.nodeValue;
1629
1630 new Effect.Highlight(e);
1631
1632 notify('');
1633
1634 } else {
1635 notify_error("Could not change feed URL.");
1636 }
1637 } });
1638 }
1639 } catch (e) {
1640 exception_error("opmlRegenKey", e);
1641 }
1642 return false;
1643}
1644function validatePrefsSave() {
1645 try {
1646
1647 var ok = confirm(__("Save current configuration?"));
1648
1649 if (ok) {
1650
1651 var query = Form.serialize("pref_prefs_form");
1652 query = query + "&subop=save-config";
1653 console.log(query);
1654
1655 new Ajax.Request("backend.php", {
1656 parameters: query,
1657 onComplete: function(transport) {
1658 var msg = transport.responseText;
1659 if (msg.match("PREFS_THEME_CHANGED")) {
1660 window.location.reload();
1661 } else {
1662 notify_info(msg);
1663 }
1664 } });
1665
1666 }
1667
1668 } catch (e) {
1669 exception_error("validatePrefsSave", e);
1670 }
1671
1672 return false;
1673}
1674
1675function feedActionChange() {
1676 try {
1677 var chooser = $("feedActionChooser");
1678 var opid = chooser[chooser.selectedIndex].value;
1679
1680 chooser.selectedIndex = 0;
1681 feedActionGo(opid);
1682 } catch (e) {
1683 exception_error("feedActionChange", e);
1684 }
1685}
1686
1687function feedActionGo(op) {
1688 try {
1689 if (op == "facEdit") {
1690
1691 var rows = getSelectedFeeds();
1692
1693 if (rows.length > 1) {
1694 editSelectedFeeds();
1695 } else {
1696 editSelectedFeed();
1697 }
1698 }
1699
1700 if (op == "facClear") {
1701 clearSelectedFeeds();
1702 }
1703
1704 if (op == "facPurge") {
1705 purgeSelectedFeeds();
1706 }
1707
1708 if (op == "facEditCats") {
1709 editFeedCats();
1710 }
1711
1712 if (op == "facRescore") {
1713 rescoreSelectedFeeds();
1714 }
1715
1716 if (op == "facUnsubscribe") {
1717 removeSelectedFeeds();
1718 }
1719
1720 } catch (e) {
1721 exception_error("feedActionGo", e);
1722
1723 }
1724}
1725
1726function clearFeedArticles(feed_id) {
1727
1728 notify_progress("Clearing feed...");
1729
1730 var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
1731
1732 new Ajax.Request("backend.php", {
1733 parameters: query,
1734 onComplete: function(transport) {
1735 notify('');
1736 } });
1737
1738 return false;
1739}
1740
1741function rescoreSelectedFeeds() {
1742
1743 var sel_rows = getSelectedFeeds();
1744
1745 if (sel_rows.length > 0) {
1746
1747 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1748 var ok = confirm(__("Rescore articles in selected feeds?"));
1749
1750 if (ok) {
1751 notify_progress("Rescoring selected feeds...", true);
1752
1753 var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+
1754 param_escape(sel_rows.toString());
1755
1756 new Ajax.Request("backend.php", {
1757 parameters: query,
1758 onComplete: function(transport) {
1759 notify_callback2(transport);
1760 } });
1761
1762 }
1763 } else {
1764 alert(__("No feeds are selected."));
1765 }
1766
1767 return false;
1768}
1769
1770function rescore_all_feeds() {
1771 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
1772
1773 if (ok) {
1774 notify_progress("Rescoring feeds...", true);
1775
1776 var query = "?op=pref-feeds&subop=rescoreAll&quiet=1";
1777
1778 new Ajax.Request("backend.php", {
1779 parameters: query,
1780 onComplete: function(transport) {
1781 notify_callback2(transport);
1782 } });
1783 }
1784}
1785
1786function removeFilter(id, title) {
1787
1788 try {
1789
1790 var msg = __("Remove filter %s?").replace("%s", title);
1791
1792 var ok = confirm(msg);
1793
1794 if (ok) {
1795 closeInfoBox();
1796
1797 notify_progress("Removing filter...");
1798
1799 var query = "?op=pref-filters&subop=remove&ids="+
1800 param_escape(id);
1801
1802 new Ajax.Request("backend.php", {
1803 parameters: query,
1804 onComplete: function(transport) {
1805 filterlist_callback2(transport);
1806 } });
1807
1808 }
1809
1810 } catch (e) {
1811 exception_error("removeFilter", e);
1812 }
1813
1814 return false;
1815}
1816
1817/*function unsubscribeFeed(id, title) {
1818
1819 try {
1820
1821 var msg = __("Unsubscribe from %s?").replace("%s", title);
1822
1823 var ok = confirm(msg);
1824
1825 if (ok) {
1826 closeInfoBox();
1827
1828 notify_progress("Removing feed...");
1829
1830 var query = "?op=pref-feeds&subop=remove&ids="+
1831 param_escape(id);
1832
1833 new Ajax.Request("backend.php", {
1834 parameters: query,
1835 onComplete: function(transport) {
1836 feedlist_callback2(transport);
1837 } });
1838 }
1839
1840 } catch (e) {
1841 exception_error("unsubscribeFeed", e);
1842 }
1843
1844 return false;
1845
1846} */
1847
1848function feedsEditSave() {
1849 try {
1850
1851 var ok = confirm(__("Save changes to selected feeds?"));
1852
1853 if (ok) {
1854
1855 var f = document.forms["batch_edit_feed_form"];
1856
1857 var query = Form.serialize("batch_edit_feed_form");
1858
1859 /* Form.serialize ignores unchecked checkboxes */
1860
1861 if (!query.match("&rtl_content=") &&
1862 f.rtl_content.disabled == false) {
1863 query = query + "&rtl_content=false";
1864 }
1865
1866 if (!query.match("&private=") &&
1867 f.private.disabled == false) {
1868 query = query + "&private=false";
1869 }
1870
1871 if (!query.match("&cache_images=") &&
1872 f.cache_images.disabled == false) {
1873 query = query + "&cache_images=false";
1874 }
1875
1876 if (!query.match("&include_in_digest=") &&
1877 f.include_in_digest.disabled == false) {
1878 query = query + "&include_in_digest=false";
1879 }
1880
1881 closeInfoBox();
1882
1883 notify_progress("Saving feeds...");
1884
1885 new Ajax.Request("backend.php", {
1886 parameters: query,
1887 onComplete: function(transport) {
1888 feedlist_callback2(transport);
1889 } });
1890
1891 }
1892
1893 return false;
1894 } catch (e) {
1895 exception_error("feedsEditSave", e);
1896 }
1897}
1898
1899function batchFeedsToggleField(cb, elem, label) {
1900 try {
1901 var f = document.forms["batch_edit_feed_form"];
1902 var l = $(label);
1903
1904 if (cb.checked) {
1905 f[elem].disabled = false;
1906
1907 if (l) {
1908 l.className = "";
1909 };
1910
1911// new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1912// queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1913
1914 } else {
1915 f[elem].disabled = true;
1916
1917 if (l) {
1918 l.className = "insensitive";
1919 };
1920
1921 }
1922 } catch (e) {
1923 exception_error("batchFeedsToggleField", e);
1924 }
1925}
1926
1927function labelColorReset() {
1928 try {
1929 var labels = getSelectedLabels();
1930
1931 var ok = confirm(__("Reset label colors to default?"));
1932
1933 if (ok) {
1934
1935 var query = "?op=pref-labels&subop=color-reset&ids="+
1936 param_escape(labels.toString());
1937
1938 new Ajax.Request("backend.php", {
1939 parameters: query,
1940 onComplete: function(transport) {
1941 labellist_callback2(transport);
1942 } });
1943 }
1944
1945 } catch (e) {
1946 exception_error("labelColorReset", e);
1947 }
1948}
1949
1950function labelColorAsk(id, kind) {
1951 try {
1952
1953 var p = null
1954
1955 if (kind == "fg") {
1956 p = prompt(__("Please enter new label foreground color:"));
1957 } else {
1958 p = prompt(__("Please enter new label background color:"));
1959 }
1960
1961 if (p != null) {
1962
1963 var query = "?op=pref-labels&subop=color-set&kind=" + kind +
1964 "&ids="+ param_escape(id) + "&color=" + param_escape(p);
1965
1966 selectPrefRows('label', false);
1967
1968 var e = $("LICID-" + id);
1969
1970 if (e) {
1971 if (kind == "fg") {
1972 e.style.color = p
1973 } else {
1974 e.style.backgroundColor = p;
1975 }
1976 }
1977
1978 new Ajax.Request("backend.php", { parameters: query });
1979 }
1980
1981 } catch (e) {
1982 exception_error("labelColorReset", e);
1983 }
1984}
1985
1986
1987function colorPicker(id, fg, bg) {
1988 try {
1989 var picker = $("colorPicker-" + id);
1990
1991 if (picker) Element.show(picker);
1992
1993 } catch (e) {
1994 exception_error("colorPicker", e);
1995 }
1996}
1997
1998function colorPickerHideAll() {
1999 try {
2000 if ($("prefLabelList")) {
2001
2002 var elems = $("prefLabelList").getElementsByTagName("DIV");
2003
2004 for (var i = 0; i < elems.length; i++) {
2005 if (elems[i].id && elems[i].id.match("colorPicker-")) {
2006 Element.hide(elems[i]);
2007 }
2008 }
2009 }
2010
2011 } catch (e) {
2012 exception_error("colorPickerHideAll", e);
2013 }
2014}
2015
2016function colorPickerDo(id, fg, bg) {
2017 try {
2018
2019 var query = "?op=pref-labels&subop=color-set&kind=both"+
2020 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
2021 "&bg=" + param_escape(bg);
2022
2023 var e = $("LICID-" + id);
2024
2025 if (e) {
2026 e.style.color = fg;
2027 e.style.backgroundColor = bg;
2028 }
2029
2030 new Ajax.Request("backend.php", { parameters: query });
2031
2032 } catch (e) {
2033 exception_error("colorPickerDo", e);
2034 }
2035}
2036
2037function colorPickerActive(b) {
2038 color_picker_active = b;
2039}
2040
2041function mouse_down_handler(e) {
2042 try {
2043
2044 /* do not prevent right click */
2045 if (e && e.button && e.button == 2) return;
2046
2047 if (selection_disabled) {
2048 document.onselectstart = function() { return false; };
2049 return false;
2050 }
2051
2052 } catch (e) {
2053 exception_error("mouse_down_handler", e);
2054 }
2055}
2056
2057function mouse_up_handler(e) {
2058 try {
2059 mouse_is_down = false;
2060
2061 if (!selection_disabled) {
2062 document.onselectstart = null;
2063 }
2064
2065 if (!color_picker_active) {
2066 colorPickerHideAll();
2067 }
2068
2069 } catch (e) {
2070 exception_error("mouse_up_handler", e);
2071 }
2072}
2073
2074function inPreferences() {
2075 return true;
2076}
2077
2078function editProfiles() {
2079 displayDlg('editPrefProfiles', false, function() {
2080 init_profile_inline_editor();
2081 });
2082}
2083
2084function activatePrefProfile() {
2085
2086 var sel_rows = getSelectedFeedCats();
2087
2088 if (sel_rows.length == 1) {
2089
2090 var ok = confirm(__("Activate selected profile?"));
2091
2092 if (ok) {
2093 notify_progress("Loading, please wait...");
2094
2095 var query = "?op=rpc&subop=setprofile&id="+
2096 param_escape(sel_rows.toString());
2097
2098 new Ajax.Request("backend.php", {
2099 parameters: query,
2100 onComplete: function(transport) {
2101 window.location.reload();
2102 } });
2103 }
2104
2105 } else {
2106 alert(__("Please choose a profile to activate."));
2107 }
2108
2109 return false;
2110}
2111
2112function opmlImportDone() {
2113 closeInfoBox();
2114 updateFeedList();
2115}
2116
2117function opmlImportHandler(iframe) {
2118 try {
2119 var tmp = new Object();
2120 tmp.responseText = iframe.document.body.innerHTML;
2121 notify('');
2122 infobox_callback2(tmp);
2123 } catch (e) {
2124 exception_error("opml_import_handler", e);
2125 }
2126}