]> git.wh0rd.org - tt-rss.git/blob - prefs.js
rework pref-feeds dialog; update other pref panes
[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.Toolbar");
1169 dojo.require("dojo.data.ItemFileWriteStore");
1170 dojo.require("dijit.Tree");
1171 dojo.require("dijit.form.DropDownButton");
1172 dojo.require("dijit.Menu");
1173 dojo.require("dijit.tree.dndSource");
1174
1175 dojo.registerModulePath("lib", "..");
1176
1177 dojo.require("lib.CheckBoxTree");
1178
1179 loading_set_progress(30);
1180
1181 var query = "?op=rpc&subop=sanityCheck";
1182
1183 new Ajax.Request("backend.php", {
1184 parameters: query,
1185 onComplete: function(transport) {
1186 backend_sanity_check_callback(transport);
1187 } });
1188
1189 } catch (e) {
1190 exception_error("init", e);
1191 }
1192 }
1193
1194 function validatePrefsReset() {
1195 try {
1196 var ok = confirm(__("Reset to defaults?"));
1197
1198 if (ok) {
1199
1200 var query = Form.serialize("pref_prefs_form");
1201 query = query + "&subop=reset-config";
1202 console.log(query);
1203
1204 new Ajax.Request("backend.php", {
1205 parameters: query,
1206 onComplete: function(transport) {
1207 var msg = transport.responseText;
1208 if (msg.match("PREFS_THEME_CHANGED")) {
1209 window.location.reload();
1210 } else {
1211 notify_info(msg);
1212 selectTab();
1213 }
1214 } });
1215
1216 }
1217
1218 } catch (e) {
1219 exception_error("validatePrefsReset", e);
1220 }
1221
1222 return false;
1223
1224 }
1225
1226
1227 function pref_hotkey_handler(e) {
1228 try {
1229
1230 var keycode;
1231 var shift_key = false;
1232
1233 var cmdline = $('cmdline');
1234
1235 try {
1236 shift_key = e.shiftKey;
1237 } catch (e) {
1238
1239 }
1240
1241 if (window.event) {
1242 keycode = window.event.keyCode;
1243 } else if (e) {
1244 keycode = e.which;
1245 }
1246
1247 var keychar = String.fromCharCode(keycode);
1248
1249 if (keycode == 27) { // escape
1250 if (Element.visible("hotkey_help_overlay")) {
1251 Element.hide("hotkey_help_overlay");
1252 }
1253 colorPickerHideAll();
1254 hotkey_prefix = false;
1255 closeInfoBox();
1256 }
1257
1258 var dialog = dijit.byId("infoBox");
1259 var dialog_visible = false;
1260
1261 if (dialog)
1262 dialog_visible = Element.visible(dialog.domNode);
1263
1264 if (dialog_visible || !hotkeys_enabled) {
1265 console.log("hotkeys disabled");
1266 return;
1267 }
1268
1269 if (keycode == 16) return; // ignore lone shift
1270
1271 if ((keycode == 67 || keycode == 71) && !hotkey_prefix) {
1272 hotkey_prefix = keycode;
1273
1274 var date = new Date();
1275 var ts = Math.round(date.getTime() / 1000);
1276
1277 hotkey_prefix_pressed = ts;
1278
1279 cmdline.innerHTML = keychar;
1280 Element.show(cmdline);
1281
1282 console.log("KP: PREFIX=" + keycode + " CHAR=" + keychar);
1283 return;
1284 }
1285
1286 if (Element.visible("hotkey_help_overlay")) {
1287 Element.hide("hotkey_help_overlay");
1288 }
1289
1290 if (keycode == 13 || keycode == 27) {
1291 seq = "";
1292 } else {
1293 seq = seq + "" + keycode;
1294 }
1295
1296 /* Global hotkeys */
1297
1298 Element.hide(cmdline);
1299
1300 if (!hotkey_prefix) {
1301
1302 if ((keycode == 191 || keychar == '?') && shift_key) { // ?
1303 if (!Element.visible("hotkey_help_overlay")) {
1304 //Element.show("hotkey_help_overlay");
1305 Effect.Appear("hotkey_help_overlay", {duration : 0.3});
1306 } else {
1307 Element.hide("hotkey_help_overlay");
1308 }
1309 return false;
1310 }
1311
1312 if (keycode == 191 || keychar == '/') { // /
1313 var search_boxes = new Array("label_search",
1314 "feed_search", "filter_search", "user_search", "feed_browser_search");
1315
1316 for (var i = 0; i < search_boxes.length; i++) {
1317 var elem = $(search_boxes[i]);
1318 if (elem) {
1319 $(search_boxes[i]).focus();
1320 return false;
1321 }
1322 }
1323 }
1324 }
1325
1326 /* Prefix c */
1327
1328 if (hotkey_prefix == 67) { // c
1329 hotkey_prefix = false;
1330
1331 if (keycode == 70) { // f
1332 quickAddFilter();
1333 return false;
1334 }
1335
1336 if (keycode == 83) { // s
1337 quickAddFeed();
1338 return false;
1339 }
1340
1341 if (keycode == 85) { // u
1342 // no-op
1343 }
1344
1345 if (keycode == 67) { // c
1346 editFeedCats();
1347 return false;
1348 }
1349
1350 if (keycode == 84 && shift_key) { // T
1351 displayDlg('feedBrowser');
1352 return false;
1353 }
1354
1355 }
1356
1357 /* Prefix g */
1358
1359 if (hotkey_prefix == 71) { // g
1360
1361 hotkey_prefix = false;
1362
1363 if (keycode == 49 && $("genConfigTab")) { // 1
1364 selectTab("genConfig");
1365 return false;
1366 }
1367
1368 if (keycode == 50 && $("feedConfigTab")) { // 2
1369 selectTab("feedConfig");
1370 return false;
1371 }
1372
1373 if (keycode == 51 && $("filterConfigTab")) { // 4
1374 selectTab("filterConfig");
1375 return false;
1376 }
1377
1378 if (keycode == 52 && $("labelConfigTab")) { // 5
1379 selectTab("labelConfig");
1380 return false;
1381 }
1382
1383 if (keycode == 53 && $("userConfigTab")) { // 6
1384 selectTab("userConfig");
1385 return false;
1386 }
1387
1388 if (keycode == 88) { // x
1389 return gotoMain();
1390 }
1391
1392 }
1393
1394 if ($("piggie")) {
1395 if (seq.match("8073717369")) {
1396 seq = "";
1397 piggie(true);
1398 } else {
1399 piggie(false);
1400 }
1401 }
1402
1403 if (hotkey_prefix) {
1404 console.log("KP: PREFIX=" + hotkey_prefix + " CODE=" + keycode + " CHAR=" + keychar);
1405 } else {
1406 console.log("KP: CODE=" + keycode + " CHAR=" + keychar);
1407 }
1408
1409 } catch (e) {
1410 exception_error("pref_hotkey_handler", e);
1411 }
1412 }
1413
1414 function editFeedCats() {
1415 try {
1416 var query = "?op=pref-feeds&subop=editCats";
1417
1418 notify_progress("Loading, please wait...");
1419
1420 new Ajax.Request("backend.php", {
1421 parameters: query,
1422 onComplete: function(transport) {
1423 infobox_feed_cat_callback2(transport);
1424 } });
1425 } catch (e) {
1426 exception_error("editFeedCats", e);
1427 }
1428 }
1429
1430 function showFeedsWithErrors() {
1431 displayDlg('feedUpdateErrors');
1432 }
1433
1434 function changeUserPassword() {
1435
1436 try {
1437
1438 var f = document.forms["change_pass_form"];
1439
1440 if (f) {
1441 if (f.OLD_PASSWORD.value == "") {
1442 new Effect.Highlight(f.OLD_PASSWORD);
1443 notify_error("Old password cannot be blank.");
1444 return false;
1445 }
1446
1447 if (f.NEW_PASSWORD.value == "") {
1448 new Effect.Highlight(f.NEW_PASSWORD);
1449 notify_error("New password cannot be blank.");
1450 return false;
1451 }
1452
1453 if (f.CONFIRM_PASSWORD.value == "") {
1454 new Effect.Highlight(f.CONFIRM_PASSWORD);
1455 notify_error("Entered passwords do not match.");
1456 return false;
1457 }
1458
1459 if (f.CONFIRM_PASSWORD.value != f.NEW_PASSWORD.value) {
1460 new Effect.Highlight(f.CONFIRM_PASSWORD);
1461 new Effect.Highlight(f.NEW_PASSWORD);
1462 notify_error("Entered passwords do not match.");
1463 return false;
1464 }
1465
1466 }
1467
1468 var query = Form.serialize("change_pass_form");
1469
1470 notify_progress("Changing password...");
1471
1472 new Ajax.Request("backend.php", {
1473 parameters: query,
1474 onComplete: function(transport) {
1475 if (transport.responseText.indexOf("ERROR: ") == 0) {
1476 notify_error(transport.responseText.replace("ERROR: ", ""));
1477 } else {
1478 notify_info(transport.responseText);
1479 var warn = $("default_pass_warning");
1480 if (warn) warn.style.display = "none";
1481 }
1482
1483 document.forms['change_pass_form'].reset();
1484 } });
1485
1486
1487 } catch (e) {
1488 exception_error("changeUserPassword", e);
1489 }
1490
1491 return false;
1492 }
1493
1494 function changeUserEmail() {
1495
1496 try {
1497
1498 var query = Form.serialize("change_email_form");
1499
1500 notify_progress("Saving...");
1501
1502 new Ajax.Request("backend.php", {
1503 parameters: query,
1504 onComplete: function(transport) {
1505 notify_callback2(transport);
1506 } });
1507
1508 } catch (e) {
1509 exception_error("changeUserPassword", e);
1510 }
1511
1512 return false;
1513
1514 }
1515
1516 function feedlistToggleSLAT() {
1517 notify_progress("Loading, please wait...");
1518 updateFeedList()
1519 }
1520
1521 function opmlRegenKey() {
1522
1523 try {
1524 var ok = confirm(__("Replace current OPML publishing address with a new one?"));
1525
1526 if (ok) {
1527
1528 notify_progress("Trying to change address...", true);
1529
1530 var query = "?op=rpc&subop=regenOPMLKey";
1531
1532 new Ajax.Request("backend.php", {
1533 parameters: query,
1534 onComplete: function(transport) {
1535 var new_link = transport.responseXML.getElementsByTagName("link")[0];
1536
1537 var e = $('pub_opml_url');
1538
1539 if (new_link) {
1540 e.href = new_link.firstChild.nodeValue;
1541 e.innerHTML = new_link.firstChild.nodeValue;
1542
1543 new Effect.Highlight(e);
1544
1545 notify('');
1546
1547 } else {
1548 notify_error("Could not change feed URL.");
1549 }
1550 } });
1551 }
1552 } catch (e) {
1553 exception_error("opmlRegenKey", e);
1554 }
1555 return false;
1556 }
1557 function validatePrefsSave() {
1558 try {
1559
1560 var ok = confirm(__("Save current configuration?"));
1561
1562 if (ok) {
1563
1564 var query = Form.serialize("pref_prefs_form");
1565 query = query + "&subop=save-config";
1566 console.log(query);
1567
1568 new Ajax.Request("backend.php", {
1569 parameters: query,
1570 onComplete: function(transport) {
1571 var msg = transport.responseText;
1572 if (msg.match("PREFS_THEME_CHANGED")) {
1573 window.location.reload();
1574 } else {
1575 notify_info(msg);
1576 }
1577 } });
1578
1579 }
1580
1581 } catch (e) {
1582 exception_error("validatePrefsSave", e);
1583 }
1584
1585 return false;
1586 }
1587
1588 function feedActionChange() {
1589 try {
1590 var chooser = $("feedActionChooser");
1591 var opid = chooser[chooser.selectedIndex].value;
1592
1593 chooser.selectedIndex = 0;
1594 feedActionGo(opid);
1595 } catch (e) {
1596 exception_error("feedActionChange", e);
1597 }
1598 }
1599
1600 function feedActionGo(op) {
1601 try {
1602 if (op == "facEdit") {
1603
1604 var rows = getSelectedFeeds();
1605
1606 if (rows.length > 1) {
1607 editSelectedFeeds();
1608 } else {
1609 editSelectedFeed();
1610 }
1611 }
1612
1613 if (op == "facClear") {
1614 clearSelectedFeeds();
1615 }
1616
1617 if (op == "facPurge") {
1618 purgeSelectedFeeds();
1619 }
1620
1621 if (op == "facEditCats") {
1622 editFeedCats();
1623 }
1624
1625 if (op == "facRescore") {
1626 rescoreSelectedFeeds();
1627 }
1628
1629 if (op == "facUnsubscribe") {
1630 removeSelectedFeeds();
1631 }
1632
1633 } catch (e) {
1634 exception_error("feedActionGo", e);
1635
1636 }
1637 }
1638
1639 function clearFeedArticles(feed_id) {
1640
1641 notify_progress("Clearing feed...");
1642
1643 var query = "?op=pref-feeds&quiet=1&subop=clear&id=" + feed_id;
1644
1645 new Ajax.Request("backend.php", {
1646 parameters: query,
1647 onComplete: function(transport) {
1648 notify('');
1649 } });
1650
1651 return false;
1652 }
1653
1654 function rescoreSelectedFeeds() {
1655
1656 var sel_rows = getSelectedFeeds();
1657
1658 if (sel_rows.length > 0) {
1659
1660 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1661 var ok = confirm(__("Rescore articles in selected feeds?"));
1662
1663 if (ok) {
1664 notify_progress("Rescoring selected feeds...", true);
1665
1666 var query = "?op=pref-feeds&subop=rescore&quiet=1&ids="+
1667 param_escape(sel_rows.toString());
1668
1669 new Ajax.Request("backend.php", {
1670 parameters: query,
1671 onComplete: function(transport) {
1672 notify_callback2(transport);
1673 } });
1674
1675 }
1676 } else {
1677 alert(__("No feeds are selected."));
1678 }
1679
1680 return false;
1681 }
1682
1683 function rescore_all_feeds() {
1684 var ok = confirm(__("Rescore all articles? This operation may take a lot of time."));
1685
1686 if (ok) {
1687 notify_progress("Rescoring feeds...", true);
1688
1689 var query = "?op=pref-feeds&subop=rescoreAll&quiet=1";
1690
1691 new Ajax.Request("backend.php", {
1692 parameters: query,
1693 onComplete: function(transport) {
1694 notify_callback2(transport);
1695 } });
1696 }
1697 }
1698
1699 function removeFilter(id, title) {
1700
1701 try {
1702
1703 var msg = __("Remove filter %s?").replace("%s", title);
1704
1705 var ok = confirm(msg);
1706
1707 if (ok) {
1708 closeInfoBox();
1709
1710 notify_progress("Removing filter...");
1711
1712 var query = "?op=pref-filters&subop=remove&ids="+
1713 param_escape(id);
1714
1715 new Ajax.Request("backend.php", {
1716 parameters: query,
1717 onComplete: function(transport) {
1718 filterlist_callback2(transport);
1719 } });
1720
1721 }
1722
1723 } catch (e) {
1724 exception_error("removeFilter", e);
1725 }
1726
1727 return false;
1728 }
1729
1730 function feedsEditSave() {
1731 try {
1732
1733 var ok = confirm(__("Save changes to selected feeds?"));
1734
1735 if (ok) {
1736
1737 var f = document.forms["batch_edit_feed_form"];
1738
1739 var query = Form.serialize("batch_edit_feed_form");
1740
1741 /* Form.serialize ignores unchecked checkboxes */
1742
1743 if (!query.match("&rtl_content=") &&
1744 f.rtl_content.disabled == false) {
1745 query = query + "&rtl_content=false";
1746 }
1747
1748 if (!query.match("&private=") &&
1749 f.private.disabled == false) {
1750 query = query + "&private=false";
1751 }
1752
1753 if (!query.match("&cache_images=") &&
1754 f.cache_images.disabled == false) {
1755 query = query + "&cache_images=false";
1756 }
1757
1758 if (!query.match("&include_in_digest=") &&
1759 f.include_in_digest.disabled == false) {
1760 query = query + "&include_in_digest=false";
1761 }
1762
1763 closeInfoBox();
1764
1765 notify_progress("Saving feeds...");
1766
1767 new Ajax.Request("backend.php", {
1768 parameters: query,
1769 onComplete: function(transport) {
1770 feedlist_callback2(transport);
1771 } });
1772
1773 }
1774
1775 return false;
1776 } catch (e) {
1777 exception_error("feedsEditSave", e);
1778 }
1779 }
1780
1781 function batchFeedsToggleField(cb, elem, label) {
1782 try {
1783 var f = document.forms["batch_edit_feed_form"];
1784 var l = $(label);
1785
1786 if (cb.checked) {
1787 f[elem].disabled = false;
1788
1789 if (l) {
1790 l.className = "";
1791 };
1792
1793 // new Effect.Highlight(f[elem], {duration: 1, startcolor: "#fff7d5",
1794 // queue: { position:'end', scope: 'BPEFQ', limit: 1 } } );
1795
1796 } else {
1797 f[elem].disabled = true;
1798
1799 if (l) {
1800 l.className = "insensitive";
1801 };
1802
1803 }
1804 } catch (e) {
1805 exception_error("batchFeedsToggleField", e);
1806 }
1807 }
1808
1809 function labelColorReset() {
1810 try {
1811 var labels = getSelectedLabels();
1812
1813 var ok = confirm(__("Reset label colors to default?"));
1814
1815 if (ok) {
1816
1817 var query = "?op=pref-labels&subop=color-reset&ids="+
1818 param_escape(labels.toString());
1819
1820 new Ajax.Request("backend.php", {
1821 parameters: query,
1822 onComplete: function(transport) {
1823 labellist_callback2(transport);
1824 } });
1825 }
1826
1827 } catch (e) {
1828 exception_error("labelColorReset", e);
1829 }
1830 }
1831
1832 function labelColorAsk(id, kind) {
1833 try {
1834
1835 var p = null
1836
1837 if (kind == "fg") {
1838 p = prompt(__("Please enter new label foreground color:"));
1839 } else {
1840 p = prompt(__("Please enter new label background color:"));
1841 }
1842
1843 if (p != null) {
1844
1845 var query = "?op=pref-labels&subop=color-set&kind=" + kind +
1846 "&ids="+ param_escape(id) + "&color=" + param_escape(p);
1847
1848 selectTableRows('prefLabelList', 'none');
1849
1850 var e = $("LICID-" + id);
1851
1852 if (e) {
1853 if (kind == "fg") {
1854 e.style.color = p
1855 } else {
1856 e.style.backgroundColor = p;
1857 }
1858 }
1859
1860 new Ajax.Request("backend.php", { parameters: query });
1861 }
1862
1863 } catch (e) {
1864 exception_error("labelColorReset", e);
1865 }
1866 }
1867
1868
1869 function colorPicker(id, fg, bg) {
1870 try {
1871 var picker = $("colorPicker-" + id);
1872
1873 if (picker) Element.show(picker);
1874
1875 } catch (e) {
1876 exception_error("colorPicker", e);
1877 }
1878 }
1879
1880 function colorPickerHideAll() {
1881 try {
1882 if ($("prefLabelList")) {
1883
1884 var elems = $("prefLabelList").getElementsByTagName("DIV");
1885
1886 for (var i = 0; i < elems.length; i++) {
1887 if (elems[i].id && elems[i].id.match("colorPicker-")) {
1888 Element.hide(elems[i]);
1889 }
1890 }
1891 }
1892
1893 } catch (e) {
1894 exception_error("colorPickerHideAll", e);
1895 }
1896 }
1897
1898 function colorPickerDo(id, fg, bg) {
1899 try {
1900
1901 var query = "?op=pref-labels&subop=color-set&kind=both"+
1902 "&ids=" + param_escape(id) + "&fg=" + param_escape(fg) +
1903 "&bg=" + param_escape(bg);
1904
1905 var e = $("LICID-" + id);
1906
1907 if (e) {
1908 e.style.color = fg;
1909 e.style.backgroundColor = bg;
1910 }
1911
1912 new Ajax.Request("backend.php", { parameters: query });
1913
1914 } catch (e) {
1915 exception_error("colorPickerDo", e);
1916 }
1917 }
1918
1919 function colorPickerActive(b) {
1920 color_picker_active = b;
1921 }
1922
1923 function mouse_down_handler(e) {
1924 try {
1925
1926 /* do not prevent right click */
1927 if (e && e.button && e.button == 2) return;
1928
1929 if (selection_disabled) {
1930 document.onselectstart = function() { return false; };
1931 return false;
1932 }
1933
1934 } catch (e) {
1935 exception_error("mouse_down_handler", e);
1936 }
1937 }
1938
1939 function mouse_up_handler(e) {
1940 try {
1941 mouse_is_down = false;
1942
1943 if (!selection_disabled) {
1944 document.onselectstart = null;
1945 }
1946
1947 if (!color_picker_active) {
1948 colorPickerHideAll();
1949 }
1950
1951 } catch (e) {
1952 exception_error("mouse_up_handler", e);
1953 }
1954 }
1955
1956 function inPreferences() {
1957 return true;
1958 }
1959
1960 function editProfiles() {
1961 displayDlg('editPrefProfiles', false, function() {
1962 init_profile_inline_editor();
1963 });
1964 }
1965
1966 function activatePrefProfile() {
1967
1968 var sel_rows = getSelectedFeedCats();
1969
1970 if (sel_rows.length == 1) {
1971
1972 var ok = confirm(__("Activate selected profile?"));
1973
1974 if (ok) {
1975 notify_progress("Loading, please wait...");
1976
1977 var query = "?op=rpc&subop=setprofile&id="+
1978 param_escape(sel_rows.toString());
1979
1980 new Ajax.Request("backend.php", {
1981 parameters: query,
1982 onComplete: function(transport) {
1983 window.location.reload();
1984 } });
1985 }
1986
1987 } else {
1988 alert(__("Please choose a profile to activate."));
1989 }
1990
1991 return false;
1992 }
1993
1994 function opmlImportDone() {
1995 closeInfoBox();
1996 updateFeedList();
1997 }
1998
1999 function opmlImportHandler(iframe) {
2000 try {
2001 var tmp = new Object();
2002 tmp.responseText = iframe.document.body.innerHTML;
2003 notify('');
2004 infobox_callback2(tmp);
2005 } catch (e) {
2006 exception_error("opml_import_handler", e);
2007 }
2008 }
2009
2010 function clearFeedAccessKeys() {
2011
2012 var ok = confirm(__("This will invalidate all previously generated feed URLs. Continue?"));
2013
2014 if (ok) {
2015 notify_progress("Clearing URLs...");
2016
2017 var query = "?op=rpc&subop=clearKeys";
2018
2019 new Ajax.Request("backend.php", {
2020 parameters: query,
2021 onComplete: function(transport) {
2022 notify_info("Generated URLs cleared.");
2023 } });
2024 }
2025
2026 return false;
2027 }
2028
2029 function handle_rpc_reply(transport, scheduled_call) {
2030 try {
2031 if (transport.responseXML) {
2032
2033 if (!transport_error_check(transport)) return false;
2034
2035 } else {
2036 notify_error("Error communicating with server.");
2037 }
2038
2039 } catch (e) {
2040 exception_error("handle_rpc_reply", e, transport);
2041 }
2042
2043 return true;
2044 }
2045