]>
git.wh0rd.org - tt-rss.git/blob - js/prefs.js
1 var init_params
= new Array ();
3 var hotkey_prefix
= false ;
4 var hotkey_prefix_pressed
= false ;
8 function notify_callback2 ( transport
, sticky
) {
9 notify_info ( transport
. responseText
, sticky
);
12 function updateFeedList ( sort_key
) {
14 var user_search
= $( "feed_search" );
16 if ( user_search
) { search
= user_search
. value
; }
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 );
27 function updateInstanceList ( sort_key
) {
28 new Ajax
. Request ( "backend.php" , {
29 parameters
: "?op=pref-instances&sort=" + param_escape ( sort_key
),
30 onComplete : function ( transport
) {
31 dijit
. byId ( 'instanceConfigTab' ). attr ( 'content' , transport
. responseText
);
32 selectTab ( "instanceConfig" , true );
37 function updateUsersList ( sort_key
) {
39 var user_search
= $( "user_search" );
41 if ( user_search
) { search
= user_search
. value
; }
43 var query
= "?op=pref-users&sort="
44 + param_escape ( sort_key
) +
45 "&search=" + param_escape ( search
);
47 new Ajax
. Request ( "backend.php" , {
49 onComplete : function ( transport
) {
50 dijit
. byId ( 'userConfigTab' ). attr ( 'content' , transport
. responseText
);
51 selectTab ( "userConfig" , true )
56 exception_error ( "updateUsersList" , e
);
64 var login
= prompt ( __ ( "Please enter login:" ), "" );
71 alert ( __ ( "Can't create user: no login specified." ));
75 notify_progress ( "Adding user..." );
77 var query
= "?op=pref-users&method=add&login=" +
80 new Ajax
. Request ( "backend.php" , {
82 onComplete : function ( transport
) {
83 notify_callback2 ( transport
);
88 exception_error ( "addUser" , e
);
92 function editUser ( id
, event
) {
95 if (! event
|| ! event
. ctrlKey
) {
97 notify_progress ( "Loading, please wait..." );
99 selectTableRows ( 'prefUserList' , 'none' );
100 selectTableRowById ( 'UMRR-' + id
, 'UMCHK-' + id
, true );
102 var query
= "?op=pref-users&method=edit&id=" +
105 new Ajax
. Request ( "backend.php" , {
107 onComplete : function ( transport
) {
108 infobox_callback2 ( transport
);
109 document
. forms
[ 'user_edit_form' ]. login
. focus ();
112 } else if ( event
. ctrlKey
) {
113 var cb
= $( 'UMCHK-' + id
);
114 cb
. checked
= ! cb
. checked
;
119 exception_error ( "editUser" , e
);
124 function editFilter ( id
) {
127 var query
= "backend.php?op=pref-filters&method=edit&id=" + param_escape ( id
);
129 if ( dijit
. byId ( "feedEditDlg" ))
130 dijit
. byId ( "feedEditDlg" ). destroyRecursive ();
132 if ( dijit
. byId ( "filterEditDlg" ))
133 dijit
. byId ( "filterEditDlg" ). destroyRecursive ();
135 dialog
= new dijit
. Dialog ({
137 title
: __ ( "Edit Filter" ),
138 style
: "width: 600px" ,
139 selectRules : function ( select
) {
140 $$( "#filterDlg_Matches input[type=checkbox]" ). each ( function ( e
) {
143 e
. parentNode
. addClassName ( "Selected" );
145 e
. parentNode
. removeClassName ( "Selected" );
148 selectActions : function ( select
) {
149 $$( "#filterDlg_Actions input[type=checkbox]" ). each ( function ( e
) {
153 e
. parentNode
. addClassName ( "Selected" );
155 e
. parentNode
. removeClassName ( "Selected" );
159 editRule : function ( e
) {
160 var li
= e
. parentNode
;
161 var rule
= li
. getElementsByTagName ( "INPUT" )[ 1 ]. value
;
162 addFilterRule ( li
, rule
);
164 editAction : function ( e
) {
165 var li
= e
. parentNode
;
166 var action
= li
. getElementsByTagName ( "INPUT" )[ 1 ]. value
;
167 addFilterAction ( li
, action
);
169 removeFilter : function () {
170 var msg
= __ ( "Remove filter?" );
175 notify_progress ( "Removing filter..." );
177 var id
= this . attr ( 'value' ). id
;
179 var query
= "?op=pref-filters&method=remove&ids=" +
182 new Ajax
. Request ( "backend.php" , {
184 onComplete : function ( transport
) {
189 addAction : function () { addFilterAction (); },
190 addRule : function () { addFilterRule (); },
191 deleteAction : function () {
192 $$( "#filterDlg_Actions li.[class*=Selected]" ). each ( function ( e
) { e
. parentNode
. removeChild ( e
) });
194 deleteRule : function () {
195 $$( "#filterDlg_Matches li.[class*=Selected]" ). each ( function ( e
) { e
. parentNode
. removeChild ( e
) });
197 execute : function () {
198 if ( this . validate ()) {
200 notify_progress ( "Saving data..." , true );
202 var query
= dojo
. formToQuery ( "filter_edit_form" );
206 new Ajax
. Request ( "backend.php" , {
208 onComplete : function ( transport
) {
220 exception_error ( "editFilter" , e
);
224 function getSelectedLabels () {
225 var tree
= dijit
. byId ( "labelTree" );
226 var items
= tree
. model
. getCheckedItems ();
229 items
. each ( function ( item
) {
230 rv
. push ( tree
. model
. store
. getValue ( item
, 'bare_id' ));
236 function getSelectedUsers () {
237 return getSelectedTableRowIds ( "prefUserList" );
240 function getSelectedFeeds () {
241 var tree
= dijit
. byId ( "feedTree" );
242 var items
= tree
. model
. getCheckedItems ();
245 items
. each ( function ( item
) {
246 if ( item
. id
[ 0 ]. match ( "FEED:" ))
247 rv
. push ( tree
. model
. store
. getValue ( item
, 'bare_id' ));
253 function getSelectedFilters () {
254 var tree
= dijit
. byId ( "filterTree" );
255 var items
= tree
. model
. getCheckedItems ();
258 items
. each ( function ( item
) {
259 rv
. push ( tree
. model
. store
. getValue ( item
, 'bare_id' ));
266 /* function getSelectedFeedCats() {
267 return getSelectedTableRowIds("prefFeedCatList");
270 function removeSelectedLabels () {
272 var sel_rows
= getSelectedLabels ();
274 if ( sel_rows
. length
> 0 ) {
276 var ok
= confirm ( __ ( "Remove selected labels?" ));
279 notify_progress ( "Removing selected labels..." );
281 var query
= "?op=pref-labels&method=remove&ids=" +
282 param_escape ( sel_rows
. toString ());
284 new Ajax
. Request ( "backend.php" , {
286 onComplete : function ( transport
) {
292 alert ( __ ( "No labels are selected." ));
298 function removeSelectedUsers () {
302 var sel_rows
= getSelectedUsers ();
304 if ( sel_rows
. length
> 0 ) {
306 var ok
= confirm ( __ ( "Remove selected users? Neither default admin nor your account will be removed." ));
309 notify_progress ( "Removing selected users..." );
311 var query
= "?op=pref-users&method=remove&ids=" +
312 param_escape ( sel_rows
. toString ());
314 new Ajax
. Request ( "backend.php" , {
316 onComplete : function ( transport
) {
323 alert ( __ ( "No users are selected." ));
327 exception_error ( "removeSelectedUsers" , e
);
333 function removeSelectedFilters () {
337 var sel_rows
= getSelectedFilters ();
339 if ( sel_rows
. length
> 0 ) {
341 var ok
= confirm ( __ ( "Remove selected filters?" ));
344 notify_progress ( "Removing selected filters..." );
346 var query
= "?op=pref-filters&method=remove&ids=" +
347 param_escape ( sel_rows
. toString ());
349 new Ajax
. Request ( "backend.php" , {
351 onComplete : function ( transport
) {
356 alert ( __ ( "No filters are selected." ));
360 exception_error ( "removeSelectedFilters" , e
);
367 function removeSelectedFeeds () {
371 var sel_rows
= getSelectedFeeds ();
373 if ( sel_rows
. length
> 0 ) {
375 var ok
= confirm ( __ ( "Unsubscribe from selected feeds?" ));
379 notify_progress ( "Unsubscribing from selected feeds..." , true );
381 var query
= "?op=pref-feeds&method=remove&ids=" +
382 param_escape ( sel_rows
. toString ());
386 new Ajax
. Request ( "backend.php" , {
388 onComplete : function ( transport
) {
394 alert ( __ ( "No feeds are selected." ));
398 exception_error ( "removeSelectedFeeds" , e
);
404 function clearSelectedFeeds () {
406 var sel_rows
= getSelectedFeeds ();
408 if ( sel_rows
. length
> 1 ) {
409 alert ( __ ( "Please select only one feed." ));
413 if ( sel_rows
. length
> 0 ) {
415 var ok
= confirm ( __ ( "Erase all non-starred articles in selected feed?" ));
418 notify_progress ( "Clearing selected feed..." );
419 clearFeedArticles ( sel_rows
[ 0 ]);
424 alert ( __ ( "No feeds are selected." ));
431 function purgeSelectedFeeds () {
433 var sel_rows
= getSelectedFeeds ();
435 if ( sel_rows
. length
> 0 ) {
437 var pr
= prompt ( __ ( "How many days of articles to keep (0 - use default)?" ), "0" );
439 if ( pr
!= undefined ) {
440 notify_progress ( "Purging selected feed..." );
442 var query
= "?op=rpc&method=purge&ids=" +
443 param_escape ( sel_rows
. toString ()) + "&days=" + pr
;
447 new Ajax
. Request ( "prefs.php" , {
449 onComplete : function ( transport
) {
456 alert ( __ ( "No feeds are selected." ));
463 function userEditCancel () {
468 function userEditSave () {
472 var login
= document
. forms
[ "user_edit_form" ]. login
. value
;
474 if ( login
. length
== 0 ) {
475 alert ( __ ( "Login field cannot be blank." ));
479 notify_progress ( "Saving user..." );
483 var query
= Form
. serialize ( "user_edit_form" );
485 new Ajax
. Request ( "backend.php" , {
487 onComplete : function ( transport
) {
492 exception_error ( "userEditSave" , e
);
500 function editSelectedUser () {
501 var rows
= getSelectedUsers ();
503 if ( rows
. length
== 0 ) {
504 alert ( __ ( "No users are selected." ));
508 if ( rows
. length
> 1 ) {
509 alert ( __ ( "Please select only one user." ));
518 function resetSelectedUserPass () {
522 var rows
= getSelectedUsers ();
524 if ( rows
. length
== 0 ) {
525 alert ( __ ( "No users are selected." ));
529 if ( rows
. length
> 1 ) {
530 alert ( __ ( "Please select only one user." ));
534 var ok
= confirm ( __ ( "Reset password of selected user?" ));
537 notify_progress ( "Resetting password for selected user..." );
541 var query
= "?op=pref-users&method=resetPass&id=" +
544 new Ajax
. Request ( "backend.php" , {
546 onComplete : function ( transport
) {
547 notify_info ( transport
. responseText
);
553 exception_error ( "resetSelectedUserPass" , e
);
557 function selectedUserDetails () {
561 var rows
= getSelectedUsers ();
563 if ( rows
. length
== 0 ) {
564 alert ( __ ( "No users are selected." ));
568 if ( rows
. length
> 1 ) {
569 alert ( __ ( "Please select only one user." ));
573 notify_progress ( "Loading, please wait..." );
577 var query
= "?op=pref-users&method=userdetails&id=" + id
;
579 new Ajax
. Request ( "backend.php" , {
581 onComplete : function ( transport
) {
582 infobox_callback2 ( transport
);
585 exception_error ( "selectedUserDetails" , e
);
590 function editSelectedFilter () {
591 var rows
= getSelectedFilters ();
593 if ( rows
. length
== 0 ) {
594 alert ( __ ( "No filters are selected." ));
598 if ( rows
. length
> 1 ) {
599 alert ( __ ( "Please select only one filter." ));
609 function joinSelectedFilters () {
610 var rows
= getSelectedFilters ();
612 if ( rows
. length
== 0 ) {
613 alert ( __ ( "No filters are selected." ));
617 var ok
= confirm ( __ ( "Combine selected filters?" ));
620 notify_progress ( "Joining filters..." );
622 var query
= "?op=pref-filters&method=join&ids=" +
623 param_escape ( rows
. toString ());
627 new Ajax
. Request ( "backend.php" , {
629 onComplete : function ( transport
) {
635 function editSelectedFeed () {
636 var rows
= getSelectedFeeds ();
638 if ( rows
. length
== 0 ) {
639 alert ( __ ( "No feeds are selected." ));
643 if ( rows
. length
> 1 ) {
644 return editSelectedFeeds ();
649 editFeed ( rows
[ 0 ], {});
653 function editSelectedFeeds () {
656 var rows
= getSelectedFeeds ();
658 if ( rows
. length
== 0 ) {
659 alert ( __ ( "No feeds are selected." ));
663 notify_progress ( "Loading, please wait..." );
665 var query
= "backend.php?op=pref-feeds&method=editfeeds&ids=" +
666 param_escape ( rows
. toString ());
670 if ( dijit
. byId ( "feedEditDlg" ))
671 dijit
. byId ( "feedEditDlg" ). destroyRecursive ();
673 new Ajax
. Request ( "backend.php" , {
675 onComplete : function ( transport
) {
679 var dialog
= new dijit
. Dialog ({
681 title
: __ ( "Edit Multiple Feeds" ),
682 style
: "width: 600px" ,
683 getChildByName : function ( name
) {
685 this . getChildren (). each (
687 if ( child
. name
== name
) {
694 toggleField : function ( checkbox
, elem
, label
) {
695 this . getChildByName ( elem
). attr ( 'disabled' , ! checkbox
. checked
);
698 if ( checkbox
. checked
)
699 $( label
). removeClassName ( 'insensitive' );
701 $( label
). addClassName ( 'insensitive' );
704 execute : function () {
705 if ( this . validate () && confirm ( __ ( "Save changes to selected feeds?" ))) {
706 var query
= dojo
. objectToQuery ( this . attr ( 'value' ));
708 /* Form.serialize ignores unchecked checkboxes */
710 if (! query
. match ( "&rtl_content=" ) &&
711 this . getChildByName ( 'rtl_content' ). attr ( 'disabled' ) == false ) {
712 query
= query
+ "&rtl_content=false" ;
715 if (! query
. match ( "&private=" ) &&
716 this . getChildByName ( 'private' ). attr ( 'disabled' ) == false ) {
717 query
= query
+ "&private=false" ;
721 if (! query
. match ( "&cache_images=" ) &&
722 this . getChildByName ( 'cache_images' ). attr ( 'disabled' ) == false ) {
723 query
= query
+ "&cache_images=false" ;
727 if (! query
. match ( "&include_in_digest=" ) &&
728 this . getChildByName ( 'include_in_digest' ). attr ( 'disabled' ) == false ) {
729 query
= query
+ "&include_in_digest=false" ;
732 if (! query
. match ( "&always_display_enclosures=" ) &&
733 this . getChildByName ( 'always_display_enclosures' ). attr ( 'disabled' ) == false ) {
734 query
= query
+ "&always_display_enclosures=false" ;
737 if (! query
. match ( "&mark_unread_on_update=" ) &&
738 this . getChildByName ( 'mark_unread_on_update' ). attr ( 'disabled' ) == false ) {
739 query
= query
+ "&mark_unread_on_update=false" ;
742 if (! query
. match ( "&update_on_checksum_change=" ) &&
743 this . getChildByName ( 'update_on_checksum_change' ). attr ( 'disabled' ) == false ) {
744 query
= query
+ "&update_on_checksum_change=false" ;
749 notify_progress ( "Saving data..." , true );
751 new Ajax
. Request ( "backend.php" , {
753 onComplete : function ( transport
) {
759 content
: transport
. responseText
});
766 exception_error ( "editSelectedFeeds" , e
);
770 function piggie ( enable
) {
772 console
. log ( "I LOVEDED IT!" );
773 var piggie
= $( "piggie" );
775 Element
. show ( piggie
);
776 Position
. Center ( piggie
);
782 function opmlImportComplete ( iframe
) {
784 if (! iframe
. contentDocument
. body
. innerHTML
) return false ;
786 Element
. show ( iframe
);
790 if ( dijit
. byId ( 'opmlImportDlg' ))
791 dijit
. byId ( 'opmlImportDlg' ). destroyRecursive ();
793 var content
= iframe
. contentDocument
. body
. innerHTML
;
795 dialog
= new dijit
. Dialog ({
797 title
: __ ( "OPML Import" ),
798 style
: "width: 600px" ,
799 onCancel : function () {
804 execute : function () {
815 exception_error ( "opmlImportComplete" , e
);
819 function opmlImport () {
821 var opml_file
= $( "opml_file" );
823 if ( opml_file
. value
. length
== 0 ) {
824 alert ( __ ( "Please choose an OPML file first." ));
827 notify_progress ( "Importing, please wait..." , true );
829 Element
. show ( "upload_iframe" );
835 function importData () {
837 var file
= $( "export_file" );
839 if ( file
. value
. length
== 0 ) {
840 alert ( __ ( "Please choose the file first." ));
843 notify_progress ( "Importing, please wait..." , true );
845 Element
. show ( "data_upload_iframe" );
852 function updateFilterList () {
853 var user_search
= $( "filter_search" );
855 if ( user_search
) { search
= user_search
. value
; }
857 new Ajax
. Request ( "backend.php" , {
858 parameters
: "?op=pref-filters&search=" + param_escape ( search
),
859 onComplete : function ( transport
) {
860 dijit
. byId ( 'filterConfigTab' ). attr ( 'content' , transport
. responseText
);
865 function updateLabelList () {
866 new Ajax
. Request ( "backend.php" , {
867 parameters
: "?op=pref-labels" ,
868 onComplete : function ( transport
) {
869 dijit
. byId ( 'labelConfigTab' ). attr ( 'content' , transport
. responseText
);
874 function updatePrefsList () {
875 new Ajax
. Request ( "backend.php" , {
876 parameters
: "?op=pref-prefs" ,
877 onComplete : function ( transport
) {
878 dijit
. byId ( 'genConfigTab' ). attr ( 'content' , transport
. responseText
);
883 function selectTab ( id
, noupdate
, method
) {
886 notify_progress ( "Loading, please wait..." );
888 if ( id
== "feedConfig" ) {
890 } else if ( id
== "filterConfig" ) {
892 } else if ( id
== "labelConfig" ) {
894 } else if ( id
== "genConfig" ) {
896 } else if ( id
== "userConfig" ) {
900 var tab
= dijit
. byId ( id
+ "Tab" );
901 dijit
. byId ( "pref-tabs" ). selectChild ( tab
);
906 exception_error ( "selectTab" , e
);
910 function init_second_stage () {
913 document
. onkeydown
= pref_hotkey_handler
;
914 loading_set_progress ( 50 );
917 dojo
. addOnLoad ( function () {
918 var tab
= getURLParam ( 'tab' );
921 tab
= dijit
. byId ( tab
+ "Tab" );
922 if ( tab
) dijit
. byId ( "pref-tabs" ). selectChild ( tab
);
925 var method
= getURLParam ( 'method' );
927 if ( method
== 'editFeed' ) {
928 var param
= getURLParam ( 'methodparam' );
930 window
. setTimeout ( 'editFeed(' + param
+ ')' , 100 );
934 setTimeout ( "hotkey_prefix_timeout()" , 5 * 1000 );
937 exception_error ( "init_second_stage" , e
);
944 dojo
. registerModulePath ( "lib" , ".." );
945 dojo
. registerModulePath ( "fox" , "../../js/" );
947 dojo
. require ( "dijit.ColorPalette" );
948 dojo
. require ( "dijit.Dialog" );
949 dojo
. require ( "dijit.form.Button" );
950 dojo
. require ( "dijit.form.CheckBox" );
951 dojo
. require ( "dijit.form.DropDownButton" );
952 dojo
. require ( "dijit.form.FilteringSelect" );
953 dojo
. require ( "dijit.form.Form" );
954 dojo
. require ( "dijit.form.RadioButton" );
955 dojo
. require ( "dijit.form.Select" );
956 dojo
. require ( "dijit.form.SimpleTextarea" );
957 dojo
. require ( "dijit.form.TextBox" );
958 dojo
. require ( "dijit.form.ValidationTextBox" );
959 dojo
. require ( "dijit.InlineEditBox" );
960 dojo
. require ( "dijit.layout.AccordionContainer" );
961 dojo
. require ( "dijit.layout.BorderContainer" );
962 dojo
. require ( "dijit.layout.ContentPane" );
963 dojo
. require ( "dijit.layout.TabContainer" );
964 dojo
. require ( "dijit.Menu" );
965 dojo
. require ( "dijit.ProgressBar" );
966 dojo
. require ( "dijit.ProgressBar" );
967 dojo
. require ( "dijit.Toolbar" );
968 dojo
. require ( "dijit.Tree" );
969 dojo
. require ( "dijit.tree.dndSource" );
970 dojo
. require ( "dojo.data.ItemFileWriteStore" );
972 dojo
. require ( "lib.CheckBoxTree" );
973 dojo
. require ( "fox.PrefFeedTree" );
974 dojo
. require ( "fox.PrefFilterTree" );
975 dojo
. require ( "fox.PrefLabelTree" );
979 dojo
. addOnLoad ( function () {
980 loading_set_progress ( 50 );
982 new Ajax
. Request ( "backend.php" , {
983 parameters
: { op
: "rpc" , method
: "sanityCheck" },
984 onComplete : function ( transport
) {
985 backend_sanity_check_callback ( transport
);
990 exception_error ( "init" , e
);
994 function validatePrefsReset () {
996 var ok
= confirm ( __ ( "Reset to defaults?" ));
1000 query
= "?op=pref-prefs&method=resetconfig" ;
1003 new Ajax
. Request ( "backend.php" , {
1005 onComplete : function ( transport
) {
1006 var msg
= transport
. responseText
;
1007 if ( msg
. match ( "PREFS_THEME_CHANGED" )) {
1008 window
. location
. reload ();
1018 exception_error ( "validatePrefsReset" , e
);
1026 function pref_hotkey_handler ( e
) {
1028 if ( e
. target
. nodeName
== "INPUT" || e
. target
. nodeName
== "TEXTAREA" ) return ;
1030 var keycode
= false ;
1031 var shift_key
= false ;
1033 var cmdline
= $( 'cmdline' );
1036 shift_key
= e
. shiftKey
;
1042 keycode
= window
. event
. keyCode
;
1047 var keychar
= String
. fromCharCode ( keycode
);
1049 if ( keycode
== 27 ) { // escape
1050 if ( Element
. visible ( "hotkey_help_overlay" )) {
1051 Element
. hide ( "hotkey_help_overlay" );
1053 hotkey_prefix
= false ;
1057 if ( keycode
== 16 ) return ; // ignore lone shift
1058 if ( keycode
== 17 ) return ; // ignore lone ctrl
1060 if (( keycode
== 67 || keycode
== 71 ) && ! hotkey_prefix
) {
1061 hotkey_prefix
= keycode
;
1063 var date
= new Date ();
1064 var ts
= Math
. round ( date
. getTime () / 1000 );
1066 hotkey_prefix_pressed
= ts
;
1068 cmdline
. innerHTML
= keychar
;
1069 Element
. show ( cmdline
);
1071 console
. log ( "KP: PREFIX=" + keycode
+ " CHAR=" + keychar
);
1075 if ( Element
. visible ( "hotkey_help_overlay" )) {
1076 Element
. hide ( "hotkey_help_overlay" );
1079 if ( keycode
== 13 || keycode
== 27 ) {
1082 seq
= seq
+ "" + keycode
;
1085 /* Global hotkeys */
1087 Element
. hide ( cmdline
);
1089 if (! hotkey_prefix
) {
1091 if (( keycode
== 191 || keychar
== '?' ) && shift_key
) { // ?
1096 if ( keycode
== 191 || keychar
== '/' ) { // /
1097 var search_boxes
= new Array ( "label_search" ,
1098 "feed_search" , "filter_search" , "user_search" , "feed_browser_search" );
1100 for ( var i
= 0 ; i
< search_boxes
. length
; i
++) {
1101 var elem
= $( search_boxes
[ i
]);
1103 $( search_boxes
[ i
]). focus ();
1112 if ( hotkey_prefix
== 67 ) { // c
1113 hotkey_prefix
= false ;
1115 if ( keycode
== 70 ) { // f
1120 if ( keycode
== 83 ) { // s
1125 if ( keycode
== 85 ) { // u
1129 if ( keycode
== 67 ) { // c
1134 if ( keycode
== 84 && shift_key
) { // T
1143 if ( hotkey_prefix
== 71 ) { // g
1145 hotkey_prefix
= false ;
1147 if ( keycode
== 49 && $( "genConfigTab" )) { // 1
1148 selectTab ( "genConfig" );
1152 if ( keycode
== 50 && $( "feedConfigTab" )) { // 2
1153 selectTab ( "feedConfig" );
1157 if ( keycode
== 51 && $( "filterConfigTab" )) { // 4
1158 selectTab ( "filterConfig" );
1162 if ( keycode
== 52 && $( "labelConfigTab" )) { // 5
1163 selectTab ( "labelConfig" );
1167 if ( keycode
== 53 && $( "userConfigTab" )) { // 6
1168 selectTab ( "userConfig" );
1172 if ( keycode
== 88 ) { // x
1179 if ( seq
. match ( "8073717369" )) {
1187 if ( hotkey_prefix
) {
1188 console
. log ( "KP: PREFIX=" + hotkey_prefix
+ " CODE=" + keycode
+ " CHAR=" + keychar
);
1190 console
. log ( "KP: CODE=" + keycode
+ " CHAR=" + keychar
);
1194 exception_error ( "pref_hotkey_handler" , e
);
1198 function removeCategory ( id
, item
) {
1201 var ok
= confirm ( __ ( "Remove category %s? Any nested feeds would be placed into Uncategorized." ). replace ( "%s" , item
. name
));
1204 var query
= "?op=pref-feeds&method=removeCat&ids=" +
1207 notify_progress ( "Removing category..." );
1209 new Ajax
. Request ( "backend.php" , {
1211 onComplete : function ( transport
) {
1218 exception_error ( "removeCategory" , e
);
1222 function createCategory () {
1224 var title
= prompt ( __ ( "Category title:" ));
1228 notify_progress ( "Creating category..." );
1230 var query
= "?op=pref-feeds&method=addCat&cat=" +
1231 param_escape ( title
);
1233 new Ajax
. Request ( "backend.php" , {
1235 onComplete : function ( transport
) {
1242 exception_error ( "createCategory" , e
);
1246 function showInactiveFeeds () {
1248 var query
= "backend.php?op=dlg&method=inactiveFeeds" ;
1250 if ( dijit
. byId ( "inactiveFeedsDlg" ))
1251 dijit
. byId ( "inactiveFeedsDlg" ). destroyRecursive ();
1253 dialog
= new dijit
. Dialog ({
1254 id
: "inactiveFeedsDlg" ,
1255 title
: __ ( "Feeds without recent updates" ),
1256 style
: "width: 600px" ,
1257 getSelectedFeeds : function () {
1258 return getSelectedTableRowIds ( "prefInactiveFeedList" );
1260 removeSelected : function () {
1261 var sel_rows
= this . getSelectedFeeds ();
1263 console
. log ( sel_rows
);
1265 if ( sel_rows
. length
> 0 ) {
1266 var ok
= confirm ( __ ( "Remove selected feeds?" ));
1269 notify_progress ( "Removing selected feeds..." , true );
1271 var query
= "?op=pref-feeds&method=remove&ids=" +
1272 param_escape ( sel_rows
. toString ());
1274 new Ajax
. Request ( "backend.php" , {
1276 onComplete : function ( transport
) {
1284 alert ( __ ( "No feeds are selected." ));
1287 execute : function () {
1288 if ( this . validate ()) {
1296 exception_error ( "showInactiveFeeds" , e
);
1301 function opmlRegenKey () {
1304 var ok
= confirm ( __ ( "Replace current OPML publishing address with a new one?" ));
1308 notify_progress ( "Trying to change address..." , true );
1310 var query
= "?op=rpc&method=regenOPMLKey" ;
1312 new Ajax
. Request ( "backend.php" , {
1314 onComplete : function ( transport
) {
1315 var reply
= JSON
. parse ( transport
. responseText
);
1317 var new_link
= reply
. link
;
1319 var e
= $( 'pub_opml_url' );
1323 e
. innerHTML
= new_link
;
1325 new Effect
. Highlight ( e
);
1330 notify_error ( "Could not change feed URL." );
1335 exception_error ( "opmlRegenKey" , e
);
1340 function feedActionChange () {
1342 var chooser
= $( "feedActionChooser" );
1343 var opid
= chooser
[ chooser
. selectedIndex
]. value
;
1345 chooser
. selectedIndex
= 0 ;
1348 exception_error ( "feedActionChange" , e
);
1352 function feedActionGo ( op
) {
1354 if ( op
== "facEdit" ) {
1356 var rows
= getSelectedFeeds ();
1358 if ( rows
. length
> 1 ) {
1359 editSelectedFeeds ();
1365 if ( op
== "facClear" ) {
1366 clearSelectedFeeds ();
1369 if ( op
== "facPurge" ) {
1370 purgeSelectedFeeds ();
1373 if ( op
== "facEditCats" ) {
1377 if ( op
== "facRescore" ) {
1378 rescoreSelectedFeeds ();
1381 if ( op
== "facUnsubscribe" ) {
1382 removeSelectedFeeds ();
1386 exception_error ( "feedActionGo" , e
);
1391 function clearFeedArticles ( feed_id
) {
1393 notify_progress ( "Clearing feed..." );
1395 var query
= "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id
;
1397 new Ajax
. Request ( "backend.php" , {
1399 onComplete : function ( transport
) {
1406 function rescoreSelectedFeeds () {
1408 var sel_rows
= getSelectedFeeds ();
1410 if ( sel_rows
. length
> 0 ) {
1412 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1413 var ok
= confirm ( __ ( "Rescore articles in selected feeds?" ));
1416 notify_progress ( "Rescoring selected feeds..." , true );
1418 var query
= "?op=pref-feeds&method=rescore&quiet=1&ids=" +
1419 param_escape ( sel_rows
. toString ());
1421 new Ajax
. Request ( "backend.php" , {
1423 onComplete : function ( transport
) {
1424 notify_callback2 ( transport
);
1429 alert ( __ ( "No feeds are selected." ));
1435 function rescore_all_feeds () {
1436 var ok
= confirm ( __ ( "Rescore all articles? This operation may take a lot of time." ));
1439 notify_progress ( "Rescoring feeds..." , true );
1441 var query
= "?op=pref-feeds&method=rescoreAll&quiet=1" ;
1443 new Ajax
. Request ( "backend.php" , {
1445 onComplete : function ( transport
) {
1446 notify_callback2 ( transport
);
1451 function labelColorReset () {
1453 var labels
= getSelectedLabels ();
1455 if ( labels
. length
> 0 ) {
1456 var ok
= confirm ( __ ( "Reset selected labels to default colors?" ));
1459 var query
= "?op=pref-labels&method=colorreset&ids=" +
1460 param_escape ( labels
. toString ());
1462 new Ajax
. Request ( "backend.php" , {
1464 onComplete : function ( transport
) {
1470 alert ( __ ( "No labels are selected." ));
1474 exception_error ( "labelColorReset" , e
);
1479 function inPreferences () {
1483 function editProfiles () {
1486 if ( dijit
. byId ( "profileEditDlg" ))
1487 dijit
. byId ( "profileEditDlg" ). destroyRecursive ();
1489 var query
= "backend.php?op=dlg&method=editPrefProfiles" ;
1491 dialog
= new dijit
. Dialog ({
1492 id
: "profileEditDlg" ,
1493 title
: __ ( "Settings Profiles" ),
1494 style
: "width: 600px" ,
1495 getSelectedProfiles : function () {
1496 return getSelectedTableRowIds ( "prefFeedProfileList" );
1498 removeSelected : function () {
1499 var sel_rows
= this . getSelectedProfiles ();
1501 if ( sel_rows
. length
> 0 ) {
1502 var ok
= confirm ( __ ( "Remove selected profiles? Active and default profiles will not be removed." ));
1505 notify_progress ( "Removing selected profiles..." , true );
1507 var query
= "?op=rpc&method=remprofiles&ids=" +
1508 param_escape ( sel_rows
. toString ());
1510 new Ajax
. Request ( "backend.php" , {
1512 onComplete : function ( transport
) {
1520 alert ( __ ( "No profiles are selected." ));
1523 activateProfile : function () {
1524 var sel_rows
= this . getSelectedProfiles ();
1526 if ( sel_rows
. length
== 1 ) {
1528 var ok
= confirm ( __ ( "Activate selected profile?" ));
1531 notify_progress ( "Loading, please wait..." );
1533 var query
= "?op=rpc&method=setprofile&id=" +
1534 param_escape ( sel_rows
. toString ());
1536 new Ajax
. Request ( "backend.php" , {
1538 onComplete : function ( transport
) {
1539 window
. location
. reload ();
1544 alert ( __ ( "Please choose a profile to activate." ));
1547 addProfile : function () {
1548 if ( this . validate ()) {
1549 notify_progress ( "Creating profile..." , true );
1551 var query
= "?op=rpc&method=addprofile&title=" +
1552 param_escape ( dialog
. attr ( 'value' ). newprofile
);
1554 new Ajax
. Request ( "backend.php" , {
1556 onComplete : function ( transport
) {
1563 execute : function () {
1564 if ( this . validate ()) {
1571 exception_error ( "editProfiles" , e
);
1575 function activatePrefProfile () {
1577 var sel_rows
= getSelectedFeedCats ();
1579 if ( sel_rows
. length
== 1 ) {
1581 var ok
= confirm ( __ ( "Activate selected profile?" ));
1584 notify_progress ( "Loading, please wait..." );
1586 var query
= "?op=rpc&method=setprofile&id=" +
1587 param_escape ( sel_rows
. toString ());
1589 new Ajax
. Request ( "backend.php" , {
1591 onComplete : function ( transport
) {
1592 window
. location
. reload ();
1597 alert ( __ ( "Please choose a profile to activate." ));
1603 function clearFeedAccessKeys () {
1605 var ok
= confirm ( __ ( "This will invalidate all previously generated feed URLs. Continue?" ));
1608 notify_progress ( "Clearing URLs..." );
1610 var query
= "?op=rpc&method=clearKeys" ;
1612 new Ajax
. Request ( "backend.php" , {
1614 onComplete : function ( transport
) {
1615 notify_info ( "Generated URLs cleared." );
1622 function clearArticleAccessKeys () {
1624 var ok
= confirm ( __ ( "This will invalidate all previously shared article URLs. Continue?" ));
1627 notify_progress ( "Clearing URLs..." );
1629 var query
= "?op=rpc&method=clearArticleKeys" ;
1631 new Ajax
. Request ( "backend.php" , {
1633 onComplete : function ( transport
) {
1634 notify_info ( "Shared URLs cleared." );
1640 function resetFeedOrder () {
1642 notify_progress ( "Loading, please wait..." );
1644 new Ajax
. Request ( "backend.php" , {
1645 parameters
: "?op=pref-feeds&method=feedsortreset" ,
1646 onComplete : function ( transport
) {
1652 exception_error ( "resetFeedOrder" );
1656 function resetCatOrder () {
1658 notify_progress ( "Loading, please wait..." );
1660 new Ajax
. Request ( "backend.php" , {
1661 parameters
: "?op=pref-feeds&method=catsortreset" ,
1662 onComplete : function ( transport
) {
1668 exception_error ( "resetCatOrder" );
1672 function toggleHiddenFeedCats () {
1674 notify_progress ( "Loading, please wait..." );
1676 new Ajax
. Request ( "backend.php" , {
1677 parameters
: "?op=pref-feeds&method=togglehiddenfeedcats" ,
1678 onComplete : function ( transport
) {
1683 exception_error ( "toggleHiddenFeedCats" );
1687 function editCat ( id
, item
, event
) {
1689 var new_name
= prompt ( __ ( 'Rename category to:' ), item
. name
);
1691 if ( new_name
&& new_name
!= item
. name
) {
1693 notify_progress ( "Loading, please wait..." );
1695 new Ajax
. Request ( "backend.php" , {
1698 method
: 'renamecat' ,
1702 onComplete : function ( transport
) {
1708 exception_error ( "editCat" , e
);
1712 function editLabel ( id
, event
) {
1714 var query
= "backend.php?op=pref-labels&method=edit&id=" +
1717 if ( dijit
. byId ( "labelEditDlg" ))
1718 dijit
. byId ( "labelEditDlg" ). destroyRecursive ();
1720 dialog
= new dijit
. Dialog ({
1722 title
: __ ( "Label Editor" ),
1723 style
: "width: 600px" ,
1724 setLabelColor : function ( id
, fg
, bg
) {
1739 var query
= "?op=pref-labels&method=colorset&kind=" + kind
+
1740 "&ids=" + param_escape ( id
) + "&fg=" + param_escape ( fg
) +
1741 "&bg=" + param_escape ( bg
) + "&color=" + param_escape ( color
);
1743 // console.log(query);
1745 var e
= $( "LICID-" + id
);
1748 if ( fg
) e
. style
. color
= fg
;
1749 if ( bg
) e
. style
. backgroundColor
= bg
;
1752 new Ajax
. Request ( "backend.php" , { parameters
: query
});
1756 execute : function () {
1757 if ( this . validate ()) {
1758 var caption
= this . attr ( 'value' ). caption
;
1759 var fg_color
= this . attr ( 'value' ). fg_color
;
1760 var bg_color
= this . attr ( 'value' ). bg_color
;
1761 var query
= dojo
. objectToQuery ( this . attr ( 'value' ));
1763 dijit
. byId ( 'labelTree' ). setNameById ( id
, caption
);
1764 this . setLabelColor ( id
, fg_color
, bg_color
);
1767 new Ajax
. Request ( "backend.php" , {
1769 onComplete : function ( transport
) {
1779 exception_error ( "editLabel" , e
);
1783 function clearTwitterCredentials () {
1785 var ok
= confirm ( __ ( "This will clear your stored authentication information for Twitter. Continue?" ));
1788 notify_progress ( "Clearing credentials..." );
1790 var query
= "?op=pref-feeds&method=remtwitterinfo" ;
1792 new Ajax
. Request ( "backend.php" , {
1794 onComplete : function ( transport
) {
1795 notify_info ( "Twitter credentials have been cleared." );
1801 exception_error ( "clearTwitterCredentials" , e
);
1805 function customizeCSS () {
1807 var query
= "backend.php?op=dlg&method=customizeCSS" ;
1809 if ( dijit
. byId ( "cssEditDlg" ))
1810 dijit
. byId ( "cssEditDlg" ). destroyRecursive ();
1812 dialog
= new dijit
. Dialog ({
1814 title
: __ ( "Customize stylesheet" ),
1815 style
: "width: 600px" ,
1816 execute : function () {
1817 notify_progress ( 'Saving data...' , true );
1818 new Ajax
. Request ( "backend.php" , {
1819 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
1820 onComplete : function ( transport
) {
1822 window
. location
. reload ();
1831 exception_error ( "customizeCSS" , e
);
1835 function insertSSLserial ( value
) {
1837 dijit
. byId ( "SSL_CERT_SERIAL" ). attr ( 'value' , value
);
1839 exception_error ( "insertSSLcerial" , e
);
1843 function getSelectedInstances () {
1844 return getSelectedTableRowIds ( "prefInstanceList" );
1847 function addInstance () {
1849 var query
= "backend.php?op=dlg&method=addInstance" ;
1851 if ( dijit
. byId ( "instanceAddDlg" ))
1852 dijit
. byId ( "instanceAddDlg" ). destroyRecursive ();
1854 dialog
= new dijit
. Dialog ({
1855 id
: "instanceAddDlg" ,
1856 title
: __ ( "Link Instance" ),
1857 style
: "width: 600px" ,
1858 regenKey : function () {
1859 new Ajax
. Request ( "backend.php" , {
1860 parameters
: "?op=rpc&method=genHash" ,
1861 onComplete : function ( transport
) {
1862 var reply
= JSON
. parse ( transport
. responseText
);
1864 dijit
. byId ( 'instance_add_key' ). attr ( 'value' , reply
. hash
);
1868 execute : function () {
1869 if ( this . validate ()) {
1870 console
. warn ( dojo
. objectToQuery ( this . attr ( 'value' )));
1872 notify_progress ( 'Saving data...' , true );
1873 new Ajax
. Request ( "backend.php" , {
1874 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
1875 onComplete : function ( transport
) {
1878 updateInstanceList ();
1888 exception_error ( "addInstance" , e
);
1892 function editInstance ( id
, event
) {
1894 if (! event
|| ! event
. ctrlKey
) {
1896 selectTableRows ( 'prefInstanceList' , 'none' );
1897 selectTableRowById ( 'LIRR-' + id
, 'LICHK-' + id
, true );
1899 var query
= "backend.php?op=pref-instances&method=edit&id=" +
1902 if ( dijit
. byId ( "instanceEditDlg" ))
1903 dijit
. byId ( "instanceEditDlg" ). destroyRecursive ();
1905 dialog
= new dijit
. Dialog ({
1906 id
: "instanceEditDlg" ,
1907 title
: __ ( "Edit Instance" ),
1908 style
: "width: 600px" ,
1909 regenKey : function () {
1910 new Ajax
. Request ( "backend.php" , {
1911 parameters
: "?op=rpc&method=genHash" ,
1912 onComplete : function ( transport
) {
1913 var reply
= JSON
. parse ( transport
. responseText
);
1915 dijit
. byId ( 'instance_edit_key' ). attr ( 'value' , reply
. hash
);
1919 execute : function () {
1920 if ( this . validate ()) {
1921 // console.warn(dojo.objectToQuery(this.attr('value')));
1923 notify_progress ( 'Saving data...' , true );
1924 new Ajax
. Request ( "backend.php" , {
1925 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
1926 onComplete : function ( transport
) {
1929 updateInstanceList ();
1938 } else if ( event
. ctrlKey
) {
1939 var cb
= $( 'LICHK-' + id
);
1940 cb
. checked
= ! cb
. checked
;
1941 toggleSelectRow ( cb
);
1946 exception_error ( "editInstance" , e
);
1950 function removeSelectedInstances () {
1952 var sel_rows
= getSelectedInstances ();
1954 if ( sel_rows
. length
> 0 ) {
1956 var ok
= confirm ( __ ( "Remove selected instances?" ));
1959 notify_progress ( "Removing selected instances..." );
1961 var query
= "?op=pref-instances&method=remove&ids=" +
1962 param_escape ( sel_rows
. toString ());
1964 new Ajax
. Request ( "backend.php" , {
1966 onComplete : function ( transport
) {
1968 updateInstanceList ();
1973 alert ( __ ( "No instances are selected." ));
1977 exception_error ( "removeInstance" , e
);
1981 function editSelectedInstance () {
1982 var rows
= getSelectedInstances ();
1984 if ( rows
. length
== 0 ) {
1985 alert ( __ ( "No instances are selected." ));
1989 if ( rows
. length
> 1 ) {
1990 alert ( __ ( "Please select only one instance." ));
1996 editInstance ( rows
[ 0 ]);
1999 function showHelp () {
2001 new Ajax
. Request ( "backend.php" , {
2002 parameters
: "?op=backend&method=help&topic=prefs" ,
2003 onComplete : function ( transport
) {
2004 $( "hotkey_help_overlay" ). innerHTML
= transport
. responseText
;
2005 Effect
. Appear ( "hotkey_help_overlay" , { duration
: 0.3 });
2009 exception_error ( "showHelp" , e
);
2013 function exportData () {
2016 var query
= "backend.php?op=dlg&method=exportData" ;
2018 if ( dijit
. byId ( "dataExportDlg" ))
2019 dijit
. byId ( "dataExportDlg" ). destroyRecursive ();
2023 dialog
= new dijit
. Dialog ({
2024 id
: "dataExportDlg" ,
2025 title
: __ ( "Export Data" ),
2026 style
: "width: 600px" ,
2027 prepare : function () {
2029 notify_progress ( "Loading, please wait..." );
2031 new Ajax
. Request ( "backend.php" , {
2032 parameters
: "?op=rpc&method=exportrun&offset=" + exported
,
2033 onComplete : function ( transport
) {
2035 var rv
= JSON
. parse ( transport
. responseText
);
2037 if ( rv
&& rv
. exported
!= undefined ) {
2038 if ( rv
. exported
> 0 ) {
2040 exported
+= rv
. exported
;
2042 $( "export_status_message" ). innerHTML
=
2043 "<img src='images/indicator_tiny.gif'> " +
2044 "Exported %d articles, please wait..." . replace ( "%d" ,
2047 setTimeout ( 'dijit.byId("dataExportDlg").prepare()' , 2000 );
2051 $( "export_status_message" ). innerHTML
=
2052 __ ( "Finished, exported %d articles. You can download the data <a class='visibleLink' href='%u'>here</a>." )
2053 . replace ( "%d" , exported
)
2054 . replace ( "%u" , "backend.php?op=rpc&subop=exportget" );
2061 $( "export_status_message" ). innerHTML
=
2062 "Error occured, could not export data." ;
2065 exception_error ( "exportData" , e
, transport
. responseText
);
2073 execute : function () {
2074 if ( this . validate ()) {
2086 exception_error ( "exportData" , e
);
2090 function dataImportComplete ( iframe
) {
2092 if (! iframe
. contentDocument
. body
. innerHTML
) return false ;
2094 Element
. hide ( iframe
);
2098 if ( dijit
. byId ( 'dataImportDlg' ))
2099 dijit
. byId ( 'dataImportDlg' ). destroyRecursive ();
2101 var content
= iframe
. contentDocument
. body
. innerHTML
;
2103 dialog
= new dijit
. Dialog ({
2104 id
: "dataImportDlg" ,
2105 title
: __ ( "Data Import" ),
2106 style
: "width: 600px" ,
2107 onCancel : function () {
2115 exception_error ( "dataImportComplete" , e
);
2119 function gotoExportOpml ( filename
, settings
) {
2120 tmp
= settings
? 1 : 0 ;
2121 document
. location
. href
= "backend.php?op=opml&method=export&filename=" + filename
+ "&settings=" + tmp
;
2125 function batchSubscribe () {
2127 var query
= "backend.php?op=dlg&method=batchSubscribe" ;
2129 if ( dijit
. byId ( "batchSubDlg" ))
2130 dijit
. byId ( "batchSubDlg" ). destroyRecursive ();
2132 var dialog
= new dijit
. Dialog ({
2134 title
: __ ( "Batch subscribe" ),
2135 style
: "width: 600px" ,
2136 execute : function () {
2137 if ( this . validate ()) {
2138 console
. log ( dojo
. objectToQuery ( this . attr ( 'value' )));
2140 notify_progress ( __ ( "Subscribing to feeds..." ), true );
2142 new Ajax
. Request ( "backend.php" , {
2143 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
2144 onComplete : function ( transport
) {
2155 exception_error ( "batchSubscribe" , e
);
2159 function updateSelf () {
2161 var query
= "backend.php?op=pref-prefs&method=updateSelf" ;
2163 if ( dijit
. byId ( "updateSelfDlg" ))
2164 dijit
. byId ( "updateSelfDlg" ). destroyRecursive ();
2166 var dialog
= new dijit
. Dialog ({
2167 id
: "updateSelfDlg" ,
2168 title
: __ ( "Update Tiny Tiny RSS" ),
2169 style
: "width: 600px" ,
2171 performUpdate : function ( step
) {
2172 dijit
. byId ( "self_update_start_btn" ). attr ( "disabled" , true );
2173 dijit
. byId ( "self_update_stop_btn" ). attr ( "disabled" , true );
2175 notify_progress ( "Loading, please wait..." , true );
2176 new Ajax
. Request ( "backend.php" , {
2177 parameters
: "?op=pref-prefs&method=performUpdate&step=" + step
+
2178 "¶ms=" + param_escape ( JSON
. stringify ( dialog
. attr ( "update-params" ))),
2179 onComplete : function ( transport
) {
2181 rv
= JSON
. parse ( transport
. responseText
);
2185 rv
[ 'log' ]. each ( function ( line
) {
2186 $( "self_update_log" ). innerHTML
+= "<li>" + line
+ "</li>" ;
2189 dialog
. attr ( "update-params" , rv
[ 'params' ]);
2192 window
. setTimeout ( "dijit.byId('updateSelfDlg').performUpdate(" +( step
+ 1 )+ ")" , 500 );
2194 dijit
. byId ( "self_update_stop_btn" ). attr ( "disabled" , false );
2198 console
. log ( transport
. responseText
);
2199 notify_error ( "Received invalid data from server." );
2202 dialog
. attr ( "updated" , true );
2204 exception_error ( "updateSelf/inner" , e
);
2209 if ( dialog
. attr ( "updated" )) {
2210 window
. location
. reload ();
2216 if ( prompt ( __ ( "Live updating is considered experimental. Backup your tt-rss directory before continuing. Please type 'yes' to continue." )) == 'yes' ) {
2217 dialog
. performUpdate ( 0 );
2224 exception_error ( "batchSubscribe" , e
);
2228 function toggleAdvancedPrefs () {
2230 notify_progress ( "Loading, please wait..." );
2232 new Ajax
. Request ( "backend.php" , {
2233 parameters
: "?op=pref-prefs&method=toggleadvanced" ,
2234 onComplete : function ( transport
) {
2239 exception_error ( "toggleAdvancedPrefs" , e
);