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