]>
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 removeFilter : function () {
140 var title
= this . attr ( 'value' ). reg_exp
;
141 var msg
= __ ( "Remove filter %s?" ). replace ( "%s" , title
);
146 notify_progress ( "Removing filter..." );
148 var id
= this . attr ( 'value' ). id
;
150 var query
= "?op=pref-filters&method=remove&ids=" +
153 new Ajax
. Request ( "backend.php" , {
155 onComplete : function ( transport
) {
161 if ( this . validate ()) {
163 if ( dijit
. byId ( "filterTestDlg" ))
164 dijit
. byId ( "filterTestDlg" ). destroyRecursive ();
166 tdialog
= new dijit
. Dialog ({
168 title
: __ ( "Filter Test Results" ),
169 style
: "width: 600px" ,
170 href
: "backend.php?savemode=test&" +
171 dojo
. objectToQuery ( dialog
. attr ( 'value' )),
178 execute : function () {
179 if ( this . validate ()) {
181 var query
= "?op=rpc&method=verifyRegexp®_exp=" +
182 param_escape ( dialog
. attr ( 'value' ). reg_exp
);
184 notify_progress ( "Verifying regular expression..." );
186 new Ajax
. Request ( "backend.php" , {
188 onComplete : function ( transport
) {
189 var reply
= JSON
. parse ( transport
. responseText
);
194 if (! reply
[ 'status' ]) {
195 alert ( "Match regular expression seems to be invalid." );
198 notify_progress ( "Saving data..." , true );
200 console
. log ( dojo
. objectToQuery ( dialog
. attr ( 'value' )));
202 new Ajax
. Request ( "backend.php" , {
203 parameters
: dojo
. objectToQuery ( dialog
. attr ( 'value' )),
204 onComplete : function ( transport
) {
219 exception_error ( "editFilter" , e
);
223 function getSelectedLabels () {
224 var tree
= dijit
. byId ( "labelTree" );
225 var items
= tree
. model
. getCheckedItems ();
228 items
. each ( function ( item
) {
229 rv
. push ( tree
. model
. store
. getValue ( item
, 'bare_id' ));
235 function getSelectedUsers () {
236 return getSelectedTableRowIds ( "prefUserList" );
239 function getSelectedFeeds () {
240 var tree
= dijit
. byId ( "feedTree" );
241 var items
= tree
. model
. getCheckedItems ();
244 items
. each ( function ( item
) {
245 if ( item
. id
[ 0 ]. match ( "FEED:" ))
246 rv
. push ( tree
. model
. store
. getValue ( item
, 'bare_id' ));
252 function getSelectedFilters () {
253 var tree
= dijit
. byId ( "filterTree" );
254 var items
= tree
. model
. getCheckedItems ();
257 items
. each ( function ( item
) {
258 rv
. push ( tree
. model
. store
. getValue ( item
, 'bare_id' ));
265 /* function getSelectedFeedCats() {
266 return getSelectedTableRowIds("prefFeedCatList");
269 function removeSelectedLabels () {
271 var sel_rows
= getSelectedLabels ();
273 if ( sel_rows
. length
> 0 ) {
275 var ok
= confirm ( __ ( "Remove selected labels?" ));
278 notify_progress ( "Removing selected labels..." );
280 var query
= "?op=pref-labels&method=remove&ids=" +
281 param_escape ( sel_rows
. toString ());
283 new Ajax
. Request ( "backend.php" , {
285 onComplete : function ( transport
) {
291 alert ( __ ( "No labels are selected." ));
297 function removeSelectedUsers () {
301 var sel_rows
= getSelectedUsers ();
303 if ( sel_rows
. length
> 0 ) {
305 var ok
= confirm ( __ ( "Remove selected users? Neither default admin nor your account will be removed." ));
308 notify_progress ( "Removing selected users..." );
310 var query
= "?op=pref-users&method=remove&ids=" +
311 param_escape ( sel_rows
. toString ());
313 new Ajax
. Request ( "backend.php" , {
315 onComplete : function ( transport
) {
322 alert ( __ ( "No users are selected." ));
326 exception_error ( "removeSelectedUsers" , e
);
332 function removeSelectedFilters () {
336 var sel_rows
= getSelectedFilters ();
338 if ( sel_rows
. length
> 0 ) {
340 var ok
= confirm ( __ ( "Remove selected filters?" ));
343 notify_progress ( "Removing selected filters..." );
345 var query
= "?op=pref-filters&method=remove&ids=" +
346 param_escape ( sel_rows
. toString ());
348 new Ajax
. Request ( "backend.php" , {
350 onComplete : function ( transport
) {
355 alert ( __ ( "No filters are selected." ));
359 exception_error ( "removeSelectedFilters" , e
);
366 function removeSelectedFeeds () {
370 var sel_rows
= getSelectedFeeds ();
372 if ( sel_rows
. length
> 0 ) {
374 var ok
= confirm ( __ ( "Unsubscribe from selected feeds?" ));
378 notify_progress ( "Unsubscribing from selected feeds..." , true );
380 var query
= "?op=pref-feeds&method=remove&ids=" +
381 param_escape ( sel_rows
. toString ());
385 new Ajax
. Request ( "backend.php" , {
387 onComplete : function ( transport
) {
393 alert ( __ ( "No feeds are selected." ));
397 exception_error ( "removeSelectedFeeds" , e
);
403 function clearSelectedFeeds () {
405 var sel_rows
= getSelectedFeeds ();
407 if ( sel_rows
. length
> 1 ) {
408 alert ( __ ( "Please select only one feed." ));
412 if ( sel_rows
. length
> 0 ) {
414 var ok
= confirm ( __ ( "Erase all non-starred articles in selected feed?" ));
417 notify_progress ( "Clearing selected feed..." );
418 clearFeedArticles ( sel_rows
[ 0 ]);
423 alert ( __ ( "No feeds are selected." ));
430 function purgeSelectedFeeds () {
432 var sel_rows
= getSelectedFeeds ();
434 if ( sel_rows
. length
> 0 ) {
436 var pr
= prompt ( __ ( "How many days of articles to keep (0 - use default)?" ), "0" );
438 if ( pr
!= undefined ) {
439 notify_progress ( "Purging selected feed..." );
441 var query
= "?op=rpc&method=purge&ids=" +
442 param_escape ( sel_rows
. toString ()) + "&days=" + pr
;
446 new Ajax
. Request ( "prefs.php" , {
448 onComplete : function ( transport
) {
455 alert ( __ ( "No feeds are selected." ));
462 function userEditCancel () {
467 function userEditSave () {
471 var login
= document
. forms
[ "user_edit_form" ]. login
. value
;
473 if ( login
. length
== 0 ) {
474 alert ( __ ( "Login field cannot be blank." ));
478 notify_progress ( "Saving user..." );
482 var query
= Form
. serialize ( "user_edit_form" );
484 new Ajax
. Request ( "backend.php" , {
486 onComplete : function ( transport
) {
491 exception_error ( "userEditSave" , e
);
499 function editSelectedUser () {
500 var rows
= getSelectedUsers ();
502 if ( rows
. length
== 0 ) {
503 alert ( __ ( "No users are selected." ));
507 if ( rows
. length
> 1 ) {
508 alert ( __ ( "Please select only one user." ));
517 function resetSelectedUserPass () {
521 var rows
= getSelectedUsers ();
523 if ( rows
. length
== 0 ) {
524 alert ( __ ( "No users are selected." ));
528 if ( rows
. length
> 1 ) {
529 alert ( __ ( "Please select only one user." ));
533 var ok
= confirm ( __ ( "Reset password of selected user?" ));
536 notify_progress ( "Resetting password for selected user..." );
540 var query
= "?op=pref-users&method=resetPass&id=" +
543 new Ajax
. Request ( "backend.php" , {
545 onComplete : function ( transport
) {
546 notify_info ( transport
. responseText
);
552 exception_error ( "resetSelectedUserPass" , e
);
556 function selectedUserDetails () {
560 var rows
= getSelectedUsers ();
562 if ( rows
. length
== 0 ) {
563 alert ( __ ( "No users are selected." ));
567 if ( rows
. length
> 1 ) {
568 alert ( __ ( "Please select only one user." ));
572 notify_progress ( "Loading, please wait..." );
576 var query
= "?op=pref-users&method=userdetails&id=" + id
;
578 new Ajax
. Request ( "backend.php" , {
580 onComplete : function ( transport
) {
581 infobox_callback2 ( transport
);
584 exception_error ( "selectedUserDetails" , e
);
589 function editSelectedFilter () {
590 var rows
= getSelectedFilters ();
592 if ( rows
. length
== 0 ) {
593 alert ( __ ( "No filters are selected." ));
597 if ( rows
. length
> 1 ) {
598 alert ( __ ( "Please select only one filter." ));
609 function editSelectedFeed () {
610 var rows
= getSelectedFeeds ();
612 if ( rows
. length
== 0 ) {
613 alert ( __ ( "No feeds are selected." ));
617 if ( rows
. length
> 1 ) {
618 return editSelectedFeeds ();
623 editFeed ( rows
[ 0 ], {});
627 function editSelectedFeeds () {
630 var rows
= getSelectedFeeds ();
632 if ( rows
. length
== 0 ) {
633 alert ( __ ( "No feeds are selected." ));
637 notify_progress ( "Loading, please wait..." );
639 var query
= "backend.php?op=pref-feeds&method=editfeeds&ids=" +
640 param_escape ( rows
. toString ());
644 if ( dijit
. byId ( "feedEditDlg" ))
645 dijit
. byId ( "feedEditDlg" ). destroyRecursive ();
647 new Ajax
. Request ( "backend.php" , {
649 onComplete : function ( transport
) {
653 var dialog
= new dijit
. Dialog ({
655 title
: __ ( "Edit Multiple Feeds" ),
656 style
: "width: 600px" ,
657 getChildByName : function ( name
) {
659 this . getChildren (). each (
661 if ( child
. name
== name
) {
668 toggleField : function ( checkbox
, elem
, label
) {
669 this . getChildByName ( elem
). attr ( 'disabled' , ! checkbox
. checked
);
672 if ( checkbox
. checked
)
673 $( label
). removeClassName ( 'insensitive' );
675 $( label
). addClassName ( 'insensitive' );
678 execute : function () {
679 if ( this . validate () && confirm ( __ ( "Save changes to selected feeds?" ))) {
680 var query
= dojo
. objectToQuery ( this . attr ( 'value' ));
682 /* Form.serialize ignores unchecked checkboxes */
684 if (! query
. match ( "&rtl_content=" ) &&
685 this . getChildByName ( 'rtl_content' ). attr ( 'disabled' ) == false ) {
686 query
= query
+ "&rtl_content=false" ;
689 if (! query
. match ( "&private=" ) &&
690 this . getChildByName ( 'private' ). attr ( 'disabled' ) == false ) {
691 query
= query
+ "&private=false" ;
695 if (! query
. match ( "&cache_images=" ) &&
696 this . getChildByName ( 'cache_images' ). attr ( 'disabled' ) == false ) {
697 query
= query
+ "&cache_images=false" ;
701 if (! query
. match ( "&include_in_digest=" ) &&
702 this . getChildByName ( 'include_in_digest' ). attr ( 'disabled' ) == false ) {
703 query
= query
+ "&include_in_digest=false" ;
706 if (! query
. match ( "&always_display_enclosures=" ) &&
707 this . getChildByName ( 'always_display_enclosures' ). attr ( 'disabled' ) == false ) {
708 query
= query
+ "&always_display_enclosures=false" ;
711 if (! query
. match ( "&mark_unread_on_update=" ) &&
712 this . getChildByName ( 'mark_unread_on_update' ). attr ( 'disabled' ) == false ) {
713 query
= query
+ "&mark_unread_on_update=false" ;
716 if (! query
. match ( "&update_on_checksum_change=" ) &&
717 this . getChildByName ( 'update_on_checksum_change' ). attr ( 'disabled' ) == false ) {
718 query
= query
+ "&update_on_checksum_change=false" ;
723 notify_progress ( "Saving data..." , true );
725 new Ajax
. Request ( "backend.php" , {
727 onComplete : function ( transport
) {
733 content
: transport
. responseText
});
740 exception_error ( "editSelectedFeeds" , e
);
744 function piggie ( enable
) {
746 console
. log ( "I LOVEDED IT!" );
747 var piggie
= $( "piggie" );
749 Element
. show ( piggie
);
750 Position
. Center ( piggie
);
756 function opmlImportComplete ( iframe
) {
758 if (! iframe
. contentDocument
. body
. innerHTML
) return false ;
760 Element
. show ( iframe
);
764 if ( dijit
. byId ( 'opmlImportDlg' ))
765 dijit
. byId ( 'opmlImportDlg' ). destroyRecursive ();
767 var content
= iframe
. contentDocument
. body
. innerHTML
;
769 dialog
= new dijit
. Dialog ({
771 title
: __ ( "OPML Import" ),
772 style
: "width: 600px" ,
773 onCancel : function () {
778 execute : function () {
789 exception_error ( "opmlImportComplete" , e
);
793 function opmlImport () {
795 var opml_file
= $( "opml_file" );
797 if ( opml_file
. value
. length
== 0 ) {
798 alert ( __ ( "Please choose an OPML file first." ));
801 notify_progress ( "Importing, please wait..." , true );
803 Element
. show ( "upload_iframe" );
809 function importData () {
811 var file
= $( "export_file" );
813 if ( file
. value
. length
== 0 ) {
814 alert ( __ ( "Please choose the file first." ));
817 notify_progress ( "Importing, please wait..." , true );
819 Element
. show ( "data_upload_iframe" );
826 function updateFilterList () {
827 var user_search
= $( "filter_search" );
829 if ( user_search
) { search
= user_search
. value
; }
831 new Ajax
. Request ( "backend.php" , {
832 parameters
: "?op=pref-filters&search=" + param_escape ( search
),
833 onComplete : function ( transport
) {
834 dijit
. byId ( 'filterConfigTab' ). attr ( 'content' , transport
. responseText
);
839 function updateLabelList () {
840 new Ajax
. Request ( "backend.php" , {
841 parameters
: "?op=pref-labels" ,
842 onComplete : function ( transport
) {
843 dijit
. byId ( 'labelConfigTab' ). attr ( 'content' , transport
. responseText
);
848 function updatePrefsList () {
849 new Ajax
. Request ( "backend.php" , {
850 parameters
: "?op=pref-prefs" ,
851 onComplete : function ( transport
) {
852 dijit
. byId ( 'genConfigTab' ). attr ( 'content' , transport
. responseText
);
857 function selectTab ( id
, noupdate
, method
) {
860 notify_progress ( "Loading, please wait..." );
862 if ( id
== "feedConfig" ) {
864 } else if ( id
== "filterConfig" ) {
866 } else if ( id
== "labelConfig" ) {
868 } else if ( id
== "genConfig" ) {
870 } else if ( id
== "userConfig" ) {
874 var tab
= dijit
. byId ( id
+ "Tab" );
875 dijit
. byId ( "pref-tabs" ). selectChild ( tab
);
880 exception_error ( "selectTab" , e
);
884 function init_second_stage () {
887 document
. onkeydown
= pref_hotkey_handler
;
888 loading_set_progress ( 50 );
891 dojo
. addOnLoad ( function () {
892 var tab
= getURLParam ( 'tab' );
895 tab
= dijit
. byId ( tab
+ "Tab" );
896 if ( tab
) dijit
. byId ( "pref-tabs" ). selectChild ( tab
);
899 var method
= getURLParam ( 'method' );
901 if ( method
== 'editFeed' ) {
902 var param
= getURLParam ( 'methodparam' );
904 window
. setTimeout ( 'editFeed(' + param
+ ')' , 100 );
908 setTimeout ( "hotkey_prefix_timeout()" , 5 * 1000 );
911 exception_error ( "init_second_stage" , e
);
918 dojo
. registerModulePath ( "lib" , ".." );
919 dojo
. registerModulePath ( "fox" , "../../js/" );
921 dojo
. require ( "dijit.ColorPalette" );
922 dojo
. require ( "dijit.Dialog" );
923 dojo
. require ( "dijit.form.Button" );
924 dojo
. require ( "dijit.form.CheckBox" );
925 dojo
. require ( "dijit.form.DropDownButton" );
926 dojo
. require ( "dijit.form.FilteringSelect" );
927 dojo
. require ( "dijit.form.Form" );
928 dojo
. require ( "dijit.form.RadioButton" );
929 dojo
. require ( "dijit.form.Select" );
930 dojo
. require ( "dijit.form.SimpleTextarea" );
931 dojo
. require ( "dijit.form.TextBox" );
932 dojo
. require ( "dijit.form.ValidationTextBox" );
933 dojo
. require ( "dijit.InlineEditBox" );
934 dojo
. require ( "dijit.layout.AccordionContainer" );
935 dojo
. require ( "dijit.layout.BorderContainer" );
936 dojo
. require ( "dijit.layout.ContentPane" );
937 dojo
. require ( "dijit.layout.TabContainer" );
938 dojo
. require ( "dijit.Menu" );
939 dojo
. require ( "dijit.ProgressBar" );
940 dojo
. require ( "dijit.ProgressBar" );
941 dojo
. require ( "dijit.Toolbar" );
942 dojo
. require ( "dijit.Tree" );
943 dojo
. require ( "dijit.tree.dndSource" );
944 dojo
. require ( "dojo.data.ItemFileWriteStore" );
946 dojo
. require ( "lib.CheckBoxTree" );
947 dojo
. require ( "fox.PrefFeedTree" );
948 dojo
. require ( "fox.PrefFilterTree" );
949 dojo
. require ( "fox.PrefLabelTree" );
953 dojo
. addOnLoad ( function () {
954 loading_set_progress ( 50 );
956 new Ajax
. Request ( "backend.php" , {
957 parameters
: { op
: "rpc" , method
: "sanityCheck" },
958 onComplete : function ( transport
) {
959 backend_sanity_check_callback ( transport
);
964 exception_error ( "init" , e
);
968 function validatePrefsReset () {
970 var ok
= confirm ( __ ( "Reset to defaults?" ));
974 query
= "?op=pref-prefs&method=resetconfig" ;
977 new Ajax
. Request ( "backend.php" , {
979 onComplete : function ( transport
) {
980 var msg
= transport
. responseText
;
981 if ( msg
. match ( "PREFS_THEME_CHANGED" )) {
982 window
. location
. reload ();
992 exception_error ( "validatePrefsReset" , e
);
1000 function pref_hotkey_handler ( e
) {
1002 if ( e
. target
. nodeName
== "INPUT" || e
. target
. nodeName
== "TEXTAREA" ) return ;
1004 var keycode
= false ;
1005 var shift_key
= false ;
1007 var cmdline
= $( 'cmdline' );
1010 shift_key
= e
. shiftKey
;
1016 keycode
= window
. event
. keyCode
;
1021 var keychar
= String
. fromCharCode ( keycode
);
1023 if ( keycode
== 27 ) { // escape
1024 if ( Element
. visible ( "hotkey_help_overlay" )) {
1025 Element
. hide ( "hotkey_help_overlay" );
1027 hotkey_prefix
= false ;
1031 if ( keycode
== 16 ) return ; // ignore lone shift
1032 if ( keycode
== 17 ) return ; // ignore lone ctrl
1034 if (( keycode
== 67 || keycode
== 71 ) && ! hotkey_prefix
) {
1035 hotkey_prefix
= keycode
;
1037 var date
= new Date ();
1038 var ts
= Math
. round ( date
. getTime () / 1000 );
1040 hotkey_prefix_pressed
= ts
;
1042 cmdline
. innerHTML
= keychar
;
1043 Element
. show ( cmdline
);
1045 console
. log ( "KP: PREFIX=" + keycode
+ " CHAR=" + keychar
);
1049 if ( Element
. visible ( "hotkey_help_overlay" )) {
1050 Element
. hide ( "hotkey_help_overlay" );
1053 if ( keycode
== 13 || keycode
== 27 ) {
1056 seq
= seq
+ "" + keycode
;
1059 /* Global hotkeys */
1061 Element
. hide ( cmdline
);
1063 if (! hotkey_prefix
) {
1065 if (( keycode
== 191 || keychar
== '?' ) && shift_key
) { // ?
1070 if ( keycode
== 191 || keychar
== '/' ) { // /
1071 var search_boxes
= new Array ( "label_search" ,
1072 "feed_search" , "filter_search" , "user_search" , "feed_browser_search" );
1074 for ( var i
= 0 ; i
< search_boxes
. length
; i
++) {
1075 var elem
= $( search_boxes
[ i
]);
1077 $( search_boxes
[ i
]). focus ();
1086 if ( hotkey_prefix
== 67 ) { // c
1087 hotkey_prefix
= false ;
1089 if ( keycode
== 70 ) { // f
1094 if ( keycode
== 83 ) { // s
1099 if ( keycode
== 85 ) { // u
1103 if ( keycode
== 67 ) { // c
1108 if ( keycode
== 84 && shift_key
) { // T
1117 if ( hotkey_prefix
== 71 ) { // g
1119 hotkey_prefix
= false ;
1121 if ( keycode
== 49 && $( "genConfigTab" )) { // 1
1122 selectTab ( "genConfig" );
1126 if ( keycode
== 50 && $( "feedConfigTab" )) { // 2
1127 selectTab ( "feedConfig" );
1131 if ( keycode
== 51 && $( "filterConfigTab" )) { // 4
1132 selectTab ( "filterConfig" );
1136 if ( keycode
== 52 && $( "labelConfigTab" )) { // 5
1137 selectTab ( "labelConfig" );
1141 if ( keycode
== 53 && $( "userConfigTab" )) { // 6
1142 selectTab ( "userConfig" );
1146 if ( keycode
== 88 ) { // x
1153 if ( seq
. match ( "8073717369" )) {
1161 if ( hotkey_prefix
) {
1162 console
. log ( "KP: PREFIX=" + hotkey_prefix
+ " CODE=" + keycode
+ " CHAR=" + keychar
);
1164 console
. log ( "KP: CODE=" + keycode
+ " CHAR=" + keychar
);
1168 exception_error ( "pref_hotkey_handler" , e
);
1172 function removeCategory ( id
, item
) {
1175 var ok
= confirm ( __ ( "Remove category %s? Any nested feeds would be placed into Uncategorized." ). replace ( "%s" , item
. name
));
1178 var query
= "?op=pref-feeds&method=removeCat&ids=" +
1181 notify_progress ( "Removing category..." );
1183 new Ajax
. Request ( "backend.php" , {
1185 onComplete : function ( transport
) {
1192 exception_error ( "removeCategory" , e
);
1196 function createCategory () {
1198 var title
= prompt ( __ ( "Category title:" ));
1202 notify_progress ( "Creating category..." );
1204 var query
= "?op=pref-feeds&method=addCat&cat=" +
1205 param_escape ( title
);
1207 new Ajax
. Request ( "backend.php" , {
1209 onComplete : function ( transport
) {
1216 exception_error ( "createCategory" , e
);
1220 function showInactiveFeeds () {
1222 var query
= "backend.php?op=dlg&method=inactiveFeeds" ;
1224 if ( dijit
. byId ( "inactiveFeedsDlg" ))
1225 dijit
. byId ( "inactiveFeedsDlg" ). destroyRecursive ();
1227 dialog
= new dijit
. Dialog ({
1228 id
: "inactiveFeedsDlg" ,
1229 title
: __ ( "Feeds without recent updates" ),
1230 style
: "width: 600px" ,
1231 getSelectedFeeds : function () {
1232 return getSelectedTableRowIds ( "prefInactiveFeedList" );
1234 removeSelected : function () {
1235 var sel_rows
= this . getSelectedFeeds ();
1237 console
. log ( sel_rows
);
1239 if ( sel_rows
. length
> 0 ) {
1240 var ok
= confirm ( __ ( "Remove selected feeds?" ));
1243 notify_progress ( "Removing selected feeds..." , true );
1245 var query
= "?op=pref-feeds&method=remove&ids=" +
1246 param_escape ( sel_rows
. toString ());
1248 new Ajax
. Request ( "backend.php" , {
1250 onComplete : function ( transport
) {
1258 alert ( __ ( "No feeds are selected." ));
1261 execute : function () {
1262 if ( this . validate ()) {
1270 exception_error ( "showInactiveFeeds" , e
);
1275 function opmlRegenKey () {
1278 var ok
= confirm ( __ ( "Replace current OPML publishing address with a new one?" ));
1282 notify_progress ( "Trying to change address..." , true );
1284 var query
= "?op=rpc&method=regenOPMLKey" ;
1286 new Ajax
. Request ( "backend.php" , {
1288 onComplete : function ( transport
) {
1289 var reply
= JSON
. parse ( transport
. responseText
);
1291 var new_link
= reply
. link
;
1293 var e
= $( 'pub_opml_url' );
1297 e
. innerHTML
= new_link
;
1299 new Effect
. Highlight ( e
);
1304 notify_error ( "Could not change feed URL." );
1309 exception_error ( "opmlRegenKey" , e
);
1314 function feedActionChange () {
1316 var chooser
= $( "feedActionChooser" );
1317 var opid
= chooser
[ chooser
. selectedIndex
]. value
;
1319 chooser
. selectedIndex
= 0 ;
1322 exception_error ( "feedActionChange" , e
);
1326 function feedActionGo ( op
) {
1328 if ( op
== "facEdit" ) {
1330 var rows
= getSelectedFeeds ();
1332 if ( rows
. length
> 1 ) {
1333 editSelectedFeeds ();
1339 if ( op
== "facClear" ) {
1340 clearSelectedFeeds ();
1343 if ( op
== "facPurge" ) {
1344 purgeSelectedFeeds ();
1347 if ( op
== "facEditCats" ) {
1351 if ( op
== "facRescore" ) {
1352 rescoreSelectedFeeds ();
1355 if ( op
== "facUnsubscribe" ) {
1356 removeSelectedFeeds ();
1360 exception_error ( "feedActionGo" , e
);
1365 function clearFeedArticles ( feed_id
) {
1367 notify_progress ( "Clearing feed..." );
1369 var query
= "?op=pref-feeds&quiet=1&method=clear&id=" + feed_id
;
1371 new Ajax
. Request ( "backend.php" , {
1373 onComplete : function ( transport
) {
1380 function rescoreSelectedFeeds () {
1382 var sel_rows
= getSelectedFeeds ();
1384 if ( sel_rows
. length
> 0 ) {
1386 //var ok = confirm(__("Rescore last 100 articles in selected feeds?"));
1387 var ok
= confirm ( __ ( "Rescore articles in selected feeds?" ));
1390 notify_progress ( "Rescoring selected feeds..." , true );
1392 var query
= "?op=pref-feeds&method=rescore&quiet=1&ids=" +
1393 param_escape ( sel_rows
. toString ());
1395 new Ajax
. Request ( "backend.php" , {
1397 onComplete : function ( transport
) {
1398 notify_callback2 ( transport
);
1403 alert ( __ ( "No feeds are selected." ));
1409 function rescore_all_feeds () {
1410 var ok
= confirm ( __ ( "Rescore all articles? This operation may take a lot of time." ));
1413 notify_progress ( "Rescoring feeds..." , true );
1415 var query
= "?op=pref-feeds&method=rescoreAll&quiet=1" ;
1417 new Ajax
. Request ( "backend.php" , {
1419 onComplete : function ( transport
) {
1420 notify_callback2 ( transport
);
1425 function labelColorReset () {
1427 var labels
= getSelectedLabels ();
1429 if ( labels
. length
> 0 ) {
1430 var ok
= confirm ( __ ( "Reset selected labels to default colors?" ));
1433 var query
= "?op=pref-labels&method=colorreset&ids=" +
1434 param_escape ( labels
. toString ());
1436 new Ajax
. Request ( "backend.php" , {
1438 onComplete : function ( transport
) {
1444 alert ( __ ( "No labels are selected." ));
1448 exception_error ( "labelColorReset" , e
);
1453 function inPreferences () {
1457 function editProfiles () {
1460 if ( dijit
. byId ( "profileEditDlg" ))
1461 dijit
. byId ( "profileEditDlg" ). destroyRecursive ();
1463 var query
= "backend.php?op=dlg&method=editPrefProfiles" ;
1465 dialog
= new dijit
. Dialog ({
1466 id
: "profileEditDlg" ,
1467 title
: __ ( "Settings Profiles" ),
1468 style
: "width: 600px" ,
1469 getSelectedProfiles : function () {
1470 return getSelectedTableRowIds ( "prefFeedProfileList" );
1472 removeSelected : function () {
1473 var sel_rows
= this . getSelectedProfiles ();
1475 if ( sel_rows
. length
> 0 ) {
1476 var ok
= confirm ( __ ( "Remove selected profiles? Active and default profiles will not be removed." ));
1479 notify_progress ( "Removing selected profiles..." , true );
1481 var query
= "?op=rpc&method=remprofiles&ids=" +
1482 param_escape ( sel_rows
. toString ());
1484 new Ajax
. Request ( "backend.php" , {
1486 onComplete : function ( transport
) {
1494 alert ( __ ( "No profiles are selected." ));
1497 activateProfile : function () {
1498 var sel_rows
= this . getSelectedProfiles ();
1500 if ( sel_rows
. length
== 1 ) {
1502 var ok
= confirm ( __ ( "Activate selected profile?" ));
1505 notify_progress ( "Loading, please wait..." );
1507 var query
= "?op=rpc&method=setprofile&id=" +
1508 param_escape ( sel_rows
. toString ());
1510 new Ajax
. Request ( "backend.php" , {
1512 onComplete : function ( transport
) {
1513 window
. location
. reload ();
1518 alert ( __ ( "Please choose a profile to activate." ));
1521 addProfile : function () {
1522 if ( this . validate ()) {
1523 notify_progress ( "Creating profile..." , true );
1525 var query
= "?op=rpc&method=addprofile&title=" +
1526 param_escape ( dialog
. attr ( 'value' ). newprofile
);
1528 new Ajax
. Request ( "backend.php" , {
1530 onComplete : function ( transport
) {
1537 execute : function () {
1538 if ( this . validate ()) {
1545 exception_error ( "editProfiles" , e
);
1549 function activatePrefProfile () {
1551 var sel_rows
= getSelectedFeedCats ();
1553 if ( sel_rows
. length
== 1 ) {
1555 var ok
= confirm ( __ ( "Activate selected profile?" ));
1558 notify_progress ( "Loading, please wait..." );
1560 var query
= "?op=rpc&method=setprofile&id=" +
1561 param_escape ( sel_rows
. toString ());
1563 new Ajax
. Request ( "backend.php" , {
1565 onComplete : function ( transport
) {
1566 window
. location
. reload ();
1571 alert ( __ ( "Please choose a profile to activate." ));
1577 function clearFeedAccessKeys () {
1579 var ok
= confirm ( __ ( "This will invalidate all previously generated feed URLs. Continue?" ));
1582 notify_progress ( "Clearing URLs..." );
1584 var query
= "?op=rpc&method=clearKeys" ;
1586 new Ajax
. Request ( "backend.php" , {
1588 onComplete : function ( transport
) {
1589 notify_info ( "Generated URLs cleared." );
1596 function clearArticleAccessKeys () {
1598 var ok
= confirm ( __ ( "This will invalidate all previously shared article URLs. Continue?" ));
1601 notify_progress ( "Clearing URLs..." );
1603 var query
= "?op=rpc&method=clearArticleKeys" ;
1605 new Ajax
. Request ( "backend.php" , {
1607 onComplete : function ( transport
) {
1608 notify_info ( "Shared URLs cleared." );
1614 function resetFeedOrder () {
1616 notify_progress ( "Loading, please wait..." );
1618 new Ajax
. Request ( "backend.php" , {
1619 parameters
: "?op=pref-feeds&method=feedsortreset" ,
1620 onComplete : function ( transport
) {
1626 exception_error ( "resetFeedOrder" );
1630 function resetCatOrder () {
1632 notify_progress ( "Loading, please wait..." );
1634 new Ajax
. Request ( "backend.php" , {
1635 parameters
: "?op=pref-feeds&method=catsortreset" ,
1636 onComplete : function ( transport
) {
1642 exception_error ( "resetCatOrder" );
1646 function toggleHiddenFeedCats () {
1648 notify_progress ( "Loading, please wait..." );
1650 new Ajax
. Request ( "backend.php" , {
1651 parameters
: "?op=pref-feeds&method=togglehiddenfeedcats" ,
1652 onComplete : function ( transport
) {
1657 exception_error ( "toggleHiddenFeedCats" );
1661 function editCat ( id
, item
, event
) {
1663 var new_name
= prompt ( __ ( 'Rename category to:' ), item
. name
);
1665 if ( new_name
&& new_name
!= item
. name
) {
1667 notify_progress ( "Loading, please wait..." );
1669 new Ajax
. Request ( "backend.php" , {
1672 method
: 'renamecat' ,
1676 onComplete : function ( transport
) {
1682 exception_error ( "editCat" , e
);
1686 function editLabel ( id
, event
) {
1688 var query
= "backend.php?op=pref-labels&method=edit&id=" +
1691 if ( dijit
. byId ( "labelEditDlg" ))
1692 dijit
. byId ( "labelEditDlg" ). destroyRecursive ();
1694 dialog
= new dijit
. Dialog ({
1696 title
: __ ( "Label Editor" ),
1697 style
: "width: 600px" ,
1698 setLabelColor : function ( id
, fg
, bg
) {
1713 var query
= "?op=pref-labels&method=colorset&kind=" + kind
+
1714 "&ids=" + param_escape ( id
) + "&fg=" + param_escape ( fg
) +
1715 "&bg=" + param_escape ( bg
) + "&color=" + param_escape ( color
);
1717 // console.log(query);
1719 var e
= $( "LICID-" + id
);
1722 if ( fg
) e
. style
. color
= fg
;
1723 if ( bg
) e
. style
. backgroundColor
= bg
;
1726 new Ajax
. Request ( "backend.php" , { parameters
: query
});
1730 execute : function () {
1731 if ( this . validate ()) {
1732 var caption
= this . attr ( 'value' ). caption
;
1733 var fg_color
= this . attr ( 'value' ). fg_color
;
1734 var bg_color
= this . attr ( 'value' ). bg_color
;
1735 var query
= dojo
. objectToQuery ( this . attr ( 'value' ));
1737 dijit
. byId ( 'labelTree' ). setNameById ( id
, caption
);
1738 this . setLabelColor ( id
, fg_color
, bg_color
);
1741 new Ajax
. Request ( "backend.php" , {
1743 onComplete : function ( transport
) {
1753 exception_error ( "editLabel" , e
);
1757 function clearTwitterCredentials () {
1759 var ok
= confirm ( __ ( "This will clear your stored authentication information for Twitter. Continue?" ));
1762 notify_progress ( "Clearing credentials..." );
1764 var query
= "?op=pref-feeds&method=remtwitterinfo" ;
1766 new Ajax
. Request ( "backend.php" , {
1768 onComplete : function ( transport
) {
1769 notify_info ( "Twitter credentials have been cleared." );
1775 exception_error ( "clearTwitterCredentials" , e
);
1779 function customizeCSS () {
1781 var query
= "backend.php?op=dlg&method=customizeCSS" ;
1783 if ( dijit
. byId ( "cssEditDlg" ))
1784 dijit
. byId ( "cssEditDlg" ). destroyRecursive ();
1786 dialog
= new dijit
. Dialog ({
1788 title
: __ ( "Customize stylesheet" ),
1789 style
: "width: 600px" ,
1790 execute : function () {
1791 notify_progress ( 'Saving data...' , true );
1792 new Ajax
. Request ( "backend.php" , {
1793 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
1794 onComplete : function ( transport
) {
1796 window
. location
. reload ();
1805 exception_error ( "customizeCSS" , e
);
1809 function insertSSLserial ( value
) {
1811 dijit
. byId ( "SSL_CERT_SERIAL" ). attr ( 'value' , value
);
1813 exception_error ( "insertSSLcerial" , e
);
1817 function getSelectedInstances () {
1818 return getSelectedTableRowIds ( "prefInstanceList" );
1821 function addInstance () {
1823 var query
= "backend.php?op=dlg&method=addInstance" ;
1825 if ( dijit
. byId ( "instanceAddDlg" ))
1826 dijit
. byId ( "instanceAddDlg" ). destroyRecursive ();
1828 dialog
= new dijit
. Dialog ({
1829 id
: "instanceAddDlg" ,
1830 title
: __ ( "Link Instance" ),
1831 style
: "width: 600px" ,
1832 regenKey : function () {
1833 new Ajax
. Request ( "backend.php" , {
1834 parameters
: "?op=rpc&method=genHash" ,
1835 onComplete : function ( transport
) {
1836 var reply
= JSON
. parse ( transport
. responseText
);
1838 dijit
. byId ( 'instance_add_key' ). attr ( 'value' , reply
. hash
);
1842 execute : function () {
1843 if ( this . validate ()) {
1844 console
. warn ( dojo
. objectToQuery ( this . attr ( 'value' )));
1846 notify_progress ( 'Saving data...' , true );
1847 new Ajax
. Request ( "backend.php" , {
1848 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
1849 onComplete : function ( transport
) {
1852 updateInstanceList ();
1862 exception_error ( "addInstance" , e
);
1866 function editInstance ( id
, event
) {
1868 if (! event
|| ! event
. ctrlKey
) {
1870 selectTableRows ( 'prefInstanceList' , 'none' );
1871 selectTableRowById ( 'LIRR-' + id
, 'LICHK-' + id
, true );
1873 var query
= "backend.php?op=pref-instances&method=edit&id=" +
1876 if ( dijit
. byId ( "instanceEditDlg" ))
1877 dijit
. byId ( "instanceEditDlg" ). destroyRecursive ();
1879 dialog
= new dijit
. Dialog ({
1880 id
: "instanceEditDlg" ,
1881 title
: __ ( "Edit Instance" ),
1882 style
: "width: 600px" ,
1883 regenKey : function () {
1884 new Ajax
. Request ( "backend.php" , {
1885 parameters
: "?op=rpc&method=genHash" ,
1886 onComplete : function ( transport
) {
1887 var reply
= JSON
. parse ( transport
. responseText
);
1889 dijit
. byId ( 'instance_edit_key' ). attr ( 'value' , reply
. hash
);
1893 execute : function () {
1894 if ( this . validate ()) {
1895 // console.warn(dojo.objectToQuery(this.attr('value')));
1897 notify_progress ( 'Saving data...' , true );
1898 new Ajax
. Request ( "backend.php" , {
1899 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
1900 onComplete : function ( transport
) {
1903 updateInstanceList ();
1912 } else if ( event
. ctrlKey
) {
1913 var cb
= $( 'LICHK-' + id
);
1914 cb
. checked
= ! cb
. checked
;
1915 toggleSelectRow ( cb
);
1920 exception_error ( "editInstance" , e
);
1924 function removeSelectedInstances () {
1926 var sel_rows
= getSelectedInstances ();
1928 if ( sel_rows
. length
> 0 ) {
1930 var ok
= confirm ( __ ( "Remove selected instances?" ));
1933 notify_progress ( "Removing selected instances..." );
1935 var query
= "?op=pref-instances&method=remove&ids=" +
1936 param_escape ( sel_rows
. toString ());
1938 new Ajax
. Request ( "backend.php" , {
1940 onComplete : function ( transport
) {
1942 updateInstanceList ();
1947 alert ( __ ( "No instances are selected." ));
1951 exception_error ( "removeInstance" , e
);
1955 function editSelectedInstance () {
1956 var rows
= getSelectedInstances ();
1958 if ( rows
. length
== 0 ) {
1959 alert ( __ ( "No instances are selected." ));
1963 if ( rows
. length
> 1 ) {
1964 alert ( __ ( "Please select only one instance." ));
1970 editInstance ( rows
[ 0 ]);
1973 function showHelp () {
1975 new Ajax
. Request ( "backend.php" , {
1976 parameters
: "?op=backend&method=help&topic=prefs" ,
1977 onComplete : function ( transport
) {
1978 $( "hotkey_help_overlay" ). innerHTML
= transport
. responseText
;
1979 Effect
. Appear ( "hotkey_help_overlay" , { duration
: 0.3 });
1983 exception_error ( "showHelp" , e
);
1987 function exportData () {
1990 var query
= "backend.php?op=dlg&method=exportData" ;
1992 if ( dijit
. byId ( "dataExportDlg" ))
1993 dijit
. byId ( "dataExportDlg" ). destroyRecursive ();
1997 dialog
= new dijit
. Dialog ({
1998 id
: "dataExportDlg" ,
1999 title
: __ ( "Export Data" ),
2000 style
: "width: 600px" ,
2001 prepare : function () {
2003 notify_progress ( "Loading, please wait..." );
2005 new Ajax
. Request ( "backend.php" , {
2006 parameters
: "?op=rpc&method=exportrun&offset=" + exported
,
2007 onComplete : function ( transport
) {
2009 var rv
= JSON
. parse ( transport
. responseText
);
2011 if ( rv
&& rv
. exported
!= undefined ) {
2012 if ( rv
. exported
> 0 ) {
2014 exported
+= rv
. exported
;
2016 $( "export_status_message" ). innerHTML
=
2017 "<img src='images/indicator_tiny.gif'> " +
2018 "Exported %d articles, please wait..." . replace ( "%d" ,
2021 setTimeout ( 'dijit.byId("dataExportDlg").prepare()' , 2000 );
2025 $( "export_status_message" ). innerHTML
=
2026 __ ( "Finished, exported %d articles. You can download the data <a class='visibleLink' href='%u'>here</a>." )
2027 . replace ( "%d" , exported
)
2028 . replace ( "%u" , "backend.php?op=rpc&subop=exportget" );
2035 $( "export_status_message" ). innerHTML
=
2036 "Error occured, could not export data." ;
2039 exception_error ( "exportData" , e
, transport
. responseText
);
2047 execute : function () {
2048 if ( this . validate ()) {
2060 exception_error ( "exportData" , e
);
2064 function dataImportComplete ( iframe
) {
2066 if (! iframe
. contentDocument
. body
. innerHTML
) return false ;
2068 Element
. hide ( iframe
);
2072 if ( dijit
. byId ( 'dataImportDlg' ))
2073 dijit
. byId ( 'dataImportDlg' ). destroyRecursive ();
2075 var content
= iframe
. contentDocument
. body
. innerHTML
;
2077 dialog
= new dijit
. Dialog ({
2078 id
: "dataImportDlg" ,
2079 title
: __ ( "Data Import" ),
2080 style
: "width: 600px" ,
2081 onCancel : function () {
2089 exception_error ( "dataImportComplete" , e
);
2093 function gotoExportOpml ( filename
, settings
) {
2094 tmp
= settings
? 1 : 0 ;
2095 document
. location
. href
= "backend.php?op=opml&method=export&filename=" + filename
+ "&settings=" + tmp
;
2099 function batchSubscribe () {
2101 var query
= "backend.php?op=dlg&method=batchSubscribe" ;
2103 if ( dijit
. byId ( "batchSubDlg" ))
2104 dijit
. byId ( "batchSubDlg" ). destroyRecursive ();
2106 var dialog
= new dijit
. Dialog ({
2108 title
: __ ( "Batch subscribe" ),
2109 style
: "width: 600px" ,
2110 execute : function () {
2111 if ( this . validate ()) {
2112 console
. log ( dojo
. objectToQuery ( this . attr ( 'value' )));
2114 notify_progress ( __ ( "Subscribing to feeds..." ), true );
2116 new Ajax
. Request ( "backend.php" , {
2117 parameters
: dojo
. objectToQuery ( this . attr ( 'value' )),
2118 onComplete : function ( transport
) {
2129 exception_error ( "batchSubscribe" , e
);
2133 function updateSelf () {
2135 var query
= "backend.php?op=pref-prefs&method=updateSelf" ;
2137 if ( dijit
. byId ( "updateSelfDlg" ))
2138 dijit
. byId ( "updateSelfDlg" ). destroyRecursive ();
2140 var dialog
= new dijit
. Dialog ({
2141 id
: "updateSelfDlg" ,
2142 title
: __ ( "Update Tiny Tiny RSS" ),
2143 style
: "width: 600px" ,
2145 performUpdate : function ( step
) {
2146 dijit
. byId ( "self_update_start_btn" ). attr ( "disabled" , true );
2147 dijit
. byId ( "self_update_stop_btn" ). attr ( "disabled" , true );
2149 notify_progress ( "Loading, please wait..." , true );
2150 new Ajax
. Request ( "backend.php" , {
2151 parameters
: "?op=pref-prefs&method=performUpdate&step=" + step
+
2152 "¶ms=" + param_escape ( JSON
. stringify ( dialog
. attr ( "update-params" ))),
2153 onComplete : function ( transport
) {
2155 rv
= JSON
. parse ( transport
. responseText
);
2159 rv
[ 'log' ]. each ( function ( line
) {
2160 $( "self_update_log" ). innerHTML
+= "<li>" + line
+ "</li>" ;
2163 dialog
. attr ( "update-params" , rv
[ 'params' ]);
2166 window
. setTimeout ( "dijit.byId('updateSelfDlg').performUpdate(" +( step
+ 1 )+ ")" , 500 );
2168 dijit
. byId ( "self_update_stop_btn" ). attr ( "disabled" , false );
2172 console
. log ( transport
. responseText
);
2173 notify_error ( "Received invalid data from server." );
2176 dialog
. attr ( "updated" , true );
2178 exception_error ( "updateSelf/inner" , e
);
2183 if ( dialog
. attr ( "updated" )) {
2184 window
. location
. reload ();
2190 if ( prompt ( __ ( "Live updating is considered experimental. Backup your tt-rss directory before continuing. Please type 'yes' to continue." )) == 'yes' ) {
2191 dialog
. performUpdate ( 0 );
2198 exception_error ( "batchSubscribe" , e
);