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/>.
* /
2008-06-24 18:46:13 +01:00
$ ( document ) . ready ( function ( ) {
2009-08-09 01:54:57 +01:00
var counterBlackout = false ;
2008-11-15 03:35:49 +00:00
// count character on keyup
function counter ( event ) {
var maxLength = 140 ;
2009-01-16 17:02:46 +00:00
var currentLength = $ ( "#notice_data-text" ) . val ( ) . length ;
2008-11-15 03:35:49 +00:00
var remaining = maxLength - currentLength ;
2009-01-16 18:14:20 +00:00
var counter = $ ( "#notice_text-count" ) ;
2009-08-09 01:54:57 +01:00
if ( remaining . toString ( ) != counter . text ( ) ) {
if ( ! counterBlackout || remaining == 0 ) {
if ( counter . text ( ) != String ( remaining ) ) {
counter . text ( remaining ) ;
}
2009-01-21 16:47:23 +00:00
2009-08-09 01:54:57 +01:00
if ( remaining < 0 ) {
$ ( "#form_notice" ) . addClass ( "warning" ) ;
} else {
$ ( "#form_notice" ) . removeClass ( "warning" ) ;
}
// Skip updates for the next 500ms.
// On slower hardware, updating on every keypress is unpleasant.
if ( ! counterBlackout ) {
counterBlackout = true ;
window . setTimeout ( clearCounterBlackout , 500 ) ;
}
}
}
}
function clearCounterBlackout ( ) {
// Allow keyup events to poke the counter again
counterBlackout = false ;
// Check if the string changed since we last looked
counter ( null ) ;
2008-11-15 03:35:49 +00:00
}
2008-06-24 18:46:13 +01:00
2008-11-15 03:35:49 +00:00
function submitonreturn ( event ) {
2009-08-10 02:39:51 +01:00
if ( event . keyCode == 13 || event . keyCode == 10 ) {
// iPhone sends \n not \r for 'return'
2009-01-16 17:02:46 +00:00
$ ( "#form_notice" ) . submit ( ) ;
2008-11-15 03:35:49 +00:00
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2009-08-10 02:39:51 +01:00
$ ( "#notice_data-text" ) . blur ( ) ;
$ ( "body" ) . focus ( ) ;
2008-11-15 03:35:49 +00:00
return false ;
}
return true ;
}
2008-09-18 16:04:38 +01:00
2009-01-16 17:02:46 +00:00
if ( $ ( "#notice_data-text" ) . length ) {
$ ( "#notice_data-text" ) . bind ( "keyup" , counter ) ;
$ ( "#notice_data-text" ) . bind ( "keydown" , submitonreturn ) ;
2009-01-21 16:47:23 +00:00
2008-11-15 03:35:49 +00:00
// run once in case there's something in there
counter ( ) ;
2009-01-21 16:47:23 +00:00
2009-07-02 22:29:03 +01:00
if ( $ ( 'body' ) [ 0 ] . id != 'conversation' ) {
$ ( "#notice_data-text" ) . focus ( ) ;
}
2008-11-15 03:35:49 +00:00
}
2008-09-18 16:04:38 +01:00
2008-11-15 03:35:49 +00:00
// XXX: refactor this code
2008-09-18 16:04:38 +01:00
2009-01-21 16:47:23 +00:00
var joinoptions = { dataType : 'xml' ,
success : function ( xml ) { var new _form = document . _importNode ( $ ( 'form' , xml ) . get ( 0 ) , true ) ;
var leave = new _form . id ;
var join = leave . replace ( 'leave' , 'join' ) ;
$ ( 'form#' + join ) . replaceWith ( new _form ) ;
$ ( 'form#' + leave ) . ajaxForm ( leaveoptions ) . each ( addAjaxHidden ) ;
}
} ;
var leaveoptions = { dataType : 'xml' ,
success : function ( xml ) { var new _form = document . _importNode ( $ ( 'form' , xml ) . get ( 0 ) , true ) ;
var join = new _form . id ;
var leave = join . replace ( 'join' , 'leave' ) ;
$ ( 'form#' + leave ) . replaceWith ( new _form ) ;
$ ( 'form#' + join ) . ajaxForm ( joinoptions ) . each ( addAjaxHidden ) ;
}
} ;
$ ( "form.form_group_join" ) . ajaxForm ( joinoptions ) ;
$ ( "form.form_group_leave" ) . ajaxForm ( leaveoptions ) ;
$ ( "form.form_group_join" ) . each ( addAjaxHidden ) ;
$ ( "form.form_group_leave" ) . each ( addAjaxHidden ) ;
2008-11-16 02:27:35 +00:00
2009-01-22 06:33:38 +00:00
$ ( "#form_user_nudge" ) . ajaxForm ( { dataType : 'xml' ,
beforeSubmit : function ( xml ) { $ ( "#form_user_nudge input[type=submit]" ) . attr ( "disabled" , "disabled" ) ;
$ ( "#form_user_nudge input[type=submit]" ) . addClass ( "disabled" ) ;
} ,
success : function ( xml ) { $ ( "#form_user_nudge" ) . replaceWith ( document . _importNode ( $ ( "#nudge_response" , xml ) . get ( 0 ) , true ) ) ;
$ ( "#form_user_nudge input[type=submit]" ) . removeAttr ( "disabled" ) ;
$ ( "#form_user_nudge input[type=submit]" ) . removeClass ( "disabled" ) ;
}
} ) ;
$ ( "#form_user_nudge" ) . each ( addAjaxHidden ) ;
2008-11-20 23:26:55 +00:00
var Subscribe = { dataType : 'xml' ,
2009-01-21 04:08:05 +00:00
beforeSubmit : function ( formData , jqForm , options ) { $ ( ".form_user_subscribe input[type=submit]" ) . attr ( "disabled" , "disabled" ) ;
$ ( ".form_user_subscribe input[type=submit]" ) . addClass ( "disabled" ) ;
2008-12-08 05:12:12 +00:00
} ,
2008-11-20 23:26:55 +00:00
success : function ( xml ) { var form _unsubscribe = document . _importNode ( $ ( 'form' , xml ) . get ( 0 ) , true ) ;
var form _unsubscribe _id = form _unsubscribe . id ;
var form _subscribe _id = form _unsubscribe _id . replace ( 'unsubscribe' , 'subscribe' ) ;
$ ( "form#" + form _subscribe _id ) . replaceWith ( form _unsubscribe ) ;
$ ( "form#" + form _unsubscribe _id ) . ajaxForm ( UnSubscribe ) . each ( addAjaxHidden ) ;
2008-11-26 18:23:17 +00:00
$ ( "dd.subscribers" ) . text ( parseInt ( $ ( "dd.subscribers" ) . text ( ) ) + 1 ) ;
2009-01-21 04:08:05 +00:00
$ ( ".form_user_subscribe input[type=submit]" ) . removeAttr ( "disabled" ) ;
$ ( ".form_user_subscribe input[type=submit]" ) . removeClass ( "disabled" ) ;
2008-11-20 23:26:55 +00:00
}
} ;
var UnSubscribe = { dataType : 'xml' ,
2009-01-21 04:08:05 +00:00
beforeSubmit : function ( formData , jqForm , options ) { $ ( ".form_user_unsubscribe input[type=submit]" ) . attr ( "disabled" , "disabled" ) ;
$ ( ".form_user_unsubscribe input[type=submit]" ) . addClass ( "disabled" ) ;
2008-12-08 05:12:12 +00:00
} ,
2008-11-20 23:26:55 +00:00
success : function ( xml ) { var form _subscribe = document . _importNode ( $ ( 'form' , xml ) . get ( 0 ) , true ) ;
var form _subscribe _id = form _subscribe . id ;
var form _unsubscribe _id = form _subscribe _id . replace ( 'subscribe' , 'unsubscribe' ) ;
$ ( "form#" + form _unsubscribe _id ) . replaceWith ( form _subscribe ) ;
$ ( "form#" + form _subscribe _id ) . ajaxForm ( Subscribe ) . each ( addAjaxHidden ) ;
$ ( "#profile_send_a_new_message" ) . remove ( ) ;
$ ( "#profile_nudge" ) . remove ( ) ;
2008-11-26 18:23:17 +00:00
$ ( "dd.subscribers" ) . text ( parseInt ( $ ( "dd.subscribers" ) . text ( ) ) - 1 ) ;
2009-01-21 04:08:05 +00:00
$ ( ".form_user_unsubscribe input[type=submit]" ) . removeAttr ( "disabled" ) ;
$ ( ".form_user_unsubscribe input[type=submit]" ) . removeClass ( "disabled" ) ;
2008-11-20 23:26:55 +00:00
}
} ;
2009-01-21 04:08:05 +00:00
$ ( ".form_user_subscribe" ) . ajaxForm ( Subscribe ) ;
$ ( ".form_user_unsubscribe" ) . ajaxForm ( UnSubscribe ) ;
$ ( ".form_user_subscribe" ) . each ( addAjaxHidden ) ;
$ ( ".form_user_unsubscribe" ) . each ( addAjaxHidden ) ;
2008-11-23 01:55:59 +00:00
var PostNotice = { dataType : 'xml' ,
2009-01-16 17:02:46 +00:00
beforeSubmit : function ( formData , jqForm , options ) { if ( $ ( "#notice_data-text" ) . get ( 0 ) . value . length == 0 ) {
$ ( "#form_notice" ) . addClass ( "warning" ) ;
2008-11-23 01:55:59 +00:00
return false ;
}
2009-03-25 22:53:21 +00:00
$ ( "#form_notice" ) . addClass ( "processing" ) ;
2009-01-16 17:02:46 +00:00
$ ( "#notice_action-submit" ) . attr ( "disabled" , "disabled" ) ;
$ ( "#notice_action-submit" ) . addClass ( "disabled" ) ;
2008-11-23 01:55:59 +00:00
return true ;
} ,
2009-05-01 18:00:36 +01:00
timeout : '60000' ,
2009-04-23 22:35:21 +01:00
error : function ( xhr , textStatus , errorThrown ) { $ ( "#form_notice" ) . removeClass ( "processing" ) ;
$ ( "#notice_action-submit" ) . removeAttr ( "disabled" ) ;
$ ( "#notice_action-submit" ) . removeClass ( "disabled" ) ;
2009-05-01 18:00:36 +01: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" ) ;
2009-04-23 22:35:21 +01:00
}
else {
2009-05-01 18:00:36 +01:00
if ( $ ( ".error" , xhr . responseXML ) . length > 0 ) {
$ ( '#form_notice' ) . append ( document . _importNode ( $ ( ".error" , xhr . responseXML ) . get ( 0 ) , true ) ) ;
}
else {
2009-06-09 01:09:44 +01:00
var HTTP20x30x = [ 200 , 201 , 202 , 203 , 204 , 205 , 206 , 300 , 301 , 302 , 303 , 304 , 305 , 306 , 307 ] ;
2009-06-08 19:55:23 +01:00
if ( jQuery . inArray ( parseInt ( xhr . status ) , 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." ) ;
}
2009-06-08 21:52:27 +01:00
else {
$ ( "#notice_data-text" ) . val ( "" ) ;
counter ( ) ;
}
2009-05-01 18:00:36 +01:00
}
2009-04-23 22:35:21 +01:00
}
} ,
2009-04-16 22:57:42 +01:00
success : function ( xml ) { if ( $ ( "#error" , xml ) . length > 0 ) {
2008-12-16 07:18:18 +00:00
var result = document . _importNode ( $ ( "p" , xml ) . get ( 0 ) , true ) ;
result = result . textContent || result . innerHTML ;
alert ( result ) ;
2008-12-11 22:58:08 +00:00
}
2008-11-23 01:55:59 +00:00
else {
2009-04-16 22:57:42 +01:00
if ( $ ( "#command_result" , xml ) . length > 0 ) {
var result = document . _importNode ( $ ( "p" , xml ) . get ( 0 ) , true ) ;
result = result . textContent || result . innerHTML ;
alert ( result ) ;
}
else {
2009-04-27 02:16:09 +01:00
li = $ ( "li" , xml ) . get ( 0 ) ;
if ( $ ( "#" + li . id ) . length == 0 ) {
2009-06-13 05:53:23 +01:00
var notice _irt _value = $ ( '#notice_in-reply-to' ) . 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>' ) ;
}
$ ( $ ( notice _irt + ' .notices' ) [ 0 ] ) . append ( document . _importNode ( li , true ) ) ;
}
else {
$ ( "#notices_primary .notices" ) . prepend ( document . _importNode ( li , true ) ) ;
}
$ ( '#' + li . id ) . css ( { display : 'none' } ) ;
$ ( '#' + li . id ) . fadeIn ( 2500 ) ;
NoticeReply ( ) ;
2009-06-23 18:05:55 +01:00
NoticeAttachments ( ) ;
2009-11-11 20:37:17 +00:00
NoticeFavors ( ) ;
2009-04-27 02:16:09 +01:00
}
2009-04-16 22:57:42 +01:00
}
2009-01-16 17:02:46 +00:00
$ ( "#notice_data-text" ) . val ( "" ) ;
2009-05-27 02:20:04 +01:00
$ ( "#notice_data-attach" ) . val ( "" ) ;
2009-07-08 04:27:34 +01:00
$ ( "#notice_in-reply-to" ) . val ( "" ) ;
2009-06-25 22:01:07 +01:00
$ ( '#notice_data-attach_selected' ) . remove ( ) ;
2009-04-17 21:14:06 +01:00
counter ( ) ;
2008-11-23 01:55:59 +00:00
}
2009-03-25 22:53:21 +00:00
$ ( "#form_notice" ) . removeClass ( "processing" ) ;
2009-01-16 17:02:46 +00:00
$ ( "#notice_action-submit" ) . removeAttr ( "disabled" ) ;
$ ( "#notice_action-submit" ) . removeClass ( "disabled" ) ;
2008-11-23 01:55:59 +00:00
}
2008-12-16 07:18:18 +00:00
} ;
2009-04-23 03:22:00 +01:00
$ ( "#form_notice" ) . ajaxForm ( PostNotice ) ;
$ ( "#form_notice" ) . each ( addAjaxHidden ) ;
2009-01-23 02:49:48 +00:00
NoticeReply ( ) ;
2009-05-27 20:43:43 +01:00
NoticeAttachments ( ) ;
2009-06-25 22:01:07 +01:00
NoticeDataAttach ( ) ;
2009-11-11 20:37:17 +00:00
NoticeFavors ( ) ;
2009-01-23 02:43:18 +00:00
} ) ;
2009-11-11 20:37:17 +00:00
function addAjaxHidden ( ) {
var ajax = document . createElement ( 'input' ) ;
ajax . setAttribute ( 'type' , 'hidden' ) ;
ajax . setAttribute ( 'name' , 'ajax' ) ;
ajax . setAttribute ( 'value' , 1 ) ;
this . appendChild ( ajax ) ;
}
function NoticeFavors ( ) {
// XXX: refactor this code
var favoptions = { dataType : 'xml' ,
beforeSubmit : function ( data , target , options ) {
$ ( target ) . addClass ( 'processing' ) ;
return true ;
} ,
success : function ( xml ) { var new _form = document . _importNode ( $ ( 'form' , xml ) . get ( 0 ) , true ) ;
var dis = new _form . id ;
var fav = dis . replace ( 'disfavor' , 'favor' ) ;
$ ( 'form#' + fav ) . replaceWith ( new _form ) ;
$ ( 'form#' + dis ) . ajaxForm ( disoptions ) . each ( addAjaxHidden ) ;
}
} ;
var disoptions = { dataType : 'xml' ,
beforeSubmit : function ( data , target , options ) {
$ ( target ) . addClass ( 'processing' ) ;
return true ;
} ,
success : function ( xml ) { var new _form = document . _importNode ( $ ( 'form' , xml ) . get ( 0 ) , true ) ;
var fav = new _form . id ;
var dis = fav . replace ( 'favor' , 'disfavor' ) ;
$ ( 'form#' + dis ) . replaceWith ( new _form ) ;
$ ( 'form#' + fav ) . ajaxForm ( favoptions ) . each ( addAjaxHidden ) ;
}
} ;
$ ( "form.form_favor" ) . ajaxForm ( favoptions ) ;
$ ( "form.form_disfavor" ) . ajaxForm ( disoptions ) ;
$ ( "form.form_favor" ) . each ( addAjaxHidden ) ;
$ ( "form.form_disfavor" ) . each ( addAjaxHidden ) ;
}
2009-01-23 02:49:48 +00:00
function NoticeReply ( ) {
2009-06-18 02:10:48 +01:00
if ( $ ( '#notice_data-text' ) . length > 0 && $ ( '#content .notice_reply' ) . length > 0 ) {
2009-01-28 15:25:50 +00:00
$ ( '#content .notice' ) . each ( function ( ) {
2009-05-22 17:19:14 +01:00
var notice = $ ( this ) [ 0 ] ;
$ ( $ ( '.notice_reply' , notice ) [ 0 ] ) . click ( function ( ) {
2009-08-04 16:54:02 +01:00
var nickname = ( $ ( '.author .nickname' , notice ) . length > 0 ) ? $ ( $ ( '.author .nickname' , notice ) [ 0 ] ) : $ ( '.author .nickname.uid' ) ;
2009-05-22 17:19:14 +01:00
NoticeReplySet ( nickname . text ( ) , $ ( $ ( '.notice_id' , notice ) [ 0 ] ) . text ( ) ) ;
2009-01-28 15:25:50 +00:00
return false ;
} ) ;
2009-01-23 02:49:48 +00:00
} ) ;
2009-01-28 15:25:50 +00:00
}
2009-01-23 02:49:48 +00:00
}
function NoticeReplySet ( nick , id ) {
2008-11-15 03:35:49 +00:00
rgx _username = /^[0-9a-zA-Z\-_.]*$/ ;
if ( nick . match ( rgx _username ) ) {
2009-08-04 09:22:37 +01:00
var text = $ ( "#notice_data-text" ) ;
if ( text . length ) {
2009-08-08 11:44:28 +01:00
replyto = "@" + nick + " " ;
text . val ( replyto + text . val ( ) . replace ( RegExp ( replyto , 'i' ) , '' ) ) ;
2009-01-17 03:03:53 +00:00
$ ( "#form_notice input#notice_in-reply-to" ) . val ( id ) ;
2009-08-04 09:22:37 +01:00
if ( text . get ( 0 ) . setSelectionRange ) {
var len = text . val ( ) . length ;
text . get ( 0 ) . setSelectionRange ( len , len ) ;
text . get ( 0 ) . focus ( ) ;
}
2008-11-15 03:35:49 +00:00
return false ;
}
}
return true ;
2008-11-17 17:31:44 +00:00
}
2009-05-27 20:43:43 +01:00
function NoticeAttachments ( ) {
$ . fn . jOverlay . options = {
method : 'GET' ,
data : '' ,
url : '' ,
color : '#000' ,
opacity : '0.6' ,
2009-05-30 20:42:15 +01:00
zIndex : 99 ,
2009-07-01 21:57:21 +01:00
center : false ,
2009-05-27 20:43:43 +01:00
imgLoading : $ ( 'address .url' ) [ 0 ] . href + 'theme/base/images/illustrations/illu_progress_loading-01.gif' ,
bgClickToClose : true ,
success : function ( ) {
$ ( '#jOverlayContent' ) . append ( '<button>×</button>' ) ;
$ ( '#jOverlayContent button' ) . click ( $ . closeOverlay ) ;
} ,
2009-06-30 04:05:45 +01:00
timeout : 0 ,
autoHide : true ,
2009-07-15 20:53:24 +01:00
css : { 'max-width' : '542px' , 'top' : '5%' , 'left' : '32.5%' }
2009-05-27 20:43:43 +01:00
} ;
2009-06-25 04:46:52 +01:00
$ ( '#content .notice a.attachment' ) . click ( function ( ) {
2009-07-01 18:43:36 +01:00
$ ( ) . jOverlay ( { url : $ ( 'address .url' ) [ 0 ] . href + 'attachment/' + ( $ ( this ) . attr ( 'id' ) . substring ( 'attachment' . length + 1 ) ) + '/ajax' } ) ;
2009-05-27 20:43:43 +01:00
return false ;
} ) ;
2009-07-01 18:43:36 +01:00
2009-05-29 00:16:25 +01:00
var t ;
2009-06-25 04:46:52 +01:00
$ ( "body:not(#shownotice) #content .notice a.thumbnail" ) . hover (
2009-05-27 20:43:43 +01:00
function ( ) {
var anchor = $ ( this ) ;
2009-05-28 23:59:22 +01:00
$ ( "a.thumbnail" ) . children ( 'img' ) . hide ( ) ;
2009-05-27 20:43:43 +01:00
anchor . closest ( ".entry-title" ) . addClass ( 'ov' ) ;
2009-05-28 23:59:22 +01:00
if ( anchor . children ( 'img' ) . length == 0 ) {
2009-05-29 00:16:25 +01:00
t = setTimeout ( function ( ) {
2009-07-02 00:18:35 +01:00
$ . get ( $ ( 'address .url' ) [ 0 ] . href + 'attachment/' + ( anchor . attr ( 'id' ) . substring ( 'attachment' . length + 1 ) ) + '/thumbnail' , null , function ( data ) {
2009-05-28 23:59:22 +01:00
anchor . append ( data ) ;
} ) ;
} , 500 ) ;
}
else {
anchor . children ( 'img' ) . show ( ) ;
}
2009-05-27 20:43:43 +01:00
} ,
function ( ) {
2009-05-29 00:16:25 +01:00
clearTimeout ( t ) ;
2009-05-28 23:59:22 +01:00
$ ( "a.thumbnail" ) . children ( 'img' ) . hide ( ) ;
2009-05-27 20:43:43 +01:00
$ ( this ) . closest ( ".entry-title" ) . removeClass ( 'ov' ) ;
}
) ;
2009-06-18 02:04:12 +01:00
}
2009-06-25 17:55:19 +01:00
2009-06-25 22:01:07 +01:00
function NoticeDataAttach ( ) {
NDA = $ ( '#notice_data-attach' ) ;
NDA . change ( function ( ) {
S = '<div id="notice_data-attach_selected" class="success"><code>' + $ ( this ) . val ( ) + '</code> <button>×</button></div>' ;
2009-06-25 17:55:19 +01:00
NDAS = $ ( '#notice_data-attach_selected' ) ;
( NDAS . length > 0 ) ? NDAS . replaceWith ( S ) : $ ( '#form_notice' ) . append ( S ) ;
2009-06-25 22:01:07 +01:00
$ ( '#notice_data-attach_selected button' ) . click ( function ( ) {
$ ( '#notice_data-attach_selected' ) . remove ( ) ;
NDA . val ( '' ) ;
} ) ;
2009-06-25 17:55:19 +01:00
} ) ;
}