/* globals tinyMCE */
addReply = {

	/**
	 * Move the reply form when "Reply" is clicked on threaded replies
	 *
	 * @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();

		/* Bail to avoid errors */
		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 () {
			var r       = addReply,
				temp    = r.getElement( 'bbp-temp-form-div' ),
				respond = r.getElement( r.respondId );

			r.removeEditor();

			if ( ! temp || ! respond ) {
				return;
			}

			r.getElement( 'bbp_reply_to' ).value = '0';

			temp.parentNode.insertBefore( respond, temp );
			temp.parentNode.removeChild( temp );

			this.style.display = 'none';
			this.onclick       = null;

			r.addEditor();
		};

		t.scrollToForm();

		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 */
		// in 2.6.4 this reads if ( typeof ( adminbar ) !== 'undefined' ) amended in next line{  
		if  ( adminbar )  {
			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' );
		}
	}
};
