240 lines
5.0 KiB
JavaScript
240 lines
5.0 KiB
JavaScript
/* globals tinyMCE */
|
|
addReply = {
|
|
|
|
/**
|
|
* Move the reply form when "Reply" is clicked.
|
|
*
|
|
* @since 2.6.2
|
|
* @param {string} replyId
|
|
* @param {string} parentId
|
|
* @param {string} respondId
|
|
* @param {string} postId
|
|
* @returns {undefined|Boolean}
|
|
*/
|
|
moveForm: function ( replyId, parentId, respondId, postId ) {
|
|
|
|
/* Get initial elements */
|
|
var t = this,
|
|
reply = t.getElement( replyId ),
|
|
respond = t.getElement( respondId ),
|
|
cancel = t.getElement( 'bbp-cancel-reply-to-link' ),
|
|
parent = t.getElement( 'bbp_reply_to' ),
|
|
post = t.getElement( 'bbp_topic_id' );
|
|
|
|
/* Remove the editor, if its already been moved */
|
|
t.removeEditor();
|
|
|
|
/* Allow click to go through */
|
|
if ( ! reply || ! respond || ! cancel || ! parent ) {
|
|
return;
|
|
}
|
|
|
|
t.respondId = respondId;
|
|
postId = postId || false;
|
|
|
|
/* Setup a temporary div for relocating back when clicking cancel */
|
|
if ( ! t.getElement( 'bbp-temp-form-div' ) ) {
|
|
var div = document.createElement( 'div' );
|
|
|
|
div.id = 'bbp-temp-form-div';
|
|
div.style.display = 'none';
|
|
|
|
respond.parentNode.appendChild( div );
|
|
}
|
|
|
|
/* Relocate the element */
|
|
reply.parentNode.appendChild( respond );
|
|
|
|
if ( post && postId ) {
|
|
post.value = postId;
|
|
}
|
|
|
|
parent.value = parentId;
|
|
cancel.style.display = '';
|
|
|
|
/* Add the editor where it now belongs */
|
|
t.addEditor();
|
|
|
|
/**
|
|
* When cancelling a Reply.
|
|
*
|
|
* @since 2.6.2
|
|
* @returns {void}
|
|
*/
|
|
cancel.onclick = function () {
|
|
t.cancelForm( this );
|
|
};
|
|
|
|
t.scrollToForm();
|
|
|
|
/* Prevent click from going through */
|
|
return false;
|
|
},
|
|
|
|
/**
|
|
* Cancel the reply form.
|
|
*
|
|
* @since 2.6.6
|
|
* @returns {void}
|
|
*/
|
|
cancelForm: function () {
|
|
var r = addReply,
|
|
temp = r.getElement( 'bbp-temp-form-div' ),
|
|
cancel = r.getElement( 'bbp-cancel-reply-to-link' ),
|
|
respond = r.getElement( r.respondId );
|
|
|
|
r.removeEditor();
|
|
|
|
/* Allow click to go through */
|
|
if ( ! temp || ! respond ) {
|
|
return;
|
|
}
|
|
|
|
r.getElement( 'bbp_reply_to' ).value = '0';
|
|
|
|
temp.parentNode.insertBefore( respond, temp );
|
|
temp.parentNode.removeChild( temp );
|
|
|
|
cancel.style.display = 'none';
|
|
cancel.onclick = null;
|
|
|
|
r.addEditor();
|
|
r.scrollToForm();
|
|
|
|
/* Prevent click from going through */
|
|
return false;
|
|
},
|
|
|
|
/**
|
|
* Scrolls to the top of the page.
|
|
*
|
|
* @since 2.6.2
|
|
* @return {void}
|
|
*/
|
|
scrollToForm: function() {
|
|
|
|
/* Get initial variables to start computing boundaries */
|
|
var t = this,
|
|
form = t.getElement( 'new-post' ),
|
|
elemRect = form.getBoundingClientRect(),
|
|
position = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0),
|
|
destination = ( position + elemRect.top ),
|
|
negative = ( destination < position ), // jshint ignore:line
|
|
adminbar = t.getElement( 'wpadminbar'),
|
|
offset = 0;
|
|
|
|
/* Offset by the adminbar */
|
|
if ( adminbar && ( typeof ( adminbar ) !== 'undefined' ) ) {
|
|
offset = adminbar.scrollHeight;
|
|
}
|
|
|
|
/* Compute the difference, depending on direction */
|
|
/* jshint ignore:start */
|
|
distance = ( true === negative )
|
|
? ( position - destination )
|
|
: ( destination - position );
|
|
|
|
/* Do some math to compute the animation steps */
|
|
var vast = ( distance > 800 ),
|
|
speed_step = vast ? 30 : 20,
|
|
speed = Math.min( 12, Math.round( distance / speed_step ) ),
|
|
step = Math.round( distance / speed_step ),
|
|
steps = [],
|
|
timer = 0;
|
|
|
|
/* Scroll up */
|
|
if ( true === negative ) {
|
|
while ( position > destination ) {
|
|
position -= step;
|
|
|
|
if ( position < destination ) {
|
|
position = destination;
|
|
}
|
|
|
|
steps.push( position - offset );
|
|
|
|
setTimeout( function() {
|
|
window.scrollTo( 0, steps.shift() );
|
|
}, timer * speed );
|
|
|
|
timer++;
|
|
}
|
|
|
|
/* Scroll down */
|
|
} else {
|
|
while ( position < destination ) {
|
|
position += step;
|
|
|
|
if ( position > destination ) {
|
|
position = destination;
|
|
}
|
|
|
|
steps.push( position - offset );
|
|
|
|
setTimeout( function() {
|
|
window.scrollTo( 0, steps.shift() );
|
|
}, timer * speed );
|
|
|
|
timer++;
|
|
}
|
|
}
|
|
/* jshint ignore:end */
|
|
},
|
|
|
|
/**
|
|
* Get an element by ID
|
|
*
|
|
* @since 2.6.2
|
|
* @param {string} e
|
|
* @returns {HTMLElement} Element
|
|
*/
|
|
getElement: function (e) {
|
|
return document.getElementById(e);
|
|
},
|
|
|
|
/**
|
|
* Remove the Editor
|
|
*
|
|
* @since 2.6.2
|
|
* @returns {void}
|
|
*/
|
|
removeEditor: function () {
|
|
|
|
/* Bail to avoid error */
|
|
if ( typeof ( tinyMCE ) === 'undefined' ) {
|
|
return;
|
|
}
|
|
|
|
var tmce = tinyMCE.get( 'bbp_reply_content' );
|
|
|
|
if ( tmce && ! tmce.isHidden() ) {
|
|
this.mode = 'tmce';
|
|
tmce.remove();
|
|
|
|
} else {
|
|
this.mode = 'html';
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Add the Editor
|
|
*
|
|
* @since 2.6.2
|
|
* @returns {void}
|
|
*/
|
|
addEditor: function () {
|
|
|
|
/* Bail to avoid error */
|
|
if ( typeof ( tinyMCE ) === 'undefined' ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'tmce' === this.mode ) {
|
|
switchEditors.go( 'bbp_reply_content', 'tmce' );
|
|
|
|
} else if ( 'html' === this.mode ) {
|
|
switchEditors.go( 'bbp_reply_content', 'html' );
|
|
}
|
|
}
|
|
};
|