2010-11-19 13:08:02 +00:00
var loading _progress = 0 ;
2010-09-13 11:14:18 +00:00
var sanity _check _done = false ;
2011-12-26 08:02:52 +00:00
var init _params = { } ;
2013-03-27 05:40:07 +00:00
var _label _base _index = - 1024 ;
2013-04-17 06:50:46 +00:00
var notify _hide _timerid = false ;
2011-12-26 08:02:52 +00:00
Ajax . Base . prototype . initialize = Ajax . Base . prototype . initialize . wrap (
function ( callOriginal , options ) {
if ( getInitParam ( "csrf_token" ) != undefined ) {
Object . extend ( options , options || { } ) ;
if ( Object . isString ( options . parameters ) )
options . parameters = options . parameters . toQueryParams ( ) ;
else if ( Object . isHash ( options . parameters ) )
options . parameters = options . parameters . toObject ( ) ;
options . parameters [ "csrf_token" ] = getInitParam ( "csrf_token" ) ;
}
return callOriginal ( options ) ;
}
) ;
2008-05-15 04:21:00 +00:00
2007-05-15 11:41:39 +00:00
/* add method to remove element from array */
Array . prototype . remove = function ( s ) {
for ( var i = 0 ; i < this . length ; i ++ ) {
if ( s == this [ i ] ) this . splice ( i , 1 ) ;
}
2011-12-10 17:26:59 +00:00
} ;
2007-05-15 11:41:39 +00:00
2010-09-05 09:41:19 +00:00
/* create console.log if it doesn't exist */
if ( ! window . console ) console = { } ;
2010-11-07 11:38:59 +00:00
console . log = console . log || function ( msg ) { } ;
console . warn = console . warn || function ( msg ) { } ;
console . error = console . error || function ( msg ) { } ;
2007-02-18 07:30:16 +00:00
2009-01-23 17:19:17 +00:00
function exception _error ( location , e , ext _info ) {
2009-01-23 14:20:36 +00:00
var msg = format _exception _error ( location , e ) ;
2010-09-05 09:41:19 +00:00
if ( ! ext _info ) ext _info = false ;
2009-02-04 20:19:16 +00:00
2009-01-23 17:19:17 +00:00
try {
2009-01-23 14:20:36 +00:00
2014-03-14 11:14:13 +00:00
if ( ext _info )
ext _info = JSON . stringify ( ext _info ) ;
2010-09-05 09:41:19 +00:00
2013-04-20 06:43:21 +00:00
try {
new Ajax . Request ( "backend.php" , {
parameters : { op : "rpc" , method : "log" , logmsg : msg } ,
onComplete : function ( transport ) {
console . log ( transport . responseText ) ;
} } ) ;
} catch ( eii ) {
console . log ( "Exception while trying to log the error." ) ;
console . log ( eii ) ;
}
msg += "<p>" + _ _ ( "The error will be reported to the configured log destination." ) +
"</p>" ;
2010-11-14 20:46:49 +00:00
var content = "<div class=\"fatalError\">" +
"<pre>" + msg + "</pre>" ;
2010-09-05 09:41:19 +00:00
2011-03-18 11:31:54 +00:00
content += "<form name=\"exceptionForm\" id=\"exceptionForm\" target=\"_blank\" " +
2017-02-14 06:32:21 +00:00
"action=\"https://tt-rss.org/report.php\" method=\"POST\">" ;
2011-03-18 11:31:54 +00:00
content += "<textarea style=\"display : none\" name=\"message\">" + msg + "</textarea>" ;
content += "<textarea style=\"display : none\" name=\"params\">N/A</textarea>" ;
2010-11-14 20:46:49 +00:00
if ( ext _info ) {
content += "<div><b>Additional information:</b></div>" +
2011-03-18 11:31:54 +00:00
"<textarea name=\"xinfo\" readonly=\"1\">" + ext _info + "</textarea>" ;
2009-01-23 14:20:36 +00:00
}
2010-11-14 20:46:49 +00:00
content += "<div><b>Stack trace:</b></div>" +
2011-03-18 11:31:54 +00:00
"<textarea name=\"stack\" readonly=\"1\">" + e . stack + "</textarea>" ;
content += "</form>" ;
2010-11-14 20:46:49 +00:00
2010-11-15 10:12:02 +00:00
content += "</div>" ;
2011-03-06 07:56:08 +00:00
content += "<div class='dlgButtons'>" ;
2014-03-14 10:08:32 +00:00
content += "<button dojoType=\"dijit.form.Button\"" +
"onclick=\"dijit.byId('exceptionDlg').report()\">" +
_ _ ( 'Report to tt-rss.org' ) + "</button> " ;
2011-03-06 07:56:08 +00:00
content += "<button dojoType=\"dijit.form.Button\" " +
2011-03-18 11:31:54 +00:00
"onclick=\"dijit.byId('exceptionDlg').hide()\">" +
2011-03-06 07:56:08 +00:00
_ _ ( 'Close' ) + "</button>" ;
content += "</div>" ;
2011-04-21 11:27:09 +00:00
if ( dijit . byId ( "exceptionDlg" ) )
dijit . byId ( "exceptionDlg" ) . destroyRecursive ( ) ;
2010-11-14 20:46:49 +00:00
2010-11-15 10:12:02 +00:00
var dialog = new dijit . Dialog ( {
2011-03-06 07:56:08 +00:00
id : "exceptionDlg" ,
2010-11-15 10:12:02 +00:00
title : "Unhandled exception" ,
style : "width: 600px" ,
2014-03-14 10:08:32 +00:00
report : function ( ) {
2014-03-14 10:40:29 +00:00
if ( confirm ( _ _ ( "Are you sure to report this exception to tt-rss.org? The report will include information about your web browser and tt-rss configuration. Your IP will be saved in the database." ) ) ) {
2014-03-14 10:08:32 +00:00
document . forms [ 'exceptionForm' ] . params . value = $H ( {
browserName : navigator . appName ,
browserVersion : navigator . appVersion ,
browserPlatform : navigator . platform ,
browserCookies : navigator . cookieEnabled ,
2014-03-14 10:20:32 +00:00
ttrssVersion : _ _ttrss _version ,
initParams : JSON . stringify ( init _params ) ,
2014-03-14 10:08:32 +00:00
} ) . toQueryString ( ) ;
document . forms [ 'exceptionForm' ] . submit ( ) ;
}
} ,
2010-11-15 10:12:02 +00:00
content : content } ) ;
dialog . show ( ) ;
2010-11-14 20:46:49 +00:00
2013-04-20 06:43:21 +00:00
} catch ( ei ) {
console . log ( "Exception while trying to report an exception. Oh boy." ) ;
console . log ( ei ) ;
console . log ( "Original exception:" ) ;
console . log ( e ) ;
msg += "\n\nAdditional exception caught while trying to show the error dialog.\n\n" + format _exception _error ( 'exception_error' , ei ) ;
try {
new Ajax . Request ( "backend.php" , {
parameters : { op : "rpc" , method : "log" , logmsg : msg } ,
onComplete : function ( transport ) {
console . log ( transport . responseText ) ;
} } ) ;
} catch ( eii ) {
console . log ( "Third exception while trying to log the error! Seriously?" ) ;
console . log ( eii ) ;
}
msg += "\n\nThe error will be reported to the configured log destination." ;
2009-01-23 14:20:36 +00:00
alert ( msg ) ;
}
2009-01-23 17:19:17 +00:00
2009-01-23 14:20:36 +00:00
}
function format _exception _error ( location , e ) {
2005-12-14 07:29:38 +00:00
var msg ;
if ( e . fileName ) {
var base _fname = e . fileName . substring ( e . fileName . lastIndexOf ( "/" ) + 1 ) ;
2011-03-18 11:31:54 +00:00
msg = "Exception: " + e . name + ", " + e . message +
2005-12-14 07:29:38 +00:00
"\nFunction: " + location + "()" +
"\nLocation: " + base _fname + ":" + e . lineNumber ;
2008-05-20 10:39:48 +00:00
} else if ( e . description ) {
msg = "Exception: " + e . description + "\nFunction: " + location + "()" ;
2005-12-14 07:29:38 +00:00
} else {
msg = "Exception: " + e + "\nFunction: " + location + "()" ;
}
2010-09-05 09:41:19 +00:00
console . error ( "EXCEPTION: " + msg ) ;
2006-05-23 06:55:26 +00:00
2009-01-23 14:20:36 +00:00
return msg ;
2005-11-26 10:06:56 +00:00
}
2005-08-22 05:28:27 +00:00
function param _escape ( arg ) {
if ( typeof encodeURIComponent != 'undefined' )
2011-03-18 11:31:54 +00:00
return encodeURIComponent ( arg ) ;
2005-08-22 05:28:27 +00:00
else
return escape ( arg ) ;
}
function param _unescape ( arg ) {
if ( typeof decodeURIComponent != 'undefined' )
2011-03-18 11:31:54 +00:00
return decodeURIComponent ( arg ) ;
2005-08-22 05:28:27 +00:00
else
return unescape ( arg ) ;
}
2007-03-02 19:58:58 +00:00
function notify _real ( msg , no _hide , n _type ) {
2005-08-22 05:28:27 +00:00
2009-02-10 09:06:15 +00:00
var n = $ ( "notify" ) ;
2005-08-22 05:28:27 +00:00
2013-04-17 06:50:46 +00:00
if ( ! n ) return ;
2005-09-05 12:02:00 +00:00
2006-05-19 05:44:23 +00:00
if ( notify _hide _timerid ) {
window . clearTimeout ( notify _hide _timerid ) ;
}
2005-11-19 18:01:06 +00:00
if ( msg == "" ) {
2014-11-02 17:58:46 +00:00
if ( n . hasClassName ( "visible" ) ) {
notify _hide _timerid = window . setTimeout ( function ( ) {
n . removeClassName ( "visible" ) } , 0 ) ;
2006-05-19 05:44:23 +00:00
}
return ;
2005-11-19 18:01:06 +00:00
}
2005-08-22 05:28:27 +00:00
2007-03-02 19:58:58 +00:00
/ * t y p e s :
1 - generic
2 - progress
3 - error
4 - info
* /
2013-04-17 06:50:46 +00:00
msg = "<span class=\"msg\"> " + _ _ ( msg ) + "</span>" ;
2007-03-06 06:54:47 +00:00
2014-11-02 17:58:46 +00:00
if ( n _type == 2 ) {
2017-02-09 20:19:26 +00:00
msg = "<span><img src=\"" + getInitParam ( "icon_indicator_white" ) + "\"></span>" + msg ;
2013-04-17 06:50:46 +00:00
no _hide = true ;
2007-03-02 19:58:58 +00:00
} else if ( n _type == 3 ) {
2017-02-09 20:19:26 +00:00
msg = "<span><img src=\"" + getInitParam ( "icon_alert" ) + "\"></span>" + msg ;
2007-03-02 19:58:58 +00:00
} else if ( n _type == 4 ) {
2017-02-09 20:19:26 +00:00
msg = "<span><img src=\"" + getInitParam ( "icon_information" ) + "\"></span>" + msg ;
2013-03-18 12:44:23 +00:00
}
2017-02-09 20:19:26 +00:00
msg += " <span><img src=\"" + getInitParam ( "icon_cross" ) + "\" class=\"close\" title=\"" +
2013-04-17 06:50:46 +00:00
_ _ ( "Click to close" ) + "\" onclick=\"notify('')\"></span>" ;
2013-03-18 12:44:23 +00:00
2013-04-17 06:50:46 +00:00
n . innerHTML = msg ;
2006-05-18 07:56:52 +00:00
2014-11-09 17:31:29 +00:00
window . setTimeout ( function ( ) {
// goddamnit firefox
if ( n _type == 2 ) {
n . className = "notify notify_progress visible" ;
} else if ( n _type == 3 ) {
n . className = "notify notify_error visible" ;
msg = "<span><img src='images/alert.png'></span>" + msg ;
} else if ( n _type == 4 ) {
n . className = "notify notify_info visible" ;
} else {
n . className = "notify visible" ;
}
if ( ! no _hide ) {
notify _hide _timerid = window . setTimeout ( function ( ) {
2014-11-02 17:58:46 +00:00
n . removeClassName ( "visible" ) } , 5 * 1000 ) ;
2014-11-09 17:31:29 +00:00
}
} , 10 ) ;
2006-05-18 12:01:09 +00:00
}
2007-03-02 19:58:58 +00:00
function notify ( msg , no _hide ) {
notify _real ( msg , no _hide , 1 ) ;
2006-05-18 12:01:09 +00:00
}
2007-03-02 19:58:58 +00:00
function notify _progress ( msg , no _hide ) {
notify _real ( msg , no _hide , 2 ) ;
}
function notify _error ( msg , no _hide ) {
notify _real ( msg , no _hide , 3 ) ;
}
function notify _info ( msg , no _hide ) {
notify _real ( msg , no _hide , 4 ) ;
2005-08-22 05:28:27 +00:00
}
2006-03-20 16:53:11 +00:00
function setCookie ( name , value , lifetime , path , domain , secure ) {
2011-03-18 11:31:54 +00:00
2006-03-20 16:53:11 +00:00
var d = false ;
2011-03-18 11:31:54 +00:00
2006-03-20 16:53:11 +00:00
if ( lifetime ) {
d = new Date ( ) ;
2007-03-21 15:36:24 +00:00
d . setTime ( d . getTime ( ) + ( lifetime * 1000 ) ) ;
2006-03-20 16:53:11 +00:00
}
2007-03-22 06:46:49 +00:00
2010-09-05 09:41:19 +00:00
console . log ( "setCookie: " + name + " => " + value + ": " + d ) ;
2011-03-18 11:31:54 +00:00
2006-03-20 16:53:11 +00:00
int _setCookie ( name , value , d , path , domain , secure ) ;
}
function int _setCookie ( name , value , expires , path , domain , secure ) {
2005-09-06 04:14:17 +00:00
document . cookie = name + "=" + escape ( value ) +
( ( expires ) ? "; expires=" + expires . toGMTString ( ) : "" ) +
( ( path ) ? "; path=" + path : "" ) +
( ( domain ) ? "; domain=" + domain : "" ) +
( ( secure ) ? "; secure" : "" ) ;
}
2006-03-20 16:53:11 +00:00
function delCookie ( name , path , domain ) {
if ( getCookie ( name ) ) {
document . cookie = name + "=" +
( ( path ) ? ";path=" + path : "" ) +
( ( domain ) ? ";domain=" + domain : "" ) +
";expires=Thu, 01-Jan-1970 00:00:01 GMT" ;
}
}
2011-03-18 11:31:54 +00:00
2006-03-20 16:53:11 +00:00
2005-09-06 04:14:17 +00:00
function getCookie ( name ) {
var dc = document . cookie ;
var prefix = name + "=" ;
var begin = dc . indexOf ( "; " + prefix ) ;
if ( begin == - 1 ) {
begin = dc . indexOf ( prefix ) ;
if ( begin != 0 ) return null ;
}
else {
begin += 2 ;
}
var end = document . cookie . indexOf ( ";" , begin ) ;
if ( end == - 1 ) {
end = dc . length ;
}
return unescape ( dc . substring ( begin + prefix . length , end ) ) ;
}
2005-09-07 07:19:14 +00:00
function gotoPreferences ( ) {
document . location . href = "prefs.php" ;
}
2013-02-06 16:14:06 +00:00
function gotoLogout ( ) {
document . location . href = "backend.php?op=logout" ;
}
2005-09-07 07:19:14 +00:00
function gotoMain ( ) {
2011-12-11 19:59:25 +00:00
document . location . href = "index.php" ;
2005-09-07 07:19:14 +00:00
}
2005-10-17 03:24:40 +00:00
/ * * * @ ( # ) i s N u m e r i c . j s * * C o p y r i g h t ( c ) 2 0 0 0 b y S u n d a r D o r a i - R a j
* * @ author Sundar Dorai - Raj
* * Email : sdoraira @ vt . edu
* * This program is free software ; you can redistribute it and / or
2011-03-18 11:31:54 +00:00
* * modify it under the terms of the GNU General Public License
* * as published by the Free Software Foundation ; either version 2
* * of the License , or ( at your option ) any later version ,
* * provided that any use properly credits the author .
2005-10-17 03:24:40 +00:00
* * This program is distributed in the hope that it will be useful ,
* * but WITHOUT ANY WARRANTY ; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* * GNU General Public License for more details at http : //www.gnu.org * * */
var numbers = ".0123456789" ;
function isNumeric ( x ) {
// is x a String or a character?
if ( x . length > 1 ) {
// remove negative sign
x = Math . abs ( x ) + "" ;
2011-12-10 17:26:59 +00:00
for ( var j = 0 ; j < x . length ; j ++ ) {
2005-10-17 03:24:40 +00:00
// call isNumeric recursively for each character
number = isNumeric ( x . substring ( j , j + 1 ) ) ;
if ( ! number ) return number ;
}
return number ;
}
else {
// if x is number return true
if ( numbers . indexOf ( x ) >= 0 ) return true ;
return false ;
}
}
2005-11-15 09:13:49 +00:00
2005-12-13 05:52:32 +00:00
function toggleSelectRowById ( sender , id ) {
2009-02-10 09:06:15 +00:00
var row = $ ( id ) ;
2010-11-14 12:55:51 +00:00
return toggleSelectRow ( sender , row ) ;
2005-12-13 05:52:32 +00:00
}
2005-12-30 04:22:07 +00:00
function toggleSelectListRow ( sender ) {
2010-11-14 12:55:51 +00:00
var row = sender . parentNode ;
return toggleSelectRow ( sender , row ) ;
2005-12-30 04:22:07 +00:00
}
2010-11-18 19:26:04 +00:00
/* this is for dijit Checkbox */
function toggleSelectListRow2 ( sender ) {
var row = sender . domNode . parentNode ;
return toggleSelectRow ( sender , row ) ;
}
/* this is for dijit Checkbox */
2013-02-28 10:22:13 +00:00
function toggleSelectRow2 ( sender , row , is _cdm ) {
2010-11-18 19:26:04 +00:00
2013-02-28 10:22:13 +00:00
if ( ! row )
if ( ! is _cdm )
row = sender . domNode . parentNode . parentNode ;
else
row = sender . domNode . parentNode . parentNode . parentNode ; // oh ffs
2010-11-18 19:26:04 +00:00
if ( sender . checked && ! row . hasClassName ( 'Selected' ) )
row . addClassName ( 'Selected' ) ;
else
row . removeClassName ( 'Selected' ) ;
2013-04-15 09:16:14 +00:00
if ( typeof updateSelectedPrompt != undefined )
updateSelectedPrompt ( ) ;
2010-11-18 19:26:04 +00:00
}
2013-02-28 11:48:09 +00:00
function toggleSelectRow ( sender , row ) {
2005-11-27 14:56:10 +00:00
2013-02-28 11:48:09 +00:00
if ( ! row ) row = sender . parentNode . parentNode ;
2010-11-14 12:55:51 +00:00
if ( sender . checked && ! row . hasClassName ( 'Selected' ) )
row . addClassName ( 'Selected' ) ;
else
row . removeClassName ( 'Selected' ) ;
2013-04-15 09:16:14 +00:00
if ( typeof updateSelectedPrompt != undefined )
updateSelectedPrompt ( ) ;
2005-11-27 14:56:10 +00:00
}
2007-08-11 16:43:45 +00:00
function checkboxToggleElement ( elem , id ) {
if ( elem . checked ) {
2010-11-15 10:12:02 +00:00
Effect . Appear ( id , { duration : 0.5 } ) ;
2007-08-11 16:43:45 +00:00
} else {
2008-08-06 07:51:28 +00:00
Effect . Fade ( id , { duration : 0.5 } ) ;
2007-08-11 16:43:45 +00:00
}
}
2005-12-20 11:14:24 +00:00
function dropboxSelect ( e , v ) {
2011-12-10 17:26:59 +00:00
for ( var i = 0 ; i < e . length ; i ++ ) {
2005-12-20 11:14:24 +00:00
if ( e [ i ] . value == v ) {
e . selectedIndex = i ;
break ;
}
}
}
2006-02-28 16:25:38 +00:00
2011-03-08 08:28:21 +00:00
function getURLParam ( param ) {
return String ( window . location . href ) . parseQuery ( ) [ param ] ;
2011-03-18 11:31:54 +00:00
}
2006-02-28 16:25:38 +00:00
2009-01-23 14:20:36 +00:00
function closeInfoBox ( cleanup ) {
2009-10-08 08:36:27 +00:00
try {
2010-11-17 07:12:50 +00:00
dialog = dijit . byId ( "infoBox" ) ;
2010-11-15 10:12:02 +00:00
2010-11-17 07:12:50 +00:00
if ( dialog ) dialog . hide ( ) ;
2009-01-23 14:20:36 +00:00
2009-10-08 08:36:27 +00:00
} catch ( e ) {
2010-11-14 20:46:49 +00:00
//exception_error("closeInfoBox", e);
2009-01-23 14:20:36 +00:00
}
2006-07-25 10:47:51 +00:00
return false ;
2006-05-18 04:58:31 +00:00
}
2013-04-01 06:47:41 +00:00
function displayDlg ( title , id , param , callback ) {
2006-05-18 02:48:33 +00:00
2010-11-14 20:46:49 +00:00
notify _progress ( "Loading, please wait..." , true ) ;
2006-05-18 08:29:17 +00:00
2011-12-12 20:20:53 +00:00
var query = "?op=dlg&method=" +
2007-08-25 12:11:54 +00:00
param _escape ( id ) + "¶m=" + param _escape ( param ) ;
2009-12-29 15:49:27 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2007-08-25 12:11:54 +00:00
onComplete : function ( transport ) {
2013-04-01 06:47:41 +00:00
infobox _callback2 ( transport , title ) ;
2010-01-06 11:17:28 +00:00
if ( callback ) callback ( transport ) ;
2007-08-25 12:11:54 +00:00
} } ) ;
2006-07-25 10:47:51 +00:00
return false ;
2006-05-18 02:48:33 +00:00
}
2013-04-01 06:47:41 +00:00
function infobox _callback2 ( transport , title ) {
2007-08-24 04:36:00 +00:00
try {
2010-11-17 07:12:50 +00:00
var dialog = false ;
2010-11-16 13:47:56 +00:00
if ( dijit . byId ( "infoBox" ) ) {
2010-11-17 07:12:50 +00:00
dialog = dijit . byId ( "infoBox" ) ;
2010-11-16 13:47:56 +00:00
}
2007-05-14 08:08:18 +00:00
2010-11-14 20:46:49 +00:00
//console.log("infobox_callback2");
notify ( '' ) ;
2007-05-14 08:08:18 +00:00
2013-04-01 06:47:41 +00:00
var content = transport . responseText ;
2007-08-10 07:35:55 +00:00
2010-11-17 07:12:50 +00:00
if ( ! dialog ) {
dialog = new dijit . Dialog ( {
title : title ,
id : 'infoBox' ,
style : "width: 600px" ,
onCancel : function ( ) {
return true ;
} ,
onExecute : function ( ) {
return true ;
} ,
onClose : function ( ) {
return true ;
} ,
content : content } ) ;
} else {
dialog . attr ( 'title' , title ) ;
dialog . attr ( 'content' , content ) ;
}
2010-11-15 10:12:02 +00:00
dialog . show ( ) ;
2007-08-24 04:36:00 +00:00
notify ( "" ) ;
} catch ( e ) {
exception _error ( "infobox_callback2" , e ) ;
2007-05-14 05:41:04 +00:00
}
}
2006-05-23 06:15:49 +00:00
function getInitParam ( key ) {
2007-03-26 05:23:15 +00:00
return init _params [ key ] ;
2006-05-23 06:15:49 +00:00
}
2006-05-23 05:34:50 +00:00
2010-01-12 08:48:31 +00:00
function setInitParam ( key , value ) {
2007-05-11 07:50:02 +00:00
init _params [ key ] = value ;
2007-03-21 15:36:24 +00:00
}
2009-01-23 17:19:17 +00:00
function fatalError ( code , msg , ext _info ) {
2011-03-18 11:31:54 +00:00
try {
2006-05-23 07:15:48 +00:00
2007-02-24 17:16:33 +00:00
if ( code == 6 ) {
2011-12-11 19:59:25 +00:00
window . location . href = "index.php" ;
2007-02-24 17:16:33 +00:00
} else if ( code == 5 ) {
2013-04-04 15:45:26 +00:00
window . location . href = "public.php?op=dbupdate" ;
2007-02-24 17:16:33 +00:00
} else {
2011-03-18 11:31:54 +00:00
2009-01-23 17:19:17 +00:00
if ( msg == "" ) msg = "Unknown error" ;
2007-03-02 19:58:58 +00:00
2011-02-18 09:28:03 +00:00
if ( ext _info ) {
if ( ext _info . responseText ) {
ext _info = ext _info . responseText ;
2009-01-23 17:19:17 +00:00
}
2011-02-18 09:28:03 +00:00
}
if ( ERRORS && ERRORS [ code ] && ! msg ) {
msg = ERRORS [ code ] ;
}
2011-03-18 11:31:54 +00:00
2011-02-18 09:28:03 +00:00
var content = "<div><b>Error code:</b> " + code + "</div>" +
"<p>" + msg + "</p>" ;
if ( ext _info ) {
content = content + "<div><b>Additional information:</b></div>" +
2011-03-18 11:31:54 +00:00
"<textarea style='width: 100%' readonly=\"1\">" +
2011-02-18 09:28:03 +00:00
ext _info + "</textarea>" ;
2009-01-23 17:19:17 +00:00
}
2011-02-18 09:28:03 +00:00
var dialog = new dijit . Dialog ( {
title : "Fatal error" ,
style : "width: 600px" ,
content : content } ) ;
dialog . show ( ) ;
2006-11-09 10:00:24 +00:00
}
2006-05-23 07:15:48 +00:00
2011-02-18 09:28:03 +00:00
return false ;
2006-05-23 07:15:48 +00:00
} catch ( e ) {
exception _error ( "fatalError" , e ) ;
}
}
2006-12-08 08:05:21 +00:00
function filterDlgCheckAction ( sender ) {
try {
2010-11-20 11:10:26 +00:00
var action = sender . value ;
2006-12-08 08:05:21 +00:00
2010-11-20 11:10:26 +00:00
var action _param = $ ( "filterDlg_paramBox" ) ;
2006-12-08 08:05:21 +00:00
if ( ! action _param ) {
2010-09-05 09:41:19 +00:00
console . log ( "filterDlgCheckAction: can't find action param box!" ) ;
2006-12-08 08:05:21 +00:00
return ;
}
// if selected action supports parameters, enable params field
2015-08-11 20:28:41 +00:00
if ( action == 4 || action == 6 || action == 7 || action == 9 ) {
2010-11-20 11:10:26 +00:00
new Effect . Appear ( action _param , { duration : 0.5 } ) ;
2015-08-11 20:28:41 +00:00
Element . hide ( dijit . byId ( "filterDlg_actionParam" ) . domNode ) ;
Element . hide ( dijit . byId ( "filterDlg_actionParamLabel" ) . domNode ) ;
Element . hide ( dijit . byId ( "filterDlg_actionParamPlugin" ) . domNode ) ;
if ( action == 7 ) {
2010-11-20 11:10:26 +00:00
Element . show ( dijit . byId ( "filterDlg_actionParamLabel" ) . domNode ) ;
2015-08-11 20:28:41 +00:00
} else if ( action == 9 ) {
Element . show ( dijit . byId ( "filterDlg_actionParamPlugin" ) . domNode ) ;
} else {
Element . show ( dijit . byId ( "filterDlg_actionParam" ) . domNode ) ;
2009-01-18 08:28:42 +00:00
}
2015-08-11 20:28:41 +00:00
2006-12-08 08:05:21 +00:00
} else {
2008-08-07 03:17:24 +00:00
Element . hide ( action _param ) ;
2006-12-08 08:05:21 +00:00
}
} catch ( e ) {
2008-05-17 16:25:41 +00:00
exception _error ( "filterDlgCheckAction" , e ) ;
2006-12-08 08:05:21 +00:00
}
}
2007-01-27 09:21:55 +00:00
2008-12-13 11:57:53 +00:00
2007-01-27 09:21:55 +00:00
function explainError ( code ) {
2013-04-01 06:47:41 +00:00
return displayDlg ( _ _ ( "Error explained" ) , "explainError" , code ) ;
2007-01-27 09:21:55 +00:00
}
2007-03-01 09:43:54 +00:00
2008-05-19 08:03:53 +00:00
function loading _set _progress ( p ) {
2008-05-19 07:37:44 +00:00
try {
2010-11-19 13:08:02 +00:00
loading _progress += p ;
2008-05-19 08:12:54 +00:00
2010-11-19 13:08:02 +00:00
if ( dijit . byId ( "loading_bar" ) )
dijit . byId ( "loading_bar" ) . update ( { progress : loading _progress } ) ;
2008-05-19 08:03:53 +00:00
2010-11-19 13:08:02 +00:00
if ( loading _progress >= 90 )
remove _splash ( ) ;
2008-05-19 07:37:44 +00:00
} catch ( e ) {
exception _error ( "loading_set_progress" , e ) ;
}
}
2008-05-19 12:00:35 +00:00
function remove _splash ( ) {
2010-11-19 13:08:02 +00:00
2008-05-19 12:00:35 +00:00
if ( Element . visible ( "overlay" ) ) {
2010-09-05 09:41:19 +00:00
console . log ( "about to remove splash, OMG!" ) ;
2008-05-19 12:00:35 +00:00
Element . hide ( "overlay" ) ;
2010-09-05 09:41:19 +00:00
console . log ( "removed splash!" ) ;
2008-05-19 12:00:35 +00:00
}
}
2008-08-07 08:06:12 +00:00
2009-01-31 20:03:40 +00:00
function transport _error _check ( transport ) {
try {
if ( transport . responseXML ) {
var error = transport . responseXML . getElementsByTagName ( "error" ) [ 0 ] ;
if ( error ) {
var code = error . getAttribute ( "error-code" ) ;
var msg = error . getAttribute ( "error-msg" ) ;
if ( code != 0 ) {
fatalError ( code , msg ) ;
return false ;
}
}
}
} catch ( e ) {
exception _error ( "check_for_error_xml" , e ) ;
}
return true ;
}
2009-01-24 05:14:06 +00:00
2009-02-03 16:09:59 +00:00
function strip _tags ( s ) {
return s . replace ( /<\/?[^>]+(>|$)/g , "" ) ;
}
function truncate _string ( s , length ) {
if ( ! length ) length = 30 ;
var tmp = s . substring ( 0 , length ) ;
if ( s . length > length ) tmp += "…" ;
return tmp ;
}
2009-10-06 09:01:40 +00:00
2009-10-09 09:13:57 +00:00
function hotkey _prefix _timeout ( ) {
try {
var date = new Date ( ) ;
var ts = Math . round ( date . getTime ( ) / 1000 ) ;
if ( hotkey _prefix _pressed && ts - hotkey _prefix _pressed >= 5 ) {
2010-09-05 09:41:19 +00:00
console . log ( "hotkey_prefix seems to be stuck, aborting" ) ;
2009-10-09 09:13:57 +00:00
hotkey _prefix _pressed = false ;
hotkey _prefix = false ;
Element . hide ( 'cmdline' ) ;
}
2017-01-20 18:13:31 +00:00
setTimeout ( hotkey _prefix _timeout , 1000 ) ;
2009-10-09 09:13:57 +00:00
} catch ( e ) {
exception _error ( "hotkey_prefix_timeout" , e ) ;
}
}
2010-01-14 09:47:28 +00:00
function uploadIconHandler ( rc ) {
2010-01-14 08:28:57 +00:00
try {
2010-01-14 09:47:28 +00:00
switch ( rc ) {
case 0 :
notify _info ( "Upload complete." ) ;
if ( inPreferences ( ) ) {
updateFeedList ( ) ;
} else {
setTimeout ( 'updateFeedList(false, false)' , 50 ) ;
}
break ;
case 1 :
notify _error ( "Upload failed: icon is too big." ) ;
break ;
case 2 :
notify _error ( "Upload failed." ) ;
break ;
}
} catch ( e ) {
exception _error ( "uploadIconHandler" , e ) ;
}
}
function removeFeedIcon ( id ) {
try {
if ( confirm ( _ _ ( "Remove stored feed icon?" ) ) ) {
2011-12-12 18:46:25 +00:00
var query = "backend.php?op=pref-feeds&method=removeicon&feed_id=" + param _escape ( id ) ;
2010-01-14 08:28:57 +00:00
2010-09-05 09:41:19 +00:00
console . log ( query ) ;
2010-01-14 08:28:57 +00:00
2010-01-14 09:47:28 +00:00
notify _progress ( "Removing feed icon..." , true ) ;
2010-01-14 08:28:57 +00:00
2010-01-14 09:47:28 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 11:31:54 +00:00
onComplete : function ( transport ) {
2010-01-14 09:47:28 +00:00
notify _info ( "Feed icon removed." ) ;
if ( inPreferences ( ) ) {
updateFeedList ( ) ;
} else {
setTimeout ( 'updateFeedList(false, false)' , 50 ) ;
}
2011-03-18 11:31:54 +00:00
} } ) ;
2010-01-14 09:47:28 +00:00
}
return false ;
2010-01-14 08:28:57 +00:00
} catch ( e ) {
2012-05-15 18:00:43 +00:00
exception _error ( "removeFeedIcon" , e ) ;
2010-01-14 08:28:57 +00:00
}
}
function uploadFeedIcon ( ) {
try {
var file = $ ( "icon_file" ) ;
if ( file . value . length == 0 ) {
alert ( _ _ ( "Please select an image file to upload." ) ) ;
} else {
2010-01-14 09:47:28 +00:00
if ( confirm ( _ _ ( "Upload new icon for this feed?" ) ) ) {
notify _progress ( "Uploading, please wait..." , true ) ;
return true ;
}
2010-01-14 08:28:57 +00:00
}
2010-01-14 09:47:28 +00:00
return false ;
2010-01-14 08:28:57 +00:00
} catch ( e ) {
exception _error ( "uploadFeedIcon" , e ) ;
}
}
2010-11-08 22:04:00 +00:00
function addLabel ( select , callback ) {
2010-02-03 13:06:24 +00:00
try {
var caption = prompt ( _ _ ( "Please enter label caption:" ) , "" ) ;
if ( caption != undefined ) {
2011-03-18 11:31:54 +00:00
2010-02-03 13:06:24 +00:00
if ( caption == "" ) {
alert ( _ _ ( "Can't create label: missing caption." ) ) ;
return false ;
}
2011-12-12 18:46:25 +00:00
var query = "?op=pref-labels&method=add&caption=" +
2010-02-03 13:06:24 +00:00
param _escape ( caption ) ;
2010-11-08 22:04:00 +00:00
if ( select )
query += "&output=select" ;
2010-02-03 13:06:24 +00:00
notify _progress ( "Loading, please wait..." , true ) ;
2010-11-08 22:04:00 +00:00
if ( inPreferences ( ) && ! select ) active _tab = "labelConfig" ;
2010-02-03 13:06:24 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 11:31:54 +00:00
onComplete : function ( transport ) {
2010-11-08 22:04:00 +00:00
if ( callback ) {
callback ( transport ) ;
} else if ( inPreferences ( ) ) {
2010-11-26 16:22:08 +00:00
updateLabelList ( ) ;
2010-02-03 13:06:24 +00:00
} else {
updateFeedList ( ) ;
}
} } ) ;
}
} catch ( e ) {
exception _error ( "addLabel" , e ) ;
}
}
2010-02-03 13:54:17 +00:00
function quickAddFeed ( ) {
2010-11-20 18:06:36 +00:00
try {
2013-04-01 07:14:27 +00:00
var query = "backend.php?op=feeds&method=quickAddFeed" ;
2010-11-20 18:06:36 +00:00
2012-11-08 14:31:14 +00:00
// overlapping widgets
if ( dijit . byId ( "batchSubDlg" ) ) dijit . byId ( "batchSubDlg" ) . destroyRecursive ( ) ;
if ( dijit . byId ( "feedAddDlg" ) ) dijit . byId ( "feedAddDlg" ) . destroyRecursive ( ) ;
2010-11-20 18:06:36 +00:00
var dialog = new dijit . Dialog ( {
id : "feedAddDlg" ,
title : _ _ ( "Subscribe to Feed" ) ,
style : "width: 600px" ,
2017-01-28 09:45:49 +00:00
show _error : function ( msg ) {
var elem = $ ( "fadd_error_message" ) ;
elem . innerHTML = msg ;
if ( ! Element . visible ( elem ) )
new Effect . Appear ( elem ) ;
} ,
2010-11-20 18:06:36 +00:00
execute : function ( ) {
if ( this . validate ( ) ) {
console . log ( dojo . objectToQuery ( this . attr ( 'value' ) ) ) ;
var feed _url = this . attr ( 'value' ) . feed ;
2012-08-21 10:09:51 +00:00
Element . show ( "feed_add_spinner" ) ;
2017-01-28 09:45:49 +00:00
Element . hide ( "fadd_error_message" ) ;
2010-11-20 18:06:36 +00:00
new Ajax . Request ( "backend.php" , {
parameters : dojo . objectToQuery ( this . attr ( 'value' ) ) ,
2011-03-18 11:31:54 +00:00
onComplete : function ( transport ) {
2010-11-20 18:06:36 +00:00
try {
2010-11-29 13:02:16 +00:00
2014-03-11 09:38:06 +00:00
try {
var reply = JSON . parse ( transport . responseText ) ;
} catch ( e ) {
Element . hide ( "feed_add_spinner" ) ;
2014-03-11 15:09:33 +00:00
alert ( _ _ ( "Failed to parse output. This can indicate server timeout and/or network issues. Backend output was logged to browser console." ) ) ;
2014-03-11 09:38:06 +00:00
console . log ( 'quickAddFeed, backend returned:' + transport . responseText ) ;
return ;
}
2011-03-18 11:31:54 +00:00
2012-08-21 10:09:51 +00:00
var rc = reply [ 'result' ] ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
notify ( '' ) ;
2012-08-21 10:09:51 +00:00
Element . hide ( "feed_add_spinner" ) ;
2010-11-20 18:06:36 +00:00
2013-04-14 06:23:01 +00:00
console . log ( rc ) ;
2011-03-18 11:31:54 +00:00
2012-08-21 10:09:51 +00:00
switch ( parseInt ( rc [ 'code' ] ) ) {
2010-11-20 18:06:36 +00:00
case 1 :
dialog . hide ( ) ;
notify _info ( _ _ ( "Subscribed to %s" ) . replace ( "%s" , feed _url ) ) ;
2011-03-18 11:31:54 +00:00
2010-11-26 16:22:08 +00:00
updateFeedList ( ) ;
2010-11-20 18:06:36 +00:00
break ;
case 2 :
2017-01-28 09:45:49 +00:00
dialog . show _error ( _ _ ( "Specified URL seems to be invalid." ) ) ;
2010-11-20 18:06:36 +00:00
break ;
case 3 :
2017-01-28 09:45:49 +00:00
dialog . show _error ( _ _ ( "Specified URL doesn't seem to contain any feeds." ) ) ;
2010-11-20 18:06:36 +00:00
break ;
case 4 :
2012-09-23 09:38:58 +00:00
feeds = rc [ 'feeds' ] ;
2013-10-02 11:24:08 +00:00
Element . show ( "fadd_multiple_notify" ) ;
2012-09-23 09:38:58 +00:00
var select = dijit . byId ( "feedDlg_feedContainerSelect" ) ;
while ( select . getOptions ( ) . length > 0 )
select . removeOption ( 0 ) ;
2013-04-14 06:23:01 +00:00
select . addOption ( { value : '' , label : _ _ ( "Expand to select feed" ) } ) ;
2012-09-23 09:38:58 +00:00
var count = 0 ;
for ( var feedUrl in feeds ) {
select . addOption ( { value : feedUrl , label : feeds [ feedUrl ] } ) ;
count ++ ;
}
Effect . Appear ( 'feedDlg_feedsContainer' , { duration : 0.5 } ) ;
2010-11-20 18:06:36 +00:00
break ;
case 5 :
2017-01-28 09:45:49 +00:00
dialog . show _error ( _ _ ( "Couldn't download the specified URL: %s" ) .
2012-08-21 10:09:51 +00:00
replace ( "%s" , rc [ 'message' ] ) ) ;
2010-11-20 18:06:36 +00:00
break ;
2013-04-19 09:17:28 +00:00
case 6 :
2017-01-28 09:45:49 +00:00
dialog . show _error ( _ _ ( "XML validation failed: %s" ) .
2013-04-19 09:17:28 +00:00
replace ( "%s" , rc [ 'message' ] ) ) ;
break ;
break ;
2010-11-20 18:06:36 +00:00
case 0 :
2017-01-28 09:45:49 +00:00
dialog . show _error ( _ _ ( "You are already subscribed to this feed." ) ) ;
2010-11-20 18:06:36 +00:00
break ;
}
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
} catch ( e ) {
2011-04-05 10:49:28 +00:00
exception _error ( "subscribeToFeed" , e , transport ) ;
2010-11-20 18:06:36 +00:00
}
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
} } ) ;
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "quickAddFeed" , e ) ;
}
2010-02-03 13:54:17 +00:00
}
2012-08-30 14:50:56 +00:00
function createNewRuleElement ( parentNode , replaceNode ) {
try {
var form = document . forms [ "filter_new_rule_form" ] ;
2015-12-03 07:25:30 +00:00
//form.reg_exp.value = form.reg_exp.value.replace(/(<([^>]+)>)/ig,"");
2013-03-17 10:55:55 +00:00
2012-08-30 14:50:56 +00:00
var query = "backend.php?op=pref-filters&method=printrulename&rule=" +
param _escape ( dojo . formToJson ( form ) ) ;
console . log ( query ) ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
try {
var li = dojo . create ( "li" ) ;
2012-08-31 11:26:11 +00:00
var cb = dojo . create ( "input" , { type : "checkbox" } , li ) ;
new dijit . form . CheckBox ( {
onChange : function ( ) {
toggleSelectListRow2 ( this ) } ,
} , cb ) ;
2012-08-30 14:50:56 +00:00
dojo . create ( "input" , { type : "hidden" ,
name : "rule[]" ,
value : dojo . formToJson ( form ) } , li ) ;
dojo . create ( "span" , {
onclick : function ( ) {
dijit . byId ( 'filterEditDlg' ) . editRule ( this ) ;
} ,
innerHTML : transport . responseText } , li ) ;
if ( replaceNode ) {
parentNode . replaceChild ( li , replaceNode ) ;
} else {
parentNode . appendChild ( li ) ;
}
} catch ( e ) {
exception _error ( "createNewRuleElement" , e ) ;
}
} } ) ;
} catch ( e ) {
exception _error ( "createNewRuleElement" , e ) ;
}
}
function createNewActionElement ( parentNode , replaceNode ) {
try {
var form = document . forms [ "filter_new_action_form" ] ;
if ( form . action _id . value == 7 ) {
form . action _param . value = form . action _param _label . value ;
2015-08-11 20:28:41 +00:00
} else if ( form . action _id . value == 9 ) {
form . action _param . value = form . action _param _plugin . value ;
2012-08-30 14:50:56 +00:00
}
var query = "backend.php?op=pref-filters&method=printactionname&action=" +
param _escape ( dojo . formToJson ( form ) ) ;
console . log ( query ) ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
try {
var li = dojo . create ( "li" ) ;
2012-08-31 11:26:11 +00:00
var cb = dojo . create ( "input" , { type : "checkbox" } , li ) ;
new dijit . form . CheckBox ( {
onChange : function ( ) {
toggleSelectListRow2 ( this ) } ,
} , cb ) ;
2012-08-30 14:50:56 +00:00
dojo . create ( "input" , { type : "hidden" ,
name : "action[]" ,
value : dojo . formToJson ( form ) } , li ) ;
dojo . create ( "span" , {
onclick : function ( ) {
dijit . byId ( 'filterEditDlg' ) . editAction ( this ) ;
} ,
innerHTML : transport . responseText } , li ) ;
if ( replaceNode ) {
parentNode . replaceChild ( li , replaceNode ) ;
} else {
parentNode . appendChild ( li ) ;
}
} catch ( e ) {
exception _error ( "createNewActionElement" , e ) ;
}
} } ) ;
} catch ( e ) {
exception _error ( "createNewActionElement" , e ) ;
}
}
function addFilterRule ( replaceNode , ruleStr ) {
try {
if ( dijit . byId ( "filterNewRuleDlg" ) )
dijit . byId ( "filterNewRuleDlg" ) . destroyRecursive ( ) ;
var query = "backend.php?op=pref-filters&method=newrule&rule=" +
param _escape ( ruleStr ) ;
var rule _dlg = new dijit . Dialog ( {
id : "filterNewRuleDlg" ,
title : ruleStr ? _ _ ( "Edit rule" ) : _ _ ( "Add rule" ) ,
style : "width: 600px" ,
execute : function ( ) {
if ( this . validate ( ) ) {
createNewRuleElement ( $ ( "filterDlg_Matches" ) , replaceNode ) ;
this . hide ( ) ;
}
} ,
href : query } ) ;
rule _dlg . show ( ) ;
} catch ( e ) {
exception _error ( "addFilterRule" , e ) ;
}
}
function addFilterAction ( replaceNode , actionStr ) {
try {
if ( dijit . byId ( "filterNewActionDlg" ) )
dijit . byId ( "filterNewActionDlg" ) . destroyRecursive ( ) ;
var query = "backend.php?op=pref-filters&method=newaction&action=" +
param _escape ( actionStr ) ;
var rule _dlg = new dijit . Dialog ( {
id : "filterNewActionDlg" ,
title : actionStr ? _ _ ( "Edit action" ) : _ _ ( "Add action" ) ,
style : "width: 600px" ,
execute : function ( ) {
if ( this . validate ( ) ) {
createNewActionElement ( $ ( "filterDlg_Actions" ) , replaceNode ) ;
this . hide ( ) ;
}
} ,
href : query } ) ;
rule _dlg . show ( ) ;
} catch ( e ) {
exception _error ( "addFilterAction" , e ) ;
}
}
2015-09-09 19:13:43 +00:00
function editFilterTest ( query ) {
try {
if ( dijit . byId ( "filterTestDlg" ) )
dijit . byId ( "filterTestDlg" ) . destroyRecursive ( ) ;
var test _dlg = new dijit . Dialog ( {
id : "filterTestDlg" ,
title : "Test Filter" ,
style : "width: 600px" ,
results : 0 ,
limit : 100 ,
max _offset : 10000 ,
getTestResults : function ( query , offset ) {
var updquery = query + "&offset=" + offset + "&limit=" + test _dlg . limit ;
console . log ( "getTestResults:" + offset ) ;
new Ajax . Request ( "backend.php" , {
parameters : updquery ,
onComplete : function ( transport ) {
try {
var result = JSON . parse ( transport . responseText ) ;
if ( result && dijit . byId ( "filterTestDlg" ) && dijit . byId ( "filterTestDlg" ) . open ) {
test _dlg . results += result . size ( ) ;
console . log ( "got results:" + result . size ( ) ) ;
$ ( "prefFilterProgressMsg" ) . innerHTML = _ _ ( "Looking for articles (%d processed, %f found)..." )
. replace ( "%f" , test _dlg . results )
. replace ( "%d" , offset ) ;
console . log ( offset + " " + test _dlg . max _offset ) ;
for ( var i = 0 ; i < result . size ( ) ; i ++ ) {
var tmp = new Element ( "table" ) ;
tmp . innerHTML = result [ i ] ;
dojo . parser . parse ( tmp ) ;
$ ( "prefFilterTestResultList" ) . innerHTML += tmp . innerHTML ;
}
if ( test _dlg . results < 30 && offset < test _dlg . max _offset ) {
// get the next batch
window . setTimeout ( function ( ) {
test _dlg . getTestResults ( query , offset + test _dlg . limit ) ;
} , 0 ) ;
} else {
// all done
Element . hide ( "prefFilterLoadingIndicator" ) ;
if ( test _dlg . results == 0 ) {
$ ( "prefFilterTestResultList" ) . innerHTML = "<tr><td align='center'>No recent articles matching this filter have been found.</td></tr>" ;
$ ( "prefFilterProgressMsg" ) . innerHTML = "Articles matching this filter:" ;
} else {
$ ( "prefFilterProgressMsg" ) . innerHTML = _ _ ( "Found %d articles matching this filter:" )
. replace ( "%d" , test _dlg . results ) ;
}
}
} else if ( ! result ) {
console . log ( "getTestResults: can't parse results object" ) ;
Element . hide ( "prefFilterLoadingIndicator" ) ;
notify _error ( "Error while trying to get filter test results." ) ;
} else {
console . log ( "getTestResults: dialog closed, bailing out." ) ;
}
} catch ( e ) {
exception _error ( "editFilterTest/inner" , e ) ;
}
} } ) ;
} ,
href : query } ) ;
dojo . connect ( test _dlg , "onLoad" , null , function ( e ) {
test _dlg . getTestResults ( query , 0 ) ;
} ) ;
test _dlg . show ( ) ;
} catch ( e ) {
exception _error ( "editFilterTest" , e ) ;
}
}
2010-02-03 13:54:17 +00:00
function quickAddFilter ( ) {
2010-11-20 11:10:26 +00:00
try {
2012-08-26 12:54:47 +00:00
var query = "" ;
if ( ! inPreferences ( ) ) {
2012-08-30 14:50:56 +00:00
query = "backend.php?op=pref-filters&method=newfilter&feed=" +
2012-08-26 12:54:47 +00:00
param _escape ( getActiveFeedId ( ) ) + "&is_cat=" +
param _escape ( activeFeedIsCat ( ) ) ;
} else {
2012-08-30 14:50:56 +00:00
query = "backend.php?op=pref-filters&method=newfilter" ;
2012-08-26 12:54:47 +00:00
}
2010-11-20 11:10:26 +00:00
2012-08-30 14:50:56 +00:00
console . log ( query ) ;
2011-12-28 10:43:55 +00:00
if ( dijit . byId ( "feedEditDlg" ) )
dijit . byId ( "feedEditDlg" ) . destroyRecursive ( ) ;
2010-11-20 11:10:26 +00:00
if ( dijit . byId ( "filterEditDlg" ) )
dijit . byId ( "filterEditDlg" ) . destroyRecursive ( ) ;
dialog = new dijit . Dialog ( {
id : "filterEditDlg" ,
title : _ _ ( "Create Filter" ) ,
style : "width: 600px" ,
2012-09-03 11:05:43 +00:00
test : function ( ) {
var query = "backend.php?" + dojo . formToQuery ( "filter_new_form" ) + "&savemode=test" ;
2015-09-09 19:13:43 +00:00
editFilterTest ( query ) ;
2012-09-03 11:05:43 +00:00
} ,
2012-08-31 08:38:45 +00:00
selectRules : function ( select ) {
$$ ( "#filterDlg_Matches input[type=checkbox]" ) . each ( function ( e ) {
e . checked = select ;
if ( select )
e . parentNode . addClassName ( "Selected" ) ;
else
e . parentNode . removeClassName ( "Selected" ) ;
} ) ;
} ,
selectActions : function ( select ) {
$$ ( "#filterDlg_Actions input[type=checkbox]" ) . each ( function ( e ) {
e . checked = select ;
if ( select )
e . parentNode . addClassName ( "Selected" ) ;
else
e . parentNode . removeClassName ( "Selected" ) ;
} ) ;
} ,
2012-08-30 14:50:56 +00:00
editRule : function ( e ) {
var li = e . parentNode ;
var rule = li . getElementsByTagName ( "INPUT" ) [ 1 ] . value ;
addFilterRule ( li , rule ) ;
} ,
editAction : function ( e ) {
var li = e . parentNode ;
var action = li . getElementsByTagName ( "INPUT" ) [ 1 ] . value ;
addFilterAction ( li , action ) ;
} ,
addAction : function ( ) { addFilterAction ( ) ; } ,
addRule : function ( ) { addFilterRule ( ) ; } ,
deleteAction : function ( ) {
$$ ( "#filterDlg_Actions li.[class*=Selected]" ) . each ( function ( e ) { e . parentNode . removeChild ( e ) } ) ;
} ,
deleteRule : function ( ) {
$$ ( "#filterDlg_Matches li.[class*=Selected]" ) . each ( function ( e ) { e . parentNode . removeChild ( e ) } ) ;
2011-04-17 20:01:24 +00:00
} ,
2010-11-20 11:10:26 +00:00
execute : function ( ) {
if ( this . validate ( ) ) {
2010-11-20 12:02:20 +00:00
2012-08-30 14:50:56 +00:00
var query = dojo . formToQuery ( "filter_new_form" ) ;
2010-11-20 12:02:20 +00:00
2012-08-30 14:50:56 +00:00
console . log ( query ) ;
2010-11-20 12:02:20 +00:00
2012-08-30 14:50:56 +00:00
new Ajax . Request ( "backend.php" , {
2010-11-20 12:02:20 +00:00
parameters : query ,
2012-08-30 14:50:56 +00:00
onComplete : function ( transport ) {
if ( inPreferences ( ) ) {
updateFilterList ( ) ;
2010-11-20 11:10:26 +00:00
}
2012-08-30 14:50:56 +00:00
dialog . hide ( ) ;
} } ) ;
2010-11-20 11:10:26 +00:00
}
} ,
href : query } ) ;
2012-08-31 13:33:22 +00:00
if ( ! inPreferences ( ) ) {
2013-11-12 10:21:28 +00:00
var selectedText = getSelectionText ( ) ;
2012-08-31 13:33:22 +00:00
var lh = dojo . connect ( dialog , "onLoad" , function ( ) {
dojo . disconnect ( lh ) ;
2013-11-12 10:21:28 +00:00
if ( selectedText != "" ) {
2012-08-31 13:33:22 +00:00
2013-11-12 10:21:28 +00:00
var feed _id = activeFeedIsCat ( ) ? 'CAT:' + parseInt ( getActiveFeedId ( ) ) :
getActiveFeedId ( ) ;
var rule = { reg _exp : selectedText , feed _id : feed _id , filter _type : 1 } ;
addFilterRule ( null , dojo . toJson ( rule ) ) ;
} else {
2012-08-31 13:33:22 +00:00
2013-11-12 10:21:28 +00:00
var query = "op=rpc&method=getlinktitlebyid&id=" + getActiveArticleId ( ) ;
2012-08-31 13:33:22 +00:00
2013-11-12 10:21:28 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
var reply = JSON . parse ( transport . responseText ) ;
2012-08-31 13:33:22 +00:00
2013-11-12 10:21:28 +00:00
var title = false ;
2013-03-22 05:49:45 +00:00
2013-11-12 10:21:28 +00:00
if ( reply && reply ) title = reply . title ;
2013-03-22 05:49:45 +00:00
2013-11-12 10:21:28 +00:00
if ( title || getActiveFeedId ( ) || activeFeedIsCat ( ) ) {
2013-03-22 05:49:45 +00:00
2013-11-12 10:21:28 +00:00
console . log ( title + " " + getActiveFeedId ( ) ) ;
2013-03-22 05:49:45 +00:00
2013-11-12 10:21:28 +00:00
var feed _id = activeFeedIsCat ( ) ? 'CAT:' + parseInt ( getActiveFeedId ( ) ) :
getActiveFeedId ( ) ;
2013-03-22 05:49:45 +00:00
2013-11-12 10:21:28 +00:00
var rule = { reg _exp : title , feed _id : feed _id , filter _type : 1 } ;
addFilterRule ( null , dojo . toJson ( rule ) ) ;
}
} } ) ;
}
2012-08-31 13:33:22 +00:00
} ) ;
}
2010-11-20 11:10:26 +00:00
dialog . show ( ) ;
2012-06-20 06:19:29 +00:00
2010-11-20 11:10:26 +00:00
} catch ( e ) {
exception _error ( "quickAddFilter" , e ) ;
}
2010-02-03 13:54:17 +00:00
}
2010-02-15 12:16:53 +00:00
2011-04-02 10:39:46 +00:00
function resetPubSub ( feed _id , title ) {
var msg = _ _ ( "Reset subscription? Tiny Tiny RSS will try to subscribe to the notification hub again on next feed update." ) . replace ( "%s" , title ) ;
if ( title == undefined || confirm ( msg ) ) {
notify _progress ( "Loading, please wait..." ) ;
2011-12-12 18:46:25 +00:00
var query = "?op=pref-feeds&quiet=1&method=resetPubSub&ids=" + feed _id ;
2011-04-02 10:39:46 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
dijit . byId ( "pubsubReset_Btn" ) . attr ( 'disabled' , true ) ;
notify _info ( "Subscription reset." ) ;
} } ) ;
}
return false ;
}
2010-02-15 12:16:53 +00:00
function unsubscribeFeed ( feed _id , title ) {
var msg = _ _ ( "Unsubscribe from %s?" ) . replace ( "%s" , title ) ;
if ( title == undefined || confirm ( msg ) ) {
notify _progress ( "Removing feed..." ) ;
2011-12-12 18:46:25 +00:00
var query = "?op=pref-feeds&quiet=1&method=remove&ids=" + feed _id ;
2010-02-15 12:16:53 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
2010-11-20 18:06:36 +00:00
if ( dijit . byId ( "feedEditDlg" ) ) dijit . byId ( "feedEditDlg" ) . hide ( ) ;
2011-03-18 11:31:54 +00:00
2010-02-15 12:16:53 +00:00
if ( inPreferences ( ) ) {
2011-03-18 11:31:54 +00:00
updateFeedList ( ) ;
2010-02-15 12:16:53 +00:00
} else {
2010-11-23 10:03:36 +00:00
if ( feed _id == getActiveFeedId ( ) )
2017-01-20 18:13:31 +00:00
setTimeout ( function ( ) { viewfeed ( { feed : - 5 } ) } , 100 ) ;
2013-02-28 16:09:25 +00:00
if ( feed _id < 0 ) updateFeedList ( ) ;
2010-02-15 12:16:53 +00:00
}
} } ) ;
}
return false ;
}
2010-09-13 11:14:18 +00:00
function backend _sanity _check _callback ( transport ) {
try {
if ( sanity _check _done ) {
fatalError ( 11 , "Sanity check request received twice. This can indicate " +
"presence of Firebug or some other disrupting extension. " +
"Please disable it and try again." ) ;
return ;
}
2011-03-18 14:39:23 +00:00
var reply = JSON . parse ( transport . responseText ) ;
2010-09-13 11:14:18 +00:00
if ( ! reply ) {
fatalError ( 3 , "Sanity check: invalid RPC reply" , transport . responseText ) ;
return ;
}
2011-03-18 14:39:23 +00:00
var error _code = reply [ 'error' ] [ 'code' ] ;
2011-03-18 11:31:54 +00:00
2010-09-13 11:14:18 +00:00
if ( error _code && error _code != 0 ) {
2011-03-18 14:39:23 +00:00
return fatalError ( error _code , reply [ 'error' ] [ 'message' ] ) ;
2010-09-13 11:14:18 +00:00
}
console . log ( "sanity check ok" ) ;
2011-03-18 14:39:23 +00:00
var params = reply [ 'init-params' ] ;
2010-09-13 11:14:18 +00:00
if ( params ) {
console . log ( 'reading init-params...' ) ;
2010-11-05 13:16:30 +00:00
2013-04-27 14:45:02 +00:00
for ( k in params ) {
2014-03-14 11:09:50 +00:00
console . log ( "IP: " + k + " => " + JSON . stringify ( params [ k ] ) ) ;
if ( k == "label_base_index" ) _label _base _index = parseInt ( params [ k ] ) ;
2010-09-13 11:14:18 +00:00
}
2010-11-10 11:23:26 +00:00
init _params = params ;
2013-04-27 16:01:54 +00:00
// PluginHost might not be available on non-index pages
window . PluginHost && PluginHost . run ( PluginHost . HOOK _PARAMS _LOADED , init _params ) ;
2010-09-13 11:14:18 +00:00
}
sanity _check _done = true ;
init _second _stage ( ) ;
} catch ( e ) {
2011-03-18 11:31:54 +00:00
exception _error ( "backend_sanity_check_callback" , e , transport ) ;
}
2010-09-13 11:14:18 +00:00
}
2011-08-31 10:03:52 +00:00
/ * f u n c t i o n h a s _ l o c a l _ s t o r a g e ( ) {
2010-11-21 15:12:50 +00:00
try {
return 'sessionStorage' in window && window [ 'sessionStorage' ] != null ;
2010-11-07 09:54:43 +00:00
} catch ( e ) {
return false ;
2011-03-18 11:31:54 +00:00
}
2011-08-31 10:03:52 +00:00
} * /
2010-11-07 20:30:05 +00:00
function catSelectOnChange ( elem ) {
try {
2010-11-20 12:29:50 +00:00
/ * v a r v a l u e = e l e m [ e l e m . s e l e c t e d I n d e x ] . v a l u e ;
2010-11-07 20:30:05 +00:00
var def = elem . getAttribute ( 'default' ) ;
if ( value == "ADD_CAT" ) {
if ( def )
dropboxSelect ( elem , def ) ;
else
elem . selectedIndex = 0 ;
quickAddCat ( elem ) ;
2010-11-20 12:29:50 +00:00
} * /
2010-11-07 20:30:05 +00:00
} catch ( e ) {
exception _error ( "catSelectOnChange" , e ) ;
}
}
2010-11-09 10:28:10 +00:00
function quickAddCat ( elem ) {
2010-11-07 20:30:05 +00:00
try {
var cat = prompt ( _ _ ( "Please enter category title:" ) ) ;
if ( cat ) {
2011-12-12 18:46:25 +00:00
var query = "?op=rpc&method=quickAddCat&cat=" + param _escape ( cat ) ;
2010-11-07 20:30:05 +00:00
2010-11-09 10:28:10 +00:00
notify _progress ( "Loading, please wait..." , true ) ;
2010-11-07 20:30:05 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
var response = transport . responseXML ;
2010-11-09 10:28:10 +00:00
var select = response . getElementsByTagName ( "select" ) [ 0 ] ;
var options = select . getElementsByTagName ( "option" ) ;
2010-11-07 20:30:05 +00:00
2010-11-09 10:28:10 +00:00
dropbox _replace _options ( elem , options ) ;
2010-11-07 20:30:05 +00:00
2010-11-09 10:28:10 +00:00
notify ( '' ) ;
2010-11-07 20:30:05 +00:00
} } ) ;
}
} catch ( e ) {
exception _error ( "quickAddCat" , e ) ;
}
}
2010-11-08 10:11:56 +00:00
function genUrlChangeKey ( feed , is _cat ) {
try {
var ok = confirm ( _ _ ( "Generate new syndication address for this feed?" ) ) ;
2011-03-18 11:31:54 +00:00
2010-11-08 10:11:56 +00:00
if ( ok ) {
2011-03-18 11:31:54 +00:00
2010-11-08 10:11:56 +00:00
notify _progress ( "Trying to change address..." , true ) ;
2011-03-18 11:31:54 +00:00
2013-04-02 10:47:43 +00:00
var query = "?op=pref-feeds&method=regenFeedKey&id=" + param _escape ( feed ) +
2010-11-08 10:11:56 +00:00
"&is_cat=" + param _escape ( is _cat ) ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
2010-11-29 13:44:50 +00:00
var reply = JSON . parse ( transport . responseText ) ;
var new _link = reply . link ;
2011-03-18 11:31:54 +00:00
2010-11-08 10:11:56 +00:00
var e = $ ( 'gen_feed_url' ) ;
2011-03-18 11:31:54 +00:00
2010-11-08 10:11:56 +00:00
if ( new _link ) {
2011-03-18 11:31:54 +00:00
e . innerHTML = e . innerHTML . replace ( /\&key=.*$/ ,
2010-11-08 10:11:56 +00:00
"&key=" + new _link ) ;
2011-04-02 07:09:06 +00:00
e . href = e . href . replace ( /\&key=.*$/ ,
"&key=" + new _link ) ;
2010-11-08 10:11:56 +00:00
new Effect . Highlight ( e ) ;
notify ( '' ) ;
2011-03-18 11:31:54 +00:00
2010-11-08 10:11:56 +00:00
} else {
notify _error ( "Could not change feed URL." ) ;
}
} } ) ;
}
} catch ( e ) {
exception _error ( "genUrlChangeKey" , e ) ;
}
return false ;
}
2010-11-08 22:04:00 +00:00
function labelSelectOnChange ( elem ) {
try {
2010-11-20 11:10:26 +00:00
/ * v a r v a l u e = e l e m [ e l e m . s e l e c t e d I n d e x ] . v a l u e ;
2010-11-08 22:04:00 +00:00
var def = elem . getAttribute ( 'default' ) ;
if ( value == "ADD_LABEL" ) {
if ( def )
dropboxSelect ( elem , def ) ;
else
elem . selectedIndex = 0 ;
addLabel ( elem , function ( transport ) {
2010-11-09 10:14:59 +00:00
try {
2010-11-08 22:04:00 +00:00
2010-11-09 10:14:59 +00:00
var response = transport . responseXML ;
var select = response . getElementsByTagName ( "select" ) [ 0 ] ;
var options = select . getElementsByTagName ( "option" ) ;
dropbox _replace _options ( elem , options ) ;
notify ( '' ) ;
} catch ( e ) {
exception _error ( "addLabel" , e ) ;
}
2010-11-08 22:04:00 +00:00
} ) ;
2010-11-20 11:10:26 +00:00
} * /
2010-11-08 22:04:00 +00:00
} catch ( e ) {
2010-11-09 10:14:59 +00:00
exception _error ( "labelSelectOnChange" , e ) ;
2010-11-08 22:04:00 +00:00
}
}
2010-11-09 10:14:59 +00:00
function dropbox _replace _options ( elem , options ) {
try {
while ( elem . hasChildNodes ( ) )
elem . removeChild ( elem . firstChild ) ;
var sel _idx = - 1 ;
for ( var i = 0 ; i < options . length ; i ++ ) {
var text = options [ i ] . firstChild . nodeValue ;
var value = options [ i ] . getAttribute ( "value" ) ;
2010-11-09 11:57:06 +00:00
if ( value == undefined ) value = text ;
2010-11-09 10:14:59 +00:00
var issel = options [ i ] . getAttribute ( "selected" ) == "1" ;
2010-11-09 10:28:10 +00:00
var option = new Option ( text , value , issel ) ;
if ( options [ i ] . getAttribute ( "disabled" ) )
option . setAttribute ( "disabled" , true ) ;
elem . insert ( option ) ;
2010-11-09 10:14:59 +00:00
if ( issel ) sel _idx = i ;
}
2010-11-08 22:04:00 +00:00
2010-11-09 10:14:59 +00:00
// Chrome doesn't seem to just select stuff when you pass new Option(x, y, true)
if ( sel _idx >= 0 ) elem . selectedIndex = sel _idx ;
} catch ( e ) {
exception _error ( "dropbox_replace_options" , e ) ;
}
}
2010-11-12 10:52:53 +00:00
// mode = all, none, invert
function selectTableRows ( id , mode ) {
try {
var rows = $ ( id ) . rows ;
for ( var i = 0 ; i < rows . length ; i ++ ) {
var row = rows [ i ] ;
var cb = false ;
2012-06-14 17:04:14 +00:00
var dcb = false ;
2010-11-12 10:52:53 +00:00
if ( row . id && row . className ) {
var bare _id = row . id . replace ( /^[A-Z]*?-/ , "" ) ;
var inputs = rows [ i ] . getElementsByTagName ( "input" ) ;
for ( var j = 0 ; j < inputs . length ; j ++ ) {
var input = inputs [ j ] ;
2011-03-18 11:31:54 +00:00
if ( input . getAttribute ( "type" ) == "checkbox" &&
2010-11-12 10:52:53 +00:00
input . id . match ( bare _id ) ) {
cb = input ;
2012-06-14 17:04:14 +00:00
dcb = dijit . getEnclosingWidget ( cb ) ;
2010-11-12 10:52:53 +00:00
break ;
}
}
2012-06-14 17:04:14 +00:00
if ( cb || dcb ) {
2010-11-14 12:55:51 +00:00
var issel = row . hasClassName ( "Selected" ) ;
2010-11-12 10:52:53 +00:00
if ( mode == "all" && ! issel ) {
2010-11-14 12:55:51 +00:00
row . addClassName ( "Selected" ) ;
2010-11-12 10:52:53 +00:00
cb . checked = true ;
2012-06-14 17:04:14 +00:00
if ( dcb ) dcb . set ( "checked" , true ) ;
2010-11-12 10:52:53 +00:00
} else if ( mode == "none" && issel ) {
2010-11-14 12:55:51 +00:00
row . removeClassName ( "Selected" ) ;
2010-11-12 10:52:53 +00:00
cb . checked = false ;
2012-06-14 17:04:14 +00:00
if ( dcb ) dcb . set ( "checked" , false ) ;
2010-11-12 10:52:53 +00:00
} else if ( mode == "invert" ) {
if ( issel ) {
2010-11-14 12:55:51 +00:00
row . removeClassName ( "Selected" ) ;
2010-11-12 10:52:53 +00:00
cb . checked = false ;
2012-06-14 17:04:14 +00:00
if ( dcb ) dcb . set ( "checked" , false ) ;
2010-11-12 10:52:53 +00:00
} else {
2010-11-14 12:55:51 +00:00
row . addClassName ( "Selected" ) ;
2010-11-12 10:52:53 +00:00
cb . checked = true ;
2012-06-14 17:04:14 +00:00
if ( dcb ) dcb . set ( "checked" , true ) ;
2010-11-12 10:52:53 +00:00
}
}
}
}
}
} catch ( e ) {
exception _error ( "selectTableRows" , e ) ;
}
}
function getSelectedTableRowIds ( id ) {
var rows = [ ] ;
try {
var elem _rows = $ ( id ) . rows ;
2011-12-10 17:26:59 +00:00
for ( var i = 0 ; i < elem _rows . length ; i ++ ) {
2010-11-14 12:55:51 +00:00
if ( elem _rows [ i ] . hasClassName ( "Selected" ) ) {
2010-11-12 10:52:53 +00:00
var bare _id = elem _rows [ i ] . id . replace ( /^[A-Z]*?-/ , "" ) ;
rows . push ( bare _id ) ;
}
}
} catch ( e ) {
exception _error ( "getSelectedTableRowIds" , e ) ;
}
return rows ;
}
2010-11-20 12:29:50 +00:00
function editFeed ( feed , event ) {
try {
2010-11-20 12:36:42 +00:00
if ( feed <= 0 )
return alert ( _ _ ( "You can't edit this kind of feed." ) ) ;
2011-12-12 18:46:25 +00:00
var query = "backend.php?op=pref-feeds&method=editfeed&id=" +
2010-11-20 12:29:50 +00:00
param _escape ( feed ) ;
console . log ( query ) ;
2011-12-28 10:43:55 +00:00
if ( dijit . byId ( "filterEditDlg" ) )
dijit . byId ( "filterEditDlg" ) . destroyRecursive ( ) ;
2010-11-20 12:29:50 +00:00
if ( dijit . byId ( "feedEditDlg" ) )
dijit . byId ( "feedEditDlg" ) . destroyRecursive ( ) ;
dialog = new dijit . Dialog ( {
id : "feedEditDlg" ,
title : _ _ ( "Edit Feed" ) ,
style : "width: 600px" ,
execute : function ( ) {
if ( this . validate ( ) ) {
2010-11-21 08:55:28 +00:00
// console.log(dojo.objectToQuery(this.attr('value')));
2010-11-20 12:29:50 +00:00
notify _progress ( "Saving data..." , true ) ;
new Ajax . Request ( "backend.php" , {
parameters : dojo . objectToQuery ( dialog . attr ( 'value' ) ) ,
onComplete : function ( transport ) {
dialog . hide ( ) ;
2010-12-17 14:14:20 +00:00
notify ( '' ) ;
2010-11-23 10:03:36 +00:00
updateFeedList ( ) ;
2011-12-10 17:26:59 +00:00
} } ) ;
2010-11-20 12:29:50 +00:00
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "editFeed" , e ) ;
}
}
2010-11-20 18:06:36 +00:00
function feedBrowser ( ) {
try {
2013-04-01 07:14:27 +00:00
var query = "backend.php?op=feeds&method=feedBrowser" ;
2010-11-20 18:06:36 +00:00
if ( dijit . byId ( "feedAddDlg" ) )
dijit . byId ( "feedAddDlg" ) . hide ( ) ;
if ( dijit . byId ( "feedBrowserDlg" ) )
dijit . byId ( "feedBrowserDlg" ) . destroyRecursive ( ) ;
var dialog = new dijit . Dialog ( {
id : "feedBrowserDlg" ,
title : _ _ ( "More Feeds" ) ,
style : "width: 600px" ,
2011-04-20 14:39:30 +00:00
getSelectedFeedIds : function ( ) {
2010-11-20 18:06:36 +00:00
var list = $$ ( "#browseFeedList li[id*=FBROW]" ) ;
var selected = new Array ( ) ;
2011-03-18 11:31:54 +00:00
list . each ( function ( child ) {
2010-11-20 18:06:36 +00:00
var id = child . id . replace ( "FBROW-" , "" ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
if ( child . hasClassName ( 'Selected' ) ) {
selected . push ( id ) ;
2011-03-18 11:31:54 +00:00
}
2010-11-20 18:06:36 +00:00
} ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
return selected ;
} ,
2011-04-20 14:39:30 +00:00
getSelectedFeeds : function ( ) {
var list = $$ ( "#browseFeedList li.Selected" ) ;
var selected = new Array ( ) ;
list . each ( function ( child ) {
var title = child . getElementsBySelector ( "span.fb_feedTitle" ) [ 0 ] . innerHTML ;
var url = child . getElementsBySelector ( "a.fb_feedUrl" ) [ 0 ] . href ;
selected . push ( [ title , url ] ) ;
} ) ;
return selected ;
} ,
2010-11-20 18:06:36 +00:00
subscribe : function ( ) {
var mode = this . attr ( 'value' ) . mode ;
2011-04-20 14:39:30 +00:00
var selected = [ ] ;
if ( mode == "1" )
selected = this . getSelectedFeeds ( ) ;
else
selected = this . getSelectedFeedIds ( ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
if ( selected . length > 0 ) {
dijit . byId ( "feedBrowserDlg" ) . hide ( ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
notify _progress ( "Loading, please wait..." , true ) ;
2011-03-18 11:31:54 +00:00
2011-04-20 14:39:30 +00:00
// we use dojo.toJson instead of JSON.stringify because
// it somehow escapes everything TWICE, at least in Chrome 9
2011-12-12 18:46:25 +00:00
var query = "?op=rpc&method=massSubscribe&payload=" +
2011-04-20 14:39:30 +00:00
param _escape ( dojo . toJson ( selected ) ) + "&mode=" + param _escape ( mode ) ;
2010-11-20 18:06:36 +00:00
console . log ( query ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 11:31:54 +00:00
onComplete : function ( transport ) {
2011-04-20 14:39:30 +00:00
notify ( '' ) ;
updateFeedList ( ) ;
2010-11-20 18:06:36 +00:00
} } ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
} else {
alert ( _ _ ( "No feeds are selected." ) ) ;
}
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
} ,
update : function ( ) {
var query = dojo . objectToQuery ( dialog . attr ( 'value' ) ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
Element . show ( 'feed_browser_spinner' ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 11:31:54 +00:00
onComplete : function ( transport ) {
2010-11-20 18:06:36 +00:00
notify ( '' ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
Element . hide ( 'feed_browser_spinner' ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
var c = $ ( "browseFeedList" ) ;
2010-11-29 13:19:32 +00:00
var reply = JSON . parse ( transport . responseText ) ;
var r = reply [ 'content' ] ;
var mode = reply [ 'mode' ] ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
if ( c && r ) {
2010-11-29 13:19:32 +00:00
c . innerHTML = r ;
2010-11-20 18:06:36 +00:00
}
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
dojo . parser . parse ( "browseFeedList" ) ;
2011-03-18 11:31:54 +00:00
2010-11-29 13:19:32 +00:00
if ( mode == 2 ) {
2010-11-20 18:06:36 +00:00
Element . show ( dijit . byId ( 'feed_archive_remove' ) . domNode ) ;
} else {
Element . hide ( dijit . byId ( 'feed_archive_remove' ) . domNode ) ;
}
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
} } ) ;
} ,
removeFromArchive : function ( ) {
2013-03-20 17:30:19 +00:00
var selected = this . getSelectedFeedIds ( ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
if ( selected . length > 0 ) {
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
var pr = _ _ ( "Remove selected feeds from the archive? Feeds with stored articles will not be removed." ) ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
if ( confirm ( pr ) ) {
Element . show ( 'feed_browser_spinner' ) ;
2011-03-18 11:31:54 +00:00
2013-03-20 17:05:19 +00:00
var query = "?op=rpc&method=remarchive&ids=" +
2010-11-20 18:06:36 +00:00
param _escape ( selected . toString ( ) ) ; ;
2011-03-18 11:31:54 +00:00
2010-11-20 18:06:36 +00:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 11:31:54 +00:00
onComplete : function ( transport ) {
2010-11-20 18:06:36 +00:00
dialog . update ( ) ;
2011-03-18 11:31:54 +00:00
} } ) ;
2010-11-20 18:06:36 +00:00
}
}
} ,
execute : function ( ) {
if ( this . validate ( ) ) {
this . subscribe ( ) ;
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "editFeed" , e ) ;
}
}
2011-04-08 11:37:50 +00:00
function showFeedsWithErrors ( ) {
try {
2012-09-14 08:30:04 +00:00
var query = "backend.php?op=pref-feeds&method=feedsWithErrors" ;
2011-04-08 11:37:50 +00:00
if ( dijit . byId ( "errorFeedsDlg" ) )
dijit . byId ( "errorFeedsDlg" ) . destroyRecursive ( ) ;
dialog = new dijit . Dialog ( {
id : "errorFeedsDlg" ,
title : _ _ ( "Feeds with update errors" ) ,
style : "width: 600px" ,
getSelectedFeeds : function ( ) {
return getSelectedTableRowIds ( "prefErrorFeedList" ) ;
} ,
removeSelected : function ( ) {
var sel _rows = this . getSelectedFeeds ( ) ;
console . log ( sel _rows ) ;
if ( sel _rows . length > 0 ) {
var ok = confirm ( _ _ ( "Remove selected feeds?" ) ) ;
if ( ok ) {
notify _progress ( "Removing selected feeds..." , true ) ;
2011-12-12 18:46:25 +00:00
var query = "?op=pref-feeds&method=remove&ids=" +
2011-04-08 11:37:50 +00:00
param _escape ( sel _rows . toString ( ) ) ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
notify ( '' ) ;
dialog . hide ( ) ;
updateFeedList ( ) ;
} } ) ;
}
} else {
alert ( _ _ ( "No feeds are selected." ) ) ;
}
} ,
execute : function ( ) {
if ( this . validate ( ) ) {
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "showFeedsWithErrors" , e ) ;
}
}
2011-08-11 22:51:00 +00:00
/* new support functions for SelectByTag */
2010-11-20 12:29:50 +00:00
2011-08-11 22:51:00 +00:00
function get _all _tags ( selObj ) {
try {
if ( ! selObj ) return "" ;
var result = "" ;
var len = selObj . options . length ;
for ( var i = 0 ; i < len ; i ++ ) {
if ( selObj . options [ i ] . selected ) {
result += selObj [ i ] . value + "%2C" ; // is really a comma
}
}
if ( result . length > 0 ) {
result = result . substr ( 0 , result . length - 3 ) ; // remove trailing %2C
}
return ( result ) ;
} catch ( e ) {
exception _error ( "get_all_tags" , e ) ;
}
}
function get _radio _checked ( radioObj ) {
try {
if ( ! radioObj ) return "" ;
var len = radioObj . length ;
if ( len == undefined ) {
if ( radioObj . checked ) {
return ( radioObj . value ) ;
} else {
return ( "" ) ;
}
}
for ( var i = 0 ; i < len ; i ++ ) {
if ( radioObj [ i ] . checked ) {
return ( radioObj [ i ] . value ) ;
}
}
} catch ( e ) {
exception _error ( "get_radio_checked" , e ) ;
}
return ( "" ) ;
}
2012-08-14 15:30:49 +00:00
function get _timestamp ( ) {
var date = new Date ( ) ;
return Math . round ( date . getTime ( ) / 1000 ) ;
}
2012-12-28 11:42:02 +00:00
function helpDialog ( topic ) {
try {
var query = "backend.php?op=backend&method=help&topic=" + param _escape ( topic ) ;
if ( dijit . byId ( "helpDlg" ) )
dijit . byId ( "helpDlg" ) . destroyRecursive ( ) ;
dialog = new dijit . Dialog ( {
id : "helpDlg" ,
title : _ _ ( "Help" ) ,
style : "width: 600px" ,
href : query ,
} ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "helpDialog" , e ) ;
}
}
2013-03-20 09:17:48 +00:00
function htmlspecialchars _decode ( string , quote _style ) {
// http://kevin.vanzonneveld.net
// + original by: Mirek Slugen
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Mateusz "loonquawl" Zalega
// + input by: ReverseSyntax
// + input by: Slawomir Kaniecki
// + input by: Scott Cariss
// + input by: Francois
// + bugfixed by: Onno Marsman
// + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Brett Zamir (http://brett-zamir.me)
// + input by: Ratheous
// + input by: Mailfaker (http://www.weedem.fr/)
// + reimplemented by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Brett Zamir (http://brett-zamir.me)
// * example 1: htmlspecialchars_decode("<p>this -> "</p>", 'ENT_NOQUOTES');
// * returns 1: '<p>this -> "</p>'
// * example 2: htmlspecialchars_decode("&quot;");
// * returns 2: '"'
var optTemp = 0 ,
i = 0 ,
noquotes = false ;
if ( typeof quote _style === 'undefined' ) {
quote _style = 2 ;
}
string = string . toString ( ) . replace ( /</g , '<' ) . replace ( />/g , '>' ) ;
var OPTS = {
'ENT_NOQUOTES' : 0 ,
'ENT_HTML_QUOTE_SINGLE' : 1 ,
'ENT_HTML_QUOTE_DOUBLE' : 2 ,
'ENT_COMPAT' : 2 ,
'ENT_QUOTES' : 3 ,
'ENT_IGNORE' : 4
} ;
if ( quote _style === 0 ) {
noquotes = true ;
}
if ( typeof quote _style !== 'number' ) { // Allow for a single string or an array of string flags
quote _style = [ ] . concat ( quote _style ) ;
for ( i = 0 ; i < quote _style . length ; i ++ ) {
// Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4
if ( OPTS [ quote _style [ i ] ] === 0 ) {
noquotes = true ;
} else if ( OPTS [ quote _style [ i ] ] ) {
optTemp = optTemp | OPTS [ quote _style [ i ] ] ;
}
}
quote _style = optTemp ;
}
if ( quote _style & OPTS . ENT _HTML _QUOTE _SINGLE ) {
string = string . replace ( /�*39;/g , "'" ) ; // PHP doesn't currently escape if more than one 0, but it should
// string = string.replace(/'|�*27;/g, "'"); // This would also be useful here, but not a part of PHP
}
if ( ! noquotes ) {
string = string . replace ( /"/g , '"' ) ;
}
// Put this in last place to avoid escape being double-decoded
string = string . replace ( /&/g , '&' ) ;
return string ;
}
2013-03-27 05:40:07 +00:00
function label _to _feed _id ( label ) {
return _label _base _index - 1 - Math . abs ( label ) ;
}
function feed _to _label _id ( feed ) {
return _label _base _index - 1 + Math . abs ( feed ) ;
}
2013-11-12 10:21:28 +00:00
// http://stackoverflow.com/questions/6251937/how-to-get-selecteduser-highlighted-text-in-contenteditable-element-and-replac
function getSelectionText ( ) {
var text = "" ;
if ( typeof window . getSelection != "undefined" ) {
var sel = window . getSelection ( ) ;
if ( sel . rangeCount ) {
var container = document . createElement ( "div" ) ;
for ( var i = 0 , len = sel . rangeCount ; i < len ; ++ i ) {
container . appendChild ( sel . getRangeAt ( i ) . cloneContents ( ) ) ;
}
text = container . innerHTML ;
}
} else if ( typeof document . selection != "undefined" ) {
if ( document . selection . type == "Text" ) {
text = document . selection . createRange ( ) . textText ;
}
}
return text . stripTags ( ) ;
}
2015-09-11 10:05:08 +00:00
2017-02-08 12:07:05 +00:00
function openUrlPopup ( url ) {
var w = window . open ( "" ) ;
w . opener = null ;
w . location = url ;
}
2015-09-11 10:05:08 +00:00
function openArticlePopup ( id ) {
2017-02-08 12:07:05 +00:00
var w = window . open ( "" ,
2015-09-11 10:05:08 +00:00
"ttrss_article_popup" ,
"height=900,width=900,resizable=yes,status=no,location=no,menubar=no,directories=no,scrollbars=yes,toolbar=no" ) ;
2017-02-08 12:07:05 +00:00
w . opener = null ;
w . location = "backend.php?op=article&method=view&mode=raw&html=1&zoom=1&id=" + id + "&csrf_token=" + getInitParam ( "csrf_token" ) ;
2015-09-11 10:05:08 +00:00
}