'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

jQuery(function () {
	return MPSUM.init();
});

var MPSUM = {};

(function ($) {
	MPSUM = {

		// Used with page number input event
		timer: null,
		delay: 500,

		/**
   * Register event handling
   */
		init: function init() {
			var _this = this;

			this.__register_update_toggle_events();
			this.__register_save_settings_event();
			this.__register_bulk_actions_event();
			this.__register_pagination_events();
			this.__register_filter_link_events();
			this.__register_logs_filter_event();

			this.__register_excluded_user_event();
			this.__register_force_updates_event();
			this.__register_enable_logs_event();
			this.__register_clear_logs_event();
			this.__register_reset_options_event();
			this.__register_advanced_tab_menu_events();
			this.__register_log_search_event();
			this.__register_multisite_get_plugins_list();
			this.__register_multisite_get_themes_list();
			this.__register_disable_admin_bar_options_event();
			this.__register_enable_admin_bar_options_event();
			this.__register_logs_expand_event();

			window.onpopstate = function (e) {
				_this.__register_advanced_on_pop_state(e);
			};

			// Select option if it exists
			this.__register_advanced_on_pop_state({});

			// Select option if it exists
			this.__register_on_resize();
		},


		/**
   * Moves section when on resize
   */
		__register_on_resize: function __register_on_resize() {
			MPSUM.__advanced_section_move();
			$(window).resize(function () {
				MPSUM.__advanced_section_move();
			});
		},


		/**
   * Moves section when on resize
   */
		__advanced_section_move: function __advanced_section_move() {
			if ($(window).width() <= 768) {
				$('.eum-advanced-settings-container:visible').insertAfter('div.active-menu').addClass('active');
			} else {
				$('.eum-advanced-settings-container:visible').appendTo('#eum-adv-settings').addClass('active');
			}
		},


		/**
   * Select option when user refreshes Advanced option or when forward or back button is used
   *
   * @param {object} e - Event object. Can be empty.
   */
		__register_advanced_on_pop_state: function __register_advanced_on_pop_state(e) {

			// Parse URL into an object with query params
			var url = wpAjax.unserialize(window.location.href);

			// Slideup any error messages
			if ('action' in url) {
				$('.eum-updated').delay(5000).slideUp(2000);
			}

			// If option in query var, click it
			if ('option' in url) {
				$('*[data-menu_name="' + url.option + '"]').click();
			} else {
				// We are on the main tab with no options - click it if not active
				var $first_item = $($('*[data-menu_name]')[0]);
				$first_item.trigger('click');
			}
		},


		/**
   * Renders the ajax response
   *
   * @param {array} response - Ajax call result as an array
   */
		render: function render(response) {
			this.__render_filter_links(response.views);
			this.__render_rows(response.rows);
			this.__render_headers(response.headers);
			this.__render_pagination_top(response.pagination.top);
			this.__render_pagination_bottom(response.pagination.bottom);
			this.__unblockUI();
			// Init back our event handlers
			this.init();
		},


		/**
   * Send an action over AJAX. A wrapper around jQuery.ajax.
   *
   * @param {string}   action   - the action to send
   * @param {*}        data     - data to send
   * @param {Function} callback - will be called with the results
   * @param {object}   options  - further options. Relevant properties include:
   * - [json_parse=true] - whether to JSON parse the results
   * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it)
   * - [action='eum_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'sub_action' parameter on the AJAX request)
   * - [nonce=eum_ajax_nonce] - the nonce value to send.
   * - [nonce_key='eum_nonce'] - the key value for the nonce field. Currently ignored on the server side.
   * - [timeout=null] - set a timeout after this number of seconds (or if null, none is set)
   * - [async=true] - control whether the request is asynchronous (almost always wanted) or blocking (would need to have a specific reason)
   * - [type='POST'] - GET or POST
   */
		send_command: function send_command(action, data, callback, options) {
			var block_ui = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;

			if (block_ui) {
				this.__blockUI({
					css: {
						width: '300px',
						border: 'none',
						'border-radius': '10px',
						left: 'calc(50% - 150px)',
						padding: '20px'
					},
					message: '<div style="margin: 8px; font-size:150%;" class="eum_saving_popup"><img src="' + mpsum.logo + '" height="80" width="80"><br>' + mpsum.working + '</div>'
				});
			}

			var default_options = {
				json_parse: true,
				alert_on_error: true,
				action: 'eum_ajax',
				nonce: mpsum.eum_nonce,
				nonce_key: 'eum_nonce',
				timeout: null,
				async: true,
				type: 'POST'
			};

			if ('undefined' === typeof options) options = {};

			for (var opt in default_options) {
				if (!options.hasOwnProperty(opt)) {
					options[opt] = default_options[opt];
				}
			}

			var ajax_data = {
				action: options.action,
				subaction: action,
				nonce: options.nonce,
				nonce_key: options.nonce_key
			};

			ajax_data[options.nonce_key] = options.nonce;

			if ('object' === (typeof data === 'undefined' ? 'undefined' : _typeof(data))) {
				for (var attrname in data) {
					ajax_data[attrname] = data[attrname];
				}
			} else {
				ajax_data.action_data = data;
			}

			var ajax_opts = {
				type: options.type,
				url: ajaxurl,
				data: ajax_data,
				success: function success(response, status) {
					if (options.json_parse) {
						var resp = void 0;
						try {
							resp = MPSUM.parse_json(response);
						} catch (e) {
							console.log(e);
							console.log(response);
							if (options.alert_on_error) {
								alert(mpsum.unexpected_response + ' ' + response);
							}
							return;
						}
						if ('function' === typeof callback) callback(resp, status, response);
					} else {
						if ('function' === typeof callback) callback(response, status);
					}
				},
				error: function error(response, status, error_code) {
					if ('function' === typeof options.error_callback) {
						options.error_callback(response, status, error_code);
					} else {
						console.log('eum_send_command: error: ' + status + '  (' + error_code + ')');
						console.log(response);
					}
				},

				dataType: 'text',
				async: options.async
			};

			if (null != options.timeout) {
				ajax_opts.timeout = options.timeout;
			}

			jQuery.ajax(ajax_opts);
		},


		/**
   * Parse JSON string, including automatically detecting unwanted extra input and skipping it
   *
   * @param {string} json_mix_str - JSON string which need to parse and convert to object
   *
   * @throws SyntaxError|String (including passing on what JSON.parse may throw) if a parsing error occurs.
   *
   * @returns Mixed parsed JSON object. Will only return if parsing is successful (otherwise, will throw)
   */
		parse_json: function parse_json(json_mix_str) {

			// Just try it - i.e. the 'default' case where things work (which can include extra whitespace/line-feeds, and simple strings, etc.).
			try {
				var result = JSON.parse(json_mix_str);
				return result;
			} catch (e) {
				console.log("EUM: Exception when trying to parse JSON (1) - will attempt to fix/re-parse");
				console.log(json_mix_str);
			}

			var json_start_pos = json_mix_str.indexOf('{');
			var json_last_pos = json_mix_str.lastIndexOf('}');

			// Case where some php notice may be added after or before json string
			if (json_start_pos > -1 && json_last_pos > -1) {
				var json_str = json_mix_str.slice(json_start_pos, json_last_pos + 1);
				try {
					var _parsed = JSON.parse(json_str);
					console.log("EUM: JSON re-parse successful");
					return _parsed;
				} catch (e) {
					console.log('EUM: Exception when trying to parse JSON (2) - will attempt to fix/re-parse based upon bracket counting');

					var cursor = json_start_pos;
					var open_count = 0;
					var last_character = '';
					var inside_string = false;

					// Don't mistake this for a real JSON parser. Its aim is to improve the odds in real-world cases seen, not to arrive at universal perfection.
					while ((open_count > 0 || cursor == json_start_pos) && cursor <= json_last_pos) {

						var current_character = json_mix_str.charAt(cursor);

						if (!inside_string && '{' == current_character) {
							open_count++;
						} else if (!inside_string && '}' == current_character) {
							open_count--;
						} else if ('"' == current_character && '\\' != last_character) {
							inside_string = inside_string ? false : true;
						}

						last_character = current_character;
						cursor++;
					}
					console.log("Started at cursor=" + json_start_pos + ", ended at cursor=" + cursor + " with result following:");
					console.log(json_mix_str.substring(json_start_pos, cursor));

					try {
						var parsed = JSON.parse(json_mix_str.substring(json_start_pos, cursor));
						console.log('EUM: JSON re-parse successful');
						return parsed;
					} catch (e) {
						// Throw it again, so that our function works just like JSON.parse() in its behaviour.
						throw e;
					}
				}
			}

			throw "EUM: could not parse the JSON";
		},


		/**
   * Retrieve the current settings from the DOM
   *
   * @param {string} output_format - the output format; valid values are 'string' or 'object'
   *
   * @returns String|Object
   */
		gather_settings: function gather_settings(output_format) {

			var form_data = '';
			output_format = 'undefined' === typeof output_format ? 'string' : output_format;

			if ('object' === output_format) {
				form_data = $('input, select').serializeJSON({ checkboxUncheckedValue: '0', useIntKeysAsArrayIndex: true });
			} else {
				form_data = $('input, select').serialize();
			}

			return form_data;
		},


		/**
   * Composes data to be sent over ajax request
   *
   * @param   {string} request_type - Type of ajax request
   * @param   {object} elm - Element that triggers ajax request
   * @returns {object}
   * @private
   */
		__get_data: function __get_data() {
			var request_type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
			var elm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

			var data = {};
			var $current = $('#current-page-selector');
			var query_string = null;
			if (null !== elm) {
				query_string = elm.search.substring(1);
			}

			switch (request_type) {
				case 'pagination':
					// We need to override this as paged data comes from clicked link
					data.paged = this.__query(query_string, 'paged');
					break;

				case 'pagination_input':
				case 'bulk':
				case 'save_settings':
					// Get paged data from input field
					data.paged = parseInt($('input[name=paged]').val()) || '1';
					break;
			}

			data.m = $('#filter-by-date').val();
			data.status = $('#filter-by-success').val();
			data.action_type = $('#filter-by-action').val();
			data.type = $('#filter-by-type').val();
			data.order = $('#filter-by-order').val();
			data.data = this.gather_settings('string');
			data.is_search = false;
			var url_params = wpAjax.unserialize(window.location.href);
			if (data.is_search) {
				data.tab = $current.data('tab') || url_params.tab;
				data.view = 'search';
			} else if (null !== query_string) {
				data.tab = url_params.tab;
				data.view = this.__query(query_string, 'view') || 'all';
			} else {
				data.tab = $current.data('tab') || url_params.tab;
				data.view = $current.data('view') || 'all';
			}

			return data;
		},


		/**
   * Filter the URL Query to extract variables
   *
   * @param {string} query    - The URL query part containing the variables
   * @param {string} variable - Name of the variable we want to get
   * @see   http://css-tricks.com/snippets/javascript/get-url-variables/
   *
   * @return string|boolean The variable value if available, false else.
   */
		__query: function __query(query, variable) {

			var params = query.split("&");
			for (var i = 0; i < params.length; i++) {
				var pair = params[i].split("=");
				if (variable === pair[0]) return pair[1];
			}
			return false;
		},


		/**
   * Blocks UI during ajax call process
   *
   * @private
   */
		__blockUI: function __blockUI() {
			$.blockUI({
				css: {
					width: '300px',
					border: 'none',
					'border-radius': '10px',
					left: 'calc(50% - 150px)',
					padding: '20px'
				},
				message: '<div style="margin: 8px; font-size:150%;" class="eum_saving_popup"><img src="' + mpsum.logo + '" height="80" width="80"><br>' + mpsum.working + '</div>'
			});
		},


		/**
   * Unblocks UI after completing ajax process
   *
   * @private
   */
		__unblockUI: function __unblockUI() {
			$('.wrap .fade').delay(6000).fadeOut(2000);

			$.unblockUI();
		},


		/**
   * Registers update / automatic update toggle button events
   *
   * @private
   */
		__register_update_toggle_events: function __register_update_toggle_events() {
			var _this2 = this;

			$('.eum-toggle-button').unbind("click");
			$('.eum-toggle-button').on('click', function (e) {
				var url_params = wpAjax.unserialize(window.location.href);
				var data_tab = url_params.tab;
				e.preventDefault();
				if (undefined == data_tab || 'general' == data_tab) {
					return;
				}

				// Add class to toggle-wrapper
				// Check for class and if update, automatic update options should be hidden and set to false
				var $this = $(e.currentTarget);
				var $checkbox = $this.closest('.toggle-wrapper').find('input');

				var $parent = $this.closest('.toggle-wrapper');
				var $feature_wrappers = $parent.closest('.eum-' + data_tab + '-name-actions').find('> div[class$="wrapper"]:not(div.eum-' + data_tab + '-wrapper)');
				var $tr = $this.closest('tr');

				$this.addClass('eum-active');

				if ($this.hasClass('eum-enabled')) {
					$this.next().removeClass('eum-active');
					$checkbox.prop('value', 'true');
					if ($parent.hasClass('toggle-wrapper-' + data_tab) && $tr.hasClass('inactive')) {
						$tr.removeClass('inactive').addClass('active');
						$.each($feature_wrappers, function (index, item) {
							$(item).find('input').prop('value', false);
							$(item).find('.eum-disabled').addClass('eum-active');
							$(item).find('.eum-enabled').removeClass('eum-active');
							$(item).slideDown();
						}.bind(_this2));
					}
				} else {
					if ($parent.hasClass('toggle-wrapper-' + data_tab)) {
						$tr.removeClass('active').addClass('inactive');
						$.each($feature_wrappers, function (index, item) {
							$(item).find('input').prop('value', false);
							$(item).slideUp();
						}.bind(_this2));
					}
					$this.prev().removeClass('eum-active');
					$checkbox.prop('value', 'false');
				}

				var data = _this2.__get_data('save_settings');
				_this2.send_command('save_' + data_tab + '_update_options_and_render', data, function (response) {
					$('.subsubsub').replaceWith(response.views);
					setTimeout(function () {
						MPSUM.__unblockUI();
						MPSUM.init();
					}, 2000);
				});
			});
		},


		/**
   * Registers Save settings button event
   *
   * @private
   */
		__register_save_settings_event: function __register_save_settings_event() {
			var _this3 = this;

			$('#eum-save-settings').on('click', function (e) {
				e.preventDefault();
				e.stopImmediatePropagation();

				var data = _this3.__get_data('save_settings');
				_this3.send_command('save_' + data.tab + '_update_options_and_render', data, function (response) {
					$('.subsubsub').replaceWith(response.views);
					_this3.__unblockUI();
					_this3.init();
				});
			});
		},


		/**
   * Registers bulk actions Apply button click event
   *
   * @private
   */
		__register_bulk_actions_event: function __register_bulk_actions_event() {
			var _this4 = this;

			$('.wrap').on('click', '#doaction, #doaction2', function (e) {
				e.preventDefault();
				e.stopImmediatePropagation();
				if (0 === $('input:checked').length) return;
				var data = _this4.__get_data('bulk');
				_this4.send_command('bulk_action_' + data.tab + '_update_options_and_render', data, function (response) {
					_this4.render(response);
					$('#bulk-action-selector-top, #bulk-action-selector-bottom').val("-1");
				});
			});
		},


		/**
   * Registers pagination button events
   *
   * @private
   */
		__register_pagination_events: function __register_pagination_events() {
			var _this5 = this;

			// Pagination buttons
			$('.tablenav-pages a').on('click', function (e) {
				e.preventDefault();
				var data = _this5.__get_data('pagination', e.currentTarget);
				_this5.__get_tab_content_and_render(data);
			});

			// Page number input
			$('input[name=paged]').on('keyup', function (e) {

				// If user hit enter, we don't want to submit the form
				if (13 === e.which) e.preventDefault();

				// Using timer to prevent every keyup sending ajax requests
				window.clearTimeout(_this5.timer);
				_this5.timer = window.setTimeout(function () {
					var data = _this5.__get_data('pagination_input');
					_this5.__get_tab_content_and_render(data);
				}, _this5.delay);
			});
		},


		/**
   * Registers filter link events
   *
   * @private
   */
		__register_filter_link_events: function __register_filter_link_events() {
			var _this6 = this;

			$('.subsubsub a').on('click', function (e) {
				e.preventDefault();
				e.stopImmediatePropagation();
				$('.subsubsub a').removeClass('current');
				$(e.currentTarget).addClass('current');
				var data = _this6.__get_data('filters', e.currentTarget);
				_this6.__get_tab_content_and_render(data);
			});
		},


		/**
   * Registers Logs Filter button click event
   *
   * @private
   */
		__register_logs_filter_event: function __register_logs_filter_event() {
			var _this7 = this;

			$('#post-query-submit').on('click', function (e) {
				e.preventDefault();
				e.stopImmediatePropagation();
				var data = _this7.__get_data();
				_this7.__get_tab_content_and_render(data);
			});

			$('#filter-by-date, #filter-by-success, #filter-by-action, #filter-by-type, #filter-by-order').on('change', function (e) {
				e.preventDefault();
				e.stopImmediatePropagation();
				var data = _this7.__get_data();
				_this7.__get_tab_content_and_render(data);
			});
		},


		/**
   * Register save excludes users event
   *
   * @private
   */
		__register_excluded_user_event: function __register_excluded_user_event() {
			var _this8 = this;

			$('#save-excluded-users').on('click', function (e) {
				e.preventDefault();
				_this8.send_command('save_excluded_users', { data: _this8.gather_settings('string') }, function (response) {
					$('#result').css('display', 'block').html('<div class="updated"><p>' + response + '</p></div>').delay(2000).slideUp(2000);
					_this8.__unblockUI();
				});
			});
		},


		/**
   * Register force updates event
   *
   * @private
   */
		__register_force_updates_event: function __register_force_updates_event() {
			var _this9 = this;

			$('#force-updates').on('click', function (e) {
				e.preventDefault();
				if (typeof updraft_backupnow_inpage_go === 'function' && 1 === $('#backup_force_updates:checked').length) {
					updraft_backupnow_inpage_go(function () {
						$('#updraft-backupnow-inpage-modal').dialog('close');
						_this9.__send_force_updates_request();
					}, 'themes,plugins,wpcore', 'autobackup', null);
				} else {
					_this9.__send_force_updates_request();
				}
			});
		},


		/**
   * Sends force updates ajax request
   *
   * @private
   */
		__send_force_updates_request: function __send_force_updates_request() {
			var _this10 = this;

			var update_version = $('#footer-upgrade strong a').html();
			this.send_command('force_updates', {}, function (response) {
				$('#result').css('display', 'block').html('<div class="updated"><p>' + response.message + '</p></div>').delay(5000).slideUp(2000);
				_this10.__unblockUI();
				if (true === response.ran_immediately) {
					// With `force_updates` call after update are run
					// we can check whether still some updates are pending and
					// can display links/update nag accordingly
					if (response.update_data.counts.total > 0) {
						_this10.__update_notifications(response.update_data);
					} else {
						_this10.__remove_update_notifications(response.update_data);
					}
					if ('undefined' !== typeof update_version) {
						$('#footer-upgrade strong').html(update_version.substr(4));
					}
					$('#result').css('display', 'block').html('<div class="updated"><p>' + response.message + '</p></div>').delay(5000).slideUp(2000);
				} else {
					$('#result').css('display', 'block').html('<div class="updated"><p>' + response.message + '</p></div>').delay(5000).slideUp(2000);
					setTimeout(function () {
						return location.reload();
					}, 60000);
				}
			});
		},


		/**
   * Removes update notification elements
   */
		__remove_update_notifications: function __remove_update_notifications(data) {
			$('#wp-admin-bar-updates').remove();
			$('.update-nag').remove();
			$('.update-plugins').remove();
		},


		/**
   * Update notification elements
   */
		__update_notifications: function __update_notifications(data) {
			$('.update-nag').remove();
			$('#wp-admin-bar-updates').html(data.admin_bar_link);
			$('#menu-dashboard ul li:nth-child(3) a').html(data.updates_link);
			$('#menu-appearance a div:nth-child(3)').html(data.themes_link);
			$('#menu-plugins a div:nth-child(3)').html(data.plugins_link);
		},


		/**
   * Registers enable log event
   *
   * @private
   */
		__register_enable_logs_event: function __register_enable_logs_event() {
			var _this11 = this;

			$('#enable-logs').on('click', function (e) {
				e.preventDefault();
				_this11.send_command('enable_logs', {}, function (response) {
					$('#result').css('display', 'block').html('<div class="updated"><p>' + response + '</p></div>').delay(5000).slideUp(2000);
					_this11.__unblockUI();
				});
			});
		},


		/**
   * Registers clear log event
   *
   * @private
   */
		__register_clear_logs_event: function __register_clear_logs_event() {
			var _this12 = this;

			$('#clear-logs').on('click', function (e) {
				e.preventDefault();
				_this12.send_command('clear_logs', {}, function (response) {
					$('#result').css('display', 'block').html('<div class="updated"><p>' + response + '</p></div>').delay(5000).slideUp(2000);
					var column_count = $('.wp-list-table thead th').length;
					$('#the-list').html('<tr class="no-items"><td class="colspanchange" colspan="' + column_count + '">' + mpsum.logs_no_items + '</td></tr>');
					$('.tablenav-pages').remove();
					_this12.__unblockUI();
				});
			});
		},


		/**
   * Registers reset options event
   *
   * @private
   */
		__register_reset_options_event: function __register_reset_options_event() {
			var _this13 = this;

			$('#reset-options').on('click', function (e) {
				e.preventDefault();
				_this13.send_command('reset_options', {}, function (response) {
					var url = window.location.href;
					url += '&action=reset&option=reset-options';
					window.location.href = url;
				});
			});
		},


		/**
   * Register Disable Admin Bar
   *
   * @private
   */
		__register_disable_admin_bar_options_event: function __register_disable_admin_bar_options_event() {
			var _this14 = this;

			$('#adminbar').on('click', '#disable-admin-bar', function (e) {
				e.preventDefault();
				_this14.send_command('disable_admin_bar', {}, function (response) {
					$('#result').css('display', 'block').html('<div class="updated"><p>' + response.message + '</p></div>').delay(5000).slideUp(2000);
					$('#disable-admin-bar').val(mpsum.enable_admin_bar);
					$('#disable-admin-bar').attr('id', 'enable-admin-bar');
					_this14.__unblockUI();
					window.location.href = window.location.href;
				});
			});
		},


		/**
   * Register Enable Admin Bar
   *
   * @private
   */
		__register_enable_admin_bar_options_event: function __register_enable_admin_bar_options_event() {
			var _this15 = this;

			$('#adminbar').on('click', '#enable-admin-bar', function (e) {
				e.preventDefault();
				_this15.send_command('enable_admin_bar', {}, function (response) {
					$('#result').css('display', 'block').html('<div class="updated"><p>' + response.message + '</p></div>').delay(5000).slideUp(2000);
					$('#enable-admin-bar').val(mpsum.disable_admin_bar);
					$('#enable-admin-bar').attr('id', 'disable-admin-bar');
					_this15.__unblockUI();
					window.location.href = window.location.href;
				});
			});
		},


		/**
   * Renders filter links
   *
   * @param   {string} views - Filter links
   * @private
   */
		__render_filter_links: function __render_filter_links(views) {
			if ('undefined' !== views && views.length) {
				$('.subsubsub').replaceWith(views);
			}
		},


		/**
   * Renders plugin / theme rows
   *
   * @param   {string} rows - Rows of plugins / themes
   * @private
   */
		__render_rows: function __render_rows(rows) {
			if ('undefined' !== rows && rows.length) $('#the-list').html(rows);
		},


		/**
   * Renders table headers
   *
   * @param   {string} headers - Table headers
   * @private
   */
		__render_headers: function __render_headers(headers) {
			if ('undefined' !== headers && headers.length) $('thead tr, tfoot tr').html(headers);
		},


		/**
   * Renders top pagination section
   *
   * @param   {string} top - Top pagination section
   * @private
   */
		__render_pagination_top: function __render_pagination_top(top) {
			if ('undefined' !== top && 0 < top.length) {
				$('.tablenav.top .tablenav-pages').html($(top).html());
			} else {
				$('.tablenav.top .tablenav-pages').html('');
			}
		},


		/**
   * Renders bottom pagination section
   *
   * @param   {string} bottom - Bottom pagination section
   * @private
   */
		__render_pagination_bottom: function __render_pagination_bottom(bottom) {
			if ('undefined' !== bottom && 0 < bottom.length) {
				$('.tablenav.bottom .tablenav-pages').html($(bottom).html());
			} else {
				$('.tablenav.bottom .tablenav-pages').html('');
			}
		},


		/**
   * Renders whole tab
   *
   * @private
   */
		__get_tab_content_and_render: function __get_tab_content_and_render(data) {
			var _this16 = this;

			this.send_command('update_' + data.tab + '_tab', data, function (response) {
				_this16.render(response);
			});
		},


		/**
   * Register advanced tab menu event
   */
		__register_advanced_tab_menu_events: function __register_advanced_tab_menu_events() {
			$('#eum-adv-settings-menu div > div').on('click', function (e) {
				var tool = e.currentTarget.dataset.menu_name;
				$('.eum-advanced-settings-container:not(' + tool + ')').hide();
				$('#eum-adv-settings-menu div > div').removeClass('active-menu');
				$('.eum-advanced-settings-container').removeClass('active');
				$(e.currentTarget).addClass('active-menu');
				$('.eum-advanced-settings-container.' + tool).css('display', 'block').addClass('active');
				MPSUM.__advanced_section_move();

				// Modify URL for advanced tab states
				var url_params = wpAjax.unserialize(window.location.href);
				var url = '' + location.protocol + '//' + ('' + location.host + location.pathname);
				var $first_option = $($('*[data-menu_name]')[0]);
				var option = tool;
				url += '?page=' + url_params.page + '&tab=' + url_params.tab;
				if (option != $first_option.data('menu_name')) {
					url += '&option=' + option;
				}
				if ('action' in url_params && 'reset-options' == option) {
					url += '&action=' + url_params.action;
				}

				// Do not push state if URL is the same
				if (window.location.href != url) {
					history.pushState('', document.title, url);
				}
			});
		},


		/**
   * Register multisite check plugins event
   */
		__register_multisite_get_plugins_list: function __register_multisite_get_plugins_list() {
			var _this17 = this;

			$('.eum-list-plugins-action').on('click', function (e) {
				e.preventDefault();
				var $target = $(e.target);
				var plugin_file = $target.data('plugin-file');
				$target.siblings('.eum-list-plugins').html('<img src="' + mpsum.spinner + '" alt="Loading..." />');
				_this17.send_command('get_multisite_installs_from_plugin', { 'data': { 'plugin_file': plugin_file } }, function (response) {
					$target.siblings('.eum-list-plugins').html(response.message);
				}, {}, false);
			});
		},


		/**
   * Register multisite check themes event
   */
		__register_multisite_get_themes_list: function __register_multisite_get_themes_list() {
			var _this18 = this;

			$('.eum-list-themes-action').on('click', function (e) {
				e.preventDefault();
				var $target = $(e.target);
				var theme_file = $target.data('theme-file');
				$target.siblings('.eum-list-themes').html('<img src="' + mpsum.spinner + '" alt="Loading..." />');
				_this18.send_command('get_multisite_installs_from_theme', { 'data': { 'stylesheet': theme_file } }, function (response) {
					$target.siblings('.eum-list-themes').html('<div class="mpsum-message">' + response.message + '</div>');
				}, {}, false);
			});
		},


		/**
   * Register advanced tab menu event
   */
		__register_log_search_event: function __register_log_search_event() {
			var _this19 = this;

			$('#log-query-search').on('click', function (e) {
				e.preventDefault();
				e.stopImmediatePropagation();
				var data = _this19.__get_data();
				var value = $('#eum-log-search').val().trim();
				if ('' == value) {
					_this19.__get_tab_content_and_render(data);
					return;
				}
				data.is_search = true;
				data.search_term = value;
				data.view = 'search';
				_this19.__get_tab_content_and_render(data);
			});
		},


		/**
   * Registers Save settings button event
   *
   * @private
   */
		__register_logs_expand_event: function __register_logs_expand_event() {
			$('.eum-note-expand').on('click', function (e) {
				e.preventDefault();
				$(e.target).siblings('div').toggle();
			});
		}
	};
})(jQuery);