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