2008-05-19 09:37:44 +02:00
var notify _silent = false ;
2010-11-19 14:08:02 +01:00
var loading _progress = 0 ;
2010-09-13 13:14:18 +02:00
var sanity _check _done = false ;
2008-05-15 06:21:00 +02:00
2007-05-15 13:41:39 +02: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 ) ;
}
}
2010-09-05 11:41:19 +02:00
/* create console.log if it doesn't exist */
if ( ! window . console ) console = { } ;
2010-11-07 12:38:59 +01:00
console . log = console . log || function ( msg ) { } ;
console . warn = console . warn || function ( msg ) { } ;
console . error = console . error || function ( msg ) { } ;
2007-02-18 08:30:16 +01:00
2009-01-23 18:19:17 +01:00
function exception _error ( location , e , ext _info ) {
2009-01-23 15:20:36 +01:00
var msg = format _exception _error ( location , e ) ;
2010-09-05 11:41:19 +02:00
if ( ! ext _info ) ext _info = false ;
2009-02-04 21:19:16 +01:00
2009-01-23 18:19:17 +01:00
try {
2009-01-23 15:20:36 +01:00
2010-11-14 21:46:49 +01:00
if ( ext _info ) {
if ( ext _info . responseText ) {
ext _info = ext _info . responseText ;
2009-01-23 15:20:36 +01:00
}
2010-11-14 21:46:49 +01:00
}
2010-09-05 11:41:19 +02:00
2010-11-14 21:46:49 +01:00
var content = "<div class=\"fatalError\">" +
"<pre>" + msg + "</pre>" ;
2010-09-05 11:41:19 +02:00
2011-03-18 12:31:54 +01:00
content += "<form name=\"exceptionForm\" id=\"exceptionForm\" target=\"_blank\" " +
"action=\"http://tt-rss.org/report.php\" method=\"POST\">" ;
content += "<textarea style=\"display : none\" name=\"message\">" + msg + "</textarea>" ;
content += "<textarea style=\"display : none\" name=\"params\">N/A</textarea>" ;
2010-11-14 21:46:49 +01:00
if ( ext _info ) {
content += "<div><b>Additional information:</b></div>" +
2011-03-18 12:31:54 +01:00
"<textarea name=\"xinfo\" readonly=\"1\">" + ext _info + "</textarea>" ;
2009-01-23 15:20:36 +01:00
}
2010-11-14 21:46:49 +01:00
content += "<div><b>Stack trace:</b></div>" +
2011-03-18 12:31:54 +01:00
"<textarea name=\"stack\" readonly=\"1\">" + e . stack + "</textarea>" ;
content += "</form>" ;
2010-11-14 21:46:49 +01:00
2010-11-15 11:12:02 +01:00
content += "</div>" ;
2011-03-06 08:56:08 +01:00
content += "<div class='dlgButtons'>" ;
content += "<button dojoType=\"dijit.form.Button\"" +
"onclick=\"dijit.byId('exceptionDlg').report()\">" +
_ _ ( 'Report to tt-rss.org' ) + "</button> " ;
content += "<button dojoType=\"dijit.form.Button\" " +
2011-03-18 12:31:54 +01:00
"onclick=\"dijit.byId('exceptionDlg').hide()\">" +
2011-03-06 08:56:08 +01:00
_ _ ( 'Close' ) + "</button>" ;
content += "</div>" ;
2011-04-21 13:27:09 +02:00
if ( dijit . byId ( "exceptionDlg" ) )
dijit . byId ( "exceptionDlg" ) . destroyRecursive ( ) ;
2010-11-14 21:46:49 +01:00
2010-11-15 11:12:02 +01:00
var dialog = new dijit . Dialog ( {
2011-03-06 08:56:08 +01:00
id : "exceptionDlg" ,
2010-11-15 11:12:02 +01:00
title : "Unhandled exception" ,
style : "width: 600px" ,
2011-03-06 08:56:08 +01:00
report : function ( ) {
if ( confirm ( _ _ ( "Are you sure to report this exception to tt-rss.org? The report will include your browser information. Your IP would be saved in the database." ) ) ) {
2011-03-18 12:31:54 +01:00
document . forms [ 'exceptionForm' ] . params . value = $H ( {
2011-03-06 08:56:08 +01:00
browserName : navigator . appName ,
browserVersion : navigator . appVersion ,
browserPlatform : navigator . platform ,
browserCookies : navigator . cookieEnabled ,
2011-03-18 12:31:54 +01:00
} ) . toQueryString ( ) ;
2011-03-06 08:56:08 +01:00
2011-03-18 12:31:54 +01:00
document . forms [ 'exceptionForm' ] . submit ( ) ;
2011-03-06 08:56:08 +01:00
}
} ,
2010-11-15 11:12:02 +01:00
content : content } ) ;
dialog . show ( ) ;
2010-11-14 21:46:49 +01:00
2009-01-23 18:19:17 +01:00
} catch ( e ) {
2009-01-23 15:20:36 +01:00
alert ( msg ) ;
}
2009-01-23 18:19:17 +01:00
2009-01-23 15:20:36 +01:00
}
function format _exception _error ( location , e ) {
2005-12-14 08:29:38 +01:00
var msg ;
if ( e . fileName ) {
var base _fname = e . fileName . substring ( e . fileName . lastIndexOf ( "/" ) + 1 ) ;
2011-03-18 12:31:54 +01:00
msg = "Exception: " + e . name + ", " + e . message +
2005-12-14 08:29:38 +01:00
"\nFunction: " + location + "()" +
"\nLocation: " + base _fname + ":" + e . lineNumber ;
2008-05-20 12:39:48 +02:00
} else if ( e . description ) {
msg = "Exception: " + e . description + "\nFunction: " + location + "()" ;
2005-12-14 08:29:38 +01:00
} else {
msg = "Exception: " + e + "\nFunction: " + location + "()" ;
}
2010-09-05 11:41:19 +02:00
console . error ( "EXCEPTION: " + msg ) ;
2006-05-23 08:55:26 +02:00
2009-01-23 15:20:36 +01:00
return msg ;
2005-11-26 11:06:56 +01:00
}
2005-08-22 07:28:27 +02:00
function param _escape ( arg ) {
if ( typeof encodeURIComponent != 'undefined' )
2011-03-18 12:31:54 +01:00
return encodeURIComponent ( arg ) ;
2005-08-22 07:28:27 +02:00
else
return escape ( arg ) ;
}
function param _unescape ( arg ) {
if ( typeof decodeURIComponent != 'undefined' )
2011-03-18 12:31:54 +01:00
return decodeURIComponent ( arg ) ;
2005-08-22 07:28:27 +02:00
else
return unescape ( arg ) ;
}
2006-05-18 14:01:09 +02:00
var notify _hide _timerid = false ;
2006-05-20 18:00:41 +02:00
2006-05-18 14:01:09 +02:00
function hide _notify ( ) {
2009-02-10 10:06:15 +01:00
var n = $ ( "notify" ) ;
2007-03-02 20:58:58 +01:00
if ( n ) {
2006-09-29 09:23:41 +02:00
n . style . display = "none" ;
2005-11-19 19:01:06 +01:00
}
2011-03-18 12:31:54 +01:00
}
2005-09-05 17:49:39 +02:00
2008-05-19 09:37:44 +02:00
function notify _silent _next ( ) {
notify _silent = true ;
}
2007-03-02 20:58:58 +01:00
function notify _real ( msg , no _hide , n _type ) {
2005-08-22 07:28:27 +02:00
2008-05-19 09:37:44 +02:00
if ( notify _silent ) {
notify _silent = false ;
return ;
}
2009-02-10 10:06:15 +01:00
var n = $ ( "notify" ) ;
var nb = $ ( "notify_body" ) ;
2005-08-22 07:28:27 +02:00
2005-09-05 17:49:39 +02:00
if ( ! n || ! nb ) return ;
2005-09-05 14:02:00 +02:00
2006-05-19 07:44:23 +02:00
if ( notify _hide _timerid ) {
window . clearTimeout ( notify _hide _timerid ) ;
}
2005-11-19 19:01:06 +01:00
if ( msg == "" ) {
2006-05-19 07:44:23 +02:00
if ( n . style . display == "block" ) {
notify _hide _timerid = window . setTimeout ( "hide_notify()" , 0 ) ;
}
return ;
2005-08-22 07:28:27 +02:00
} else {
2006-05-18 09:56:52 +02:00
n . style . display = "block" ;
2005-11-19 19:01:06 +01:00
}
2005-08-22 07:28:27 +02:00
2007-03-02 20:58:58 +01:00
/ * t y p e s :
1 - generic
2 - progress
3 - error
4 - info
* /
2007-03-06 07:54:47 +01:00
if ( typeof _ _ != 'undefined' ) {
msg = _ _ ( msg ) ;
}
2007-03-02 20:58:58 +01:00
if ( n _type == 1 ) {
n . className = "notify" ;
} else if ( n _type == 2 ) {
n . className = "notifyProgress" ;
2010-01-14 21:09:23 +01:00
msg = "<img src='" + getInitParam ( "sign_progress" ) + "'> " + msg ;
2007-03-02 20:58:58 +01:00
} else if ( n _type == 3 ) {
2006-10-01 11:08:55 +02:00
n . className = "notifyError" ;
2010-01-14 21:09:23 +01:00
msg = "<img src='" + getInitParam ( "sign_excl" ) + "'> " + msg ;
2007-03-02 20:58:58 +01:00
} else if ( n _type == 4 ) {
n . className = "notifyInfo" ;
2010-01-14 21:09:23 +01:00
msg = "<img src='" + getInitParam ( "sign_info" ) + "'> " + msg ;
2006-05-18 14:37:52 +02:00
}
2006-09-29 08:51:40 +02:00
// msg = "<img src='images/live_com_loading.gif'> " + msg;
2006-05-18 09:56:52 +02:00
nb . innerHTML = msg ;
2006-05-18 14:32:28 +02:00
if ( ! no _hide ) {
2006-05-18 15:51:15 +02:00
notify _hide _timerid = window . setTimeout ( "hide_notify()" , 3000 ) ;
2006-05-18 14:32:28 +02:00
}
2006-05-18 14:01:09 +02:00
}
2007-03-02 20:58:58 +01:00
function notify ( msg , no _hide ) {
notify _real ( msg , no _hide , 1 ) ;
2006-05-18 14:01:09 +02:00
}
2007-03-02 20:58:58 +01: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 07:28:27 +02:00
}
2006-03-20 17:53:11 +01:00
function setCookie ( name , value , lifetime , path , domain , secure ) {
2011-03-18 12:31:54 +01:00
2006-03-20 17:53:11 +01:00
var d = false ;
2011-03-18 12:31:54 +01:00
2006-03-20 17:53:11 +01:00
if ( lifetime ) {
d = new Date ( ) ;
2007-03-21 16:36:24 +01:00
d . setTime ( d . getTime ( ) + ( lifetime * 1000 ) ) ;
2006-03-20 17:53:11 +01:00
}
2007-03-22 07:46:49 +01:00
2010-09-05 11:41:19 +02:00
console . log ( "setCookie: " + name + " => " + value + ": " + d ) ;
2011-03-18 12:31:54 +01:00
2006-03-20 17:53:11 +01:00
int _setCookie ( name , value , d , path , domain , secure ) ;
}
function int _setCookie ( name , value , expires , path , domain , secure ) {
2005-09-06 06:14:17 +02:00
document . cookie = name + "=" + escape ( value ) +
( ( expires ) ? "; expires=" + expires . toGMTString ( ) : "" ) +
( ( path ) ? "; path=" + path : "" ) +
( ( domain ) ? "; domain=" + domain : "" ) +
( ( secure ) ? "; secure" : "" ) ;
}
2006-03-20 17:53:11 +01: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 12:31:54 +01:00
2006-03-20 17:53:11 +01:00
2005-09-06 06:14:17 +02: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 09:19:14 +02:00
function gotoPreferences ( ) {
document . location . href = "prefs.php" ;
}
function gotoMain ( ) {
document . location . href = "tt-rss.php" ;
}
2011-07-31 04:34:22 +02:00
function gotoExportOpml ( filename , settings ) {
tmp = settings ? 1 : 0 ;
document . location . href = "opml.php?op=Export&filename=" + filename + "&settings=" + tmp ;
2005-09-07 15:31:21 +02:00
}
2005-09-08 07:29:45 +02:00
2006-06-05 10:33:19 +02:00
2005-10-17 05:24:40 +02: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 12:31:54 +01: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 05:24:40 +02: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 ) + "" ;
for ( j = 0 ; j < x . length ; j ++ ) {
// 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 10:13:49 +01:00
2005-12-13 06:52:32 +01:00
function toggleSelectRowById ( sender , id ) {
2009-02-10 10:06:15 +01:00
var row = $ ( id ) ;
2010-11-14 13:55:51 +01:00
return toggleSelectRow ( sender , row ) ;
2005-12-13 06:52:32 +01:00
}
2005-12-30 05:22:07 +01:00
function toggleSelectListRow ( sender ) {
2010-11-14 13:55:51 +01:00
var row = sender . parentNode ;
return toggleSelectRow ( sender , row ) ;
2005-12-30 05:22:07 +01:00
}
2010-11-18 20:26:04 +01:00
/* this is for dijit Checkbox */
function toggleSelectListRow2 ( sender ) {
var row = sender . domNode . parentNode ;
return toggleSelectRow ( sender , row ) ;
}
2010-11-14 13:55:51 +01:00
function tSR ( sender , row ) {
return toggleSelectRow ( sender , row ) ;
2007-05-15 09:51:57 +02:00
}
2005-12-13 06:52:32 +01:00
2010-11-18 20:26:04 +01:00
/* this is for dijit Checkbox */
function toggleSelectRow2 ( sender , row ) {
if ( ! row ) row = sender . domNode . parentNode . parentNode ;
if ( sender . checked && ! row . hasClassName ( 'Selected' ) )
row . addClassName ( 'Selected' ) ;
else
row . removeClassName ( 'Selected' ) ;
}
2010-11-14 13:55:51 +01:00
function toggleSelectRow ( sender , row ) {
2005-11-27 15:56:10 +01:00
2010-11-14 13:55:51 +01:00
if ( ! row ) row = sender . parentNode . parentNode ;
if ( sender . checked && ! row . hasClassName ( 'Selected' ) )
row . addClassName ( 'Selected' ) ;
else
row . removeClassName ( 'Selected' ) ;
2005-11-27 15:56:10 +01:00
}
2007-08-11 18:43:45 +02:00
function checkboxToggleElement ( elem , id ) {
if ( elem . checked ) {
2010-11-15 11:12:02 +01:00
Effect . Appear ( id , { duration : 0.5 } ) ;
2007-08-11 18:43:45 +02:00
} else {
2008-08-06 09:51:28 +02:00
Effect . Fade ( id , { duration : 0.5 } ) ;
2007-08-11 18:43:45 +02:00
}
}
2005-12-20 12:14:24 +01:00
function dropboxSelect ( e , v ) {
for ( i = 0 ; i < e . length ; i ++ ) {
if ( e [ i ] . value == v ) {
e . selectedIndex = i ;
break ;
}
}
}
2006-02-28 17:25:38 +01:00
2011-03-08 09:28:21 +01:00
function getURLParam ( param ) {
return String ( window . location . href ) . parseQuery ( ) [ param ] ;
2011-03-18 12:31:54 +01:00
}
2006-02-28 17:25:38 +01:00
2006-03-04 11:35:47 +01:00
function leading _zero ( p ) {
var s = String ( p ) ;
if ( s . length == 1 ) s = "0" + s ;
return s ;
}
2006-03-20 12:24:34 +01:00
2010-09-05 11:41:19 +02:00
function make _timestamp ( ) {
var d = new Date ( ) ;
return leading _zero ( d . getHours ( ) ) + ":" + leading _zero ( d . getMinutes ( ) ) +
":" + leading _zero ( d . getSeconds ( ) ) ;
}
2009-01-23 15:20:36 +01:00
function closeErrorBox ( ) {
2007-05-14 10:08:18 +02:00
2009-01-23 18:19:17 +01:00
if ( Element . visible ( "errorBoxShadow" ) ) {
2009-01-23 15:20:36 +01:00
Element . hide ( "dialog_overlay" ) ;
2009-01-23 18:19:17 +01:00
Element . hide ( "errorBoxShadow" ) ;
2006-05-18 06:58:31 +02:00
}
2009-01-23 15:20:36 +01:00
return false ;
}
2006-05-21 06:28:51 +02:00
2009-01-23 15:20:36 +01:00
function closeInfoBox ( cleanup ) {
2009-10-08 10:36:27 +02:00
try {
2010-11-17 08:12:50 +01:00
dialog = dijit . byId ( "infoBox" ) ;
2010-11-15 11:12:02 +01:00
2010-11-17 08:12:50 +01:00
if ( dialog ) dialog . hide ( ) ;
2009-01-23 15:20:36 +01:00
2009-10-08 10:36:27 +02:00
} catch ( e ) {
2010-11-14 21:46:49 +01:00
//exception_error("closeInfoBox", e);
2009-01-23 15:20:36 +01:00
}
2006-07-25 12:47:51 +02:00
return false ;
2006-05-18 06:58:31 +02:00
}
2010-01-06 12:17:28 +01:00
function displayDlg ( id , param , callback ) {
2006-05-18 04:48:33 +02:00
2010-11-14 21:46:49 +01:00
notify _progress ( "Loading, please wait..." , true ) ;
2006-05-18 10:29:17 +02:00
2009-12-29 16:49:27 +01:00
var query = "?op=dlg&id=" +
2007-08-25 14:11:54 +02:00
param _escape ( id ) + "¶m=" + param _escape ( param ) ;
2009-12-29 16:49:27 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2007-08-25 14:11:54 +02:00
onComplete : function ( transport ) {
infobox _callback2 ( transport ) ;
2010-01-06 12:17:28 +01:00
if ( callback ) callback ( transport ) ;
2007-08-25 14:11:54 +02:00
} } ) ;
2006-07-25 12:47:51 +02:00
return false ;
2006-05-18 04:48:33 +02:00
}
2007-08-24 06:36:00 +02:00
function infobox _callback2 ( transport ) {
try {
2010-11-17 08:12:50 +01:00
var dialog = false ;
2010-11-16 14:47:56 +01:00
if ( dijit . byId ( "infoBox" ) ) {
2010-11-17 08:12:50 +01:00
dialog = dijit . byId ( "infoBox" ) ;
2010-11-16 14:47:56 +01:00
}
2007-05-14 10:08:18 +02:00
2010-11-14 21:46:49 +01:00
//console.log("infobox_callback2");
notify ( '' ) ;
2007-05-14 10:08:18 +02:00
2010-11-14 21:46:49 +01:00
var content ;
var dtitle = "Dialog" ;
2007-08-11 06:14:27 +02:00
2010-11-20 13:38:27 +01:00
var dlg = transport . responseXML . getElementsByTagName ( "dlg" ) [ 0 ] ;
2009-10-07 14:33:45 +02:00
2010-11-20 13:38:27 +01:00
var title = transport . responseXML . getElementsByTagName ( "title" ) [ 0 ] ;
if ( title )
title = title . firstChild . nodeValue ;
2009-10-07 14:33:45 +02:00
2010-11-20 13:38:27 +01:00
var content = transport . responseXML . getElementsByTagName ( "content" ) [ 0 ] ;
2011-03-18 12:31:54 +01:00
2010-11-20 13:38:27 +01:00
content = content . firstChild . nodeValue ;
2007-08-10 09:35:55 +02:00
2010-11-17 08:12:50 +01: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 11:12:02 +01:00
dialog . show ( ) ;
2007-08-24 06:36:00 +02:00
notify ( "" ) ;
} catch ( e ) {
exception _error ( "infobox_callback2" , e ) ;
2007-05-14 07:41:04 +02:00
}
}
2006-10-01 08:33:32 +02:00
function filterCR ( e , f )
2006-05-21 06:28:51 +02:00
{
var key ;
if ( window . event )
key = window . event . keyCode ; //IE
else
key = e . which ; //firefox
2006-10-01 08:33:32 +02:00
if ( key == 13 ) {
if ( typeof f != 'undefined' ) {
f ( ) ;
return false ;
} else {
return false ;
}
} else {
return true ;
}
2006-05-21 06:28:51 +02:00
}
2006-05-23 08:15:49 +02:00
function getInitParam ( key ) {
2007-03-26 07:23:15 +02:00
return init _params [ key ] ;
2006-05-23 08:15:49 +02:00
}
2006-05-23 07:34:50 +02:00
2010-01-12 09:48:31 +01:00
function setInitParam ( key , value ) {
2007-05-11 09:50:02 +02:00
init _params [ key ] = value ;
2007-03-21 16:36:24 +01:00
}
2009-01-23 18:19:17 +01:00
function fatalError ( code , msg , ext _info ) {
2011-03-18 12:31:54 +01:00
try {
2006-05-23 09:15:48 +02:00
2007-02-24 18:16:33 +01:00
if ( code == 6 ) {
2011-03-18 12:31:54 +01:00
window . location . href = "tt-rss.php" ;
2007-02-24 18:16:33 +01:00
} else if ( code == 5 ) {
2010-11-09 14:33:08 +01:00
window . location . href = "db-updater.php" ;
2007-02-24 18:16:33 +01:00
} else {
2011-03-18 12:31:54 +01:00
2009-01-23 18:19:17 +01:00
if ( msg == "" ) msg = "Unknown error" ;
2007-03-02 20:58:58 +01:00
2011-02-18 10:28:03 +01:00
if ( ext _info ) {
if ( ext _info . responseText ) {
ext _info = ext _info . responseText ;
2009-01-23 18:19:17 +01:00
}
2011-02-18 10:28:03 +01:00
}
if ( ERRORS && ERRORS [ code ] && ! msg ) {
msg = ERRORS [ code ] ;
}
2011-03-18 12:31:54 +01:00
2011-02-18 10:28:03 +01: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 12:31:54 +01:00
"<textarea style='width: 100%' readonly=\"1\">" +
2011-02-18 10:28:03 +01:00
ext _info + "</textarea>" ;
2009-01-23 18:19:17 +01:00
}
2011-02-18 10:28:03 +01:00
var dialog = new dijit . Dialog ( {
title : "Fatal error" ,
style : "width: 600px" ,
content : content } ) ;
dialog . show ( ) ;
2006-11-09 11:00:24 +01:00
}
2006-05-23 09:15:48 +02:00
2011-02-18 10:28:03 +01:00
return false ;
2006-05-23 09:15:48 +02:00
} catch ( e ) {
exception _error ( "fatalError" , e ) ;
}
}
2008-12-13 12:57:53 +01:00
function filterDlgCheckType ( sender ) {
try {
2010-11-20 12:10:26 +01:00
var ftype = sender . value ;
2008-12-13 12:57:53 +01:00
// if selected filter type is 5 (Date) enable the modifier dropbox
if ( ftype == 5 ) {
2010-11-20 12:10:26 +01:00
Element . show ( "filterDlg_dateModBox" ) ;
Element . show ( "filterDlg_dateChkBox" ) ;
2008-12-13 12:57:53 +01:00
} else {
2010-11-20 12:10:26 +01:00
Element . hide ( "filterDlg_dateModBox" ) ;
Element . hide ( "filterDlg_dateChkBox" ) ;
2008-12-13 12:57:53 +01:00
}
} catch ( e ) {
exception _error ( "filterDlgCheckType" , e ) ;
}
}
2006-12-08 09:05:21 +01:00
function filterDlgCheckAction ( sender ) {
try {
2010-11-20 12:10:26 +01:00
var action = sender . value ;
2006-12-08 09:05:21 +01:00
2010-11-20 12:10:26 +01:00
var action _param = $ ( "filterDlg_paramBox" ) ;
2006-12-08 09:05:21 +01:00
if ( ! action _param ) {
2010-09-05 11:41:19 +02:00
console . log ( "filterDlgCheckAction: can't find action param box!" ) ;
2006-12-08 09:05:21 +01:00
return ;
}
// if selected action supports parameters, enable params field
2009-01-18 09:28:42 +01:00
if ( action == 4 || action == 6 || action == 7 ) {
2010-11-20 12:10:26 +01:00
new Effect . Appear ( action _param , { duration : 0.5 } ) ;
2009-01-18 09:28:42 +01:00
if ( action != 7 ) {
2010-11-20 12:10:26 +01:00
Element . show ( dijit . byId ( "filterDlg_actionParam" ) . domNode ) ;
Element . hide ( dijit . byId ( "filterDlg_actionParamLabel" ) . domNode ) ;
2009-01-18 09:28:42 +01:00
} else {
2010-11-20 12:10:26 +01:00
Element . show ( dijit . byId ( "filterDlg_actionParamLabel" ) . domNode ) ;
Element . hide ( dijit . byId ( "filterDlg_actionParam" ) . domNode ) ;
2009-01-18 09:28:42 +01:00
}
2006-12-08 09:05:21 +01:00
} else {
2008-08-07 05:17:24 +02:00
Element . hide ( action _param ) ;
2006-12-08 09:05:21 +01:00
}
} catch ( e ) {
2008-05-17 18:25:41 +02:00
exception _error ( "filterDlgCheckAction" , e ) ;
2006-12-08 09:05:21 +01:00
}
}
2007-01-27 10:21:55 +01:00
2008-12-13 12:57:53 +01:00
function filterDlgCheckDate ( ) {
try {
2010-11-20 12:10:26 +01:00
var dialog = dijit . byId ( "filterEditDlg" ) ;
2008-12-13 12:57:53 +01:00
2010-11-20 12:10:26 +01:00
var reg _exp = dialog . attr ( 'value' ) . reg _exp ;
2008-12-13 12:57:53 +01:00
2009-12-29 16:49:27 +01:00
var query = "?op=rpc&subop=checkDate&date=" + reg _exp ;
2008-12-13 12:57:53 +01:00
2009-12-29 16:49:27 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 12:31:54 +01:00
onComplete : function ( transport ) {
2008-12-13 12:57:53 +01:00
2010-11-29 14:09:28 +01:00
var reply = JSON . parse ( transport . responseText ) ;
2008-12-13 12:57:53 +01:00
2010-11-29 14:09:28 +01:00
if ( reply [ 'result' ] == true ) {
2011-04-18 11:09:59 +02:00
alert ( _ _ ( "Date syntax appears to be correct:" ) + " " + reply [ 'date' ] ) ;
2010-11-29 14:09:28 +01:00
return ;
} else {
alert ( _ _ ( "Date syntax is incorrect." ) ) ;
}
2008-12-13 12:57:53 +01:00
} } ) ;
} catch ( e ) {
exception _error ( "filterDlgCheckDate" , e ) ;
}
}
2007-01-27 10:21:55 +01:00
function explainError ( code ) {
return displayDlg ( "explainError" , code ) ;
}
2007-03-01 10:43:54 +01:00
2008-01-12 13:05:29 +01:00
function displayHelpInfobox ( topic _id ) {
2007-10-18 06:51:29 +02:00
2008-01-12 13:05:29 +01:00
var url = "backend.php?op=help&tid=" + param _escape ( topic _id ) ;
2011-03-18 12:31:54 +01:00
var w = window . open ( url , "ttrss_help" ,
2008-01-12 13:05:29 +01:00
"status=0,toolbar=0,location=0,width=450,height=500,scrollbars=1,menubar=0" ) ;
}
2008-03-20 06:34:43 +01:00
2008-05-19 10:03:53 +02:00
function loading _set _progress ( p ) {
2008-05-19 09:37:44 +02:00
try {
2010-11-19 14:08:02 +01:00
loading _progress += p ;
2008-05-19 10:12:54 +02:00
2010-11-19 14:08:02 +01:00
if ( dijit . byId ( "loading_bar" ) )
dijit . byId ( "loading_bar" ) . update ( { progress : loading _progress } ) ;
2008-05-19 10:03:53 +02:00
2010-11-19 14:08:02 +01:00
if ( loading _progress >= 90 )
remove _splash ( ) ;
2008-05-19 09:37:44 +02:00
} catch ( e ) {
exception _error ( "loading_set_progress" , e ) ;
}
}
2008-05-19 14:00:35 +02:00
function remove _splash ( ) {
2010-11-19 14:08:02 +01:00
2008-05-19 14:00:35 +02:00
if ( Element . visible ( "overlay" ) ) {
2010-09-05 11:41:19 +02:00
console . log ( "about to remove splash, OMG!" ) ;
2008-05-19 14:00:35 +02:00
Element . hide ( "overlay" ) ;
2010-09-05 11:41:19 +02:00
console . log ( "removed splash!" ) ;
2008-05-19 14:00:35 +02:00
}
}
2008-08-07 10:06:12 +02:00
2009-01-31 21:03:40 +01: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 06:14:06 +01:00
2009-02-03 17:09:59 +01: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 11:01:40 +02:00
2009-10-09 11:13:57 +02: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 11:41:19 +02:00
console . log ( "hotkey_prefix seems to be stuck, aborting" ) ;
2009-10-09 11:13:57 +02:00
hotkey _prefix _pressed = false ;
hotkey _prefix = false ;
Element . hide ( 'cmdline' ) ;
}
setTimeout ( "hotkey_prefix_timeout()" , 1000 ) ;
} catch ( e ) {
exception _error ( "hotkey_prefix_timeout" , e ) ;
}
}
2009-10-13 17:05:36 +02:00
function hideAuxDlg ( ) {
try {
Element . hide ( 'auxDlg' ) ;
} catch ( e ) {
exception _error ( "hideAuxDlg" , e ) ;
}
}
2010-01-13 11:44:20 +01:00
2010-01-14 10:47:28 +01:00
function uploadIconHandler ( rc ) {
2010-01-14 09:28:57 +01:00
try {
2010-01-14 10:47:28 +01: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?" ) ) ) {
var query = "backend.php?op=pref-feeds&subop=removeicon&feed_id=" + param _escape ( id ) ;
2010-01-14 09:28:57 +01:00
2010-09-05 11:41:19 +02:00
console . log ( query ) ;
2010-01-14 09:28:57 +01:00
2010-01-14 10:47:28 +01:00
notify _progress ( "Removing feed icon..." , true ) ;
2010-01-14 09:28:57 +01:00
2010-01-14 10:47:28 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 12:31:54 +01:00
onComplete : function ( transport ) {
2010-01-14 10:47:28 +01:00
notify _info ( "Feed icon removed." ) ;
if ( inPreferences ( ) ) {
updateFeedList ( ) ;
} else {
setTimeout ( 'updateFeedList(false, false)' , 50 ) ;
}
2011-03-18 12:31:54 +01:00
} } ) ;
2010-01-14 10:47:28 +01:00
}
return false ;
2010-01-14 09:28:57 +01:00
} catch ( e ) {
2010-01-14 10:47:28 +01:00
exception _error ( "uploadFeedIcon" , e ) ;
2010-01-14 09:28:57 +01: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 10:47:28 +01:00
if ( confirm ( _ _ ( "Upload new icon for this feed?" ) ) ) {
notify _progress ( "Uploading, please wait..." , true ) ;
return true ;
}
2010-01-14 09:28:57 +01:00
}
2010-01-14 10:47:28 +01:00
return false ;
2010-01-14 09:28:57 +01:00
} catch ( e ) {
exception _error ( "uploadFeedIcon" , e ) ;
}
}
2010-11-08 23:04:00 +01:00
function addLabel ( select , callback ) {
2010-02-03 14:06:24 +01:00
try {
var caption = prompt ( _ _ ( "Please enter label caption:" ) , "" ) ;
if ( caption != undefined ) {
2011-03-18 12:31:54 +01:00
2010-02-03 14:06:24 +01:00
if ( caption == "" ) {
alert ( _ _ ( "Can't create label: missing caption." ) ) ;
return false ;
}
2011-03-18 12:31:54 +01:00
var query = "?op=pref-labels&subop=add&caption=" +
2010-02-03 14:06:24 +01:00
param _escape ( caption ) ;
2010-11-08 23:04:00 +01:00
if ( select )
query += "&output=select" ;
2010-02-03 14:06:24 +01:00
notify _progress ( "Loading, please wait..." , true ) ;
2010-11-08 23:04:00 +01:00
if ( inPreferences ( ) && ! select ) active _tab = "labelConfig" ;
2010-02-03 14:06:24 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 12:31:54 +01:00
onComplete : function ( transport ) {
2010-11-08 23:04:00 +01:00
if ( callback ) {
callback ( transport ) ;
} else if ( inPreferences ( ) ) {
2010-11-26 17:22:08 +01:00
updateLabelList ( ) ;
2010-02-03 14:06:24 +01:00
} else {
updateFeedList ( ) ;
}
} } ) ;
}
} catch ( e ) {
exception _error ( "addLabel" , e ) ;
}
}
2010-02-03 14:54:17 +01:00
function quickAddFeed ( ) {
2010-11-20 19:06:36 +01:00
try {
var query = "backend.php?op=dlg&id=quickAddFeed" ;
if ( dijit . byId ( "feedAddDlg" ) )
dijit . byId ( "feedAddDlg" ) . destroyRecursive ( ) ;
var dialog = new dijit . Dialog ( {
id : "feedAddDlg" ,
title : _ _ ( "Subscribe to Feed" ) ,
style : "width: 600px" ,
execute : function ( ) {
if ( this . validate ( ) ) {
console . log ( dojo . objectToQuery ( this . attr ( 'value' ) ) ) ;
var feed _url = this . attr ( 'value' ) . feed ;
notify _progress ( _ _ ( "Subscribing to feed..." ) , true ) ;
new Ajax . Request ( "backend.php" , {
parameters : dojo . objectToQuery ( this . attr ( 'value' ) ) ,
2011-03-18 12:31:54 +01:00
onComplete : function ( transport ) {
2010-11-20 19:06:36 +01:00
try {
2010-11-29 14:02:16 +01:00
var reply = JSON . parse ( transport . responseText ) ;
2011-03-18 12:31:54 +01:00
2010-11-29 14:02:16 +01:00
var rc = parseInt ( reply [ 'result' ] ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
notify ( '' ) ;
console . log ( "GOT RC: " + rc ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
switch ( rc ) {
case 1 :
dialog . hide ( ) ;
notify _info ( _ _ ( "Subscribed to %s" ) . replace ( "%s" , feed _url ) ) ;
2011-03-18 12:31:54 +01:00
2010-11-26 17:22:08 +01:00
updateFeedList ( ) ;
2010-11-20 19:06:36 +01:00
break ;
case 2 :
alert ( _ _ ( "Specified URL seems to be invalid." ) ) ;
break ;
case 3 :
alert ( _ _ ( "Specified URL doesn't seem to contain any feeds." ) ) ;
break ;
case 4 :
notify _progress ( "Searching for feed urls..." , true ) ;
new Ajax . Request ( "backend.php" , {
parameters : 'op=rpc&subop=extractfeedurls&url=' + param _escape ( feed _url ) ,
onComplete : function ( transport , dialog , feed _url ) {
notify ( '' ) ;
2010-11-29 14:02:16 +01:00
var reply = JSON . parse ( transport . responseText ) ;
var feeds = reply [ 'urls' ] ;
2010-11-20 19:06:36 +01:00
console . log ( transport . responseText ) ;
var select = dijit . byId ( "feedDlg_feedContainerSelect" ) ;
while ( select . getOptions ( ) . length > 0 )
select . removeOption ( 0 ) ;
var count = 0 ;
for ( var feedUrl in feeds ) {
select . addOption ( { value : feedUrl , label : feeds [ feedUrl ] } ) ;
count ++ ;
}
// if (count > 5) count = 5;
2011-03-18 12:31:54 +01:00
// select.size = count;
Effect . Appear ( 'feedDlg_feedsContainer' , { duration : 0.5 } ) ;
2010-11-20 19:06:36 +01:00
}
} ) ;
break ;
case 5 :
alert ( _ _ ( "Couldn't download the specified URL." ) ) ;
break ;
case 0 :
alert ( _ _ ( "You are already subscribed to this feed." ) ) ;
break ;
}
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
} catch ( e ) {
2011-04-05 12:49:28 +02:00
exception _error ( "subscribeToFeed" , e , transport ) ;
2010-11-20 19:06:36 +01:00
}
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
} } ) ;
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "quickAddFeed" , e ) ;
}
2010-02-03 14:54:17 +01:00
}
function quickAddFilter ( ) {
2010-11-20 12:10:26 +01:00
try {
var query = "backend.php?op=dlg&id=quickAddFilter" ;
if ( dijit . byId ( "filterEditDlg" ) )
dijit . byId ( "filterEditDlg" ) . destroyRecursive ( ) ;
dialog = new dijit . Dialog ( {
id : "filterEditDlg" ,
title : _ _ ( "Create Filter" ) ,
style : "width: 600px" ,
2011-04-17 22:01:24 +02:00
test : function ( ) {
if ( this . validate ( ) ) {
if ( dijit . byId ( "filterTestDlg" ) )
dijit . byId ( "filterTestDlg" ) . destroyRecursive ( ) ;
tdialog = new dijit . Dialog ( {
id : "filterTestDlg" ,
title : _ _ ( "Filter Test Results" ) ,
style : "width: 600px" ,
href : "backend.php?savemode=test&" +
dojo . objectToQuery ( dialog . attr ( 'value' ) ) ,
} ) ;
tdialog . show ( ) ;
}
} ,
2010-11-20 12:10:26 +01:00
execute : function ( ) {
if ( this . validate ( ) ) {
2010-11-20 13:02:20 +01:00
2011-03-18 12:31:54 +01:00
var query = "?op=rpc&subop=verifyRegexp®_exp=" +
2010-11-20 13:02:20 +01:00
param _escape ( dialog . attr ( 'value' ) . reg _exp ) ;
notify _progress ( "Verifying regular expression..." ) ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
2010-11-20 12:10:26 +01:00
onComplete : function ( transport ) {
2011-03-18 12:31:54 +01:00
var reply = JSON . parse ( transport . responseText ) ;
2010-11-20 13:02:20 +01:00
2010-11-29 14:44:50 +01:00
if ( reply ) {
2010-11-20 13:02:20 +01:00
notify ( '' ) ;
2010-11-29 14:44:50 +01:00
if ( ! reply [ 'status' ] ) {
2010-11-20 13:02:20 +01:00
alert ( "Match regular expression seems to be invalid." ) ;
return ;
} else {
notify _progress ( "Saving data..." , true ) ;
console . log ( dojo . objectToQuery ( dialog . attr ( 'value' ) ) ) ;
new Ajax . Request ( "backend.php" , {
parameters : dojo . objectToQuery ( dialog . attr ( 'value' ) ) ,
onComplete : function ( transport ) {
dialog . hide ( ) ;
notify _info ( transport . responseText ) ;
if ( inPreferences ( ) ) {
2011-03-18 12:31:54 +01:00
updateFilterList ( ) ;
2010-11-20 13:02:20 +01:00
}
} } )
2011-03-18 12:31:54 +01:00
}
2010-11-20 12:10:26 +01:00
}
} } ) ;
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "quickAddFilter" , e ) ;
}
2010-02-03 14:54:17 +01:00
}
2010-02-15 13:16:53 +01:00
2011-04-02 12:39:46 +02: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..." ) ;
var query = "?op=pref-feeds&quiet=1&subop=resetPubSub&ids=" + feed _id ;
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 13:16:53 +01:00
function unsubscribeFeed ( feed _id , title ) {
var msg = _ _ ( "Unsubscribe from %s?" ) . replace ( "%s" , title ) ;
if ( title == undefined || confirm ( msg ) ) {
notify _progress ( "Removing feed..." ) ;
var query = "?op=pref-feeds&quiet=1&subop=remove&ids=" + feed _id ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
2010-11-20 19:06:36 +01:00
if ( dijit . byId ( "feedEditDlg" ) ) dijit . byId ( "feedEditDlg" ) . hide ( ) ;
2011-03-18 12:31:54 +01:00
2010-02-15 13:16:53 +01:00
if ( inPreferences ( ) ) {
2011-03-18 12:31:54 +01:00
updateFeedList ( ) ;
2010-02-15 13:16:53 +01:00
} else {
2010-11-23 11:03:36 +01:00
if ( feed _id == getActiveFeedId ( ) )
setTimeout ( "viewfeed(-5)" , 100 ) ;
2010-02-15 13:16:53 +01:00
}
} } ) ;
}
return false ;
}
2010-09-13 13:14:18 +02: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 15:39:23 +01:00
var reply = JSON . parse ( transport . responseText ) ;
2010-09-13 13:14:18 +02:00
if ( ! reply ) {
fatalError ( 3 , "Sanity check: invalid RPC reply" , transport . responseText ) ;
return ;
}
2011-03-18 15:39:23 +01:00
var error _code = reply [ 'error' ] [ 'code' ] ;
2011-03-18 12:31:54 +01:00
2010-09-13 13:14:18 +02:00
if ( error _code && error _code != 0 ) {
2011-03-18 15:39:23 +01:00
return fatalError ( error _code , reply [ 'error' ] [ 'message' ] ) ;
2010-09-13 13:14:18 +02:00
}
console . log ( "sanity check ok" ) ;
2011-03-18 15:39:23 +01:00
var params = reply [ 'init-params' ] ;
2010-09-13 13:14:18 +02:00
if ( params ) {
console . log ( 'reading init-params...' ) ;
2010-11-05 14:16:30 +01:00
if ( params ) {
2010-11-10 12:23:26 +01:00
for ( k in params ) {
var v = params [ k ] ;
console . log ( "IP: " + k + " => " + v ) ;
2010-11-05 14:16:30 +01:00
}
2010-09-13 13:14:18 +02:00
}
2010-11-10 12:23:26 +01:00
init _params = params ;
2010-09-13 13:14:18 +02:00
}
sanity _check _done = true ;
init _second _stage ( ) ;
} catch ( e ) {
2011-03-18 12:31:54 +01:00
exception _error ( "backend_sanity_check_callback" , e , transport ) ;
}
2010-09-13 13:14:18 +02:00
}
2011-08-31 12:03:52 +02: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 16:12:50 +01:00
try {
return 'sessionStorage' in window && window [ 'sessionStorage' ] != null ;
2010-11-07 10:54:43 +01:00
} catch ( e ) {
return false ;
2011-03-18 12:31:54 +01:00
}
2011-08-31 12:03:52 +02:00
} * /
2010-11-07 21:30:05 +01:00
function catSelectOnChange ( elem ) {
try {
2010-11-20 13:29:50 +01: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 21:30:05 +01:00
var def = elem . getAttribute ( 'default' ) ;
if ( value == "ADD_CAT" ) {
if ( def )
dropboxSelect ( elem , def ) ;
else
elem . selectedIndex = 0 ;
quickAddCat ( elem ) ;
2010-11-20 13:29:50 +01:00
} * /
2010-11-07 21:30:05 +01:00
} catch ( e ) {
exception _error ( "catSelectOnChange" , e ) ;
}
}
2010-11-09 11:28:10 +01:00
function quickAddCat ( elem ) {
2010-11-07 21:30:05 +01:00
try {
var cat = prompt ( _ _ ( "Please enter category title:" ) ) ;
if ( cat ) {
var query = "?op=rpc&subop=quickAddCat&cat=" + param _escape ( cat ) ;
2010-11-09 11:28:10 +01:00
notify _progress ( "Loading, please wait..." , true ) ;
2010-11-07 21:30:05 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
var response = transport . responseXML ;
2010-11-09 11:28:10 +01:00
var select = response . getElementsByTagName ( "select" ) [ 0 ] ;
var options = select . getElementsByTagName ( "option" ) ;
2010-11-07 21:30:05 +01:00
2010-11-09 11:28:10 +01:00
dropbox _replace _options ( elem , options ) ;
2010-11-07 21:30:05 +01:00
2010-11-09 11:28:10 +01:00
notify ( '' ) ;
2010-11-07 21:30:05 +01:00
} } ) ;
}
} catch ( e ) {
exception _error ( "quickAddCat" , e ) ;
}
}
2010-11-08 11:11:56 +01:00
function genUrlChangeKey ( feed , is _cat ) {
try {
var ok = confirm ( _ _ ( "Generate new syndication address for this feed?" ) ) ;
2011-03-18 12:31:54 +01:00
2010-11-08 11:11:56 +01:00
if ( ok ) {
2011-03-18 12:31:54 +01:00
2010-11-08 11:11:56 +01:00
notify _progress ( "Trying to change address..." , true ) ;
2011-03-18 12:31:54 +01:00
var query = "?op=rpc&subop=regenFeedKey&id=" + param _escape ( feed ) +
2010-11-08 11:11:56 +01:00
"&is_cat=" + param _escape ( is _cat ) ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
2010-11-29 14:44:50 +01:00
var reply = JSON . parse ( transport . responseText ) ;
var new _link = reply . link ;
2011-03-18 12:31:54 +01:00
2010-11-08 11:11:56 +01:00
var e = $ ( 'gen_feed_url' ) ;
2011-03-18 12:31:54 +01:00
2010-11-08 11:11:56 +01:00
if ( new _link ) {
2011-03-18 12:31:54 +01:00
e . innerHTML = e . innerHTML . replace ( /\&key=.*$/ ,
2010-11-08 11:11:56 +01:00
"&key=" + new _link ) ;
2011-04-02 09:09:06 +02:00
e . href = e . href . replace ( /\&key=.*$/ ,
"&key=" + new _link ) ;
2010-11-08 11:11:56 +01:00
new Effect . Highlight ( e ) ;
notify ( '' ) ;
2011-03-18 12:31:54 +01:00
2010-11-08 11:11:56 +01:00
} else {
notify _error ( "Could not change feed URL." ) ;
}
} } ) ;
}
} catch ( e ) {
exception _error ( "genUrlChangeKey" , e ) ;
}
return false ;
}
2010-11-08 23:04:00 +01:00
function labelSelectOnChange ( elem ) {
try {
2010-11-20 12:10:26 +01: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 23:04:00 +01: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 11:14:59 +01:00
try {
2010-11-08 23:04:00 +01:00
2010-11-09 11:14:59 +01: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 23:04:00 +01:00
} ) ;
2010-11-20 12:10:26 +01:00
} * /
2010-11-08 23:04:00 +01:00
} catch ( e ) {
2010-11-09 11:14:59 +01:00
exception _error ( "labelSelectOnChange" , e ) ;
2010-11-08 23:04:00 +01:00
}
}
2010-11-09 11:14:59 +01: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 12:57:06 +01:00
if ( value == undefined ) value = text ;
2010-11-09 11:14:59 +01:00
var issel = options [ i ] . getAttribute ( "selected" ) == "1" ;
2010-11-09 11:28:10 +01:00
var option = new Option ( text , value , issel ) ;
if ( options [ i ] . getAttribute ( "disabled" ) )
option . setAttribute ( "disabled" , true ) ;
elem . insert ( option ) ;
2010-11-09 11:14:59 +01:00
if ( issel ) sel _idx = i ;
}
2010-11-08 23:04:00 +01:00
2010-11-09 11:14:59 +01: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 11:52:53 +01: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 ;
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 12:31:54 +01:00
if ( input . getAttribute ( "type" ) == "checkbox" &&
2010-11-12 11:52:53 +01:00
input . id . match ( bare _id ) ) {
cb = input ;
break ;
}
}
if ( cb ) {
2010-11-14 13:55:51 +01:00
var issel = row . hasClassName ( "Selected" ) ;
2010-11-12 11:52:53 +01:00
if ( mode == "all" && ! issel ) {
2010-11-14 13:55:51 +01:00
row . addClassName ( "Selected" ) ;
2010-11-12 11:52:53 +01:00
cb . checked = true ;
} else if ( mode == "none" && issel ) {
2010-11-14 13:55:51 +01:00
row . removeClassName ( "Selected" ) ;
2010-11-12 11:52:53 +01:00
cb . checked = false ;
} else if ( mode == "invert" ) {
if ( issel ) {
2010-11-14 13:55:51 +01:00
row . removeClassName ( "Selected" ) ;
2010-11-12 11:52:53 +01:00
cb . checked = false ;
} else {
2010-11-14 13:55:51 +01:00
row . addClassName ( "Selected" ) ;
2010-11-12 11:52:53 +01:00
cb . checked = true ;
}
}
}
}
}
} catch ( e ) {
exception _error ( "selectTableRows" , e ) ;
}
}
function getSelectedTableRowIds ( id ) {
var rows = [ ] ;
try {
var elem _rows = $ ( id ) . rows ;
for ( i = 0 ; i < elem _rows . length ; i ++ ) {
2010-11-14 13:55:51 +01:00
if ( elem _rows [ i ] . hasClassName ( "Selected" ) ) {
2010-11-12 11:52:53 +01: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 13:29:50 +01:00
function editFeed ( feed , event ) {
try {
2010-11-20 13:36:42 +01:00
if ( feed <= 0 )
return alert ( _ _ ( "You can't edit this kind of feed." ) ) ;
2010-11-20 13:29:50 +01:00
var query = "backend.php?op=pref-feeds&subop=editfeed&id=" +
param _escape ( feed ) ;
console . log ( query ) ;
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 09:55:28 +01:00
// console.log(dojo.objectToQuery(this.attr('value')));
2010-11-20 13:29:50 +01: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 15:14:20 +01:00
notify ( '' ) ;
2010-11-23 11:03:36 +01:00
updateFeedList ( ) ;
2010-11-20 13:29:50 +01:00
} } )
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "editFeed" , e ) ;
}
}
2010-11-20 19:06:36 +01:00
function feedBrowser ( ) {
try {
var query = "backend.php?op=dlg&id=feedBrowser" ;
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 16:39:30 +02:00
getSelectedFeedIds : function ( ) {
2010-11-20 19:06:36 +01:00
var list = $$ ( "#browseFeedList li[id*=FBROW]" ) ;
var selected = new Array ( ) ;
2011-03-18 12:31:54 +01:00
list . each ( function ( child ) {
2010-11-20 19:06:36 +01:00
var id = child . id . replace ( "FBROW-" , "" ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
if ( child . hasClassName ( 'Selected' ) ) {
selected . push ( id ) ;
2011-03-18 12:31:54 +01:00
}
2010-11-20 19:06:36 +01:00
} ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
return selected ;
} ,
2011-04-20 16:39:30 +02: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 19:06:36 +01:00
subscribe : function ( ) {
var mode = this . attr ( 'value' ) . mode ;
2011-04-20 16:39:30 +02:00
var selected = [ ] ;
if ( mode == "1" )
selected = this . getSelectedFeeds ( ) ;
else
selected = this . getSelectedFeedIds ( ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
if ( selected . length > 0 ) {
dijit . byId ( "feedBrowserDlg" ) . hide ( ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
notify _progress ( "Loading, please wait..." , true ) ;
2011-03-18 12:31:54 +01:00
2011-04-20 16:39:30 +02:00
// we use dojo.toJson instead of JSON.stringify because
// it somehow escapes everything TWICE, at least in Chrome 9
var query = "?op=rpc&subop=massSubscribe&payload=" +
param _escape ( dojo . toJson ( selected ) ) + "&mode=" + param _escape ( mode ) ;
2010-11-20 19:06:36 +01:00
console . log ( query ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 12:31:54 +01:00
onComplete : function ( transport ) {
2011-04-20 16:39:30 +02:00
notify ( '' ) ;
updateFeedList ( ) ;
2010-11-20 19:06:36 +01:00
} } ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
} else {
alert ( _ _ ( "No feeds are selected." ) ) ;
}
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
} ,
update : function ( ) {
var query = dojo . objectToQuery ( dialog . attr ( 'value' ) ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
Element . show ( 'feed_browser_spinner' ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 12:31:54 +01:00
onComplete : function ( transport ) {
2010-11-20 19:06:36 +01:00
notify ( '' ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
Element . hide ( 'feed_browser_spinner' ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
var c = $ ( "browseFeedList" ) ;
2010-11-29 14:19:32 +01:00
var reply = JSON . parse ( transport . responseText ) ;
var r = reply [ 'content' ] ;
var mode = reply [ 'mode' ] ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
if ( c && r ) {
2010-11-29 14:19:32 +01:00
c . innerHTML = r ;
2010-11-20 19:06:36 +01:00
}
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
dojo . parser . parse ( "browseFeedList" ) ;
2011-03-18 12:31:54 +01:00
2010-11-29 14:19:32 +01:00
if ( mode == 2 ) {
2010-11-20 19:06:36 +01:00
Element . show ( dijit . byId ( 'feed_archive_remove' ) . domNode ) ;
} else {
Element . hide ( dijit . byId ( 'feed_archive_remove' ) . domNode ) ;
}
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
} } ) ;
} ,
removeFromArchive : function ( ) {
var selected = this . getSelectedFeeds ( ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
if ( selected . length > 0 ) {
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
var pr = _ _ ( "Remove selected feeds from the archive? Feeds with stored articles will not be removed." ) ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
if ( confirm ( pr ) ) {
Element . show ( 'feed_browser_spinner' ) ;
2011-03-18 12:31:54 +01:00
var query = "?op=rpc&subop=remarchived&ids=" +
2010-11-20 19:06:36 +01:00
param _escape ( selected . toString ( ) ) ; ;
2011-03-18 12:31:54 +01:00
2010-11-20 19:06:36 +01:00
new Ajax . Request ( "backend.php" , {
parameters : query ,
2011-03-18 12:31:54 +01:00
onComplete : function ( transport ) {
2010-11-20 19:06:36 +01:00
dialog . update ( ) ;
2011-03-18 12:31:54 +01:00
} } ) ;
2010-11-20 19:06:36 +01:00
}
}
} ,
execute : function ( ) {
if ( this . validate ( ) ) {
this . subscribe ( ) ;
}
} ,
href : query } ) ;
dialog . show ( ) ;
} catch ( e ) {
exception _error ( "editFeed" , e ) ;
}
}
2011-04-08 13:37:50 +02:00
function showFeedsWithErrors ( ) {
try {
var query = "backend.php?op=dlg&id=feedsWithErrors" ;
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 ) ;
var query = "?op=pref-feeds&subop=remove&ids=" +
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-12 00:51:00 +02:00
/* new support functions for SelectByTag */
2010-11-20 13:29:50 +01:00
2011-08-12 00:51:00 +02: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 ( "" ) ;
}