2010-09-24 01:08:03 -04:00
NEWSBLUR . ReaderFeedchooser = function ( options ) {
var defaults = { } ;
this . options = $ . extend ( { } , defaults , options ) ;
this . model = NEWSBLUR . AssetModel . reader ( ) ;
this . google _favicon _url = 'http://www.google.com/s2/favicons?domain_url=' ;
this . runner ( ) ;
} ;
NEWSBLUR . ReaderFeedchooser . prototype = {
runner : function ( ) {
2010-09-29 09:49:34 -04:00
this . start = new Date ( ) ;
2010-09-27 11:43:08 -04:00
this . MAX _FEEDS = 40 ;
2010-09-24 01:08:03 -04:00
this . approve _list = [ ] ;
this . make _modal ( ) ;
this . open _modal ( ) ;
2010-09-29 09:49:34 -04:00
this . find _feeds _in _feed _list ( ) ;
2010-09-27 11:43:08 -04:00
this . initial _load _feeds ( ) ;
2010-09-24 01:08:03 -04:00
this . $modal . bind ( 'mousedown' , $ . rescope ( this . handle _click , this ) ) ;
} ,
make _modal : function ( ) {
var self = this ;
this . $modal = $ . make ( 'div' , { className : 'NB-modal-feedchooser NB-modal' } , [
$ . make ( 'h2' , { className : 'NB-modal-title' } , 'Choose Your ' + this . MAX _FEEDS ) ,
$ . make ( 'h2' , { className : 'NB-modal-subtitle' } , [
$ . make ( 'b' , [
'You have a ' ,
$ . make ( 'span' , { style : 'color: #303060;' } , 'Standard Account' ) ,
', which can follow up to ' + this . MAX _FEEDS + ' sites at a time.'
] ) ,
'Choose which ' + this . MAX _FEEDS + ' you would like to follow. You can always change these.'
] ) ,
$ . make ( 'div' , { className : 'NB-feedchooser-info' } , [
$ . make ( 'div' , { className : 'NB-feedchooser-info-counts' } )
] ) ,
this . make _feeds ( ) ,
$ . make ( 'form' , { className : 'NB-feedchooser-form' } , [
$ . make ( 'div' , { className : 'NB-modal-submit' } , [
2010-09-28 18:53:57 -04:00
$ . make ( 'input' , { type : 'submit' , disabled : 'true' , className : 'NB-disabled NB-modal-submit-save NB-modal-submit-green' , value : 'Check what you like above...' } )
2010-09-24 01:08:03 -04:00
] )
2010-09-28 18:53:57 -04:00
] )
2010-09-24 01:08:03 -04:00
] ) ;
} ,
make _feeds : function ( ) {
var feeds = this . model . feeds ;
var $feeds = $ ( '#feed_list' ) . clone ( true ) . attr ( {
'id' : 'NB-feedchooser-feeds' ,
'class' : 'NB-feedlist NB-feedchooser unread_view_positive' ,
'style' : ''
} ) ;
2010-09-28 18:53:57 -04:00
// Expand collapsed folders
$ ( 'ul.folder' , $feeds ) . css ( {
'display' : 'block' ,
'opacity' : 1
} ) ;
2010-09-24 01:08:03 -04:00
$ ( '.unread_count_positive' , $feeds ) . text ( 'On' ) ;
$ ( '.unread_count_negative' , $feeds ) . text ( 'Off' ) ;
2010-09-28 18:53:57 -04:00
2010-09-24 01:08:03 -04:00
return $feeds ;
} ,
open _modal : function ( ) {
var self = this ;
this . $modal . modal ( {
'minWidth' : 600 ,
'maxWidth' : 600 ,
'overlayClose' : true ,
'onOpen' : function ( dialog ) {
dialog . overlay . fadeIn ( 200 , function ( ) {
dialog . container . fadeIn ( 200 ) ;
dialog . data . fadeIn ( 200 ) ;
} ) ;
} ,
'onShow' : function ( dialog ) {
$ ( '#simplemodal-container' ) . corner ( '6px' ) ;
} ,
'onClose' : function ( dialog ) {
dialog . data . hide ( ) . empty ( ) . remove ( ) ;
dialog . container . hide ( ) . empty ( ) . remove ( ) ;
dialog . overlay . fadeOut ( 200 , function ( ) {
dialog . overlay . empty ( ) . remove ( ) ;
$ . modal . close ( ) ;
} ) ;
$ ( '.NB-modal-holder' ) . empty ( ) . remove ( ) ;
}
} ) ;
} ,
2010-09-29 09:49:34 -04:00
add _feed _to _decline : function ( feed _id , update ) {
2010-09-24 01:08:03 -04:00
this . approve _list = _ . without ( this . approve _list , feed _id ) ;
2010-09-29 09:49:34 -04:00
var $feed = this . $feeds [ feed _id ] ;
2010-09-24 01:08:03 -04:00
$feed . removeClass ( 'NB-feedchooser-approve' ) ;
$feed . addClass ( 'NB-feedchooser-decline' ) ;
2010-09-29 09:49:34 -04:00
if ( update ) {
this . update _counts ( ) ;
}
2010-09-24 01:08:03 -04:00
} ,
2010-09-29 09:49:34 -04:00
add _feed _to _approve : function ( feed _id , update ) {
2010-09-24 01:08:03 -04:00
if ( ! _ . contains ( this . approve _list , feed _id ) ) {
this . approve _list . push ( feed _id ) ;
2010-09-29 09:49:34 -04:00
var $feed = this . $feeds [ feed _id ] ;
2010-09-24 01:08:03 -04:00
$feed . removeClass ( 'NB-feedchooser-decline' ) ;
$feed . addClass ( 'NB-feedchooser-approve' ) ;
2010-09-29 09:49:34 -04:00
if ( update ) {
this . update _counts ( ) ;
}
2010-09-24 01:08:03 -04:00
}
} ,
2010-09-29 09:49:34 -04:00
find _feeds _in _feed _list : function ( ) {
2010-09-24 01:08:03 -04:00
var $feed _list = $ ( '.NB-feedchooser' , this . $modal ) ;
2010-09-29 09:49:34 -04:00
var $feeds = { } ;
2010-09-24 01:08:03 -04:00
$ ( '.feed' , $feed _list ) . each ( function ( ) {
2010-09-29 09:49:34 -04:00
var feed _id = $ ( this ) . data ( 'feed_id' ) ;
if ( ! _ . contains ( _ . keys ( $feeds ) , feed _id ) ) {
$feeds [ feed _id ] = $ ( [ ] ) ;
2010-09-24 01:08:03 -04:00
}
2010-09-29 09:49:34 -04:00
$feeds [ feed _id ] . push ( $ ( this ) . get ( 0 ) ) ;
2010-09-24 01:08:03 -04:00
} ) ;
2010-09-29 09:49:34 -04:00
this . $feeds = $feeds ;
2010-09-24 01:08:03 -04:00
} ,
update _counts : function ( ) {
var $count = $ ( '.NB-feedchooser-info-counts' ) ;
var approved = this . approve _list . length ;
2010-09-27 11:43:08 -04:00
var $submit = $ ( '.NB-modal-submit-save' , this . $modal ) ;
var difference = approved - this . MAX _FEEDS ;
2010-09-24 01:08:03 -04:00
$count . text ( approved + '/' + this . MAX _FEEDS ) ;
$count . toggleClass ( 'NB-full' , approved == this . MAX _FEEDS ) ;
$count . toggleClass ( 'NB-error' , approved > this . MAX _FEEDS ) ;
2010-09-27 11:43:08 -04:00
if ( approved > this . MAX _FEEDS ) {
2010-09-28 18:53:57 -04:00
$submit . addClass ( 'NB-disabled' ) . attr ( 'disabled' , true ) . val ( 'Too many sites! Deselect ' + (
2010-09-27 11:43:08 -04:00
difference == 1 ?
'1 site...' :
difference + ' sites...'
) ) ;
} else {
2010-09-28 18:53:57 -04:00
$submit . removeClass ( 'NB-disabled' ) . attr ( 'disabled' , false ) . val ( 'OK, These are my ' + approved + '. Save them, please!' ) ;
2010-09-27 11:43:08 -04:00
}
2010-09-24 01:08:03 -04:00
} ,
initial _load _feeds : function ( ) {
2010-09-29 09:49:34 -04:00
var start = new Date ( ) ;
2010-09-24 01:08:03 -04:00
var self = this ;
var $feeds = $ ( '.feed' , this . $modal ) ;
2010-09-28 18:53:57 -04:00
var feeds = this . model . get _feeds ( ) ;
var active _feeds = _ . any ( _ . pluck ( feeds , 'active' ) ) ;
if ( ! active _feeds ) {
// Get feed subscribers
var min _subscribers = _ . last (
_ . first (
_ . pluck ( this . model . get _feeds ( ) , 'subs' ) . sort ( function ( a , b ) {
return b - a ;
} ) ,
this . MAX _FEEDS
)
) ;
2010-09-24 18:22:12 -04:00
2010-09-28 18:53:57 -04:00
// Decline everything
2010-09-29 09:49:34 -04:00
var approve _feeds = [ ] ;
_ . each ( feeds , function ( feed , feed _id ) {
self . add _feed _to _decline ( parseInt ( feed _id , 10 ) ) ;
2010-09-24 18:22:12 -04:00
2010-09-29 09:49:34 -04:00
if ( feed [ 'subs' ] >= min _subscribers ) {
approve _feeds . push ( parseInt ( feed _id , 10 ) ) ;
2010-09-28 18:53:57 -04:00
}
} ) ;
2010-09-24 18:22:12 -04:00
2010-09-28 18:53:57 -04:00
// Approve feeds in subs
2010-09-29 09:49:34 -04:00
_ . each ( approve _feeds , function ( feed _id ) {
2010-09-28 18:53:57 -04:00
if ( self . model . get _feed ( feed _id ) [ 'subs' ] > min _subscribers &&
self . approve _list . length < self . MAX _FEEDS ) {
self . add _feed _to _approve ( feed _id ) ;
}
} ) ;
2010-09-29 09:49:34 -04:00
_ . each ( approve _feeds , function ( feed _id ) {
2010-09-28 18:53:57 -04:00
if ( self . model . get _feed ( feed _id ) [ 'subs' ] == min _subscribers &&
self . approve _list . length < self . MAX _FEEDS ) {
self . add _feed _to _approve ( feed _id ) ;
}
} ) ;
} else {
// Get active feeds
var active _feeds = _ . pluck ( _ . select ( feeds , function ( feed ) {
if ( feed . active ) return true ;
} ) , 'id' ) ;
2010-09-29 09:49:34 -04:00
this . approve _list = active _feeds ;
2010-09-28 18:53:57 -04:00
// Approve or decline
var feeds = [ ] ;
$feeds . each ( function ( ) {
var feed _id = $ ( this ) . data ( 'feed_id' ) ;
if ( _ . contains ( active _feeds , feed _id ) ) {
self . add _feed _to _approve ( feed _id ) ;
} else {
self . add _feed _to _decline ( feed _id ) ;
}
} ) ;
}
2010-09-29 09:49:34 -04:00
this . update _counts ( ) ;
2010-09-28 18:53:57 -04:00
} ,
save : function ( ) {
var $submit = $ ( '.NB-modal-submit-save' , this . $modal ) ;
$submit . addClass ( 'NB-disabled' ) . val ( 'Saving...' ) ;
this . model . save _feed _chooser ( this . approve _list , function ( ) {
NEWSBLUR . reader . load _feeds ( ) ;
$ . modal . close ( ) ;
2010-09-24 01:08:03 -04:00
} ) ;
} ,
// ===========
// = Actions =
// ===========
handle _click : function ( elem , e ) {
var self = this ;
$ . targetIs ( e , { tagSelector : '.feed' } , _ . bind ( function ( $t , $p ) {
e . preventDefault ( ) ;
var feed _id = $t . data ( 'feed_id' ) ;
if ( _ . contains ( this . approve _list , feed _id ) ) {
2010-09-29 09:49:34 -04:00
this . add _feed _to _decline ( feed _id , true ) ;
2010-09-24 01:08:03 -04:00
} else {
2010-09-29 09:49:34 -04:00
this . add _feed _to _approve ( feed _id , true ) ;
2010-09-24 01:08:03 -04:00
}
} , this ) ) ;
2010-09-27 11:43:08 -04:00
$ . targetIs ( e , { tagSelector : '.NB-modal-submit-save' } , _ . bind ( function ( $t , $p ) {
e . preventDefault ( ) ;
2010-09-28 18:53:57 -04:00
this . save ( ) ;
2010-09-27 11:43:08 -04:00
} , this ) ) ;
2010-09-24 01:08:03 -04:00
} ,
handle _cancel : function ( ) {
var $cancel = $ ( '.NB-modal-cancel' , this . $modal ) ;
$cancel . click ( function ( e ) {
e . preventDefault ( ) ;
$ . modal . close ( ) ;
} ) ;
}
} ;