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