/**
 * Inserts shortcodes into TinyMCE and QuickTag instances when the TinyMCE
 * modal's Insert or Cancel buttons are clicked.
 *
 * For QuickTags, sets up a Backbone modal to look similar to the TinyMCE
 * modal.
 *
 * @package WPZincDashboardWidget
 * @author WP Zinc
 */

/**
 * Handles the Insert and Cancel events on TinyMCE and QuickTag Modals
 *
 * @since   1.0.0
 */
jQuery( document ).ready(
	function ( $ ) {

		// Cancel.
		$( 'body' ).on(
			'click',
			'#wpzinc-tinymce-modal div.mce-cancel button, .wpzinc-backbone-modal .media-frame-toolbar .media-toolbar button.cancel',
			function ( e ) {

				// TinyMCE.
				if ( typeof tinyMCE !== 'undefined' && tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden() ) {
					tinymce.activeEditor.windowManager.close();
					return;
				}

				// Text Editor.
				wpZincModal.close();

				// Reset the non-TinyMCE modal content.
				// If we don't do this, switching from Text to Visual Editor for the same shortcode results
				// code picking up data from the QuickTags modal, not the TinyMCE one.
				if ( typeof wpZincModal !== 'undefined' ) {
					wpZincModal.content( new wpZincModalContent() );
				}

			}
		);

		// Insert.
		$( 'body' ).on(
			'click',
			'#wpzinc-tinymce-modal div.mce-insert button, .wpzinc-backbone-modal .media-frame-toolbar .media-toolbar button.insert',
			function ( e ) {

				// Prevent default action.
				e.preventDefault();

				// Get containing form.
				var form = $( 'form.wpzinc-tinymce-popup' );

				// Build Shortcode.
				var shortcode                = '[' + $( 'input[name="shortcode"]', $( form ) ).val(),
					shortcodeEnclosedContent = false;

				$( 'input, select, textarea', $( form ) ).each(
					function ( i ) {
						// Skip if no data-shortcode attribute.
						if ( typeof $( this ).data( 'shortcode' ) === 'undefined' ) {
							return true;
						}

						// Skip if the value is empty.
						if ( ! $( this ).val() ) {
							return true;
						}
						if ( $( this ).val().length == 0 ) {
							return true;
						}

						// Get shortcode attribute.
						var key = $( this ).data( 'shortcode' ),
						trim    = ( $( this ).data( 'trim' ) == '0' ? false : true ),
						val     = $( this ).val();

						// Skip if the shortcode is empty.
						if ( ! key.length ) {
							return true;
						}

						// If the shortcode attribute is within curly braces, the shortcode attribute
						// is the value of another field.
						if ( key.search( '}' ) > -1 && key.search( '{' ) > -1 ) {
							// Remove curly braces.
							key = key.replace(
								/{|}/gi,
								function ( x ) {
									return '';
								}
							);

							// Get value of input/select, which will form our attribute.
							key = $( key, $( this ).parent().parent() ).val();
						}

						// If a prepend is specified, prepend the key with it now.
						if ( typeof ( $( this ).data( 'shortcode-prepend' ) ) !== 'undefined' ) {
							key = $( this ).data( 'shortcode-prepend' ) + key;
						}

						// If the value is an array (i.e. from selectize), implode it now.
						if ( Array.isArray( val ) ) {
							val = val.join( ',' );
						}

						// Trim the value, unless the shortcode attribute disables string trimming.
						if ( trim ) {
							val = val.trim();
						}

						// Skip if the shortcode attribute will be enclosed in the shortcode content.
						if ( $( this ).data( 'enclose' ) == '1' ) {
							shortcodeEnclosedContent = val;
							return true;
						}

						// Append attribute and value to shortcode string.
						shortcode += ' ' + key.trim() + '="' + val + '"';
					}
				);

				// Close Shortcode.
				shortcode += ']';

				// If the shortcode includes enclosed content, append it now and close the shortcode.
				if ( shortcodeEnclosedContent ) {
					shortcode += shortcodeEnclosedContent + '[/' + $( 'input[name="shortcode"]', $( form ) ).val() + ']';
				}

				// Depending on the editor type, insert the shortcode.
				let editor_type = $( 'input[name="editor_type"]', $( form ) ).val();
				switch ( editor_type ) {
					case 'tinymce':
						// Sanity check that a Visual editor exists and is active.
						if ( typeof tinyMCE !== 'undefined' && tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden() ) {
							// Insert into editor.
							tinyMCE.activeEditor.execCommand( 'mceReplaceContent', false, shortcode );

							// Close modal.
							tinyMCE.activeEditor.windowManager.close();
						}
						break;

					case 'quicktags':
						// Insert into editor.
						QTags.insertContent( shortcode );

						// Close modal.
						wpZincModal.close();

						// Reset the modal content.
						// If we don't do this, switching from Text to Visual Editor for the same shortcode results
						// code picking up data from the QuickTags modal, not the TinyMCE one.
						if ( typeof wpZincModal !== 'undefined' ) {
							wpZincModal.content( new wpZincModalContent() );
						}
						break;

					default:
						// Insert into selector.
						$( editor_type ).val( shortcode );

						// Close modal.
						wpZincModal.close();

						// Reset the modal content.
						// If we don't do this, switching from Text to Visual Editor for the same shortcode results
						// code picking up data from the QuickTags modal, not the TinyMCE one.
						if ( typeof wpZincModal !== 'undefined' ) {
							wpZincModal.content( new wpZincModalContent() );
						}
						break;
				}

			}
		);

	}
);

// QuickTags: Setup Backbone Modal and Template.
if ( typeof wp !== 'undefined' && typeof wp.media !== 'undefined' ) {
	var wpZincModal        = new wp.media.view.Modal(
		{
			controller: { trigger: function () {} },
			className: 'wpzinc-backbone-modal'
		}
	);
	var wpZincModalContent = wp.Backbone.View.extend(
		{
			template: wp.template( 'wpzinc-modal' )
		}
	);
	wpZincModal.content( new wpZincModalContent() );
}
