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