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