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