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