var total _unread = 0 ;
var first _run = true ;
var display _tags = false ;
var global _unread = - 1 ;
var active _title _text = "" ;
var current _subtitle = "" ;
var daemon _enabled = false ;
var daemon _refresh _only = false ;
//var _qfd_deleted_feed = 0;
var firsttime _update = true ;
var _active _feed _id = 0 ;
var _active _feed _is _cat = false ;
var number _of _feeds = 0 ;
var sanity _check _done = false ;
var _hfd _scrolltop = 0 ;
var hotkey _prefix = false ;
var init _params = new Object ( ) ;
var ver _offset = 0 ;
var hor _offset = 0 ;
var feeds _sort _by _unread = false ;
var feedlist _sortable _enabled = false ;
var offline _mode = false ;
var store = false ;
var localServer = false ;
var db = false ;
var download _progress _last = 0 ;
function activeFeedIsCat ( ) {
return _active _feed _is _cat ;
}
function getActiveFeedId ( ) {
// return getCookie("ttrss_vf_actfeed");
try {
debug ( "gAFID: " + _active _feed _id ) ;
return _active _feed _id ;
} catch ( e ) {
exception _error ( "getActiveFeedId" , e ) ;
}
}
function setActiveFeedId ( id , is _cat ) {
// return setCookie("ttrss_vf_actfeed", id);
try {
debug ( "sAFID(" + id + ", " + is _cat + ")" ) ;
_active _feed _id = id ;
if ( is _cat != undefined ) {
_active _feed _is _cat = is _cat ;
}
} catch ( e ) {
exception _error ( "setActiveFeedId" , e ) ;
}
}
function isFeedlistSortable ( ) {
return feedlist _sortable _enabled ;
}
function tagsAreDisplayed ( ) {
return display _tags ;
}
function toggleTags ( show _all ) {
try {
debug ( "toggleTags: " + show _all + "; " + display _tags ) ;
var p = document . getElementById ( "dispSwitchPrompt" ) ;
if ( ! show _all && ! display _tags ) {
displayDlg ( "printTagCloud" ) ;
} else if ( show _all ) {
closeInfoBox ( ) ;
display _tags = true ;
p . innerHTML = _ _ ( "display feeds" ) ;
notify _progress ( "Loading, please wait..." , true ) ;
updateFeedList ( ) ;
} else if ( display _tags ) {
display _tags = false ;
p . innerHTML = _ _ ( "tag cloud" ) ;
notify _progress ( "Loading, please wait..." , true ) ;
updateFeedList ( ) ;
}
} catch ( e ) {
exception _error ( "toggleTags" , e ) ;
}
}
function dlg _frefresh _callback ( transport , deleted _feed ) {
if ( getActiveFeedId ( ) == deleted _feed ) {
var h = document . getElementById ( "headlines-frame" ) ;
if ( h ) {
h . innerHTML = "<div class='whiteBox'>" + _ _ ( 'No feed selected.' ) + "</div>" ;
}
}
setTimeout ( 'updateFeedList(false, false)' , 50 ) ;
closeInfoBox ( ) ;
}
function refetch _callback2 ( transport ) {
try {
var date = new Date ( ) ;
parse _counters _reply ( transport , true ) ;
debug ( "refetch_callback2: done" ) ;
/ * i f ( ! d a e m o n _ e n a b l e d & & ! d a e m o n _ r e f r e s h _ o n l y ) {
notify _info ( "All feeds updated." ) ;
updateTitle ( "" ) ;
} else {
//notify("");
} * /
} catch ( e ) {
exception _error ( "refetch_callback" , e ) ;
updateTitle ( "" ) ;
}
}
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 ;
}
if ( ! transport . responseXML ) {
if ( ! window . google && ! google . gears ) {
fatalError ( 3 , "Sanity check: Received reply is not XML" , transport . responseText ) ;
} else {
init _offline ( ) ;
}
return ;
}
var reply = transport . responseXML . firstChild . firstChild ;
if ( ! reply ) {
fatalError ( 3 , "Sanity check: invalid RPC reply" , transport . responseText ) ;
return ;
}
var error _code = reply . getAttribute ( "error-code" ) ;
if ( error _code && error _code != 0 ) {
return fatalError ( error _code , reply . getAttribute ( "error-msg" ) ) ;
}
debug ( "sanity check ok" ) ;
var params = reply . nextSibling ;
if ( params ) {
debug ( 'reading init-params...' ) ;
var param = params . firstChild ;
while ( param ) {
var k = param . getAttribute ( "key" ) ;
var v = param . getAttribute ( "value" ) ;
debug ( k + " => " + v ) ;
init _params [ k ] = v ;
param = param . nextSibling ;
}
}
sanity _check _done = true ;
init _second _stage ( ) ;
} catch ( e ) {
exception _error ( "backend_sanity_check_callback" , e , transport ) ;
}
}
function scheduleFeedUpdate ( force ) {
debug ( "in scheduleFeedUpdate" ) ;
/ * i f ( ! d a e m o n _ e n a b l e d & & ! d a e m o n _ r e f r e s h _ o n l y ) {
notify _progress ( "Updating feeds..." , true ) ;
} * /
var query _str = "backend.php?op=rpc&subop=" ;
if ( force ) {
query _str = query _str + "forceUpdateAllFeeds" ;
} else {
query _str = query _str + "updateAllFeeds" ;
}
var omode ;
if ( firsttime _update && ! navigator . userAgent . match ( "Opera" ) ) {
firsttime _update = false ;
omode = "T" ;
} else {
if ( display _tags ) {
omode = "tl" ;
} else {
omode = "flc" ;
}
}
query _str = query _str + "&omode=" + omode ;
query _str = query _str + "&uctr=" + global _unread ;
var date = new Date ( ) ;
var timestamp = Math . round ( date . getTime ( ) / 1000 ) ;
query _str = query _str + "&ts=" + timestamp
debug ( "REFETCH query: " + query _str ) ;
new Ajax . Request ( query _str , {
onComplete : function ( transport ) {
refetch _callback2 ( transport ) ;
} } ) ;
}
function updateFeedList ( silent , fetch ) {
// if (silent != true) {
// notify("Loading feed list...");
// }
debug ( "<b>updateFeedList</b>" ) ;
var query _str = "backend.php?op=feeds" ;
if ( display _tags ) {
query _str = query _str + "&tags=1" ;
}
if ( getActiveFeedId ( ) && ! activeFeedIsCat ( ) ) {
query _str = query _str + "&actid=" + getActiveFeedId ( ) ;
}
var date = new Date ( ) ;
var timestamp = Math . round ( date . getTime ( ) / 1000 ) ;
query _str = query _str + "&ts=" + timestamp
if ( fetch ) query _str = query _str + "&fetch=yes" ;
// var feeds_frame = document.getElementById("feeds-frame");
// feeds_frame.src = query_str;
debug ( "updateFeedList Q=" + query _str ) ;
new Ajax . Request ( query _str , {
onComplete : function ( transport ) {
feedlist _callback2 ( transport ) ;
} } ) ;
}
function catchupAllFeeds ( ) {
var str = _ _ ( "Mark all articles as read?" ) ;
if ( getInitParam ( "confirm_feed_catchup" ) != 1 || confirm ( str ) ) {
var query _str = "backend.php?op=feeds&subop=catchupAll" ;
notify _progress ( "Marking all feeds as read..." ) ;
debug ( "catchupAllFeeds Q=" + query _str ) ;
new Ajax . Request ( query _str , {
onComplete : function ( transport ) {
feedlist _callback2 ( transport ) ;
} } ) ;
global _unread = 0 ;
updateTitle ( "" ) ;
}
}
function viewCurrentFeed ( subop ) {
// if (getActiveFeedId()) {
if ( getActiveFeedId ( ) != undefined ) {
viewfeed ( getActiveFeedId ( ) , subop , activeFeedIsCat ( ) ) ;
} else {
disableContainerChildren ( "headlinesToolbar" , false , document ) ;
// viewfeed(-1, subop); // FIXME
}
return false ; // block unneeded form submits
}
function viewfeed ( feed , subop ) {
var f = window . frames [ "feeds-frame" ] ;
f . viewfeed ( feed , subop ) ;
}
function timeout ( ) {
if ( getInitParam ( "bw_limit" ) == "1" ) return ;
scheduleFeedUpdate ( false ) ;
var refresh _time = getInitParam ( "feeds_frame_refresh" ) ;
if ( ! refresh _time ) refresh _time = 600 ;
setTimeout ( "timeout()" , refresh _time * 1000 ) ;
}
function resetSearch ( ) {
var searchbox = document . getElementById ( "searchbox" )
if ( searchbox . value != "" && getActiveFeedId ( ) ) {
searchbox . value = "" ;
viewfeed ( getActiveFeedId ( ) , "" ) ;
}
}
function searchCancel ( ) {
closeInfoBox ( true ) ;
}
function search ( ) {
closeInfoBox ( ) ;
viewCurrentFeed ( 0 , "" ) ;
}
// if argument is undefined, current subtitle is not updated
// use blank string to clear subtitle
function updateTitle ( s ) {
var tmp = "Tiny Tiny RSS" ;
if ( s != undefined ) {
current _subtitle = s ;
}
if ( global _unread > 0 ) {
tmp = tmp + " (" + global _unread + ")" ;
}
if ( current _subtitle ) {
tmp = tmp + " - " + current _subtitle ;
}
if ( active _title _text . length > 0 ) {
tmp = tmp + " > " + active _title _text ;
}
document . title = tmp ;
}
function genericSanityCheck ( ) {
// if (!Ajax.getTransport()) fatalError(1);
setCookie ( "ttrss_vf_test" , "TEST" ) ;
if ( getCookie ( "ttrss_vf_test" ) != "TEST" ) {
fatalError ( 2 ) ;
}
return true ;
}
function init ( ) {
try {
// this whole shebang is based on http://www.birnamdesigns.com/misc/busted2.html
if ( arguments . callee . done ) return ;
arguments . callee . done = true ;
init _gears ( ) ;
disableContainerChildren ( "headlinesToolbar" , true ) ;
Form . disable ( "main_toolbar_form" ) ;
if ( ! genericSanityCheck ( ) )
return ;
if ( getURLParam ( 'debug' ) ) {
Element . show ( "debug_output" ) ;
debug ( 'debug mode activated' ) ;
}
var params = "&ua=" + param _escape ( navigator . userAgent ) ;
loading _set _progress ( 30 ) ;
new Ajax . Request ( "backend.php?op=rpc&subop=sanityCheck" + params , {
onComplete : function ( transport ) {
backend _sanity _check _callback ( transport ) ;
} } ) ;
} catch ( e ) {
exception _error ( "init" , e ) ;
}
}
function resize _headlines ( delta _x , delta _y ) {
try {
debug ( "resize_headlines: " + delta _x + ":" + delta _y ) ;
var h _frame = document . getElementById ( "headlines-frame" ) ;
var c _frame = document . getElementById ( "content-frame" ) ;
var f _frame = document . getElementById ( "footer" ) ;
var feeds _frame = document . getElementById ( "feeds-holder" ) ;
var resize _grab = document . getElementById ( "resize-grabber" ) ;
var resize _handle = document . getElementById ( "resize-handle" ) ;
if ( ! c _frame || ! h _frame ) return ;
if ( feeds _frame && getInitParam ( "theme" ) == "compat" ) {
feeds _frame . style . bottom = f _frame . offsetHeight + "px" ;
}
if ( getInitParam ( "theme" ) == "3pane" ) {
if ( delta _x != undefined ) {
if ( c _frame . offsetLeft - delta _x > feeds _frame . offsetWidth + feeds _frame . offsetLeft + 100 && c _frame . offsetWidth + delta _x > 100 ) {
hor _offset = hor _offset + delta _x ;
}
}
debug ( "resize_headlines: HOR-mode: " + hor _offset ) ;
c _frame . style . width = ( 400 + hor _offset ) + "px" ;
h _frame . style . right = c _frame . offsetWidth - 1 + "px" ;
resize _grab . style . top = ( h _frame . offsetTop + h _frame . offsetHeight - 60 ) + "px" ;
resize _grab . style . left = ( h _frame . offsetLeft + h _frame . offsetWidth -
4 ) + "px" ;
resize _grab . style . display = "block" ;
resize _handle . src = "themes/3pane/images/resize_handle_vert.png" ;
resize _handle . style . paddingTop = ( resize _grab . offsetHeight / 2 - 7 ) + "px" ;
} else {
if ( delta _y != undefined ) {
if ( c _frame . offsetHeight + delta _y > 100 && h _frame . offsetHeight - delta _y > 100 ) {
ver _offset = ver _offset + delta _y ;
}
}
debug ( "resize_headlines: VER-mode: " + ver _offset ) ;
h _frame . style . height = ( 300 - ver _offset ) + "px" ;
c _frame . style . top = ( h _frame . offsetTop + h _frame . offsetHeight + 0 ) + "px" ;
h _frame . style . height = h _frame . offsetHeight + "px" ;
var theme _c = 0 ;
if ( getInitParam ( "theme" ) == "graycube" ) {
theme _c = 1 ;
}
if ( getInitParam ( "theme" ) == "graycube" || getInitParam ( "theme" ) == "compat" ) {
resize _handle . src = "themes/graycube/images/resize_handle_horiz.png" ;
}
/ * r e s i z e _ g r a b . s t y l e . t o p = ( h _ f r a m e . o f f s e t T o p + h _ f r a m e . o f f s e t H e i g h t -
4 - theme _c ) + "px" ;
resize _grab . style . display = "block" ; * /
}
if ( getInitParam ( "cookie_lifetime" ) != 0 ) {
setCookie ( "ttrss_offset_ver" , ver _offset ,
getInitParam ( "cookie_lifetime" ) ) ;
setCookie ( "ttrss_offset_hor" , hor _offset ,
getInitParam ( "cookie_lifetime" ) ) ;
} else {
setCookie ( "ttrss_offset_ver" , ver _offset ) ;
setCookie ( "ttrss_offset_hor" , hor _offset ) ;
}
} catch ( e ) {
exception _error ( "resize_headlines" , e ) ;
}
}
function init _second _stage ( ) {
try {
delCookie ( "ttrss_vf_test" ) ;
// document.onresize = resize_headlines;
var toolbar = document . forms [ "main_toolbar_form" ] ;
dropboxSelect ( toolbar . view _mode , getInitParam ( "default_view_mode" ) ) ;
dropboxSelect ( toolbar . limit , getInitParam ( "default_view_limit" ) ) ;
dropboxSelect ( toolbar . order _by , getInitParam ( "default_view_order_by" ) ) ;
daemon _enabled = getInitParam ( "daemon_enabled" ) == 1 ;
daemon _refresh _only = getInitParam ( "daemon_refresh_only" ) == 1 ;
feeds _sort _by _unread = getInitParam ( "feeds_sort_by_unread" ) == 1 ;
var fl = cache _find _param ( "FEEDLIST" , getInitParam ( "num_feeds" ) ) ;
if ( fl ) {
render _feedlist ( fl ) ;
if ( document . getElementById ( "feedList" ) ) {
request _counters ( ) ;
} else {
setTimeout ( 'updateFeedList(false, false)' , 50 ) ;
}
} else {
setTimeout ( 'updateFeedList(false, false)' , 50 ) ;
}
debug ( "second stage ok" ) ;
loading _set _progress ( 60 ) ;
ver _offset = parseInt ( getCookie ( "ttrss_offset_ver" ) ) ;
hor _offset = parseInt ( getCookie ( "ttrss_offset_hor" ) ) ;
debug ( "got offsets from cookies: ver " + ver _offset + " hor " + hor _offset ) ;
/* fuck IE */
if ( isNaN ( hor _offset ) ) hor _offset = 0 ;
if ( isNaN ( ver _offset ) ) ver _offset = 0 ;
debug ( "offsets from cookies [x:y]: " + hor _offset + ":" + ver _offset ) ;
resize _headlines ( ) ;
} catch ( e ) {
exception _error ( "init_second_stage" , e ) ;
}
}
function quickMenuChange ( ) {
var chooser = document . getElementById ( "quickMenuChooser" ) ;
var opid = chooser [ chooser . selectedIndex ] . value ;
chooser . selectedIndex = 0 ;
quickMenuGo ( opid ) ;
}
function quickMenuGo ( opid ) {
try {
if ( opid == "qmcPrefs" ) {
gotoPreferences ( ) ;
}
if ( opid == "qmcSearch" ) {
displayDlg ( "search" , getActiveFeedId ( ) + ":" + activeFeedIsCat ( ) ) ;
return ;
}
if ( opid == "qmcAddFeed" ) {
displayDlg ( "quickAddFeed" ) ;
return ;
}
if ( opid == "qmcEditFeed" ) {
editFeedDlg ( getActiveFeedId ( ) ) ;
}
if ( opid == "qmcRemoveFeed" ) {
var actid = getActiveFeedId ( ) ;
if ( activeFeedIsCat ( ) ) {
alert ( _ _ ( "You can't unsubscribe from the category." ) ) ;
return ;
}
if ( ! actid ) {
alert ( _ _ ( "Please select some feed first." ) ) ;
return ;
}
var fn = getFeedName ( actid ) ;
var pr = _ _ ( "Unsubscribe from %s?" ) . replace ( "%s" , fn ) ;
if ( confirm ( pr ) ) {
unsubscribeFeed ( actid ) ;
}
return ;
}
if ( opid == "qmcClearFeed" ) {
var actid = getActiveFeedId ( ) ;
if ( ! actid ) {
alert ( _ _ ( "Please select some feed first." ) ) ;
return ;
}
if ( activeFeedIsCat ( ) || actid < 0 ) {
alert ( _ _ ( "You can't clear this type of feed." ) ) ;
return ;
}
var fn = getFeedName ( actid ) ;
var pr = _ _ ( "Erase all non-starred articles in %s?" ) . replace ( "%s" , fn ) ;
if ( confirm ( pr ) ) {
clearFeedArticles ( actid ) ;
}
return ;
}
if ( opid == "qmcUpdateFeeds" ) {
scheduleFeedUpdate ( true ) ;
return ;
}
if ( opid == "qmcCatchupAll" ) {
catchupAllFeeds ( ) ;
return ;
}
if ( opid == "qmcShowOnlyUnread" ) {
toggleDispRead ( ) ;
return ;
}
if ( opid == "qmcAddFilter" ) {
displayDlg ( "quickAddFilter" , getActiveFeedId ( ) ) ;
}
if ( opid == "qmcAddLabel" ) {
addLabel ( ) ;
}
if ( opid == "qmcRescoreFeed" ) {
rescoreCurrentFeed ( ) ;
}
if ( opid == "qmcHKhelp" ) {
//Element.show("hotkey_help_overlay");
Effect . Appear ( "hotkey_help_overlay" , { duration : 0.3 } ) ;
}
if ( opid == "qmcResetUI" ) {
hor _offset = 0 ;
ver _offset = 0 ;
resize _headlines ( ) ;
}
if ( opid == "qmcDownload" ) {
displayDlg ( "offlineDownload" ) ;
return ;
}
if ( opid == "qmcResetCats" ) {
if ( confirm ( _ _ ( "Reset category order?" ) ) ) {
var query = "backend.php?op=feeds&subop=catsortreset" ;
notify _progress ( "Loading, please wait..." , true ) ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
window . setTimeout ( 'updateFeedList(false, false)' , 50 ) ;
} } ) ;
}
}
} catch ( e ) {
exception _error ( "quickMenuGo" , e ) ;
}
}
function unsubscribeFeed ( feed _id , title ) {
var msg = _ _ ( "Unsubscribe from %s?" ) . replace ( "%s" , title ) ;
if ( title == undefined || confirm ( msg ) ) {
notify _progress ( "Removing feed..." ) ;
var query = "backend.php?op=pref-feeds&quiet=1&subop=remove&ids=" + feed _id ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
dlg _frefresh _callback ( transport , feed _id ) ;
} } ) ;
}
return false ;
}
function updateFeedTitle ( t ) {
active _title _text = t ;
updateTitle ( ) ;
}
function toggleDispRead ( ) {
try {
var hide _read _feeds = ( getInitParam ( "hide_read_feeds" ) == "1" ) ;
hide _read _feeds = ! hide _read _feeds ;
debug ( "toggle_disp_read => " + hide _read _feeds ) ;
hideOrShowFeeds ( hide _read _feeds ) ;
storeInitParam ( "hide_read_feeds" , hide _read _feeds , true ) ;
} catch ( e ) {
exception _error ( "toggleDispRead" , e ) ;
}
}
function parse _runtime _info ( elem ) {
if ( ! elem ) {
debug ( "parse_runtime_info: elem is null, aborting" ) ;
return ;
}
var param = elem . firstChild ;
debug ( "parse_runtime_info: " + param ) ;
while ( param ) {
var k = param . getAttribute ( "key" ) ;
var v = param . getAttribute ( "value" ) ;
debug ( "RI: " + k + " => " + v ) ;
if ( k == "num_feeds" ) {
init _params [ k ] = v ;
}
if ( k == "new_version_available" ) {
var icon = document . getElementById ( "newVersionIcon" ) ;
if ( icon ) {
if ( v == "1" ) {
icon . style . display = "inline" ;
} else {
icon . style . display = "none" ;
}
}
}
var error _flag ;
if ( k == "daemon_is_running" && v != 1 ) {
notify _error ( "<span onclick=\"javascript:explainError(1)\">Update daemon is not running.</span>" , true ) ;
error _flag = true ;
}
if ( k == "daemon_stamp_ok" && v != 1 ) {
notify _error ( "<span onclick=\"javascript:explainError(3)\">Update daemon is not updating feeds.</span>" , true ) ;
error _flag = true ;
}
if ( ! error _flag ) {
notify ( '' ) ;
}
/ * v a r w = d o c u m e n t . g e t E l e m e n t B y I d ( " n o D a e m o n W a r n i n g " ) ;
if ( w ) {
if ( k == "daemon_is_running" && v != 1 ) {
w . style . display = "block" ;
} else {
w . style . display = "none" ;
}
} * /
param = param . nextSibling ;
}
}
function catchupCurrentFeed ( ) {
var fn = getFeedName ( getActiveFeedId ( ) , activeFeedIsCat ( ) ) ;
var str = _ _ ( "Mark all articles in %s as read?" ) . replace ( "%s" , fn ) ;
if ( getInitParam ( "confirm_feed_catchup" ) != 1 || confirm ( str ) ) {
return viewCurrentFeed ( 'MarkAllRead' )
}
}
function catchupFeedInGroup ( id ) {
try {
var title = getFeedName ( id ) ;
var str = _ _ ( "Mark all articles in %s as read?" ) . replace ( "%s" , title ) ;
if ( getInitParam ( "confirm_feed_catchup" ) != 1 || confirm ( str ) ) {
return viewCurrentFeed ( 'MarkAllReadGR:' + id )
}
} catch ( e ) {
exception _error ( "catchupFeedInGroup" , e ) ;
}
}
function editFeedDlg ( feed ) {
try {
if ( ! feed ) {
alert ( _ _ ( "Please select some feed first." ) ) ;
return ;
}
if ( ( feed <= 0 ) || activeFeedIsCat ( ) || tagsAreDisplayed ( ) ) {
alert ( _ _ ( "You can't edit this kind of feed." ) ) ;
return ;
}
var query = "" ;
if ( feed > 0 ) {
query = "backend.php?op=pref-feeds&subop=editfeed&id=" + param _escape ( feed ) ;
} else {
query = "backend.php?op=pref-labels&subop=edit&id=" + param _escape ( - feed - 11 ) ;
}
disableHotkeys ( ) ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
infobox _callback2 ( transport ) ;
} } ) ;
} catch ( e ) {
exception _error ( "editFeedDlg" , e ) ;
}
}
/ * t h i s f u n c t i o n s d u p l i c a t e t h o s e o f p r e f s . j s f e e d e d i t o r , w i t h
some differences because there is no feedlist * /
function feedEditCancel ( ) {
closeInfoBox ( ) ;
return false ;
}
function feedEditSave ( ) {
try {
// FIXME: add parameter validation
var query = Form . serialize ( "edit_feed_form" ) ;
notify _progress ( "Saving feed..." ) ;
new Ajax . Request ( "backend.php" , {
parameters : query ,
onComplete : function ( transport ) {
dlg _frefresh _callback ( transport ) ;
} } ) ;
closeInfoBox ( ) ;
return false ;
} catch ( e ) {
exception _error ( "feedEditSave (main)" , e ) ;
}
}
function clearFeedArticles ( feed _id ) {
notify _progress ( "Clearing feed..." ) ;
var query = "backend.php?op=pref-feeds&quiet=1&subop=clear&id=" + feed _id ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
dlg _frefresh _callback ( transport , feed _id ) ;
} } ) ;
return false ;
}
function collapse _feedlist ( ) {
try {
debug ( "toggle_feedlist" ) ;
var theme = getInitParam ( "theme" ) ;
if ( theme != "" && theme != "compact" && theme != "graycube" &&
theme != "compat" ) return ;
var fl = document . getElementById ( "feeds-holder" ) ;
var fh = document . getElementById ( "headlines-frame" ) ;
var fc = document . getElementById ( "content-frame" ) ;
var ft = document . getElementById ( "toolbar" ) ;
var ff = document . getElementById ( "footer" ) ;
var fhdr = document . getElementById ( "header" ) ;
var fbtn = document . getElementById ( "collapse_feeds_btn" ) ;
if ( ! Element . visible ( fl ) ) {
Element . show ( fl ) ;
fbtn . value = "<<" ;
if ( theme != "graycube" ) {
fh . style . left = fl . offsetWidth + "px" ;
ft . style . left = fl . offsetWidth + "px" ;
if ( fc ) fc . style . left = fl . offsetWidth + "px" ;
if ( ff && theme != "compat" ) ff . style . left = ( fl . offsetWidth - 1 ) + "px" ;
if ( theme == "compact" ) fhdr . style . left = ( fl . offsetWidth + 10 ) + "px" ;
} else {
fh . style . left = fl . offsetWidth + 40 + "px" ;
ft . style . left = fl . offsetWidth + 40 + "px" ;
if ( fc ) fc . style . left = fl . offsetWidth + 40 + "px" ;
}
setCookie ( "ttrss_vf_fclps" , "0" ) ;
} else {
Element . hide ( fl ) ;
fbtn . value = ">>" ;
if ( theme != "graycube" ) {
fh . style . left = "0px" ;
ft . style . left = "0px" ;
if ( fc ) fc . style . left = "0px" ;
if ( ff ) ff . style . left = "0px" ;
if ( theme == "compact" ) fhdr . style . left = "10px" ;
} else {
fh . style . left = "20px" ;
ft . style . left = "20px" ;
if ( fc ) fc . style . left = "20px" ;
}
setCookie ( "ttrss_vf_fclps" , "1" ) ;
}
} catch ( e ) {
exception _error ( "toggle_feedlist" , e ) ;
}
}
function viewModeChanged ( ) {
cache _empty ( ) ;
return viewCurrentFeed ( 0 , '' )
}
function viewLimitChanged ( ) {
cache _empty ( ) ;
return viewCurrentFeed ( 0 , '' )
}
/ * f u n c t i o n a d j u s t A r t i c l e S c o r e ( i d , s c o r e ) {
try {
var pr = prompt ( _ _ ( "Assign score to article:" ) , score ) ;
if ( pr != undefined ) {
var query = "backend.php?op=rpc&subop=setScore&id=" + id + "&score=" + pr ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
viewCurrentFeed ( ) ;
} } ) ;
}
} catch ( e ) {
exception _error ( "adjustArticleScore" , e ) ;
}
} * /
function rescoreCurrentFeed ( ) {
var actid = getActiveFeedId ( ) ;
if ( activeFeedIsCat ( ) || actid < 0 || tagsAreDisplayed ( ) ) {
alert ( _ _ ( "You can't rescore this kind of feed." ) ) ;
return ;
}
if ( ! actid ) {
alert ( _ _ ( "Please select some feed first." ) ) ;
return ;
}
var fn = getFeedName ( actid ) ;
var pr = _ _ ( "Rescore articles in %s?" ) . replace ( "%s" , fn ) ;
if ( confirm ( pr ) ) {
notify _progress ( "Rescoring articles..." ) ;
var query = "backend.php?op=pref-feeds&subop=rescore&quiet=1&ids=" + actid ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
viewCurrentFeed ( ) ;
} } ) ;
}
}
function hotkey _handler ( e ) {
try {
var keycode ;
var shift _key = false ;
var feedlist = document . getElementById ( 'feedList' ) ;
try {
shift _key = e . shiftKey ;
} catch ( e ) {
}
if ( window . event ) {
keycode = window . event . keyCode ;
} else if ( e ) {
keycode = e . which ;
}
var keychar = String . fromCharCode ( keycode ) ;
if ( keycode == 27 ) { // escape
if ( Element . visible ( "hotkey_help_overlay" ) ) {
Element . hide ( "hotkey_help_overlay" ) ;
}
hotkey _prefix = false ;
closeInfoBox ( ) ;
}
if ( ! hotkeys _enabled ) {
debug ( "hotkeys disabled" ) ;
return ;
}
if ( keycode == 16 ) return ; // ignore lone shift
if ( ( keycode == 70 || keycode == 67 || keycode == 71 )
&& ! hotkey _prefix ) {
hotkey _prefix = keycode ;
debug ( "KP: PREFIX=" + keycode + " CHAR=" + keychar ) ;
return true ;
}
if ( Element . visible ( "hotkey_help_overlay" ) ) {
Element . hide ( "hotkey_help_overlay" ) ;
}
/* Global hotkeys */
if ( ! hotkey _prefix ) {
if ( keycode == 68 && shift _key ) { // d
if ( ! Element . visible ( "debug_output" ) ) {
Element . show ( "debug_output" ) ;
debug ( 'debug mode activated' ) ;
} else {
Element . hide ( "debug_output" ) ;
}
return ;
}
if ( ( keycode == 191 || keychar == '?' ) && shift _key ) { // ?
if ( ! Element . visible ( "hotkey_help_overlay" ) ) {
//Element.show("hotkey_help_overlay");
Effect . Appear ( "hotkey_help_overlay" , { duration : 0.3 } ) ;
} else {
Element . hide ( "hotkey_help_overlay" ) ;
}
return false ;
}
if ( keycode == 191 || keychar == '/' ) { // /
displayDlg ( "search" , getActiveFeedId ( ) + ":" + activeFeedIsCat ( ) ) ;
return false ;
}
if ( keycode == 82 && shift _key ) { // R
scheduleFeedUpdate ( true ) ;
return ;
}
if ( keycode == 74 ) { // j
var feed = getActiveFeedId ( ) ;
var new _feed = getRelativeFeedId2 ( feed , activeFeedIsCat ( ) , 'prev' ) ;
// alert(feed + " IC: " + activeFeedIsCat() + " => " + new_feed);
if ( new _feed ) {
var is _cat = new _feed . match ( "CAT:" ) ;
if ( is _cat ) {
new _feed = new _feed . replace ( "CAT:" , "" ) ;
viewCategory ( new _feed ) ;
} else {
viewfeed ( new _feed , '' , false ) ;
}
}
return ;
}
if ( keycode == 75 ) { // k
var feed = getActiveFeedId ( ) ;
var new _feed = getRelativeFeedId2 ( feed , activeFeedIsCat ( ) , 'next' ) ;
// alert(feed + " IC: " + activeFeedIsCat() + " => " + new_feed);
if ( new _feed ) {
var is _cat = new _feed . match ( "CAT:" ) ;
if ( is _cat == "CAT:" ) {
new _feed = new _feed . replace ( "CAT:" , "" ) ;
viewCategory ( new _feed ) ;
} else {
viewfeed ( new _feed , '' , false ) ;
}
}
return ;
}
if ( shift _key && keycode == 40 ) { // shift-down
catchupRelativeToArticle ( 1 ) ;
return ;
}
if ( shift _key && keycode == 38 ) { // shift-up
catchupRelativeToArticle ( 0 ) ;
return ;
}
if ( shift _key && keycode == 78 ) { // N
scrollArticle ( 50 ) ;
return ;
}
if ( shift _key && keycode == 80 ) { // P
scrollArticle ( - 50 ) ;
return ;
}
if ( keycode == 78 || keycode == 40 ) { // n, down
if ( typeof moveToPost != 'undefined' ) {
moveToPost ( 'next' ) ;
return ;
}
}
if ( keycode == 80 || keycode == 38 ) { // p, up
if ( typeof moveToPost != 'undefined' ) {
moveToPost ( 'prev' ) ;
return ;
}
}
if ( keycode == 83 && shift _key ) { // S
var id = getActiveArticleId ( ) ;
if ( id ) {
togglePub ( id ) ;
}
return ;
}
if ( keycode == 83 ) { // s
var id = getActiveArticleId ( ) ;
if ( id ) {
toggleMark ( id ) ;
}
return ;
}
if ( keycode == 85 ) { // u
var id = getActiveArticleId ( ) ;
if ( id ) {
toggleUnread ( id ) ;
}
return ;
}
if ( keycode == 84 && shift _key ) { // T
var id = getActiveArticleId ( ) ;
if ( id ) {
editArticleTags ( id , getActiveFeedId ( ) , isCdmMode ( ) ) ;
return ;
}
}
if ( keycode == 9 ) { // tab
var id = getArticleUnderPointer ( ) ;
if ( id ) {
var cb = document . getElementById ( "RCHK-" + id ) ;
if ( cb ) {
cb . checked = ! cb . checked ;
toggleSelectRowById ( cb , "RROW-" + id ) ;
return false ;
}
}
}
if ( keycode == 79 ) { // o
if ( getActiveArticleId ( ) ) {
openArticleInNewWindow ( getActiveArticleId ( ) ) ;
return ;
}
}
if ( keycode == 81 && shift _key ) { // Q
if ( typeof catchupAllFeeds != 'undefined' ) {
catchupAllFeeds ( ) ;
return ;
}
}
if ( keycode == 88 ) { // x
if ( activeFeedIsCat ( ) ) {
toggleCollapseCat ( getActiveFeedId ( ) ) ;
}
}
}
/* Prefix f */
if ( hotkey _prefix == 70 ) { // f
hotkey _prefix = false ;
if ( keycode == 81 ) { // q
if ( getActiveFeedId ( ) ) {
catchupCurrentFeed ( ) ;
return ;
}
}
if ( keycode == 82 ) { // r
if ( getActiveFeedId ( ) ) {
viewfeed ( getActiveFeedId ( ) , "ForceUpdate" , activeFeedIsCat ( ) ) ;
return ;
}
}
if ( keycode == 65 ) { // a
toggleDispRead ( ) ;
return false ;
}
if ( keycode == 85 && shift _key ) { // U
scheduleFeedUpdate ( true ) ;
return false ;
}
if ( keycode == 85 ) { // u
if ( getActiveFeedId ( ) ) {
viewfeed ( getActiveFeedId ( ) , "ForceUpdate" ) ;
return false ;
}
}
if ( keycode == 69 ) { // e
editFeedDlg ( getActiveFeedId ( ) ) ;
return false ;
}
if ( keycode == 83 ) { // s
displayDlg ( "quickAddFeed" ) ;
return false ;
}
if ( keycode == 67 && shift _key ) { // C
if ( typeof catchupAllFeeds != 'undefined' ) {
catchupAllFeeds ( ) ;
return false ;
}
}
if ( keycode == 67 ) { // c
if ( getActiveFeedId ( ) ) {
catchupCurrentFeed ( ) ;
return false ;
}
}
if ( keycode == 68 && shift _key ) { // D
initiate _offline _download ( ) ;
return false ;
}
if ( keycode == 68 ) { // d
displayDlg ( "offlineDownload" ) ;
return false ;
}
if ( keycode == 87 ) { // w
feeds _sort _by _unread = ! feeds _sort _by _unread ;
return resort _feedlist ( ) ;
}
if ( keycode == 72 ) { // h
hideReadHeadlines ( ) ;
return ;
}
}
/* Prefix c */
if ( hotkey _prefix == 67 ) { // c
hotkey _prefix = false ;
if ( keycode == 70 ) { // f
displayDlg ( "quickAddFilter" , getActiveFeedId ( ) ) ;
return false ;
}
if ( keycode == 76 ) { // l
addLabel ( ) ;
return false ;
}
if ( keycode == 83 ) { // s
if ( typeof collapse _feedlist != 'undefined' ) {
collapse _feedlist ( ) ;
return false ;
}
}
if ( keycode == 77 ) { // m
feedlist _sortable _enabled = ! feedlist _sortable _enabled ;
if ( feedlist _sortable _enabled ) {
notify _info ( "Category reordering enabled" ) ;
toggle _sortable _feedlist ( true ) ;
} else {
notify _info ( "Category reordering disabled" ) ;
toggle _sortable _feedlist ( false ) ;
}
}
if ( keycode == 78 ) { // n
catchupRelativeToArticle ( 1 ) ;
return ;
}
if ( keycode == 80 ) { // p
catchupRelativeToArticle ( 0 ) ;
return ;
}
}
/* Prefix g */
if ( hotkey _prefix == 71 ) { // g
hotkey _prefix = false ;
if ( keycode == 65 ) { // a
viewfeed ( - 4 ) ;
return false ;
}
if ( keycode == 83 ) { // s
viewfeed ( - 1 ) ;
return false ;
}
if ( keycode == 80 && shift _key ) { // P
gotoPreferences ( ) ;
return false ;
}
if ( keycode == 80 ) { // p
viewfeed ( - 2 ) ;
return false ;
}
if ( keycode == 70 ) { // f
viewfeed ( - 3 ) ;
return false ;
}
if ( keycode == 84 && shift _key ) { // T
toggleTags ( ) ;
return false ;
}
}
/* Cmd */
if ( hotkey _prefix == 224 || hotkey _prefix == 91 ) { // f
hotkey _prefix = false ;
return ;
}
if ( hotkey _prefix ) {
debug ( "KP: PREFIX=" + hotkey _prefix + " CODE=" + keycode + " CHAR=" + keychar ) ;
} else {
debug ( "KP: CODE=" + keycode + " CHAR=" + keychar ) ;
}
} catch ( e ) {
exception _error ( "hotkey_handler" , e ) ;
}
}
function feedsSortByUnread ( ) {
return feeds _sort _by _unread ;
}
function addLabel ( ) {
try {
var caption = prompt ( _ _ ( "Please enter label caption:" ) , "" ) ;
if ( caption != undefined ) {
if ( caption == "" ) {
alert ( _ _ ( "Can't create label: missing caption." ) ) ;
return false ;
}
var query = "backend.php?op=pref-labels&subop=add&caption=" +
param _escape ( caption ) ;
notify _progress ( "Loading, please wait..." , true ) ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
updateFeedList ( ) ;
} } ) ;
}
} catch ( e ) {
exception _error ( "addLabel" , e ) ;
}
}
function visitOfficialSite ( ) {
window . open ( "http://tt-rss.org/" ) ;
}
function feedBrowserSubscribe ( ) {
try {
var selected = getSelectedFeedsFromBrowser ( ) ;
if ( selected . length > 0 ) {
closeInfoBox ( ) ;
notify _progress ( "Loading, please wait..." , true ) ;
var query = "backend.php?op=pref-feeds&subop=massSubscribe&ids=" +
param _escape ( selected . toString ( ) ) ;
new Ajax . Request ( query , {
onComplete : function ( transport ) {
updateFeedList ( ) ;
} } ) ;
} else {
alert ( _ _ ( "No feeds are selected." ) ) ;
}
} catch ( e ) {
exception _error ( "feedBrowserSubscribe" , e ) ;
}
}
function init _gears ( ) {
try {
if ( window . google && google . gears ) {
localServer = google . gears . factory . create ( "beta.localserver" ) ;
store = localServer . createManagedStore ( "tt-rss" ) ;
db = google . gears . factory . create ( 'beta.database' ) ;
db . open ( 'tt-rss' ) ;
db . execute ( "CREATE TABLE IF NOT EXISTS cache (id text, article text, param text, added text)" ) ;
db . execute ( "CREATE TABLE if not exists offline_feeds (id integer, title text)" ) ;
db . execute ( "CREATE TABLE if not exists offline_data (id integer, feed_id integer, title text, link text, guid text, updated text, content text, tags text)" ) ;
var qmcDownload = document . getElementById ( "qmcDownload" ) ;
if ( qmcDownload ) Element . show ( qmcDownload ) ;
}
cache _expire ( ) ;
} catch ( e ) {
exception _error ( "init_gears" , e ) ;
}
}
function init _offline ( ) {
try {
offline _mode = true ;
render _offline _feedlist ( ) ;
remove _splash ( ) ;
} catch ( e ) {
exception _error ( "init_offline" , e ) ;
}
}
function offline _download _parse ( stage , transport ) {
try {
if ( transport . responseXML ) {
if ( stage == 0 ) {
var feeds = transport . responseXML . getElementsByTagName ( "feed" ) ;
if ( feeds . length > 0 ) {
db . execute ( "DELETE FROM offline_feeds" ) ;
}
for ( var i = 0 ; i < feeds . length ; i ++ ) {
var id = feeds [ i ] . getAttribute ( "id" ) ;
var title = feeds [ i ] . firstChild . nodeValue ;
db . execute ( "INSERT INTO offline_feeds (id,title) VALUES (?,?)" ,
[ id , title ] ) ;
}
window . setTimeout ( "initiate_offline_download(" + ( stage + 1 ) + ")" , 50 ) ;
} else {
var articles = transport . responseXML . getElementsByTagName ( "article" ) ;
var articles _found = 0 ;
for ( var i = 0 ; i < articles . length ; i ++ ) {
var a = eval ( "(" + articles [ i ] . firstChild . nodeValue + ")" ) ;
articles _found ++ ;
if ( a ) {
db . execute ( "DELETE FROM offline_data WHERE id = ?" , [ a . id ] ) ;
db . execute ( "INSERT INTO offline_data " +
"(id, feed_id, title, link, guid, updated, content) " +
"VALUES (?, ?, ?, ?, ?, ?, ?)" ,
[ a . id , a . feed _id , a . title , a . link , a . guid , a . updated , a . content ] ) ;
}
}
if ( articles _found > 0 ) {
window . setTimeout ( "initiate_offline_download(" + ( stage + 1 ) + ")" , 50 ) ;
}
}
notify _info ( "All done." ) ;
}
} catch ( e ) {
exception _error ( "offline_download_parse" , e ) ;
}
}
function initiate _offline _download ( stage ) {
try {
if ( ! stage ) stage = 0 ;
notify _progress ( "Loading, please wait... (" + stage + ")" , true ) ;
var query = "backend.php?op=rpc&subop=download&stage=" + stage ;
if ( document . getElementById ( "download_ops_form" ) ) {
query = query + "&" + Form . serialize ( "download_ops_form" ) ;
}
new Ajax . Request ( query , {
onComplete : function ( transport ) {
offline _download _parse ( stage , transport ) ;
} } ) ;
} catch ( e ) {
exception _error ( "initiate_offline_download" , e ) ;
}
}