import Smush from '../smush/smush';

const remove_element = function( el, timeout ) {
	if ( typeof timeout === 'undefined' ) {
		timeout = 100;
	}
	el.fadeTo( timeout, 0, function() {
		el.slideUp( timeout, function() {
			el.remove();
		} );
	} );
};

jQuery( function( $ ) {
	'use strict';

	/**
	 * Disable the action links *
	 *
	 * @param c_element
	 */
	const disable_links = function( c_element ) {
		const parent = c_element.parent();
		//reduce parent opacity
		parent.css( { opacity: '0.5' } );
		//Disable Links
		parent.find( 'a' ).attr( 'disabled', 'disabled' );
	};

	/**
	 * Enable the Action Links *
	 *
	 * @param c_element
	 */
	const enable_links = function( c_element ) {
		const parent = c_element.parent();

		//reduce parent opacity
		parent.css( { opacity: '1' } );
		//Disable Links
		parent.find( 'a' ).removeAttr( 'disabled' );
	};

	/**
	 * Restore image request with a specified action for Media Library / NextGen Gallery
	 *
	 * @param {Object} e
	 * @param {string} currentButton
	 * @param {string} smushAction
	 * @param {string} action
	 */
	const process_smush_action = function(
		e,
		currentButton,
		smushAction,
		action
	) {
		// If disabled.
		if ( 'disabled' === currentButton.attr( 'disabled' ) ) {
			return;
		}

		e.preventDefault();

		// Remove Error.
		$( '.wp-smush-error' ).remove();

		// Hide stats.
		$( '.smush-stats-wrapper' ).hide();

		let mode = 'grid';
		if ( 'smush_restore_image' === smushAction ) {
			if (
				$( document ).find( 'div.media-modal.wp-core-ui' ).length > 0
			) {
				mode = 'grid';
			} else {
				mode =
					window.location.search.indexOf( 'item' ) > -1
						? 'grid'
						: 'list';
			}
		}

		// Get the image ID and nonce.
		const params = {
			action: smushAction,
			attachment_id: currentButton.data( 'id' ),
			mode,
			_nonce: currentButton.data( 'nonce' ),
		};

		// Reduce the opacity of stats and disable the click.
		disable_links( currentButton );

		currentButton.html(
			'<span class="spinner wp-smush-progress">' +
				wp_smush_msgs[ action ] +
				'</span>'
		);

		// Restore the image.
		$.post( ajaxurl, params, function( r ) {
			// Reset all functionality.
			enable_links( currentButton );

			if ( r.success && 'undefined' !== typeof r.data ) {
				// Replace in immediate parent for NextGEN.
				if (
					'undefined' !== typeof this.data &&
					this.data.indexOf( 'nextgen' ) > -1
				) {
					// Show the smush button, and remove stats and restore option.
					currentButton
						.parents()
						.eq( 1 )
						.html( r.data.stats );
				} else if ( 'restore' === action ) {
					// Show the smush button, and remove stats and restore option.
					currentButton
						.parents()
						.eq( 1 )
						.html( r.data.stats );
				} else {
					currentButton
						.parents()
						.eq( 1 )
						.html( r.data );
				}

				if ( 'undefined' !== typeof r.data && 'restore' === action ) {
					Smush.updateImageStats( r.data.new_size );
				}
			} else if ( r.data.error_msg ) {
				// Show error.
				currentButton.parent().append( r.data.error_msg );
			}
		} );
	};

	/**
	 * Validates the Resize Width and Height against the Largest Thumbnail Width and Height
	 *
	 * @param wrapper_div jQuery object for the whole setting row wrapper div
	 * @param width_only Whether to validate only width
	 * @param height_only Validate only Height
	 * @return {boolean} All Good or not
	 */
	const validate_resize_settings = function(
		wrapper_div,
		width_only,
		height_only
	) {
		const resize_checkbox = wrapper_div.find(
			'#wp-smush-resize, #wp-smush-resize-quick-setup'
		);

		if ( ! height_only ) {
			var width_input = wrapper_div.find(
				'#wp-smush-resize_width, #quick-setup-resize_width'
			);
			var width_error_note = wrapper_div.find(
				'.sui-notice-info.wp-smush-update-width'
			);
		}
		if ( ! width_only ) {
			var height_input = wrapper_div.find(
				'#wp-smush-resize_height, #quick-setup-resize_height'
			);
			var height_error_note = wrapper_div.find(
				'.sui-notice-info.wp-smush-update-height'
			);
		}

		let width_error = false;
		let height_error = false;

		//If resize settings is not enabled, return true
		if ( ! resize_checkbox.is( ':checked' ) ) {
			return true;
		}

		//Check if we have localised width and height
		if (
			'undefined' === typeof wp_smushit_data.resize_sizes ||
			'undefined' === typeof wp_smushit_data.resize_sizes.width
		) {
			//Rely on server validation
			return true;
		}

		//Check for width
		if (
			! height_only &&
			'undefined' !== typeof width_input &&
			parseInt( wp_smushit_data.resize_sizes.width ) >
				parseInt( width_input.val() )
		) {
			width_input.parent().addClass( 'sui-form-field-error' );
			width_error_note.show( 'slow' );
			width_error = true;
		} else {
			//Remove error class
			width_input.parent().removeClass( 'sui-form-field-error' );
			width_error_note.hide();
			if ( height_input.hasClass( 'error' ) ) {
				height_error_note.show( 'slow' );
			}
		}

		//Check for height
		if (
			! width_only &&
			'undefined' !== typeof height_input &&
			parseInt( wp_smushit_data.resize_sizes.height ) >
				parseInt( height_input.val() )
		) {
			height_input.parent().addClass( 'sui-form-field-error' );
			//If we are not showing the width error already
			if ( ! width_error ) {
				height_error_note.show( 'slow' );
			}
			height_error = true;
		} else {
			//Remove error class
			height_input.parent().removeClass( 'sui-form-field-error' );
			height_error_note.hide();
			if ( width_input.hasClass( 'error' ) ) {
				width_error_note.show( 'slow' );
			}
		}

		if ( width_error || height_error ) {
			return false;
		}
		return true;
	};

	/**
	 * Update the progress bar width if we have images that needs to be resmushed
	 *
	 * @param unsmushed_count
	 * @return {boolean}
	 */
	const update_progress_bar_resmush = function( unsmushed_count ) {
		if ( 'undefined' === typeof unsmushed_count ) {
			return false;
		}

		const smushed_count = wp_smushit_data.count_total - unsmushed_count;

		//Update the Progress Bar Width
		// get the progress bar
		const $progress_bar = jQuery(
			'.bulk-smush-wrapper .wp-smush-progress-inner'
		);
		if ( $progress_bar.length < 1 ) {
			return;
		}

		const width = ( smushed_count / wp_smushit_data.count_total ) * 100;

		// increase progress
		$progress_bar.css( 'width', width + '%' );
	};

	const run_re_check = function( process_settings ) {
		const button = $( '.wp-smush-scan' );

		// Empty the button text and add loader class.
		button
			.text( '' )
			.addClass( 'sui-button-onload sui-icon-loader sui-loading' )
			.blur();

		// Check if type is set in data attributes.
		let scan_type = button.data( 'type' );
		scan_type = 'undefined' === typeof scan_type ? 'media' : scan_type;

		// Remove the Skip resmush attribute from button.
		$( '.wp-smush-all' ).removeAttr( 'data-smush' );

		// Remove notices.
		const notices = $( '.sui-notice-top.sui-notice-success' );
		notices.slideUp( 100, function() {
			notices.remove();
		} );

		// Disable Bulk smush button and itself.
		$( '.wp-smush-all' ).attr( 'disabled', 'disabled' );

		// Hide Settings changed Notice.
		$( '.wp-smush-settings-changed' ).hide();

		// Ajax params.
		const params = {
			action: 'scan_for_resmush',
			type: scan_type,
			get_ui: true,
			process_settings,
			wp_smush_options_nonce: jQuery( '#wp_smush_options_nonce' ).val(),
		};

		// Send ajax request and get ids if any.
		$.get( ajaxurl, params, function( r ) {
			// Check if we have the ids,  initialize the local variable.
			if ( 'undefined' !== typeof r.data ) {
				// Update Resmush id list.
				if ( 'undefined' !== typeof r.data.resmush_ids ) {
					wp_smushit_data.resmush = r.data.resmush_ids;

					// Update wp_smushit_data ( Smushed count, Smushed Percent, Image count, Super smush count, resize savings, conversion savings ).
					if ( 'undefined' !== typeof wp_smushit_data ) {
						wp_smushit_data.count_smushed =
							'undefined' !== typeof r.data.count_smushed
								? r.data.count_smushed
								: wp_smushit_data.count_smushed;
						wp_smushit_data.count_supersmushed =
							'undefined' !== typeof r.data.count_supersmushed
								? r.data.count_supersmushed
								: wp_smushit_data.count_supersmushed;
						wp_smushit_data.count_images =
							'undefined' !== typeof r.data.count_image
								? r.data.count_image
								: wp_smushit_data.count_images;
						wp_smushit_data.size_before =
							'undefined' !== typeof r.data.size_before
								? r.data.size_before
								: wp_smushit_data.size_before;
						wp_smushit_data.size_after =
							'undefined' !== typeof r.data.size_after
								? r.data.size_after
								: wp_smushit_data.size_after;
						wp_smushit_data.savings_resize =
							'undefined' !== typeof r.data.savings_resize
								? r.data.savings_resize
								: wp_smushit_data.savings_resize;
						wp_smushit_data.savings_conversion =
							'undefined' !== typeof r.data.savings_conversion
								? r.data.savings_conversion
								: wp_smushit_data.savings_conversion;
						wp_smushit_data.count_resize =
							'undefined' !== typeof r.data.count_resize
								? r.data.count_resize
								: wp_smushit_data.count_resize;
						wp_smushit_data.unsmushed =
							'undefined' !== typeof r.data.unsmushed
								? r.data.unsmushed
								: wp_smushit_data.unsmushed;
					}

					if ( 'nextgen' === scan_type ) {
						wp_smushit_data.bytes =
							parseInt( wp_smushit_data.size_before ) -
							parseInt( wp_smushit_data.size_after );
					}

					// Hide the Existing wrapper.
					const notices = $( '.bulk-smush-wrapper .sui-notice' );
					if ( notices.length > 0 ) {
						notices.addClass( 'sui-hidden' );
						$( '.wp-smush-pagespeed-recommendation' ).addClass( 'sui-hidden' );
					}
					// Remove existing Re-Smush notices.
					$( '.wp-smush-resmush-notice' ).remove();

					// Show Bulk wrapper.
					$( '.wp-smush-bulk-wrapper' ).removeClass( 'sui-hidden' );
				}
				// If content is received, Prepend it.
				if ( 'undefined' !== typeof r.data.content ) {
					$(
						'.bulk-smush-wrapper .sui-box-body > p:first-of-type'
					).after( r.data.content );
				}
				// If we have any notice to show.
				if ( 'undefined' !== typeof r.data.notice ) {
					let type = 'success';
					if ( 'undefined' !== typeof r.data.noticeType ) {
						type = r.data.noticeType;
					}
					window.SUI.openNotice(
						'wp-smush-ajax-notice',
						'<p>' + r.data.notice + '</p>',
						{ type, icon: 'check-tick' }
					);
				}
				// Hide errors.
				$( 'div.smush-final-log' ).hide();

				// Hide Super Smush notice if it's enabled in media settings.
				if (
					'undefined' !== typeof r.data.super_smush &&
					r.data.super_smush
				) {
					const enable_lossy = jQuery( '.wp-smush-enable-lossy' );
					if ( enable_lossy.length > 0 ) {
						enable_lossy.remove();
					}
					if ( 'undefined' !== r.data.super_smush_stats ) {
						$( '.super-smush-attachments .wp-smush-stats' ).html(
							r.data.super_smush_stats
						);
					}
				}
				Smush.updateStats( scan_type );

				const remainingCount = r.data.count || 0;
				Smush.updateRemainingCount( remainingCount );
				updateDisplayedContentAfterReCheck( remainingCount );
			}
		} ).always( function() {
			// Hide the progress bar.
			jQuery(
				'.bulk-smush-wrapper .wp-smush-bulk-progress-bar-wrapper'
			).addClass( 'sui-hidden' );

			// Add check complete status to button.
			button
				.text( wp_smush_msgs.resmush_complete )
				.removeClass( 'sui-button-onload sui-icon-loader sui-loading' )
				.addClass( 'smush-button-check-success' );

			// Remove success message from button.
			setTimeout( function() {
				button
					.removeClass( 'smush-button-check-success' )
					.html(
						'<i class="sui-icon-update" aria-hidden="true"></i>' +
							wp_smush_msgs.resmush_check
					);
			}, 2000 );

			$( '.wp-smush-all' ).removeAttr( 'disabled' );
		} );
	};

	const updateDisplayedContentAfterReCheck = function( count ) {
		const $pendingImagesWrappers = jQuery(
			'.bulk-smush-wrapper .wp-smush-bulk-wrapper, .bulk-smush-wrapper .wp-smush-unsmushed-images-notice'
		);
		const $allDoneWrappers = jQuery(
			'.bulk-smush-wrapper .wp-smush-all-done, .bulk-smush-wrapper .wp-smush-pagespeed-recommendation'
		);

		if ( $pendingImagesWrappers.length && $allDoneWrappers.length ) {
			if ( count === 0 ) {
				$pendingImagesWrappers.addClass( 'sui-hidden' );
				$allDoneWrappers.removeClass( 'sui-hidden' );
			} else {
				$pendingImagesWrappers.removeClass( 'sui-hidden' );
				$allDoneWrappers.addClass( 'sui-hidden' );

				// Update texts mentioning the amount of unsmushed images.
				// They're the tooltip in the summary icon, and the notice within the Bulk Smush tab content.
				const $unsmushedNotice = jQuery( '.bulk-smush-wrapper .wp-smush-unsmushed-images-notice' ),
					$unsmushedTooltip = jQuery( '.sui-summary-smush .sui-summary-details .sui-tooltip' ),
					textForm = 1 === count ? 'singular' : 'plural',
					noticeText = $unsmushedNotice.data( textForm ).replace( '{count}', count );

				$unsmushedNotice.find( '.wp-smush-unsmushed-notice-count-text' ).html( noticeText );

				// The tooltip doesn't exist in the NextGen page.
				if ( $unsmushedTooltip.length ) {
					const tooltipText = $unsmushedTooltip.data( textForm ).replace( '{count}', count );
					$unsmushedTooltip.attr( 'data-tooltip', tooltipText );
				}
			}
		}
	};

	// Scroll the element to top of the page.
	const goToByScroll = function( selector ) {
		// Scroll if element found.
		if ( $( selector ).length > 0 ) {
			$( 'html, body' ).animate(
				{
					scrollTop: $( selector ).offset().top - 100,
				},
				'slow'
			);
		}
	};

	const update_cummulative_stats = function( stats ) {
		//Update Directory Smush Stats
		if ( 'undefined' !== typeof stats.dir_smush ) {
			const stats_human = $(
				'li.smush-dir-savings span.wp-smush-stats span.wp-smush-stats-human'
			);
			const stats_percent = $(
				'li.smush-dir-savings span.wp-smush-stats span.wp-smush-stats-percent'
			);

			// Do not replace if 0 savings.
			if ( stats.dir_smush.bytes > 0 ) {
				$( '.wp-smush-dir-link' ).addClass( 'sui-hidden' );

				// Hide selector.
				$(
					'li.smush-dir-savings .wp-smush-stats-label-message'
				).hide();
				//Update Savings in bytes
				if ( stats_human.length > 0 ) {
					stats_human.html( stats.dir_smush.human );
				} else {
					var span =
						'<span class="wp-smush-stats-human">' +
						stats.dir_smush.bytes +
						'</span>';
				}

				//Percentage section
				if ( stats.dir_smush.percent > 0 ) {
					// Show size and percentage separator.
					$(
						'li.smush-dir-savings span.wp-smush-stats span.wp-smush-stats-sep'
					).removeClass( 'sui-hidden' );
					//Update Optimisation percentage
					if ( stats_percent.length > 0 ) {
						stats_percent.html( stats.dir_smush.percent + '%' );
					} else {
						var span =
							'<span class="wp-smush-stats-percent">' +
							stats.dir_smush.percent +
							'%' +
							'</span>';
					}
				}
			} else {
				$( '.wp-smush-dir-link' ).removeClass( 'sui-hidden' );
			}
		}

		//Update Combined stats
		if (
			'undefined' !== typeof stats.combined_stats &&
			stats.combined_stats.length > 0
		) {
			const c_stats = stats.combined_stats;

			let smush_percent = ( c_stats.smushed / c_stats.total_count ) * 100;
			smush_percent = WP_Smush.helpers.precise_round( smush_percent, 1 );

			//Smushed Percent
			if ( smush_percent ) {
				$(
					'div.wp-smush-count-total span.wp-smush-images-percent'
				).html( smush_percent );
			}
			//Update Total Attachment Count
			if ( c_stats.total_count ) {
				$(
					'span.wp-smush-count-total span.wp-smush-total-optimised'
				).html( c_stats.total_count );
			}
			//Update Savings and Percent
			if ( c_stats.savings ) {
				$( 'span.wp-smush-savings span.wp-smush-stats-human' ).html(
					c_stats.savings
				);
			}
			if ( c_stats.percent ) {
				$( 'span.wp-smush-savings span.wp-smush-stats-percent' ).html(
					c_stats.percent
				);
			}
		}
	};

	/**
	 * When 'All' is selected for the Image Sizes setting, select all available sizes.
	 *
	 * @since 3.2.1
	 */
	$( '#all-image-sizes' ).on( 'change', function() {
		$( 'input[name^="wp-smush-image_sizes"]' ).prop( 'checked', true );
	} );

	/**
	 * Handle re-check api status button click (Settings)
	 *
	 * @since 3.2.0.2
	 */
	$( '#wp-smush-update-api-status' ).on( 'click', function( e ) {
		e.preventDefault();

		//$(this).prop('disabled', true);
		$( this ).addClass( 'sui-button-onload' );

		$.post( ajaxurl, { action: 'recheck_api_status' }, function() {
			location.reload();
		} );
	} );

	/**
	 * Handle the Smush Stats link click
	 */
	$( 'body' ).on( 'click', 'a.smush-stats-details', function( e ) {
		//If disabled
		if ( 'disabled' == $( this ).attr( 'disabled' ) ) {
			return false;
		}

		// prevent the default action
		e.preventDefault();
		//Replace the `+` with a `-`
		const slide_symbol = $( this ).find( '.stats-toggle' );
		$( this )
			.parents()
			.eq( 1 )
			.find( '.smush-stats-wrapper' )
			.slideToggle();
		slide_symbol.text( slide_symbol.text() == '+' ? '-' : '+' );
	} );

	/** Handle smush button click **/
	$( 'body' ).on( 'click', '.wp-smush-send:not(.wp-smush-resmush)', function(
		e
	) {
		// prevent the default action
		e.preventDefault();
		new Smush( $( this ), false );
	} );

	/** Handle show in bulk smush button click **/
	$( 'body' ).on( 'click', '.wp-smush-remove-skipped', function( e ) {
		e.preventDefault();

		const self = $( this );

		// Send Ajax request to remove the image from the skip list.
		$.post( ajaxurl, {
			action: 'remove_from_skip_list',
			id: self.attr( 'data-id' ),
		} ).done( ( response ) => {
			if (
				response.success &&
				'undefined' !== typeof response.data.links
			) {
				self.parent()
					.parent()
					.find( '.smush-status' )
					.text( wp_smush_msgs.not_processed );
				e.target.closest( '.smush-status-links' ).innerHTML =
					response.data.links;
			}
		} );
	} );

	/** Handle NextGen Gallery smush button click **/
	$( 'body' ).on( 'click', '.wp-smush-nextgen-send', function( e ) {
		// prevent the default action
		e.preventDefault();
		new Smush( $( this ), false, 'nextgen' );
	} );

	/** Handle NextGen Gallery Bulk smush button click **/
	$( 'body' ).on( 'click', '.wp-smush-nextgen-bulk', function( e ) {
		// prevent the default action
		e.preventDefault();

		// Remove existing Re-Smush notices.
		$( '.wp-smush-resmush-notice' ).remove();

		//Check for ids, if there is none (Unsmushed or lossless), don't call smush function
		if (
			'undefined' === typeof wp_smushit_data ||
			( wp_smushit_data.unsmushed.length === 0 &&
				wp_smushit_data.resmush.length === 0 )
		) {
			return false;
		}

		jQuery( '.wp-smush-all, .wp-smush-scan' ).attr(
			'disabled',
			'disabled'
		);
		$( '.wp-smush-notice.wp-smush-remaining' ).hide();
		new Smush( $( this ), true, 'nextgen' );
	} );

	/** Restore: Media Library **/
	$( 'body' ).on( 'click', '.wp-smush-action.wp-smush-restore', function(
		e
	) {
		const current_button = $( this );
		process_smush_action(
			e,
			current_button,
			'smush_restore_image',
			'restore'
		);
	} );

	/** Resmush: Media Library **/
	$( 'body' ).on( 'click', '.wp-smush-action.wp-smush-resmush', function(
		e
	) {
		process_smush_action( e, $( this ), 'smush_resmush_image', 'smushing' );
	} );

	/** Restore: NextGen Gallery **/
	$( 'body' ).on(
		'click',
		'.wp-smush-action.wp-smush-nextgen-restore',
		function( e ) {
			process_smush_action(
				e,
				$( this ),
				'smush_restore_nextgen_image',
				'restore'
			);
		}
	);

	/** Resmush: NextGen Gallery **/
	$( 'body' ).on(
		'click',
		'.wp-smush-action.wp-smush-nextgen-resmush',
		function( e ) {
			process_smush_action(
				e,
				$( this ),
				'smush_resmush_nextgen_image',
				'smushing'
			);
		}
	);

	//Scan For resmushing images
	$( '.wp-smush-scan' ).on( 'click', function( e ) {
		e.preventDefault();
		run_re_check( false );
	} );

	//Dismiss Welcome notice
	//@todo: Use it for popup
	$( '#wp-smush-welcome-box .smush-dismiss-welcome' ).on( 'click', function(
		e
	) {
		e.preventDefault();
		const $el = $( this )
			.parents()
			.eq( 1 );
		remove_element( $el );

		//Send a ajax request to save the dismissed notice option
		const param = {
			action: 'dismiss_welcome_notice',
		};
		$.post( ajaxurl, param );
	} );

	//Remove Notice
	$( 'body' ).on( 'click', '.wp-smush-notice .icon-fi-close', function( e ) {
		e.preventDefault();
		const $el = $( this ).parent();
		remove_element( $el );
	} );

	/**
	 * Parse remove data change.
	 */
	$( 'input[name=wp-smush-keep_data]' ).on( 'change', function( e ) {
		const otherClass =
			'keep_data-true' === e.target.id
				? 'keep_data-false'
				: 'keep_data-true';
		e.target.parentNode.classList.add( 'active' );
		document
			.getElementById( otherClass )
			.parentNode.classList.remove( 'active' );
	} );

	// On Click Update Settings. Check for change in settings.
	$( 'button#wp-smush-save-settings' ).on( 'click', function( e ) {
		e.preventDefault();

		let setting_type = '';
		const setting_input = $( 'input[name="setting-type"]' );
		// Check if setting type is set in the form.
		if ( setting_input.length > 0 ) {
			setting_type = setting_input.val();
		}

		// Show the spinner.
		const self = $( this );
		self.parent()
			.find( 'span.sui-icon-loader.sui-loading' )
			.removeClass( 'sui-hidden' );

		// Save settings if in network admin.
		if ( '' != setting_type && 'network' == setting_type ) {
			// Ajax param.
			let param = {
				action: 'save_settings',
				wp_smush_options_nonce: $( '#wp_smush_options_nonce' ).val(),
			};

			param =
				jQuery.param( param ) +
				'&' +
				jQuery( 'form#wp-smush-settings-form' ).serialize();

			// Send ajax, Update Settings, And Check For resmush.
			jQuery.post( ajaxurl, param ).done( function() {
				jQuery( 'form#wp-smush-settings-form' ).submit();
				return true;
			} );
		} else {
			$( '.wp-smush-hex-notice' ).hide();

			// Update text.
			self.attr( 'disabled', 'disabled' ).addClass( 'button-grey' );

			// Update save button text.
			if (
				'undefined' !== typeof self.attr( 'data-msg' ) &&
				self.attr( 'data-msg' ).length > 0
			) {
				self.html( self.attr( 'data-msg' ) );
			} else {
				self.html( wp_smush_msgs.checking );
			}

			// Check if type is set in data attributes.
			let scan_type = self.data( 'type' );
			scan_type = 'undefined' === typeof scan_type ? 'media' : scan_type;

			// Ajax param.
			let param = {
				action: 'scan_for_resmush',
				wp_smush_options_nonce: jQuery(
					'#wp_smush_options_nonce'
				).val(),
				type: scan_type,
			};

			param =
				jQuery.param( param ) +
				'&' +
				jQuery( 'form#wp-smush-settings-form' ).serialize();

			// Send ajax, Update Settings, And Check For resmush.
			jQuery.post( ajaxurl, param ).done( function() {
				jQuery( 'form#wp-smush-settings-form' ).submit();
				return true;
			} );
		}
	} );

	// On re-Smush click.
	$( 'body' ).on( 'click', '.wp-smush-skip-resmush', function( e ) {
		e.preventDefault();

		const self = jQuery( this ),
			container = self.parents().eq( 1 ),
			el = self.parent();

		// Remove Parent div.
		remove_element( el );

		// Remove Settings Notice.
		$( '.sui-notice-top.sui-notice-success' ).remove();

		// Set button attribute to skip re-smush ids.
		container.find( '.wp-smush-all' ).attr( 'data-smush', 'skip_resmush' );

		// Update Smushed count.
		wp_smushit_data.count_smushed =
			parseInt( wp_smushit_data.count_smushed ) +
			wp_smushit_data.resmush.length;
		wp_smushit_data.count_supersmushed =
			parseInt( wp_smushit_data.count_supersmushed ) +
			wp_smushit_data.resmush.length;

		// Update stats.
		if ( wp_smushit_data.count_smushed === wp_smushit_data.count_total ) {
			// Show all done notice.
			$(
				'.wp-smush-notice.wp-smush-all-done, .wp-smush-pagespeed-recommendation'
			).removeClass( 'sui-hidden' );

			// Hide Smush button.
			$( '.wp-smush-bulk-wrapper ' ).addClass( 'sui-hidden' );
		}

		// Remove re-Smush notice.
		$( '.wp-smush-resmush-notice' ).remove();

		let type = $( '.wp-smush-scan' ).data( 'type' );
		type = 'undefined' === typeof type ? 'media' : type;

		const smushed_count =
			'undefined' !== typeof wp_smushit_data.count_smushed
				? wp_smushit_data.count_smushed
				: 0;

		let smush_percent =
			( smushed_count / wp_smushit_data.count_total ) * 100;
		smush_percent = WP_Smush.helpers.precise_round( smush_percent, 1 );

		$( '.wp-smush-images-percent' ).html( smush_percent );

		// Update the progress bar width. Get the progress bar.
		const progress_bar = jQuery(
			'.bulk-smush-wrapper .wp-smush-progress-inner'
		);
		if ( progress_bar.length < 1 ) {
			return;
		}

		// Increase progress.
		progress_bar.css( 'width', smush_percent + '%' );

		// Show the default bulk smush notice.
		$( '.wp-smush-bulk-wrapper' ).removeClass( 'sui-hidden' );
		$( '.wp-smush-bulk-wrapper .sui-notice' ).removeClass( 'sui-hidden' );

		const params = {
			action: 'delete_resmush_list',
			type,
		};

		//Delete resmush list, @todo: update stats from the ajax response
		$.post( ajaxurl, params, function( res ) {
			// Remove the whole li element on success
			if ( res.success && 'undefined' !== typeof res.data.stats ) {
				const stats = res.data.stats;
				// Update wp_smushit_data ( Smushed count, Smushed Percent, Image count, Super smush count, resize savings, conversion savings )
				if ( 'undefined' !== typeof wp_smushit_data ) {
					wp_smushit_data.count_images =
						'undefined' !== typeof stats.count_images
							? parseInt( wp_smushit_data.count_images ) +
							  stats.count_images
							: wp_smushit_data.count_images;
					wp_smushit_data.size_before =
						'undefined' !== typeof stats.size_before
							? parseInt( wp_smushit_data.size_before ) +
							  stats.size_before
							: wp_smushit_data.size_before;
					wp_smushit_data.size_after =
						'undefined' !== typeof stats.size_after
							? parseInt( wp_smushit_data.size_after ) +
							  stats.size_after
							: wp_smushit_data.size_after;
					wp_smushit_data.savings_resize =
						'undefined' !== typeof stats.savings_resize
							? parseInt( wp_smushit_data.savings_resize ) +
							  stats.savings_resize
							: wp_smushit_data.savings_resize;
					wp_smushit_data.savings_conversion =
						'undefined' !== typeof stats.savings_conversion
							? parseInt( wp_smushit_data.savings_conversion ) +
							  stats.savings_conversion
							: wp_smushit_data.savings_conversion;

					// Add directory smush stats.
					if (
						'undefined' !==
							typeof wp_smushit_data.savings_dir_smush &&
						'undefined' !==
							typeof wp_smushit_data.savings_dir_smush.orig_size
					) {
						wp_smushit_data.size_before =
							'undefined' !==
							typeof wp_smushit_data.savings_dir_smush
								? parseInt( wp_smushit_data.size_before ) +
								  parseInt(
										wp_smushit_data.savings_dir_smush
											.orig_size
								  )
								: wp_smushit_data.size_before;
						wp_smushit_data.size_after =
							'undefined' !==
							typeof wp_smushit_data.savings_dir_smush
								? parseInt( wp_smushit_data.size_after ) +
								  parseInt(
										wp_smushit_data.savings_dir_smush
											.image_size
								  )
								: wp_smushit_data.size_after;
					}

					wp_smushit_data.count_resize =
						'undefined' !== typeof stats.count_resize
							? parseInt( wp_smushit_data.count_resize ) +
							  stats.count_resize
							: wp_smushit_data.count_resize;
				}
				// Smush notice.
				const remainingCountDiv = $(
					'.bulk-smush-wrapper .wp-smush-remaining-count'
				);
				if (
					remainingCountDiv.length &&
					'undefined' !== typeof wp_smushit_data.unsmushed
				) {
					remainingCountDiv.html( wp_smushit_data.unsmushed.length );
				}

				// If no images left, hide the notice, show all success notice.
				if (
					'undefined' !== typeof wp_smushit_data.unsmushed ||
					wp_smushit_data.unsmushed.length === 0
				) {
					$( '.wp-smush-bulk-wrapper .sui-notice' ).removeClass( 'sui-hidden' );
					$( '.sui-notice-success.wp-smush-all-done' ).addClass( 'sui-hidden' );
				}

				Smush.updateStats();
			}
		} );
	} );

	// Enable super smush on clicking link from stats area.
	$( 'a.wp-smush-lossy-enable' ).on( 'click', function( e ) {
		e.preventDefault();
		// Scroll down to settings area.
		goToByScroll( '#column-wp-smush-lossy' );
	} );

	// Enable resize on clicking link from stats area.
	$( '.wp-smush-resize-enable' ).on( 'click', function( e ) {
		e.preventDefault();
		// Scroll down to settings area.
		goToByScroll( '#column-wp-smush-resize' );
	} );

	// If settings string is found in url, enable and scroll.
	if ( window.location.hash ) {
		const setting_hash = window.location.hash.substring( 1 );
		// Enable and scroll to resize settings.
		if ( 'enable-resize' === setting_hash ) {
			goToByScroll( '#column-wp-smush-resize' );
		} else if ( 'enable-lossy' === setting_hash ) {
			// Enable and scroll to lossy settings.
			goToByScroll( '#column-wp-smush-lossy' );
		}
	}

	//Trigger Bulk
	$( 'body' ).on( 'click', '.wp-smush-trigger-bulk', function( e ) {
		e.preventDefault();

		//Induce Setting button save click
		if (
			'undefined' !== typeof e.target.dataset.type &&
			'nextgen' === e.target.dataset.type
		) {
			$( '.wp-smush-nextgen-bulk' ).click();
		} else {
			$( '.wp-smush-all' ).click();
		}

		$( 'span.sui-notice-dismiss' ).click();
	} );

	//Trigger Bulk
	$( 'body' ).on( 'click', '#bulk-smush-top-notice-close', function( e ) {
		e.preventDefault();
		$( this )
			.parent()
			.parent()
			.slideUp( 'slow' );
	} );

	//Allow the checkboxes to be Keyboard Accessible
	$( '.wp-smush-setting-row .toggle-checkbox' ).focus( function() {
		//If Space is pressed
		$( this ).keypress( function( e ) {
			if ( e.keyCode == 32 ) {
				e.preventDefault();
				$( this )
					.find( '.toggle-checkbox' )
					.click();
			}
		} );
	} );

	// Re-Validate Resize Width And Height.
	$( 'body' ).on( 'blur', '.wp-smush-resize-input', function() {
		const self = $( this );

		const wrapper_div = self.parents().eq( 4 );

		// Initiate the check.
		validate_resize_settings( wrapper_div, false, false ); // run the validation.
	} );

	// Handle Resize Checkbox toggle, to show/hide width, height settings.
	$( 'body' ).on(
		'click',
		'#wp-smush-resize, #wp-smush-resize-quick-setup',
		function() {
			const self = $( this );
			const settings_wrap = $( '.wp-smush-resize-settings-wrap' );

			if ( self.is( ':checked' ) ) {
				settings_wrap.show();
			} else {
				settings_wrap.hide();
			}
		}
	);

	// Handle auto detect checkbox toggle, to show/hide highlighting notice.
	$( 'body' ).on( 'click', '#wp-smush-detection', function() {
		const self = $( this );
		const notice_wrap = $( '.smush-highlighting-notice' );
		const warning_wrap = $( '.smush-highlighting-warning' );

		// Setting enabled.
		if ( self.is( ':checked' ) ) {
			// Highlighting is already active and setting not saved.
			if ( notice_wrap.length > 0 ) {
				notice_wrap.show();
			} else {
				warning_wrap.show();
			}
		} else {
			notice_wrap.hide();
			warning_wrap.hide();
		}
	} );

	// Handle PNG to JPG Checkbox toggle, to show/hide Transparent image conversion settings.
	$( '#wp-smush-png_to_jpg' ).click( function() {
		const self = $( this );
		const settings_wrap = $( '.wp-smush-png_to_jpg-wrap' );

		if ( self.is( ':checked' ) ) {
			settings_wrap.show();
		} else {
			settings_wrap.hide();
		}
	} );

	//Handle Re-check button functionality
	$( '#wp-smush-revalidate-member' ).on( 'click', function( e ) {
		e.preventDefault();
		//Ajax Params
		const params = {
			action: 'smush_show_warning',
		};
		const link = $( this );
		const parent = link.parents().eq( 1 );
		parent.addClass( 'loading-notice' );
		$.get( ajaxurl, params, function( r ) {
			//remove the warning
			parent.removeClass( 'loading-notice' ).addClass( 'loaded-notice' );
			if ( 0 == r ) {
				parent.attr( 'data-message', wp_smush_msgs.membership_valid );
				remove_element( parent, 1000 );
			} else {
				parent.attr( 'data-message', wp_smush_msgs.membership_invalid );
				setTimeout( function remove_loader() {
					parent.removeClass( 'loaded-notice' );
				}, 1000 );
			}
		} );
	} );

	if ( $( 'li.smush-dir-savings' ).length > 0 ) {
		// Update Directory Smush, as soon as the page loads.
		const stats_param = {
			action: 'get_dir_smush_stats',
		};
		$.get( ajaxurl, stats_param, function( r ) {
			//Hide the spinner
			$( 'li.smush-dir-savings .sui-icon-loader' ).hide();

			//If there are no errors, and we have a message to display
			if ( ! r.success && 'undefined' !== typeof r.data.message ) {
				$( 'div.wp-smush-scan-result div.content' ).prepend(
					r.data.message
				);
				return;
			}

			//If there is no value in r
			if (
				'undefined' === typeof r.data ||
				'undefined' === typeof r.data.dir_smush
			) {
				//Append the text
				$( 'li.smush-dir-savings span.wp-smush-stats' ).append(
					wp_smush_msgs.ajax_error
				);
				$( 'li.smush-dir-savings span.wp-smush-stats span' ).hide();
			} else {
				//Update the stats
				update_cummulative_stats( r.data );
			}
		} );
	}
	//Close Directory smush modal, if pressed esc
	$( document ).keyup( function( e ) {
		if ( e.keyCode === 27 ) {
			const modal = $(
				'div.dev-overlay.wp-smush-list-dialog, div.dev-overlay.wp-smush-get-pro'
			);
			//If the Directory dialog is not visible
			if ( ! modal.is( ':visible' ) ) {
				return;
			}
			modal.find( 'div.close' ).click();
		}
	} );

	//Dismiss Smush recommendation
	$( 'span.dismiss-recommendation' ).on( 'click', function( e ) {
		e.preventDefault();
		const parent = $( this ).parent();
		//remove div and save preference in db
		parent.hide( 'slow', function() {
			parent.remove();
		} );
		$.ajax( {
			type: 'POST',
			url: ajaxurl,
			data: {
				action: 'hide_pagespeed_suggestion',
			},
		} );
	} );

	/**
	 * Scroll to resize settings.
	 *
	 * @since 3.3.2
	 */
	$( '#close-resize-update-dialog' ).on( 'click', function( e ) {
		e.preventDefault();

		window.SUI.dialogs[ 'resizing-update' ].hide();

		goToByScroll( '#column-wp-smush-resize' );
	} );

	/**
	 * Closes and dismisses the Tutorials meta-box under the Bulk Smush tab.
	 *
	 * @since 3.7.1
	 */
	$( '#wp-smush-dismiss-tutorials-button' ).on( 'click', function( e ) {
		const $button = $( e.currentTarget ),
			$metaBox = $button.closest( '#smush-box-bulk-tutorials' );

		$metaBox.hide( 'slow', () => $metaBox.remove() );

		$.ajax( {
			type: 'POST',
			url: ajaxurl,
			data: {
				action: 'hide_tutorials_bulk_smush',
			},
		} );

		// Display a floating notification.
		const noticeMessage = `<p>${ $button.data('notice') }</p>`,
			noticeOptions = {
				type: 'info',
				icon: 'info',
				dismiss: {
					show: true,
					label: $button.data( 'notice-close' ),
				},
				autoclose: {
					show: true,
				}
			};

		SUI.openNotice( 'wp-smush-hide-tutorials-notice', noticeMessage, noticeOptions );
	} );

	/**
	 * Adds the slider functionality for the Tutorials under the Bulk Smush tab.
	 *
	 * @since 3.7.1
	 */
	$( '#smush-box-bulk-tutorials .wp-smush-tutorials-button' ).on( 'click', function( e ) {
		const $button = $( e.currentTarget ),
			$sliderContainer = $button.closest( '.wp-smush-tutorials-section' ),
			amountOfSlides = $sliderContainer.find( '.wp-smush-slider-wrapper li' ).length;

		// If there isn't more than 1 slide, we don't need the slider functionality.
		if ( 1 >= amountOfSlides ) {
			return;
		}

		const direction = $button.data( 'direction' ),
			activeSlideNumber = parseInt( $sliderContainer.data( 'active' ) ),
			newActiveNumber = 'next' === direction ? activeSlideNumber + 1 : activeSlideNumber - 1,
			$newActiveSlide = $sliderContainer.find( `[data-slide="${ newActiveNumber }"]` );

		// Return if the following slide doesn't exist for some reason.
		if ( ! $newActiveSlide.length ) {
			return;
		}

		const $activeSlide = $sliderContainer.find( `[data-slide="${ activeSlideNumber }"]` ),
			$nextButton = $sliderContainer.find( '.wp-smush-slider-button-next' ),
			$prevButton = $sliderContainer.find( '.wp-smush-slider-button-prev' );

		// Hide the previous slide, show the new one.
		$activeSlide.attr( 'tabindex', '-1' );
		$activeSlide.addClass( 'sui-hidden' );
		$activeSlide.attr( 'aria-hidden', 'true' );
		$newActiveSlide.attr( 'tabindex', '0' );
		$newActiveSlide.removeClass( 'sui-hidden' );
		$newActiveSlide.attr( 'aria-hidden', 'false' );

		// Update the "active slide" flag.
		$sliderContainer.attr( 'data-active', newActiveNumber );
		$sliderContainer.data( 'active', newActiveNumber );

		// Focus on the new slide.
		$newActiveSlide[0].focus();

		if ( 'next' === direction ) {
			$prevButton.removeAttr( 'disabled' );
			$prevButton.removeAttr( 'aria-disabled' );

			// Hide the 'next' button if we moved forward and we're now in the last slide.
			if ( amountOfSlides === newActiveNumber ) {
				$nextButton.attr( 'disabled', true );
				$nextButton.attr( 'aria-disabled', 'true' );
			}
		} else {
			$nextButton.removeAttr( 'disabled' );
			$nextButton.removeAttr( 'aria-disabled' );

			// Hide the 'prev' button if we moved backward and we're now in the first slide.
			if ( 1 === newActiveNumber ) {
				$prevButton.attr( 'disabled', true );
				$prevButton.attr( 'aria-disabled', 'true' );
			}
		}
	} );

	/**
	 * @namespace aria
	 */
	let aria = aria || {};

	// Key codes.
	aria.KeyCode = {
		TAB: 9,
		RETURN: 13,
		ESC: 27,
		SPACE: 32,
		PAGE_UP: 33,
		PAGE_DOWN: 34,
		END: 35,
		HOME: 36,
		LEFT: 37,
		UP: 38,
		RIGHT: 39,
		DOWN: 40,
		DELETE: 46
	};

	// Handling accessibility for the tutorials tab.
	$( '#smush-box-tutorials div[role="link"]' ).on( 'click', function( e ) {

		let ref = e.target !== null ? e.target : e.srcElement;

		if ( ref ) {
			window.open( ref.getAttribute( 'data-href' ), '_blank' );
		}
	}).on( 'keydown', function( e ) {

		const focusOnNextTut = function( direction ) {
			const current = $( ref ).data( 'tutorial' ),
				next = 'next' === direction ? current + 1 : current - 1;

			let $nextTut = $( `#smush-box-tutorials [data-tutorial="${ next }"]` );

			// When we are at the end and moving forward, or at the beginning and moving backward.
			if ( ! $nextTut.length ) {
				const allTuts = $( '#smush-box-tutorials .wp-smush-tutorial-item' ),
					nextTutKey = 'next' === direction ? 0 : allTuts.length - 1;
				$nextTut = allTuts[ nextTutKey ];
			}

			$nextTut.focus();
		}

		let key = e.which || e.keyCode,
			ref = e.target !== null ? e.target : e.srcElement;

		switch ( key ) {

			case aria.KeyCode.RETURN :
				if ( ref ) {
					window.open( ref.getAttribute( 'data-href' ), '_blank' );
				}
				break;

			case aria.KeyCode.LEFT :
				focusOnNextTut( 'prev' );
				break;

			case aria.KeyCode.RIGHT :
				focusOnNextTut( 'next' );
				break;
		}
	});
} );
