2009-11-04 09:24:14 +00:00
/ *
* StatusNet - a distributed open - source microblogging tool
* Copyright ( C ) 2008 , StatusNet , Inc .
*
* Add a notice encoded as JSON into the current timeline
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* 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 Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*
* @ category Plugin
* @ package StatusNet
* @ author Evan Prodromou < evan @ status . net >
* @ author Sarven Capadisli < csarven @ status . net >
* @ copyright 2009 StatusNet , Inc .
* @ license http : //www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @ link http : //status.net/
* /
2009-09-23 22:07:20 +01:00
// TODO: i18n
RealtimeUpdate = {
_userid : 0 ,
_replyurl : '' ,
_favorurl : '' ,
_deleteurl : '' ,
2009-11-04 09:12:34 +00:00
_updatecounter : 0 ,
2009-11-18 10:54:57 +00:00
_maxnotices : 50 ,
2009-11-18 12:46:36 +00:00
_windowhasfocus : true ,
2009-11-18 13:34:06 +00:00
_documenttitle : '' ,
2009-11-18 15:41:07 +00:00
_paused : false ,
_queuedNotices : [ ] ,
2009-09-23 22:07:20 +01:00
init : function ( userid , replyurl , favorurl , deleteurl )
{
RealtimeUpdate . _userid = userid ;
RealtimeUpdate . _replyurl = replyurl ;
RealtimeUpdate . _favorurl = favorurl ;
RealtimeUpdate . _deleteurl = deleteurl ;
2009-09-27 15:06:39 +01:00
2009-11-18 13:34:06 +00:00
RealtimeUpdate . _documenttitle = document . title ;
2009-11-04 09:12:34 +00:00
2009-11-18 10:53:48 +00:00
$ ( window ) . bind ( 'focus' , function ( ) { RealtimeUpdate . _windowhasfocus = true ; } ) ;
2009-11-18 12:46:36 +00:00
$ ( window ) . bind ( 'blur' , function ( ) {
2009-11-11 12:21:27 +00:00
$ ( '#notices_primary .notice' ) . removeClass ( 'mark-top' ) ;
2009-09-27 15:06:39 +01:00
2009-11-11 12:21:27 +00:00
$ ( '#notices_primary .notice:first' ) . addClass ( 'mark-top' ) ;
2009-11-04 09:12:34 +00:00
RealtimeUpdate . _updatecounter = 0 ;
2009-11-18 13:34:06 +00:00
document . title = RealtimeUpdate . _documenttitle ;
2009-11-18 10:53:48 +00:00
RealtimeUpdate . _windowhasfocus = false ;
2009-11-04 09:12:34 +00:00
return false ;
2009-09-27 15:06:39 +01:00
} ) ;
2009-09-23 22:07:20 +01:00
} ,
receive : function ( data )
{
2009-11-18 10:46:55 +00:00
id = data . id ;
2009-11-04 09:12:34 +00:00
2009-11-18 10:46:55 +00:00
// Don't add it if it already exists
if ( $ ( "#notice-" + id ) . length > 0 ) {
return ;
}
2009-11-04 09:12:34 +00:00
2009-11-18 15:41:07 +00:00
if ( RealtimeUpdate . _paused === false ) {
RealtimeUpdate . purgeLastNoticeItem ( ) ;
2009-11-18 10:54:57 +00:00
2009-11-18 15:41:07 +00:00
RealtimeUpdate . insertNoticeItem ( data ) ;
2009-11-18 13:34:06 +00:00
2009-11-18 15:41:07 +00:00
RealtimeUpdate . updateWindowCounter ( ) ;
}
else {
RealtimeUpdate . _queuedNotices . push ( data ) ;
}
2009-11-18 13:34:06 +00:00
} ,
2009-11-18 10:54:57 +00:00
2009-11-18 13:34:06 +00:00
insertNoticeItem : function ( data ) {
var noticeItem = RealtimeUpdate . makeNoticeItem ( data ) ;
$ ( "#notices_primary .notices" ) . prepend ( noticeItem ) ;
$ ( "#notices_primary .notice:first" ) . css ( { display : "none" } ) ;
$ ( "#notices_primary .notice:first" ) . fadeIn ( 1000 ) ;
SN . U . NoticeReply ( ) ;
SN . U . NoticeFavor ( ) ;
} ,
purgeLastNoticeItem : function ( ) {
if ( $ ( '#notices_primary .notice' ) . length > RealtimeUpdate . _maxnotices ) {
$ ( "#notices_primary .notice:last .form_disfavor" ) . unbind ( 'submit' ) ;
$ ( "#notices_primary .notice:last .form_favor" ) . unbind ( 'submit' ) ;
$ ( "#notices_primary .notice:last .notice_reply" ) . unbind ( 'click' ) ;
$ ( "#notices_primary .notice:last" ) . remove ( ) ;
}
} ,
2009-11-04 09:12:34 +00:00
2009-11-18 13:34:06 +00:00
updateWindowCounter : function ( ) {
2009-11-18 10:53:48 +00:00
if ( RealtimeUpdate . _windowhasfocus === false ) {
RealtimeUpdate . _updatecounter += 1 ;
2009-11-18 13:34:06 +00:00
document . title = '(' + RealtimeUpdate . _updatecounter + ') ' + RealtimeUpdate . _documenttitle ;
2009-11-18 10:53:48 +00:00
}
2009-09-23 22:07:20 +01:00
} ,
makeNoticeItem : function ( data )
{
user = data [ 'user' ] ;
html = data [ 'html' ] . replace ( /&/g , '&' ) . replace ( /</g , '<' ) . replace ( />/g , '>' ) . replace ( /"/g , '"' ) ;
source = data [ 'source' ] . replace ( /&/g , '&' ) . replace ( /</g , '<' ) . replace ( />/g , '>' ) . replace ( /"/g , '"' ) ;
ni = "<li class=\"hentry notice\" id=\"notice-" + data [ 'id' ] + "\">" +
"<div class=\"entry-title\">" +
"<span class=\"vcard author\">" +
"<a href=\"" + user [ 'profile_url' ] + "\" class=\"url\">" +
"<img src=\"" + user [ 'profile_image_url' ] + "\" class=\"avatar photo\" width=\"48\" height=\"48\" alt=\"" + user [ 'screen_name' ] + "\"/>" +
"<span class=\"nickname fn\">" + user [ 'screen_name' ] + "</span>" +
"</a>" +
"</span>" +
"<p class=\"entry-content\">" + html + "</p>" +
"</div>" +
"<div class=\"entry-content\">" +
"<a class=\"timestamp\" rel=\"bookmark\" href=\"" + data [ 'url' ] + "\" >" +
"<abbr class=\"published\" title=\"" + data [ 'created_at' ] + "\">a few seconds ago</abbr>" +
"</a> " +
"<span class=\"source\">" +
"from " +
2009-09-21 20:17:37 +01:00
"<span class=\"device\">" + source + "</span>" + // may have a link
2009-09-23 22:07:20 +01:00
"</span>" ;
if ( data [ 'in_reply_to_status_id' ] ) {
ni = ni + " <a class=\"response\" href=\"" + data [ 'in_reply_to_status_url' ] + "\">in context</a>" ;
}
2009-09-21 20:17:37 +01:00
2009-09-23 22:07:20 +01:00
ni = ni + "</div>" +
2009-09-21 20:17:37 +01:00
"<div class=\"notice-options\">" ;
2009-09-23 22:07:20 +01:00
if ( RealtimeUpdate . _userid != 0 ) {
var input = $ ( "form#form_notice fieldset input#token" ) ;
var session _key = input . val ( ) ;
ni = ni + RealtimeUpdate . makeFavoriteForm ( data [ 'id' ] , session _key ) ;
ni = ni + RealtimeUpdate . makeReplyLink ( data [ 'id' ] , data [ 'user' ] [ 'screen_name' ] ) ;
if ( RealtimeUpdate . _userid == data [ 'user' ] [ 'id' ] ) {
2009-07-14 20:26:39 +01:00
ni = ni + RealtimeUpdate . makeDeleteLink ( data [ 'id' ] ) ;
2009-09-23 22:07:20 +01:00
}
}
2009-09-21 20:17:37 +01:00
2009-09-23 22:07:20 +01:00
ni = ni + "</div>" +
"</li>" ;
return ni ;
} ,
2009-09-21 20:17:37 +01:00
2009-09-23 22:07:20 +01:00
makeFavoriteForm : function ( id , session _key )
{
var ff ;
2009-09-21 20:17:37 +01:00
2009-09-23 22:07:20 +01:00
ff = "<form id=\"favor-" + id + "\" class=\"form_favor\" method=\"post\" action=\"" + RealtimeUpdate . _favorurl + "\">" +
2009-09-21 20:17:37 +01:00
"<fieldset>" +
2009-09-23 22:07:20 +01:00
"<legend>Favor this notice</legend>" +
"<input name=\"token-" + id + "\" type=\"hidden\" id=\"token-" + id + "\" value=\"" + session _key + "\"/>" +
"<input name=\"notice\" type=\"hidden\" id=\"notice-n" + id + "\" value=\"" + id + "\"/>" +
"<input type=\"submit\" id=\"favor-submit-" + id + "\" name=\"favor-submit-" + id + "\" class=\"submit\" value=\"Favor\" title=\"Favor this notice\"/>" +
2009-09-21 20:17:37 +01:00
"</fieldset>" +
2009-09-23 22:07:20 +01:00
"</form>" ;
return ff ;
} ,
makeReplyLink : function ( id , nickname )
{
var rl ;
rl = "<a class=\"notice_reply\" href=\"" + RealtimeUpdate . _replyurl + "?replyto=" + nickname + "\" title=\"Reply to this notice\">Reply <span class=\"notice_id\">" + id + "</span></a>" ;
return rl ;
2009-09-21 20:17:37 +01:00
} ,
2009-09-23 22:07:20 +01:00
makeDeleteLink : function ( id )
{
var dl , delurl ;
delurl = RealtimeUpdate . _deleteurl . replace ( "0000000000" , id ) ;
2009-09-21 20:17:37 +01:00
2009-09-23 22:07:20 +01:00
dl = "<a class=\"notice_delete\" href=\"" + delurl + "\" title=\"Delete this notice\">Delete</a>" ;
2009-09-21 20:17:37 +01:00
2009-09-23 22:07:20 +01:00
return dl ;
2009-09-23 20:24:12 +01:00
} ,
2009-11-18 15:41:07 +00:00
initActions : function ( url , timeline , path )
{
var NP = $ ( '#notices_primary' ) ;
2009-11-18 15:57:45 +00:00
NP . prepend ( '<ul id="realtime_actions"><li id="realtime_pauseplay"></li><li id="realtime_timeline"></li></ul>' ) ;
2009-11-18 16:00:40 +00:00
NP . css ( { 'position' : 'relative' } ) ;
2009-11-18 15:57:45 +00:00
$ ( '#realtime_actions' ) . css ( {
'position' : 'absolute' ,
'top' : '-20px' ,
'right' : '0' ,
'margin' : '0 0 11px 0'
} ) ;
$ ( '#realtime_actions li' ) . css ( {
'margin-left' : '18px' ,
'list-style-type' : 'none' ,
'float' : 'left'
} ) ;
2009-11-18 15:41:07 +00:00
RealtimeUpdate . _pluginPath = path ;
RealtimeUpdate . initPlayPause ( ) ;
RealtimeUpdate . initAddPopup ( url , timeline , RealtimeUpdate . _pluginPath ) ;
} ,
initPlayPause : function ( )
{
RealtimeUpdate . showPause ( ) ;
} ,
showPause : function ( )
{
RT _PP = $ ( '#realtime_pauseplay' ) ;
RT _PP . empty ( ) ;
RT _PP . append ( '<button id="realtime_pause" class="pause" title="Pause">Pause</button>' ) ;
RT _P = $ ( '#realtime_pause' ) ;
$ ( '#realtime_pause' ) . css ( {
'background' : 'url(' + RealtimeUpdate . _pluginPath + 'icon_pause.gif) no-repeat 47% 47%' ,
2009-11-18 15:57:45 +00:00
'width' : '16px' ,
'height' : '16px' ,
'display' : 'block' ,
2009-11-18 15:41:07 +00:00
'border' : 'none' ,
2009-11-18 15:57:45 +00:00
'cursor' : 'pointer' ,
'text-indent' : '-9999px'
2009-11-18 15:41:07 +00:00
} ) ;
RT _P . bind ( 'click' , function ( ) {
RealtimeUpdate . _paused = true ;
RealtimeUpdate . showPlay ( ) ;
return false ;
} ) ;
} ,
showPlay : function ( )
{
RT _PP = $ ( '#realtime_pauseplay' ) ;
RT _PP . empty ( ) ;
RT _PP . append ( '<button id="realtime_play" class="play" title="Play">Play</button>' ) ;
RT _P = $ ( '#realtime_play' ) ;
RT _P . css ( {
'background' : 'url(' + RealtimeUpdate . _pluginPath + 'icon_play.gif) no-repeat 47% 47%' ,
2009-11-18 15:57:45 +00:00
'width' : '16px' ,
'height' : '16px' ,
'display' : 'block' ,
2009-11-18 15:41:07 +00:00
'border' : 'none' ,
2009-11-18 15:57:45 +00:00
'cursor' : 'pointer' ,
'text-indent' : '-9999px'
2009-11-18 15:41:07 +00:00
} ) ;
RT _P . bind ( 'click' , function ( ) {
RealtimeUpdate . _paused = false ;
RealtimeUpdate . showPause ( ) ;
RealtimeUpdate . showQueuedNotices ( ) ;
return false ;
} ) ;
} ,
showQueuedNotices : function ( ) {
$ . each ( RealtimeUpdate . _queuedNotices , function ( i , n ) {
RealtimeUpdate . insertNoticeItem ( n ) ;
} ) ;
RealtimeUpdate . _queuedNotices = [ ] ;
} ,
initAddPopup : function ( url , timeline , path )
2009-09-23 20:24:12 +01:00
{
2009-11-18 15:57:45 +00:00
var NP = $ ( '#realtime_timeline' ) ;
NP . append ( '<button id="realtime_popup" title="Pop up in a window">Pop up</button>' ) ;
2009-09-27 12:49:18 +01:00
2009-11-18 15:57:45 +00:00
var PP = $ ( '#realtime_popup' ) ;
PP . css ( {
2009-11-18 15:41:07 +00:00
'background' : 'transparent url(' + path + 'icon_external.gif) no-repeat 0 30%' ,
2009-11-18 15:57:45 +00:00
'width' : '16px' ,
'height' : '16px' ,
2009-09-23 22:58:35 +01:00
'display' : 'block' ,
'border' : 'none' ,
2009-09-26 21:25:47 +01:00
'cursor' : 'pointer' ,
2009-11-18 15:57:45 +00:00
'text-indent' : '-9999px'
2009-09-23 22:58:35 +01:00
} ) ;
2009-11-11 12:57:48 +00:00
$ ( '#showstream #notices_primary' ) . css ( { 'margin-top' : '18px' } ) ;
2009-09-27 12:49:18 +01:00
2009-11-18 15:57:45 +00:00
PP . bind ( 'click' , function ( ) {
2009-09-23 22:58:35 +01:00
window . open ( url ,
2009-11-18 10:43:55 +00:00
'' ,
2009-11-11 12:34:22 +00:00
'toolbar=no,resizable=yes,scrollbars=yes,status=yes,width=500,height=550' ) ;
2009-09-27 12:49:18 +01:00
2009-09-23 22:58:35 +01:00
return false ;
} ) ;
2009-09-23 23:02:42 +01:00
} ,
initPopupWindow : function ( )
{
$ ( 'address' ) . hide ( ) ;
2009-09-27 13:26:01 +01:00
$ ( '#content' ) . css ( { 'width' : '93.5%' } ) ;
2009-09-27 12:49:18 +01:00
$ ( '#form_notice' ) . css ( {
2009-09-27 13:22:56 +01:00
'margin' : '18px 0 18px 1.795%' ,
2009-09-27 13:43:40 +01:00
'width' : '93%' ,
'max-width' : '451px'
2009-09-27 12:49:18 +01:00
} ) ;
2009-09-27 13:15:37 +01:00
2009-09-27 13:38:40 +01:00
$ ( '#form_notice label[for=notice_data-text], h1' ) . css ( { 'display' : 'none' } ) ;
2009-09-27 13:15:37 +01:00
2009-09-27 15:06:39 +01:00
$ ( '.notices li:first-child' ) . css ( { 'border-top-color' : 'transparent' } ) ;
2009-09-27 13:40:35 +01:00
$ ( '#form_notice label[for="notice_data-attach"], #form_notice #notice_data-attach' ) . css ( { 'top' : '0' } ) ;
2009-09-27 13:59:01 +01:00
$ ( '#form_notice #notice_data-attach' ) . css ( {
'left' : 'auto' ,
'right' : '0'
} ) ;
2009-11-18 10:42:43 +00:00
$ ( '.notices .entry-title a, .notices .entry-content a' ) . bind ( 'click' , function ( ) {
window . open ( this . href , '' ) ;
return false ;
} ) ;
2009-09-23 22:07:20 +01:00
}
}
2009-09-21 20:17:37 +01:00