2008-08-27 02:38:35 +01:00
/ *
2009-08-25 23:40:12 +01:00
* StatusNet - a distributed open - source microblogging tool
* Copyright ( C ) 2008 , StatusNet , Inc .
2008-08-27 02:38:35 +01:00
*
* 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/>.
2009-10-30 14:49:47 +00:00
*
* @ category UI interaction
* @ package StatusNet
* @ author Sarven Capadisli < csarven @ status . net >
* @ author Evan Prodromou < evan @ 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/
2008-08-27 02:38:35 +01:00
* /
2009-10-30 11:40:08 +00:00
var SN = { // StatusNet
C : { // Config
2009-10-30 14:59:17 +00:00
I : { // Init
2009-10-30 14:43:41 +00:00
CounterBlackout : false ,
MaxLength : 140 ,
2009-10-30 12:15:11 +00:00
PatternUsername : /^[0-9a-zA-Z\-_.]*$/ ,
HTTP20x30x : [ 200 , 201 , 202 , 203 , 204 , 205 , 206 , 300 , 301 , 302 , 303 , 304 , 305 , 306 , 307 ]
} ,
2009-10-30 15:21:03 +00:00
2009-10-30 11:40:08 +00:00
S : { // Selector
Disabled : 'disabled' ,
Warning : 'warning' ,
Error : 'error' ,
2009-10-30 13:16:38 +00:00
Success : 'success' ,
2009-10-30 12:15:11 +00:00
Processing : 'processing' ,
2009-10-31 17:01:19 +00:00
CommandResult : 'command_result' ,
2009-10-30 12:15:11 +00:00
FormNotice : 'form_notice' ,
NoticeDataText : 'notice_data-text' ,
NoticeTextCount : 'notice_text-count' ,
NoticeInReplyTo : 'notice_in-reply-to' ,
NoticeDataAttach : 'notice_data-attach' ,
2009-10-30 13:16:38 +00:00
NoticeDataAttachSelected : 'notice_data-attach_selected' ,
2009-10-30 15:47:32 +00:00
NoticeActionSubmit : 'notice_action-submit'
2009-10-30 11:40:08 +00:00
}
} ,
U : { // Utils
2009-10-31 17:55:13 +00:00
FormNoticeEnhancements : function ( form ) {
form _id = form . attr ( 'id' ) ;
2009-11-02 17:56:55 +00:00
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) . unbind ( 'keyup' ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) . unbind ( 'keydown' ) ;
2009-10-31 17:55:13 +00:00
if ( maxLength > 0 ) {
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) . bind ( 'keyup' , function ( e ) {
SN . U . Counter ( form ) ;
} ) ;
// run once in case there's something in there
SN . U . Counter ( form ) ;
}
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) . bind ( 'keydown' , function ( e ) {
SN . U . SubmitOnReturn ( e , form ) ;
} ) ;
if ( $ ( 'body' ) [ 0 ] . id != 'conversation' ) {
$ ( '#' + form _id + ' textarea' ) . focus ( ) ;
}
} ,
2009-10-30 13:31:57 +00:00
SubmitOnReturn : function ( event , el ) {
if ( event . keyCode == 13 || event . keyCode == 10 ) {
el . submit ( ) ;
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2009-11-02 16:55:47 +00:00
$ ( '#' + el [ 0 ] . id + ' #' + SN . C . S . NoticeDataText ) . blur ( ) ;
$ ( 'body' ) . focus ( ) ;
2009-10-30 13:31:57 +00:00
return false ;
}
return true ;
} ,
2009-10-31 17:55:13 +00:00
Counter : function ( form ) {
SN . C . I . FormNoticeCurrent = form ;
form _id = form . attr ( 'id' ) ;
2009-10-30 14:43:41 +00:00
if ( typeof ( maxLength ) == "undefined" ) {
maxLength = SN . C . I . MaxLength ;
}
if ( maxLength <= 0 ) {
return ;
}
2009-10-31 17:55:13 +00:00
var remaining = maxLength - $ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) . val ( ) . length ;
var counter = $ ( '#' + form _id + ' #' + SN . C . S . NoticeTextCount ) ;
2009-10-30 14:43:41 +00:00
if ( remaining . toString ( ) != counter . text ( ) ) {
2009-11-02 17:06:52 +00:00
if ( ! SN . C . I . CounterBlackout || remaining === 0 ) {
2009-10-30 14:43:41 +00:00
if ( counter . text ( ) != String ( remaining ) ) {
counter . text ( remaining ) ;
}
if ( remaining < 0 ) {
2009-10-31 17:55:13 +00:00
form . addClass ( SN . C . S . Warning ) ;
2009-10-30 14:43:41 +00:00
} else {
2009-10-31 17:55:13 +00:00
form . removeClass ( SN . C . S . Warning ) ;
2009-10-30 14:43:41 +00:00
}
// Skip updates for the next 500ms.
// On slower hardware, updating on every keypress is unpleasant.
if ( ! SN . C . I . CounterBlackout ) {
SN . C . I . CounterBlackout = true ;
2009-10-31 17:55:13 +00:00
SN . C . I . FormNoticeCurrent = form ;
window . setTimeout ( "SN.U.ClearCounterBlackout(SN.C.I.FormNoticeCurrent);" , 500 ) ;
2009-10-30 14:43:41 +00:00
}
}
}
} ,
2009-10-31 17:55:13 +00:00
ClearCounterBlackout : function ( form ) {
2009-10-30 14:43:41 +00:00
// Allow keyup events to poke the counter again
SN . C . I . CounterBlackout = false ;
// Check if the string changed since we last looked
2009-10-31 17:55:13 +00:00
SN . U . Counter ( form ) ;
2009-10-30 14:43:41 +00:00
} ,
2009-10-30 11:40:08 +00:00
FormXHR : function ( f ) {
f . bind ( 'submit' , function ( e ) {
form _id = $ ( this ) [ 0 ] . id ;
$ . ajax ( {
type : 'POST' ,
2009-10-30 15:59:24 +00:00
dataType : 'xml' ,
2009-10-30 11:40:08 +00:00
url : $ ( this ) [ 0 ] . action ,
data : $ ( this ) . serialize ( ) + '&ajax=1' ,
beforeSend : function ( xhr ) {
$ ( '#' + form _id ) . addClass ( SN . C . S . Processing ) ;
$ ( '#' + form _id + ' .submit' ) . addClass ( SN . C . S . Disabled ) ;
$ ( '#' + form _id + ' .submit' ) . attr ( SN . C . S . Disabled , SN . C . S . Disabled ) ;
} ,
error : function ( xhr , textStatus , errorThrown ) {
alert ( errorThrown || textStatus ) ;
} ,
success : function ( data , textStatus ) {
2009-10-30 16:06:11 +00:00
if ( typeof ( $ ( 'form' , data ) [ 0 ] ) != 'undefined' ) {
form _new = document . _importNode ( $ ( 'form' , data ) [ 0 ] , true ) ;
2009-10-30 15:59:24 +00:00
$ ( '#' + form _id ) . replaceWith ( form _new ) ;
2009-10-30 11:40:08 +00:00
$ ( '#' + form _new . id ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
}
else {
$ ( '#' + form _id ) . replaceWith ( document . _importNode ( $ ( 'p' , data ) [ 0 ] , true ) ) ;
}
}
} ) ;
return false ;
} ) ;
2009-10-30 12:15:11 +00:00
} ,
2009-10-31 17:01:19 +00:00
FormNoticeXHR : function ( form ) {
form _id = form . attr ( 'id' ) ;
form . append ( '<input type="hidden" name="ajax" value="1"/>' ) ;
form . ajaxForm ( {
2009-10-30 15:21:03 +00:00
dataType : 'xml' ,
2009-10-30 21:11:56 +00:00
timeout : '60000' ,
2009-10-30 12:15:11 +00:00
beforeSend : function ( xhr ) {
2009-10-31 17:01:19 +00:00
if ( $ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) [ 0 ] . value . length === 0 ) {
form . addClass ( SN . C . S . Warning ) ;
2009-10-30 12:15:11 +00:00
return false ;
}
2009-10-31 17:01:19 +00:00
form . addClass ( SN . C . S . Processing ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeActionSubmit ) . addClass ( SN . C . S . Disabled ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeActionSubmit ) . attr ( SN . C . S . Disabled , SN . C . S . Disabled ) ;
2009-10-30 12:15:11 +00:00
return true ;
} ,
error : function ( xhr , textStatus , errorThrown ) {
2009-10-31 17:01:19 +00:00
form . removeClass ( SN . C . S . Processing ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeActionSubmit ) . removeClass ( SN . C . S . Disabled ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeActionSubmit ) . removeAttr ( SN . C . S . Disabled , SN . C . S . Disabled ) ;
2009-10-30 12:15:11 +00:00
if ( textStatus == 'timeout' ) {
alert ( 'Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists' ) ;
}
else {
if ( $ ( '.' + SN . C . S . Error , xhr . responseXML ) . length > 0 ) {
2009-10-31 17:01:19 +00:00
form . append ( document . _importNode ( $ ( '.' + SN . C . S . Error , xhr . responseXML ) [ 0 ] , true ) ) ;
2009-10-30 12:15:11 +00:00
}
else {
if ( jQuery . inArray ( parseInt ( xhr . status ) , SN . C . I . HTTP20x30x ) < 0 ) {
alert ( 'Sorry! We had trouble sending your notice (' + xhr . status + ' ' + xhr . statusText + '). Please report the problem to the site administrator if this happens again.' ) ;
}
else {
2009-10-31 17:01:19 +00:00
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) . val ( '' ) ;
2009-11-02 17:56:55 +00:00
SN . U . FormNoticeEnhancements ( $ ( '#' + form _id ) ) ;
2009-10-30 12:15:11 +00:00
}
}
}
} ,
success : function ( data , textStatus ) {
2009-11-02 17:06:52 +00:00
var result ;
2009-10-30 12:15:11 +00:00
if ( $ ( '#' + SN . C . S . Error , data ) . length > 0 ) {
2009-11-02 17:06:52 +00:00
result = document . _importNode ( $ ( 'p' , data ) [ 0 ] , true ) ;
2009-10-30 12:15:11 +00:00
alert ( result . textContent || result . innerHTML ) ;
}
else {
if ( $ ( 'body' ) [ 0 ] . id == 'bookmarklet' ) {
self . close ( ) ;
}
2009-10-31 17:01:19 +00:00
2009-10-30 12:15:11 +00:00
if ( $ ( '#' + SN . C . S . CommandResult , data ) . length > 0 ) {
2009-11-02 17:06:52 +00:00
result = document . _importNode ( $ ( 'p' , data ) [ 0 ] , true ) ;
2009-10-30 12:15:11 +00:00
alert ( result . textContent || result . innerHTML ) ;
}
else {
2009-10-30 21:11:56 +00:00
notice = document . _importNode ( $ ( 'li' , data ) [ 0 ] , true ) ;
2009-11-02 17:06:52 +00:00
if ( $ ( '#' + notice . id ) . length === 0 ) {
2009-10-30 12:15:11 +00:00
var notice _irt _value = $ ( '#' + SN . C . S . NoticeInReplyTo ) . val ( ) ;
var notice _irt = '#notices_primary #notice-' + notice _irt _value ;
if ( $ ( 'body' ) [ 0 ] . id == 'conversation' ) {
if ( notice _irt _value . length > 0 && $ ( notice _irt + ' .notices' ) . length < 1 ) {
$ ( notice _irt ) . append ( '<ul class="notices"></ul>' ) ;
}
2009-10-30 21:11:56 +00:00
$ ( $ ( notice _irt + ' .notices' ) [ 0 ] ) . append ( notice ) ;
2009-10-30 12:15:11 +00:00
}
else {
2009-10-30 21:11:56 +00:00
$ ( "#notices_primary .notices" ) . prepend ( notice ) ;
2009-10-30 12:15:11 +00:00
}
$ ( '#' + notice . id ) . css ( { display : 'none' } ) ;
$ ( '#' + notice . id ) . fadeIn ( 2500 ) ;
2009-10-30 13:16:38 +00:00
SN . U . NoticeAttachments ( ) ;
2009-10-30 12:56:01 +00:00
SN . U . NoticeReply ( ) ;
2009-10-30 12:15:11 +00:00
}
}
2009-10-31 17:01:19 +00:00
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataText ) . val ( '' ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataAttach ) . val ( '' ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeInReplyTo ) . val ( '' ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeDataAttachSelected ) . remove ( ) ;
2009-11-02 17:19:08 +00:00
SN . U . FormNoticeEnhancements ( $ ( '#' + form _id ) ) ;
2009-10-30 12:15:11 +00:00
}
} ,
complete : function ( xhr , textStatus ) {
2009-10-31 17:01:19 +00:00
form . removeClass ( SN . C . S . Processing ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeActionSubmit ) . removeAttr ( SN . C . S . Disabled ) ;
$ ( '#' + form _id + ' #' + SN . C . S . NoticeActionSubmit ) . removeClass ( SN . C . S . Disabled ) ;
2009-10-30 12:15:11 +00:00
}
} ) ;
2009-10-30 12:56:01 +00:00
} ,
NoticeReply : function ( ) {
if ( $ ( '#' + SN . C . S . NoticeDataText ) . length > 0 && $ ( '#content .notice_reply' ) . length > 0 ) {
$ ( '#content .notice' ) . each ( function ( ) {
var notice = $ ( this ) [ 0 ] ;
$ ( $ ( '.notice_reply' , notice ) [ 0 ] ) . click ( function ( ) {
var nickname = ( $ ( '.author .nickname' , notice ) . length > 0 ) ? $ ( $ ( '.author .nickname' , notice ) [ 0 ] ) : $ ( '.author .nickname.uid' ) ;
SN . U . NoticeReplySet ( nickname . text ( ) , $ ( $ ( '.notice_id' , notice ) [ 0 ] ) . text ( ) ) ;
return false ;
} ) ;
} ) ;
}
} ,
2009-10-30 12:56:53 +00:00
NoticeReplySet : function ( nick , id ) {
2009-10-30 12:56:01 +00:00
if ( nick . match ( SN . C . I . PatternUsername ) ) {
var text = $ ( '#' + SN . C . S . NoticeDataText ) ;
if ( text . length ) {
replyto = '@' + nick + ' ' ;
text . val ( replyto + text . val ( ) . replace ( RegExp ( replyto , 'i' ) , '' ) ) ;
$ ( '#' + SN . C . S . FormNotice + ' input#' + SN . C . S . NoticeInReplyTo ) . val ( id ) ;
2009-11-02 13:28:14 +00:00
if ( text [ 0 ] . setSelectionRange ) {
2009-10-30 12:56:01 +00:00
var len = text . val ( ) . length ;
2009-11-02 13:28:14 +00:00
text [ 0 ] . setSelectionRange ( len , len ) ;
text [ 0 ] . focus ( ) ;
2009-10-30 12:56:01 +00:00
}
return false ;
}
}
return true ;
2009-10-30 13:02:51 +00:00
} ,
NoticeAttachments : function ( ) {
$ . fn . jOverlay . options = {
method : 'GET' ,
data : '' ,
url : '' ,
color : '#000' ,
opacity : '0.6' ,
zIndex : 99 ,
center : false ,
imgLoading : $ ( 'address .url' ) [ 0 ] . href + 'theme/base/images/illustrations/illu_progress_loading-01.gif' ,
bgClickToClose : true ,
success : function ( ) {
2009-11-01 19:53:25 +00:00
$ ( '#jOverlayContent' ) . append ( '<button class="close">×</button>' ) ;
2009-10-30 13:02:51 +00:00
$ ( '#jOverlayContent button' ) . click ( $ . closeOverlay ) ;
} ,
timeout : 0 ,
autoHide : true ,
css : { 'max-width' : '542px' , 'top' : '5%' , 'left' : '32.5%' }
} ;
$ ( '#content .notice a.attachment' ) . click ( function ( ) {
$ ( ) . jOverlay ( { url : $ ( 'address .url' ) [ 0 ] . href + 'attachment/' + ( $ ( this ) . attr ( 'id' ) . substring ( 'attachment' . length + 1 ) ) + '/ajax' } ) ;
return false ;
} ) ;
var t ;
$ ( "body:not(#shownotice) #content .notice a.thumbnail" ) . hover (
function ( ) {
var anchor = $ ( this ) ;
$ ( "a.thumbnail" ) . children ( 'img' ) . hide ( ) ;
anchor . closest ( ".entry-title" ) . addClass ( 'ov' ) ;
2009-11-02 17:06:52 +00:00
if ( anchor . children ( 'img' ) . length === 0 ) {
2009-10-30 13:02:51 +00:00
t = setTimeout ( function ( ) {
$ . get ( $ ( 'address .url' ) [ 0 ] . href + 'attachment/' + ( anchor . attr ( 'id' ) . substring ( 'attachment' . length + 1 ) ) + '/thumbnail' , null , function ( data ) {
anchor . append ( data ) ;
} ) ;
} , 500 ) ;
}
else {
anchor . children ( 'img' ) . show ( ) ;
}
} ,
function ( ) {
clearTimeout ( t ) ;
$ ( "a.thumbnail" ) . children ( 'img' ) . hide ( ) ;
$ ( this ) . closest ( ".entry-title" ) . removeClass ( 'ov' ) ;
}
) ;
2009-10-30 13:16:38 +00:00
} ,
NoticeDataAttach : function ( ) {
NDA = $ ( '#' + SN . C . S . NoticeDataAttach ) ;
NDA . change ( function ( ) {
2009-11-01 19:53:25 +00:00
S = '<div id="' + SN . C . S . NoticeDataAttachSelected + '" class="' + SN . C . S . Success + '"><code>' + $ ( this ) . val ( ) + '</code> <button class="close">×</button></div>' ;
2009-10-30 13:16:38 +00:00
NDAS = $ ( '#' + SN . C . S . NoticeDataAttachSelected ) ;
2009-11-02 17:06:52 +00:00
if ( NDAS . length > 0 ) {
NDAS . replaceWith ( S ) ;
}
else {
$ ( '#' + SN . C . S . FormNotice ) . append ( S ) ;
}
2009-10-30 13:16:38 +00:00
$ ( '#' + SN . C . S . NoticeDataAttachSelected + ' button' ) . click ( function ( ) {
$ ( '#' + SN . C . S . NoticeDataAttachSelected ) . remove ( ) ;
NDA . val ( '' ) ;
} ) ;
} ) ;
2009-10-31 15:14:38 +00:00
} ,
NewDirectMessage : function ( ) {
NDM = $ ( '.entity_send-a-message a' ) ;
NDM . attr ( { 'href' : NDM . attr ( 'href' ) + '&ajax=1' } ) ;
NDM . click ( function ( ) {
var NDMF = $ ( '.entity_send-a-message form' ) ;
2009-11-02 17:06:52 +00:00
if ( NDMF . length === 0 ) {
2009-10-31 15:14:38 +00:00
$ . get ( NDM . attr ( 'href' ) , null , function ( data ) {
2009-11-02 13:28:14 +00:00
$ ( '.entity_send-a-message' ) . append ( document . _importNode ( $ ( 'form' , data ) [ 0 ] , true ) ) ;
2009-10-31 17:01:19 +00:00
NDMF = $ ( '.entity_send-a-message .form_notice' ) ;
2009-11-02 17:56:55 +00:00
SN . U . FormNoticeXHR ( NDMF ) ;
2009-10-31 17:55:13 +00:00
SN . U . FormNoticeEnhancements ( NDMF ) ;
2009-11-01 19:53:25 +00:00
NDMF . append ( '<button class="close">×</button>' ) ;
2009-10-31 15:14:38 +00:00
$ ( '.entity_send-a-message button' ) . click ( function ( ) {
NDMF . hide ( ) ;
return false ;
} ) ;
} ) ;
}
else {
NDMF . show ( ) ;
$ ( '.entity_send-a-message textarea' ) . focus ( ) ;
}
return false ;
} ) ;
2009-10-30 11:40:08 +00:00
}
}
2009-11-02 17:06:52 +00:00
} ;
$ ( document ) . ready ( function ( ) {
if ( $ ( 'body.user_in' ) . length > 0 ) {
2009-11-02 17:56:55 +00:00
$ ( '.' + SN . C . S . FormNotice ) . each ( function ( ) {
SN . U . FormNoticeXHR ( $ ( this ) ) ;
SN . U . FormNoticeEnhancements ( $ ( this ) ) ;
} ) ;
2009-11-02 17:06:52 +00:00
$ ( '.form_user_subscribe' ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
$ ( '.form_user_unsubscribe' ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
$ ( '.form_favor' ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
$ ( '.form_disfavor' ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
$ ( '.form_group_join' ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
$ ( '.form_group_leave' ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
$ ( '.form_user_nudge' ) . each ( function ( ) { SN . U . FormXHR ( $ ( this ) ) ; } ) ;
SN . U . NoticeReply ( ) ;
SN . U . NoticeDataAttach ( ) ;
SN . U . NewDirectMessage ( ) ;
}
SN . U . NoticeAttachments ( ) ;
} ) ;