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