Файл: public/js/ips.messenger.js
Строк: 608
<?php
/************************************************/
/* IPB3 Javascript */
/* -------------------------------------------- */
/* ips.messenger.js - Messenger code */
/* (c) IPS, Inc 2008 */
/* -------------------------------------------- */
/* Author: Rikki Tissier */
/************************************************/
var _msg = window.IPBoard;
_msg.prototype.messenger = {
folderTemplate: '',
inviteInit: false,
disabled: 0,
editShown: 0,
/*------------------------------*/
/* Constructor */
init: function()
{
Debug.write("Initializing ips.messenger.js");
document.observe("dom:loaded", function(){
ipb.messenger.initEvents();
});
},
/* ------------------------------ */
/**
* Initialize the events necessary for this module
*/
initEvents: function()
{
if( $('add_folder') )
{
$('add_folder').observe( 'click', ipb.messenger.addFolder );
}
if( $('edit_folders') )
{
$('edit_folders').observe( 'click', ipb.messenger.toggleEdit );
ipb.delegate.register('.f_empty', ipb.messenger.emptyFolder );
ipb.delegate.register('.f_delete', ipb.messenger.deleteFolder );
}
if( $('msg_checkall') )
{
$('msg_checkall').observe('click', ipb.messenger.checkAllMsgs );
}
ipb.delegate.register('.msg_check', ipb.messenger.checkSingleBox );
/*$$('.msg_check').each( function(checkbox){
$(checkbox).observe('click', ipb.messenger.checkSingleBox );
} );*/
if( $('folder_moderation') )
{
$('folder_moderation').observe('click', ipb.messenger.goMultiFile );
}
// Autocomplete stuff
ipb.messenger.acURL = ipb.vars['base_url'] + 'app=core&module=ajax§ion=findnames&do=get-member-names&secure_key=' + ipb.vars['secure_hash'] + '&name=';
if( $('entered_name') )
{
ipb.messenger.autoComplete = new ipb.Autocomplete( $('entered_name'), { multibox: false, url: ipb.messenger.acURL, templates: { wrap: ipb.templates['autocomplete_wrap'], item: ipb.templates['autocomplete_item'] } } );
}
if( $('more_members') ){
ipb.messenger.autoCompleteMore = new ipb.Autocomplete( $('more_members'), { multibox: true, url: ipb.messenger.acURL, templates: { wrap: ipb.templates['autocomplete_wrap'], item: ipb.templates['autocomplete_item'] } } );
}
if( $('add_participants') ){
$('add_participants').observe('click', ipb.messenger.loadInvites);
}
ipb.delegate.register('.email_convo', ipb.messenger.emailConversation);
// Delegate for delete post
ipb.delegate.register('.delete_post', ipb.messenger.deleteReply);
// Messenger disabled?
if ( ipb.messenger.disabled )
{
new ipb.Popup( 'pmdisabled', { type: 'modal',
initial: $('pmDisabled').innerHTML,
stem: true,
hideAtStart: false,
modal: true,
modalOpacity: 0.8,
hideClose: true,
w: '450px' });
}
},
/* ------------------------------ */
/**
* Empty a conversation
*
* @param {event} e The event
* @return {boolean}
*/
emailConversation: function(e, elem)
{
if( Object.isUndefined( elem ) ){ return; }
Event.stop(e);
// Get id
id = elem.id.replace( 'email_convo_', '' );
Debug.write( "Sending topic ID: " + id );
if( ! id )
{
return false;
}
// OK, empty
url = '&app=members&module=ajax&secure_key=' + ipb.vars['secure_hash'] + '§ion=messenger&do=archiveConversation&memberID='+ipb.vars['member_id']+'&topicID=' + id;
new Ajax.Request( ipb.vars['base_url'] + url,
{
method: 'post',
parameters: { method: 'all' },
evalJSON: 'force',
onSuccess: function(t)
{
if( Object.isUndefined( t.responseJSON ) )
{
alert( ipb.lang['error_occured'] );
return;
}
if ( t.responseJSON['error'] )
{
alert( t.responseJSON['error'] );
return;
}
if ( t.responseJSON['msg'] )
{
ipb.global.showInlineNotification( t.responseJSON['msg'].toString() );
}
}
}
);
return true;
},
/* ------------------------------ */
/**
* Shows the popup for adding more participants
*/
loadInvites: function(e)
{
Event.stop(e);
$('invite_more_default').hide();
$('invite_more_dialogue').setStyle( { display: 'block' });
if ( ! ipb.messenger.inviteInit )
{
$('invite_more_dialogue').innerHTML = $('invite_more_dialogue').innerHTML.gsub(/[x]/, ipb.messenger.nameText );
$('invite_more_cancel').observe( 'click', ipb.messenger.closeInvites );
ipb.messenger.autoCompleteInvite = new ipb.Autocomplete( $('invite_more_autocomplete'), { multibox: true, url: ipb.messenger.acURL, templates: { wrap: ipb.templates['autocomplete_wrap'], item: ipb.templates['autocomplete_item'] } } );
ipb.messenger.inviteInit = true;
}
},
/* ------------------------------ */
/**
* Closes invites
*/
closeInvites: function(e)
{
Event.stop(e);
$('invite_more_default').show();
$('invite_more_dialogue').hide();
},
/* ------------------------------ */
/**
* Checks all messages
*
* @param {event} e The event
*/
checkAllMsgs: function(e)
{
toCheck = $F('msg_checkall');
$$('.msg_check').each( function(elem){
if( toCheck != null )
{
elem.checked = true;
}
else
{
elem.checked = false;
}
});
},
/* ------------------------------ */
/**
* Monitors single checkbox and updates "check all" box appropriately
*
* @param {event} e The event
*/
checkSingleBox: function(e, elem)
{
var totalBoxes = 0;
var totalChecked = 0;
$$('.msg_check').each( function(checkbox){
totalBoxes++;
if( checkbox.checked == true )
{
totalChecked++;
}
} );
if( totalBoxes == totalChecked )
{
$('msg_checkall').checked = true;
}
else
{
$('msg_checkall').checked = false;
}
},
/* ------------------------------ */
/**
* Empty a folder
*
* @param {event} e The event
* @return {boolean}
*/
emptyFolder: function(e, elem)
{
if( Object.isUndefined( elem ) ){ return; }
Event.stop(e);
// Get folder id
//elem = Event.findElement( e, 'li');
id = elem.id.replace('f_', '');
id = elem.id.replace('empty_', '');
if( !confirm( ipb.lang['confirm_empty'] ) )
{
return false;
}
// OK, empty
url = '&app=members&module=ajax&secure_key=' + ipb.vars['secure_hash'] + '§ion=messenger&do=emptyFolder&memberID='+ipb.vars['member_id']+'&folderID=' + id;
new Ajax.Request( ipb.vars['base_url'] + url,
{
method: 'post',
parameters: { method: 'all' },
evalJSON: 'force',
onSuccess: function(t)
{
if( Object.isUndefined( t.responseJSON ) )
{
alert( ipb.lang['error_occured'] );
return;
}
if( t.responseJSON['error'] && t.responseJSON['error'] != 'nothingToRemove')
{
alert( t.responseJSON['error'] );
return;
}
// Reset count
if( $('f_' + id).select('.total')[0] )
{
$('f_' + id).select('.total')[0].update('0');
//new Effect.Highlight( $('f_' + id) );
ipb.global.showInlineNotification( ipb.lang['folder_emptied'] );
}
if( !Object.isUndefined( ipb.messenger.curFolder ) && ipb.messenger.curFolder == id )
{
window.refresh();
}
}
}
);
return true;
},
/* ------------------------------ */
/**
* Delete a folder
*
* @param {event} e The event
* @return {boolean}
*/
deleteFolder: function(e, elem)
{
if( Object.isUndefined( elem ) ){ return; }
//elem = Event.findElement( e, 'li' );
id = elem.id.replace('f_', '');
id = elem.id.replace('delete_', '');
if( elem.hasClassName('protected') )
{
alert( ipb.lang['cant_delete_folder'] );
return false;
}
if( !confirm( ipb.lang['confirm_delete'] ) )
{
return false;
}
// Remove it
url = '&app=members&module=ajax&secure_key=' + ipb.vars['secure_hash'] + '§ion=messenger&do=removeFolder&memberID='+ipb.vars['member_id']+'&folderID=' + id;
new Ajax.Request( ipb.vars['base_url'] + url,
{
method: 'post',
evalJSON: 'force',
onSuccess: function(t)
{
if( Object.isUndefined( t.responseJSON ) )
{
alert( ipb.lang['error_occured'] );
return;
}
if( t.responseJSON['error'] )
{
switch( t.responseJSON['error'] )
{
case 'cannotDeleteUndeletable':
alert( ipb.lang['cant_delete_folder'] );
break;
default:
alert( t.responseJSON['error'] );
break;
}
}
new Effect.BlindUp( $('f_' + id ), {duration: 0.3, afterFinish: function(elem){
$('f_' + id).remove();
} } );
if( !Object.isUndefined( ipb.messenger.curFolder ) && ipb.messenger.curFolder == id )
{
window.refresh();
}
}
}
);
return true;
},
/* ------------------------------ */
/**
* Toggles the edit folder options on/off
*
* @param {event} e The event
*/
toggleEdit: function(e)
{
if( ipb.messenger.editShown )
{
$('edit_folders').update( $('edit_folders').innerHTML.replace( /(.+?)> (.+?)</a>/i, "$1> " + ipb.lang['messenger_edit'] + "</a>" ) );
$('folder_list').select('.edit_folders').each( function(elem){
new Effect.Fade( elem, { duration: 0.4 } );
});
$('folder_list').select('.total').each( function(elem){
new Effect.Appear( elem, { duration: 0.4 } );
});
// Check for any folder renames
$('folder_list').select('a[rel="folder_name"]').each( function( elem ){
var parent = $( elem ).up('.folder');
if( !$( parent ) ){ return; }
if( $( parent ).hasClassName('protected') ){ return; }
if( $( $(parent).id + '_rename') ){
$( $(parent).id + '_rename').remove();
}
if( $( $(parent).id + '_save' ) ){
$( $(parent).id + '_save').remove();
}
$( elem ).show();
});
ipb.messenger.editShown = 0;
}
else
{
$('edit_folders').update( $('edit_folders').innerHTML.replace( /(.+?)> (.+?)</a>/i, "$1> " + ipb.lang['messenger_cancel'] + "</a>" ) );
$('folder_list').select('.total').each( function(elem){
new Effect.Fade( elem, { duration: 0.4 } );
});
$('folder_list').select('.edit_folders').each( function(elem){
new Effect.Appear( elem, { duration: 0.4 } );
});
// Set up folder renaming
$('folder_list').select('a[rel="folder_name"]').each( function( elem ){
var parent = $( elem ).up('.folder');
if( !$( parent ) ){ return; }
if( $( parent ).hasClassName('protected') ){ return; }
// Create new textbox
var textbox = new Element('input', { type: 'text', 'class': 'input_text', value: $( elem ).innerHTML, size: '10', id: $(parent).id + '_rename' });
var submit = new Element('input', { type: 'submit', 'class': 'input_submit add_folder', value: ipb.lang['save_folder'], id: $(parent).id + '_save'});
$( elem ).insert( { before: submit } );
$( submit ).insert( { before: textbox } );
$( elem ).hide();
$( submit ).observe( 'click', ipb.messenger.saveFolderName.bindAsEventListener( this, $( parent ).id ) );
$( textbox ).observe( 'keypress', ipb.messenger.checkNameSubmit.bindAsEventListener( this, $( parent ).id ) );
});
ipb.messenger.editShown = 1;
}
Event.stop(e);
},
checkNameSubmit: function(e, id)
{
if( e.which == Event.KEY_RETURN )
{
ipb.messenger.saveFolderName(e, id);
}
},
saveFolderName: function(e, id)
{
// find text box
if( !$( id + '_rename') ){ return; }
// Check for value
if( $F( id + '_rename' ).blank() ){
alert( ipb.lang['must_enter_name'] );
return;
}
var folderID = id.replace('f_', '');
var folderName = $F( id + '_rename' );
// Send
new Ajax.Request( ipb.vars['base_url'] + 'app=members&module=ajax§ion=messenger&do=renameFolder&secure_key=' + ipb.vars['secure_hash'] + '&folderID=' + folderID + '&memberID=' + ipb.vars['member_id'],
{
method: 'post',
parameters: {
name: folderName.encodeParam()
},
evalJSON: 'force',
onSuccess: function(t){
if( Object.isUndefined( t.responseJSON ) )
{
alert( ipb.lang['error_occured'] );
return;
}
if( t.responseJSON['error'] )
{
switch( t.responseJSON['error'] )
{
case 'noSuchFolder':
alert( ipb.lang['folder_not_found'] );
break;
case 'cannotDeleteUndeletable':
alert( ipb.lang['folder_protected'] );
break;
default:
alert( ipb.lang['error_occured'] + ": " + t.responseJSON['error'] );
break;
}
return;
}
// It was a success, so remove text boxes
$( id ).select('a[rel="folder_name"]')[0].update( t.responseJSON['name'] ).show();
if( $( id + '_rename' ) ){
$( id + '_rename' ).remove();
}
if( $( id + '_save' ) ){
$( id + '_save' ).remove();
}
}
}
);
},
/* ------------------------------ */
/**
* Shows the textbox for adding a folder
*
* @param {event} e The event
*/
addFolder: function(e)
{
Debug.write("Adding folder");
rand = Math.ceil( Math.random() * 10000 );
// Create text box
_textbox = new Element( 'input', { 'type': 'text', 'size': 16, 'class': 'input_text', 'id': 'fa_text_' + rand } );
_li = new Element( 'li', { 'class': 'new_folder', 'id': 'fa_li_' + rand } ).hide();
_submit = new Element( 'input', { 'type': 'submit', 'value': '+', 'class': 'input_submit add_folder', 'id': 'fa_submit_' + rand } );
_li.insert( _textbox ).insert( _submit );
$('folders').insert( _li );
// Add events
_textbox.observe('keypress', ipb.messenger.checkForAddSubmit).setStyle('width: 70%');
_submit.observe('click', ipb.messenger.doNewFolder);
new Effect.BlindDown( _li, { duration: 0.3 } );
Event.stop(e);
},
/* ------------------------------ */
/**
* Listens for an enter keypress in textbox
*
* @param {event} e The event
*/
checkForAddSubmit: function(e)
{
if( e.which == Event.KEY_RETURN )
{
ipb.messenger.doNewFolder(e);
}
},
/**
* Delete PM
*
* @param {event} e Event
* @param {int} tid The topic ID to delete
*/
deletePM: function ( e, tid )
{
Event.stop(e);
if ( confirm( ipb.lang['delete_pm_confirm'] ) !== true )
{
Event.stop(e);
return false;
}
window.location = ipb.vars['base_url'] + 'app=members&module=messaging§ion=view&do=deleteConversation&topicID=' + tid + '&authKey=' + ipb.vars['secure_hash'];
},
/* ------------------------------ */
/**
* Deletes a reply in a PM
*
* @param {event} e The event
* @param {element} elem The element in question
*/
deleteReply: function(e, elem)
{
if( ! confirm( ipb.lang['delete_reply_confirm'] ) )
{
Event.stop(e);
return false;
}
},
/**
* Go Multi File
* Processes many messages
*
* @param {event} e The event
*/
goMultiFile: function(e)
{
/* Confirm if we chose delete */
var method = $('pm_multifile').options[ $('pm_multifile').selectedIndex ].value;
if ( method == 'delete' )
{
if ( !confirm( ipb.lang['delete_pm_many_confirm'] ) )
{
Event.stop(e);
return false;
}
$('msgFolderForm').action += '&method=delete';
}
else if ( method == 'markread' )
{
$('msgFolderForm').action += '&method=markread';
}
else if ( method == 'markunread' )
{
$('msgFolderForm').action += '&method=markunread';
}
else if ( method == 'notifyon' )
{
$('msgFolderForm').action += '&method=notifyon';
}
else if ( method == 'notifyoff' )
{
$('msgFolderForm').action += '&method=notifyoff';
}
else
{
var id = method.replace( 'move_', '' );
$('msgFolderForm').action += '&method=move&folderID=' + id;
$('pm_multifile').options[ $('pm_multifile').selectedIndex ].value = 'move';
}
$('msgFolderForm').submit();
},
/* ------------------------------ */
/**
* Processes an add folder request
*
* @param {event} e The event
*/
doNewFolder: function(e)
{
elem = Event.findElement(e, 'li');
// Find ID
addID = elem.id.replace("fa_li_", '');
if( $F('fa_text_' + addID).blank() )
{
alert( ipb.lang['invalid_folder_name'] );
return;
}
new Ajax.Request( ipb.vars['base_url'] + '&app=members&module=ajax&secure_key=' + ipb.vars['secure_hash'] + '§ion=messenger&do=addFolder&memberID='+ ipb.vars['member_id'],
{ method: 'post',
parameters: { 'name' : $F('fa_text_' + addID).encodeParam() },
evalJSON: 'force',
onSuccess: function (t)
{
if( Object.isUndefined( t.responseJSON ) )
{
alert( ipb.lang['error_occured'] );
return;
}
if( t.responseJSON['error'] )
{
if( t.responseJSON['error'] == 'invalidName' )
{
alert( ipb.lang['invalid_folder_name'] );
}
else if( t.responseJSON['error'] == 'tooManyFolders' )
{
alert( ipb.lang['reached_max_folders'] );
}
else
{
alert( t.responseJSON['error'] );
}
return;
}
_temp = ipb.messenger.folderTemplate;
_temp = _temp.gsub(/[id]/, t.responseJSON['newID']);
_temp = _temp.gsub(/[name]/, $F('fa_text_' + addID).escapeHTML());
_temp = _temp.gsub(/[total]/, 0);
$('fa_li_' + addID).insert( { before: _temp } );
$('f_' + t.responseJSON['newID']).hide();
Effect.toggle( $('f_' + t.responseJSON['newID']), 'blind', {duration: 0.4});
Effect.toggle( $('fa_li_' + addID ), 'blind', {duration: 0.4} );
$('f_' + t.responseJSON['newID']).select('.f_empty')[0].observe('click', ipb.messenger.emptyFolder );
$('f_' + t.responseJSON['newID']).select('.f_delete')[0].observe('click', ipb.messenger.deleteFolder );
if( ipb.messenger.editShown ){
var elem = $('f_' + t.responseJSON['newID']).select("a[rel='folder_name']")[0];
var parent = $( elem ).up('.folder');
if( !$( parent ) ){ return; }
if( $( parent ).hasClassName('protected') ){ return; }
// Create new textbox
var textbox = new Element('input', { type: 'text', 'class': 'input_text', value: $( elem ).innerHTML, size: '10', id: $(parent).id + '_rename' });
var submit = new Element('input', { type: 'submit', 'class': 'input_submit add_folder', value: ipb.lang['save_folder'], id: $(parent).id + '_save'});
$(parent).select(".total")[0].hide();
$(parent).select(".edit_folders")[0].show();
$( elem ).insert( { before: submit } );
$( submit ).insert( { before: textbox } );
$( elem ).hide();
$( submit ).observe( 'click', ipb.messenger.saveFolderName.bindAsEventListener( this, $( parent ).id ) );
$( textbox ).observe( 'keypress', ipb.messenger.checkNameSubmit.bindAsEventListener( this, $( parent ).id ) );
}
}
}
);
}
};
ipb.messenger.init();
?>