521 lines
13 KiB
JavaScript
521 lines
13 KiB
JavaScript
/************************************************/
|
|
/* IPB3 Javascript */
|
|
/* -------------------------------------------- */
|
|
/* ips.topic.js - Topic view code */
|
|
/* (c) IPS, Inc 2008 */
|
|
/* -------------------------------------------- */
|
|
/* Author: Rikki Tissier */
|
|
/************************************************/
|
|
|
|
var _comments = window.IPBoard;
|
|
|
|
_comments.prototype.idmcomments = {
|
|
totalChecked: 0,
|
|
postcache: [],
|
|
|
|
init: function()
|
|
{
|
|
Debug.write("Initializing ips.idmcomments.js");
|
|
|
|
document.observe("dom:loaded", function(){
|
|
$$('.multiquote', '.delete_post', '.edit_post', '.toggle_post').each( function(elem){
|
|
if( elem.hasClassName('multiquote') ){
|
|
elem.observe('click', ipb.idmcomments.toggleMultimod);
|
|
}
|
|
if( elem.hasClassName('delete_post') ){
|
|
elem.observe('click', ipb.idmcomments.confirmSingleDelete);
|
|
}
|
|
if( elem.hasClassName('edit_post') ){
|
|
elem.observe('click', ipb.idmcomments.ajaxEditShow);
|
|
}
|
|
if( elem.hasClassName('toggle_post') ){
|
|
elem.observe('click', ipb.idmcomments.ajaxTogglePostApprove);
|
|
}
|
|
});
|
|
|
|
// Resize images
|
|
$$('.post').each( function(elem){
|
|
ipb.global.findImgs( $( elem ) );
|
|
});
|
|
|
|
// Open rel='external' in a new window
|
|
$$('a[rel~="external"]').each( function(elem){
|
|
elem.observe('click', ipb.global.openNewWindow );
|
|
});
|
|
|
|
// Checkboxes
|
|
ipb.idmcomments.preCheckPosts();
|
|
|
|
$$('input.post_mod').each( function(elem){
|
|
elem.observe('click', ipb.idmcomments.checkPost );
|
|
});
|
|
|
|
$$('a[rel="bookmark"]').each( function(elem){
|
|
elem.observe('click', ipb.idmcomments.showLinkToTopic );
|
|
});
|
|
});
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Event handler for moderating posts
|
|
*
|
|
* @param {event} e The event
|
|
*/
|
|
submitPostModeration: function(e)
|
|
{
|
|
if( $F('idmact') == 'delete' ){
|
|
if( !confirm( ipb.lang['delete_confirm'] ) ){
|
|
Event.stop(e);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* MATT
|
|
* Toggle post approval thingy majigy
|
|
*/
|
|
ajaxTogglePostApprove: function(e)
|
|
{
|
|
Event.stop(e);
|
|
var elem = Event.element(e);
|
|
var postid = elem.id.replace( new RegExp( /toggle(text)?_post_/ ), '' );
|
|
if( !postid ){ return; }
|
|
|
|
var toApprove = ( $('comment_id_' + postid).hasClassName( 'moderated' ) ) ? 1 : 0;
|
|
|
|
var url = ipb.vars['base_url'] + 'app=downloads&module=post§ion=comments&do=appcomment&xml=1&cid=' + postid + '&approve=' + toApprove;
|
|
|
|
new Ajax.Request( url,
|
|
{
|
|
method: 'post',
|
|
evalJSON: 'force',
|
|
parameters: {
|
|
secure_key: ipb.vars['secure_hash']
|
|
},
|
|
onSuccess: function(t)
|
|
{
|
|
if( t.responseJSON['error'] )
|
|
{
|
|
switch( t.responseJSON['error'] )
|
|
{
|
|
case 'nofile':
|
|
alert( ipb.lang['idm_invalid_file'] );
|
|
break;
|
|
case 'nopermission':
|
|
alert( ipb.lang['no_permission'] );
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( toApprove )
|
|
{
|
|
$('comment_id_' + postid).removeClassName( 'moderated' );
|
|
$('toggletext_post_' + postid).update( "Unapprove" );
|
|
}
|
|
else
|
|
{
|
|
$('comment_id_' + postid).addClassName( 'moderated' );
|
|
$('toggletext_post_' + postid).update( "Approve" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
},
|
|
/* END MATT */
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Shows the quick ajax edit box
|
|
*
|
|
* @var {event} e The event
|
|
*/
|
|
ajaxEditShow: function(e)
|
|
{
|
|
// If user is holding ctrl or command, just submit since they
|
|
// want to open a new tab (requested by Luke)
|
|
if( e.ctrlKey == true || e.metaKey == true || e.keyCode == 91 )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Event.stop(e);
|
|
var edit = [];
|
|
|
|
edit['button'] = ( !Event.element(e).hasClassName('post_edit') ) ? Event.element(e).up('.post_edit') : Event.element(e);
|
|
if( !edit['button'] ){ return; }
|
|
|
|
edit['cid'] = edit['button'].id.replace('edit_post_', '');
|
|
edit['post'] = $( 'comment_id_' + edit['cid'] ).down('.post');
|
|
|
|
// Find post content
|
|
ipb.idmcomments.postcache[ edit['cid'] ] = edit['post'].innerHTML;
|
|
|
|
url = ipb.vars['base_url'] + 'app=downloads&module=ajax§ion=comments&do=commentEdit&cid=' + edit['cid'] + '&secure_key=' + ipb.vars['secure_hash'];
|
|
|
|
// DO TEH AJAX LOL
|
|
new Ajax.Request( url,
|
|
{
|
|
method: 'post',
|
|
onSuccess: function(t)
|
|
{
|
|
if( t.responseText == 'nopermission' )
|
|
{
|
|
alert( ipb.lang['no_permission'] );
|
|
return;
|
|
}
|
|
if( t.responseText == 'error' )
|
|
{
|
|
alert( ipb.lang['action_failed'] );
|
|
return;
|
|
}
|
|
|
|
// Put it in
|
|
edit['post'].update( t.responseText );
|
|
new Effect.ScrollTo( edit['post'], { offset: -50 } );
|
|
|
|
// Init the editor SKINNOTE: this needs to respect user preference
|
|
ipb.editors[ edit['cid'] ] = new ipb.editor( edit['cid'], USE_RTE );
|
|
|
|
// Set up events
|
|
if( $('edit_save_' + edit['cid'] ) ){
|
|
$('edit_save_' + edit['cid'] ).observe('click', ipb.idmcomments.ajaxEditSave );
|
|
}
|
|
if( $('edit_switch_' + edit['cid'] ) ){
|
|
$('edit_switch_' + edit['cid'] ).observe('click', ipb.idmcomments.ajaxEditSwitch );
|
|
}
|
|
if( $('edit_cancel_' + edit['cid'] ) ){
|
|
$('edit_cancel_' + edit['cid'] ).observe('click', ipb.idmcomments.ajaxEditCancel );
|
|
}
|
|
}
|
|
}
|
|
);
|
|
|
|
Debug.write( url );
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Switches from quick edit to full editor
|
|
*/
|
|
ajaxEditSwitch: function(e)
|
|
{
|
|
// Because all posts on a topic page are wrapped in a form tag for moderation
|
|
// purposes, to switch editor we have to perform a bit of trickery by building
|
|
// a new form at the bottom of the page, filling it with the right values,
|
|
// and submitting it.
|
|
|
|
Event.stop(e);
|
|
var elem = Event.element(e);
|
|
var postid = elem.id.replace('edit_switch_', '');
|
|
if( !postid ){ return; }
|
|
var url = ipb.vars['base_url'] + 'app=downloads&module=post§ion=comments&do=fulledit&cid=' + postid + '&st=' + ipb.idmcomments.start_id + '&_from=quickedit';
|
|
|
|
try {
|
|
// Need to update for submit manually in this case
|
|
ipb.editors[ postid ].update_for_form_submit();
|
|
var Post = $F( postid + '_textarea' );
|
|
} catch(err) {
|
|
Debug.error( err );
|
|
return;
|
|
}
|
|
|
|
form = new Element('form', { action: url, method: 'post' } );
|
|
textarea = new Element('textarea', { name: 'Post' } );
|
|
md5check = new Element('input', { type: 'hidden', name: 'auth_key', value: ipb.vars['secure_hash'] } );
|
|
textarea.innerHTML = Post.replace( /&/g, '&' );
|
|
|
|
form.insert( md5check ).insert( textarea ).hide();
|
|
$$('body')[0].insert( form );
|
|
|
|
form.submit();
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Saves the contents of quick edit
|
|
*/
|
|
ajaxEditSave: function(e)
|
|
{
|
|
Event.stop(e);
|
|
var elem = Event.element(e);
|
|
var postid = elem.id.replace('edit_save_', '');
|
|
if( !postid ){ return; }
|
|
|
|
try {
|
|
// Need to update for submit manually in this case
|
|
ipb.editors[ postid ].update_for_form_submit();
|
|
var Post = $F( postid + '_textarea' );
|
|
} catch(err) {
|
|
Debug.error( err );
|
|
Debug.dir( ipb.editors );
|
|
return;
|
|
}
|
|
|
|
if( Post.blank() )
|
|
{
|
|
alert( ipb.lang['idm_comment_empty'] );
|
|
return;
|
|
}
|
|
|
|
var url = ipb.vars['base_url'] + 'app=downloads&module=ajax§ion=comments&do=commentEditSave&cid=' + postid;
|
|
|
|
new Ajax.Request( url,
|
|
{
|
|
method: 'post',
|
|
evalJSON: 'force',
|
|
encoding: ipb.vars['charset'],
|
|
parameters: {
|
|
secure_key: ipb.vars['secure_hash'],
|
|
Post: Post.encodeParam()
|
|
},
|
|
onSuccess: function(t)
|
|
{
|
|
if( t.responseJSON['error'] )
|
|
{
|
|
if( $('error_msg_' + postid) )
|
|
{
|
|
$('error_msg_' + postid).update( t.responseJSON['error'] );
|
|
new Effect.BlindDown( $('error_msg_' + postid), { duration: 0.4 } );
|
|
}
|
|
else
|
|
{
|
|
alert( t.responseJSON['error'] );
|
|
}
|
|
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
// Update post; SKINNOTE: need to fix linked image sizes
|
|
// SKINNOTE: also need to reapply "code" javascript
|
|
$('comment_id_' + postid).down('.post').update( t.responseJSON['successString'] );
|
|
|
|
ipb.global.findImgs( $( 'comment_id_' + postid ) );
|
|
}
|
|
}
|
|
}
|
|
);
|
|
},
|
|
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Cancel the quick edit
|
|
*
|
|
* @var {event} e The event
|
|
*/
|
|
ajaxEditCancel: function(e)
|
|
{
|
|
Event.stop(e);
|
|
var elem = Event.element(e);
|
|
var postid = elem.id.replace('edit_cancel_', '');
|
|
if( !postid ){ return; }
|
|
|
|
if( ipb.idmcomments.postcache[ postid ] ){
|
|
$('comment_id_' + postid).down('.post').update( ipb.idmcomments.postcache[ postid ] );
|
|
ipb.editors[ postid ] = null;
|
|
}
|
|
|
|
return;
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Reads the cookie and checks posts as necessary
|
|
*/
|
|
preCheckPosts: function()
|
|
{
|
|
// Get the cookie
|
|
cookie = ipb.Cookie.get('idmmodpids');
|
|
if( cookie == null ){ return; }
|
|
pids = cookie.split(',');
|
|
|
|
if( pids )
|
|
{
|
|
pids.each( function(pid){
|
|
if( !pid.blank() && $('checkbox_' + pid) )
|
|
{
|
|
$('checkbox_' + pid).checked = true;
|
|
ipb.idmcomments.totalChecked++;
|
|
}
|
|
});
|
|
}
|
|
|
|
ipb.idmcomments.updatePostModButton();
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Checks a post
|
|
*
|
|
* @var {event} e The event
|
|
*/
|
|
checkPost: function(e)
|
|
{
|
|
check = Event.findElement(e, 'input');
|
|
remove = $A();
|
|
cookie = ipb.Cookie.get('idmmodpids');
|
|
|
|
if( cookie != null ){
|
|
pids = cookie.split(',') || $A();
|
|
} else {
|
|
pids = $A();
|
|
}
|
|
|
|
if( check.checked == true )
|
|
{
|
|
pids.push( check.id.replace('checkbox_', '') );
|
|
ipb.idmcomments.totalChecked++;
|
|
}
|
|
else
|
|
{
|
|
remove.push( check.id.replace('checkbox_', '') );
|
|
ipb.idmcomments.totalChecked--;
|
|
}
|
|
|
|
pids = pids.uniq().without( remove ).join(',');
|
|
ipb.Cookie.set('idmmodpids', pids, 0);
|
|
ipb.idmcomments.updatePostModButton();
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Updates the text on the moderation submit button
|
|
*/
|
|
updatePostModButton: function()
|
|
{
|
|
if( $('mod_submit') )
|
|
{
|
|
if( ipb.idmcomments.totalChecked == 0 ){
|
|
$('mod_submit').disabled = true;
|
|
} else {
|
|
$('mod_submit').disabled = false;
|
|
}
|
|
|
|
$('mod_submit').value = ipb.lang['with_selected'].replace('{num}', ipb.idmcomments.totalChecked);
|
|
}
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Shows a prompt allowing user to copy the URL
|
|
*
|
|
* @var {event} e The event
|
|
*/
|
|
showLinkToTopic: function(e)
|
|
{
|
|
if( $( Event.element(e) ).tagName != 'A' ){ return; }
|
|
_t = prompt( ipb.lang['copy_topic_link'], $( Event.element(e) ).readAttribute('href') );
|
|
Event.stop(e);
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Confirm they want to delete stuff
|
|
*
|
|
* @var {event} e The event
|
|
*/
|
|
confirmSingleDelete: function(e)
|
|
{
|
|
if( !confirm( ipb.lang['delete_confirm'] ) )
|
|
{
|
|
Event.stop(e);
|
|
}
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Toggles the multimod buttons in posts
|
|
*
|
|
* @var {event} e The event
|
|
*/
|
|
toggleMultimod: function(e)
|
|
{
|
|
Event.stop(e);
|
|
|
|
elem = Event.element(e);
|
|
if( !elem.hasClassName('multiquote') )
|
|
{
|
|
elem = $( Event.element(e) ).up('.multiquote');
|
|
}
|
|
|
|
// Get list of already quoted posts
|
|
try {
|
|
quoted = ipb.Cookie.get('idm_pids').split(',').compact();
|
|
} catch(err){
|
|
quoted = $A();
|
|
}
|
|
|
|
id = elem.id.replace('multiq_', '');
|
|
|
|
// Hokay, are we selecting/deselecting?
|
|
if( elem.hasClassName('selected') )
|
|
{
|
|
elem.removeClassName('selected');
|
|
quoted = quoted.uniq().without( id ).join(',');
|
|
}
|
|
else
|
|
{
|
|
elem.addClassName('selected');
|
|
quoted.push( id );
|
|
quoted = quoted.uniq().join(',');
|
|
}
|
|
|
|
// Save cookie
|
|
ipb.Cookie.set('idm_pids', quoted, 0);
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Sets the supplied post to hidden
|
|
*
|
|
* @var {int} id The ID of the post to hide
|
|
*/
|
|
setPostHidden: function(id)
|
|
{
|
|
if( $( 'comment_id_' + id ).select('.post_wrap')[0] )
|
|
{
|
|
$( 'comment_id_' + id ).select('.post_wrap')[0].hide();
|
|
|
|
if( $('unhide_post_' + id ) )
|
|
{
|
|
$('unhide_post_' + id).observe('click', ipb.idmcomments.showHiddenPost );
|
|
}
|
|
}
|
|
},
|
|
|
|
/* ------------------------------ */
|
|
/**
|
|
* Unhides the supplied post
|
|
*
|
|
* @var {event} e The link event
|
|
*/
|
|
showHiddenPost: function(e)
|
|
{
|
|
link = Event.findElement(e, 'a');
|
|
id = link.id.replace('unhide_post_', '');
|
|
|
|
if( $('comment_id_' + id ).select('.post_wrap')[0] )
|
|
{
|
|
elem = $('comment_id_' + id ).select('.post_wrap')[0];
|
|
new Effect.Parallel( [
|
|
new Effect.BlindDown( elem ),
|
|
new Effect.Appear( elem )
|
|
], { duration: 0.5 } );
|
|
}
|
|
|
|
if( $('comment_id_' + id ).select('.post_ignore')[0] )
|
|
{
|
|
elem = $('comment_id_' + id ).select('.post_ignore')[0];
|
|
/*new Effect.BlindUp( elem, {duration: 0.2} );*/
|
|
elem.hide();
|
|
}
|
|
|
|
Event.stop(e);
|
|
},
|
|
|
|
}
|
|
ipb.idmcomments.init(); |