/**
 * AJAX Request Queue
 *
 * - add()
 * - remove()
 * - run()
 * - stop()
 *
 * @since 1.0.0
 */
var AstraSitesAjaxQueue = (function () {

	var requests = [];

	return {

		/**
		 * Add AJAX request
		 *
		 * @since 1.0.0
		 */
		add: function (opt) {
			requests.push(opt);
		},

		/**
		 * Remove AJAX request
		 *
		 * @since 1.0.0
		 */
		remove: function (opt) {
			if (jQuery.inArray(opt, requests) > -1)
				requests.splice($.inArray(opt, requests), 1);
		},

		/**
		 * Run / Process AJAX request
		 *
		 * @since 1.0.0
		 */
		run: function () {
			var self = this,
				oriSuc;

			if (requests.length) {
				oriSuc = requests[0].complete;

				requests[0].complete = function () {
					if (typeof (oriSuc) === 'function') oriSuc();
					requests.shift();
					self.run.apply(self, []);
				};

				jQuery.ajax(requests[0]);

			} else {

				self.tid = setTimeout(function () {
					self.run.apply(self, []);
				}, 1000);
			}
		},

		/**
		 * Stop AJAX request
		 *
		 * @since 1.0.0
		 */
		stop: function () {

			requests = [];
			clearTimeout(this.tid);
		}
	};

}());

(function ($) {

	$elscope = {};

	$.fn.isInViewport = function () {

		// If not have the element then return false!
		if (!$(this).length) {
			return false;
		}

		var elementTop = $(this).offset().top;
		var elementBottom = elementTop + $(this).outerHeight();
		var viewportTop = $(window).scrollTop();
		var viewportBottom = viewportTop + $(window).height();

		return elementBottom > viewportTop && elementTop < viewportBottom;
	};

	AstraElementorSitesAdmin = {

		visited_pages: [],
		reset_remaining_posts: 0,
		site_imported_data: null,
		backup_taken: false,
		templateData: {},
		insertData: {},
		log_file: '',
		pages_list: '',
		insertActionFlag: false,
		page_id: 0,
		site_id: 0,
		block_id: 0,
		requiredPlugins: [],
		canImport: false,
		canInsert: false,
		type: 'pages',
		action: '',
		masonryObj: [],
		index: 0,
		blockCategory: '',
		blockColor: '',
		processing: false,
		siteType: '',
		page: 1,
		per_page: 20,

		init: function () {
			this._bind();
		},

		/**
		 * Binds events for the Astra Sites.
		 *
		 * @since 1.0.0
		 * @access private
		 * @method _bind
		 */
		_bind: function () {

			if (elementorCommon) {

				let add_section_tmpl = $("#tmpl-elementor-add-section");

				if (add_section_tmpl.length > 0) {

					let action_for_add_section = add_section_tmpl.text();
					let white_label_class = '';
					let stylesheet = '';
					if (astraElementorSites.isWhiteLabeled) {
						white_label_class = " ast-elementor-white-label"
						stylesheet = '<style type="">.elementor-add-ast-site-button.ast-elementor-white-label .eicon-folder:before {content: \'' + astraElementorSites.plugin_name[0] + '\';}</style>'
					}

					action_for_add_section = action_for_add_section.replace('<div class="elementor-add-section-drag-title', stylesheet + '<div class="elementor-add-section-area-button elementor-add-ast-site-button ' + white_label_class + '" title="' + astraElementorSites.plugin_name + '"> <i class="eicon-folder"></i> </div><div class="elementor-add-section-drag-title');

					add_section_tmpl.text(action_for_add_section);

					elementor.on("preview:loaded", function () {

						let base_skeleton = wp.template('ast-template-base-skeleton');
						let header_template = $('#tmpl-ast-template-modal__header').text();

						if ($('#ast-sites-modal').length == 0) {

							$('body').append(base_skeleton());
							$elscope = $('#ast-sites-modal');
							$elscope.find('.astra-sites-content-wrap').before(header_template);
						}

						AstraElementorSitesAdmin._populate_color_filters();

						$elscope.find('.astra-blocks-category').select2();

						$elscope.find('.astra-blocks-category').on('select2:select', AstraElementorSitesAdmin._categoryChange);
						$elscope.find('#elementor-template-block-color-filter select').on('change', AstraElementorSitesAdmin._blockColorChange);

						$(elementor.$previewContents[0].body).on("click", ".elementor-add-ast-site-button", AstraElementorSitesAdmin._open);

						// Click events.
						$('body').on("click", ".ast-sites-modal__header__close", AstraElementorSitesAdmin._close);
						$('body').on("click", "#ast-sites-modal .elementor-template-library-menu-item", AstraElementorSitesAdmin._libraryClick);
						$('body').on("click", "#ast-sites-modal .theme-screenshot", AstraElementorSitesAdmin._preview);
						$('body').on("click", "#ast-sites-modal .back-to-layout", AstraElementorSitesAdmin._goBack);
						$('body').on("click", AstraElementorSitesAdmin._closeTooltip);

						$(document).on("click", "#ast-sites-modal .ast-library-template-insert", AstraElementorSitesAdmin._insert);
						$(document).on("click", ".ast-import-elementor-template", AstraElementorSitesAdmin._importTemplate);
						$('body').on("click", "#ast-sites-modal .astra-sites-tooltip-icon", AstraElementorSitesAdmin._toggleTooltip);
						$(document).on("click", ".elementor-template-library-menu-item", AstraElementorSitesAdmin._toggle);
						$(document).on('click', '#ast-sites-modal .astra-sites__sync-wrap', AstraElementorSitesAdmin._sync);
						$(document).on('click', '#ast-sites-modal .ast-sites-modal__header__logo, #ast-sites-modal .back-to-layout-button', AstraElementorSitesAdmin._home);
						$(document).on('click', '#ast-sites-modal .notice-dismiss', AstraElementorSitesAdmin._dismiss);
						$(document).on('click', '#ast-sites-modal .elementor-template-library-template-insert.ast-block-insert', AstraElementorSitesAdmin._insert_from_link);

						// Other events.
						$elscope.find('.astra-sites-content-wrap').scroll(AstraElementorSitesAdmin._loadLargeImages);
						$(document).on('keyup input', '#ast-sites-modal #wp-filter-search-input', AstraElementorSitesAdmin._search);
						$(document).on('change', '#ast-sites-modal .elementor-template-library-order-input', AstraElementorSitesAdmin._changeType);

						// Triggers.
						$(document).on("astra-sites__elementor-open-after", AstraElementorSitesAdmin._initSites);
						$(document).on("astra-sites__elementor-open-before", AstraElementorSitesAdmin._beforeOpen);
						$(document).on("astra-sites__elementor-plugin-check", AstraElementorSitesAdmin._pluginCheck);
						$(document).on('astra-sites__elementor-close-before', AstraElementorSitesAdmin._beforeClose);

						$(document).on('astra-sites__elementor-do-step-1', AstraElementorSitesAdmin._step1);
						$(document).on('astra-sites__elementor-do-step-2', AstraElementorSitesAdmin._step2);

						$(document).on('astra-sites__elementor-goback-step-1', AstraElementorSitesAdmin._goStep1);
						$(document).on('astra-sites__elementor-goback-step-2', AstraElementorSitesAdmin._goStep2);

						// Plugin install & activate.
						$(document).on('wp-plugin-installing', AstraElementorSitesAdmin._pluginInstalling);
						$(document).on('wp-plugin-install-error', AstraElementorSitesAdmin._installError);
						$(document).on('wp-plugin-install-success', AstraElementorSitesAdmin._installSuccess);

					});
				}
			}

		},

		_populate_color_filters: function() {

			if( ! Object.keys( astraElementorSites.astra_blocks ).length ) {
				return;
			}

			let template = wp.template('ast-template-block-color-filters');

			var colorFilters = [];

			for( block_id in astraElementorSites.astra_blocks ) {
				if( astraElementorSites.astra_blocks[ block_id ]['filter'] && ! colorFilters.includes( astraElementorSites.astra_blocks[ block_id ]['filter'] )) {
					colorFilters.push( astraElementorSites.astra_blocks[ block_id ]['filter'] );
				}
			}

			if( colorFilters.length <= 1 ) {
				return;
			}

			$( '#elementor-template-block-color-filter' ).show().html( template( colorFilters ) );

		},

		_paginateBlocks: function () {
			if (AstraElementorSitesAdmin.type == 'blocks') {
				if (undefined != $elscope.find('.astra-sites-library-template:last').offset()) {
					if (($('.dialog-widget-content').scrollTop() + 600) >= ($elscope.find('.astra-sites-library-template:last').offset().top)) {
						AstraElementorSitesAdmin.page = (AstraElementorSitesAdmin.page + 1);
						// Set listing HTML.
						AstraElementorSitesAdmin._appendPaginationBlocks(astraElementorSites.astra_blocks);
					}
				}
			}
		},

		_changeType: function () {
			AstraElementorSitesAdmin.siteType = $(this).val();
			$elscope.find('#wp-filter-search-input').trigger('keyup');
		},

		_categoryChange: function (event) {
			AstraElementorSitesAdmin.blockCategory = $(this).val();
			$elscope.find('#wp-filter-search-input').trigger('keyup');
		},

		_blockColorChange: function (event) {
			AstraElementorSitesAdmin.blockColor = $(this).val();
			$elscope.find('#wp-filter-search-input').trigger('keyup');
		},

		_dismiss: function () {
			$(this).closest('.ast-sites-floating-notice-wrap').removeClass('slide-in');
			$(this).closest('.ast-sites-floating-notice-wrap').addClass('slide-out');

			setTimeout(function () {
				$(this).closest('.ast-sites-floating-notice-wrap').removeClass('slide-out');
			}, 200);

			if ($(this).closest('.ast-sites-floating-notice-wrap').hasClass('refreshed-notice')) {
				$.ajax({
					url: astraElementorSites.ajaxurl,
					type: 'POST',
					data: {
						action: 'astra-sites-update-library-complete',
					},
				}).done(function (response) {
					$('#ast-sites-floating-notice-wrap-id').toggle();
				});

			}
		},

		_done: function (data) {

			console.groupEnd('Process Done.');

			var str = (AstraElementorSitesAdmin.type == 'pages') ? astraElementorSites.template : astraElementorSites.block;
			$elscope.find('.ast-import-elementor-template').removeClass('installing');
			$elscope.find('.ast-import-elementor-template').attr('data-demo-link', data.data.link);
			setTimeout(function () {
				$elscope.find('.ast-import-elementor-template').text('View Saved ' + str);
				$elscope.find('.ast-import-elementor-template').addClass('action-done');
			}, 200);
		},

		_beforeClose: function () {
			if (AstraElementorSitesAdmin.action == 'insert') {
				$elscope.find('.ast-library-template-insert').removeClass('installing');
				$elscope.find('.ast-library-template-insert').text('Imported');
				$elscope.find('.ast-library-template-insert').addClass('action-done');

				if ($elscope.find('.ast-sites-floating-notice-wrap').hasClass('slide-in')) {

					$elscope.find('.ast-sites-floating-notice-wrap').removeClass('slide-in');
					$elscope.find('.ast-sites-floating-notice-wrap').addClass('slide-out');

					setTimeout(function () {
						$elscope.find('.ast-sites-floating-notice-wrap').removeClass('slide-out');
					}, 200);
				}
			}
		},

		_closeTooltip: function (event) {

			if (
				event.target.className !== "ast-tooltip-wrap" &&
				event.target.className !== "dashicons dashicons-editor-help"
			) {
				var wrap = $elscope.find('.ast-tooltip-wrap');
				if (wrap.hasClass('ast-show-tooltip')) {
					$elscope.find('.ast-tooltip-wrap').removeClass('ast-show-tooltip');
				}
			}
		},

		_sync: function (event) {

			event.preventDefault();
			var button = $(this).find('.astra-sites-sync-library-button');

			if (button.hasClass('updating-message')) {
				return;
			}

			button.addClass('updating-message');
			$elscope.find('#ast-sites-floating-notice-wrap-id').show().removeClass('error');
			$elscope.find('#ast-sites-floating-notice-wrap-id .ast-sites-floating-notice').html('<span class="message">Syncing template library in the background. The process can take anywhere between 2 to 3 minutes. We will notify you once done.<span><button type="button" class="notice-dismiss"><span class="screen-reader-text">' + astraElementorSites.dismiss_text + '</span></button>');
			$elscope.find('#ast-sites-floating-notice-wrap-id').addClass('slide-in').removeClass('refreshed-notice');

			$.ajax({
				url: astraElementorSites.ajaxurl,
				type: 'POST',
				data: {
					action: 'astra-sites-update-library',
				},
			})
				.fail(function (jqXHR) {
					console.log(jqXHR);
				})
				.done(function (response) {

					if (response.success) {
						if ('updated' === response.data) {
							$elscope.find('#ast-sites-floating-notice-wrap-id').addClass('refreshed-notice').find('.ast-sites-floating-notice').html('<span class="message">' + astraElementorSites.syncCompleteMessage + '</span><button type="button" class="notice-dismiss"><span class="screen-reader-text">' + astraElementorSites.dismiss_text + '</span></button>');
							button.removeClass('updating-message');
							console.log('Already sync all the sites.');
						} else {

							// Import categories.
							$.ajax({
								url: astraElementorSites.ajaxurl,
								type: 'POST',
								data: {
									action: 'astra-sites-import-all-categories-and-tags',
								},
							})
								.fail(function (jqXHR) {
									console.log(jqXHR);
								});


							// Import categories.
							$.ajax({
								url: astraElementorSites.ajaxurl,
								type: 'POST',
								data: {
									action: 'astra-sites-import-all-categories',
								},
							})
								.fail(function (jqXHR) {
									console.log(jqXHR);
								});

							// Import Blocks.
							$.ajax({
								url: astraElementorSites.ajaxurl,
								type: 'POST',
								data: {
									action: 'astra-sites-get-blocks-request-count',
								},
								beforeSend: function () {
									console.groupCollapsed('Updating Blocks');
									console.log('Updating Blocks');
								},
							})
								.fail(function (jqXHR) {
									console.log(jqXHR, 'error');
									console.error(jqXHR.status + jqXHR.statusText, 'Blocks Count Request Failed!', jqXHR);
									console.groupEnd('Updating Blocks');
								})
								.done(function (response) {
									console.log(response);
									if (response.success) {
										var total = response.data;

										for (let i = 1; i <= total; i++) {
											AstraSitesAjaxQueue.add({
												url: astraElementorSites.ajaxurl,
												type: 'POST',
												data: {
													action: 'astra-sites-import-blocks',
													page_no: i,
													_ajax_nonce: astraElementorSites._ajax_nonce,
												},
												beforeSend: function () {
													console.groupCollapsed('Importing Blocks - Page ' + i);
													console.log('Importing Blocks - Page ' + i);
												},
												success: function (response) {
													console.log(response);
													console.groupEnd('Importing Blocks - Page ' + i);
												}
											});
										}

										// Run the AJAX queue.
										AstraSitesAjaxQueue.run();
									} else {
										console.error(response.data, 'Blocks Count Request Failed!');
									}
								});

							// Import Block Categories.
							$.ajax({
								url: astraElementorSites.ajaxurl,
								type: 'POST',
								data: {
									action: 'astra-sites-import-block-categories',
								},
							})
								.fail(function (jqXHR) {
									console.log(jqXHR);
								});

							$.ajax({
								url: astraElementorSites.ajaxurl,
								type: 'POST',
								data: {
									action: 'astra-sites-get-sites-request-count',
								},
							})
								.fail(function (jqXHR) {
									console.log(jqXHR);
								})
								.done(function (response) {
									if (response.success) {
										var total = response.data;

										for (let i = 1; i <= total; i++) {
											AstraSitesAjaxQueue.add({
												url: astraElementorSites.ajaxurl,
												type: 'POST',
												data: {
													action: 'astra-sites-import-sites',
													page_no: i,
													_ajax_nonce: astraElementorSites._ajax_nonce,
												},
												success: function (result) {

													if (i === total && astraElementorSites.syncCompleteMessage) {
														button.removeClass('updating-message');
														$elscope.find('#ast-sites-floating-notice-wrap-id').addClass('refreshed-notice').find('.ast-sites-floating-notice').html('<span class="message">' + astraElementorSites.syncCompleteMessage + '</span><button type="button" class="notice-dismiss"><span class="screen-reader-text">' + astraElementorSites.dismiss_text + '</span></button>');
													}
												}
											});
										}

										// Run the AJAX queue.
										AstraSitesAjaxQueue.run();
									}
								});
						}
					}
				});
		},

		_toggleTooltip: function (e) {

			var wrap = $elscope.find('.ast-tooltip-wrap');


			if (wrap.hasClass('ast-show-tooltip')) {
				$elscope.find('.ast-tooltip-wrap').removeClass('ast-show-tooltip');
			} else {
				$elscope.find('.ast-tooltip-wrap').addClass('ast-show-tooltip');
			}
		},

		_toggle: function (e) {
			$elscope.find('.elementor-template-library-menu-item').removeClass('elementor-active');

			$elscope.find('.dialog-lightbox-content').hide();

			$elscope.find('.theme-preview').hide();
			$elscope.find('.theme-preview').html('');
			$elscope.find('.theme-preview-block').hide();
			$elscope.find('.theme-preview-block').html('');
			$elscope.find('.ast-template-library-toolbar').show();

			$elscope.find('.dialog-lightbox-content').hide();
			$elscope.find('.dialog-lightbox-content-block').hide();

			$(this).addClass('elementor-active');
			let data_type = $(this).data('template-type');

			AstraElementorSitesAdmin.type = data_type;
			AstraElementorSitesAdmin._switchTo(data_type);
		},

		_home: function () {
			if (AstraElementorSitesAdmin.processing) {
				return;
			}
			$elscope.find('#wp-filter-search-input').val('');
			// Hide Back button.
			$elscope.find('.back-to-layout').css('visibility', 'hidden');
			$elscope.find('.back-to-layout').css('opacity', '0');
			$elscope.find('.elementor-template-library-menu-item:first-child').trigger('click');
		},

		_switchTo: function (type) {
			if ('pages' == type) {
				AstraElementorSitesAdmin._initSites();
				$elscope.find('.dialog-lightbox-content').show();
				$elscope.find('.astra-blocks-category-inner-wrap').hide();
				$elscope.find('.astra-blocks-filter-inner-wrap').hide();
				$elscope.find('.elementor-template-library-order').show();
			} else {
				AstraElementorSitesAdmin._initBlocks();
				$elscope.find('.dialog-lightbox-content-block').show();
				$elscope.find('.astra-blocks-category-inner-wrap').show();
				$elscope.find('.astra-blocks-filter-inner-wrap').show();
				$elscope.find('.elementor-template-library-order').hide();
			}
			$elscope.find('.astra-sites-content-wrap').trigger('scroll');
		},

		_importWPForm: function (wpforms_url, callback) {

			if ( ! wpforms_url) {
				if (callback && typeof callback == "function") {
					callback('');
				}
				return;
			}

			$.ajax({
				url: astraElementorSites.ajaxurl,
				type: 'POST',
				dataType: 'json',
				data: {
					action: 'astra-sites-import-wpforms',
					wpforms_url: wpforms_url,
					_ajax_nonce: astraElementorSites._ajax_nonce,
				},
				beforeSend: function () {
					console.groupCollapsed('Importing WP Forms');
				},
			})
				.fail(function (jqXHR) {
					console.log(jqXHR.status + ' ' + jqXHR.responseText, true);
					console.groupEnd();
				})
				.done(function (data) {

					// 1. Fail - Import WPForms Options.
					if (false === data.success) {
						console.log(data.data);
						console.groupEnd();
					} else {
						if (callback && typeof callback == "function") {
							callback(data);
						}
					}
				});
		},

		_createTemplate: function () {

			let url = AstraElementorSitesAdmin.templateData['astra-page-api-url'];

			if( AstraElementorSitesAdmin.type == 'blocks' ) {
				url = astraElementorSites.ApiURL + 'astra-blocks/' + AstraElementorSitesAdmin.block_id.replace( 'id-', "" );
			}

			console.groupEnd();

			// Work with JSON page here
			$.ajax({
				url: astraElementorSites.ajaxurl,
				type: 'POST',
				dataType: 'json',
				data: {
					'action': 'astra-sites-create-template',
					'id' : (AstraElementorSitesAdmin.type == 'pages') ? AstraElementorSitesAdmin.page_id : AstraElementorSitesAdmin.block_id,
					'url' : url,
					'title': (AstraElementorSitesAdmin.type == 'pages') ? astraElementorSites.default_page_builder_sites[AstraElementorSitesAdmin.site_id]['title'] : '',
					'type': AstraElementorSitesAdmin.type,
					'_ajax_nonce': astraElementorSites._ajax_nonce,
				},
				beforeSend: function () {
					console.groupCollapsed('Creating Template');
				}
			})
				.fail(function (jqXHR) {
					console.log(jqXHR);
				})
				.done(function (data) {
					AstraElementorSitesAdmin._done(data);
				});
		},

		/**
		 * Install All Plugins.
		 */
		_installAllPlugins: function (not_installed) {

			$.each(not_installed, function (index, single_plugin) {

				console.log('Installing Plugin - ' + single_plugin.name);

				// Add each plugin activate request in Ajax queue.
				// @see wp-admin/js/updates.js
				wp.updates.queue.push({
					action: 'install-plugin', // Required action.
					data: {
						slug: single_plugin.slug
					}
				});
			});

			// Required to set queue.
			wp.updates.queueChecker();
		},

		/**
		 * Activate All Plugins.
		 */
		_activateAllPlugins: function (activate_plugins) {

			$.each(activate_plugins, function (index, single_plugin) {

				console.log('Activating Plugin - ' + single_plugin.name);

				AstraSitesAjaxQueue.add({
					url: astraElementorSites.ajaxurl,
					type: 'POST',
					data: {
						'action': 'astra-required-plugin-activate',
						'init': single_plugin.init,
						'_ajax_nonce': astraElementorSites._ajax_nonce,
					},
					success: function (result) {

						if (result.success) {

							var pluginsList = AstraElementorSitesAdmin.requiredPlugins.inactive;

							// Reset not installed plugins list.
							AstraElementorSitesAdmin.requiredPlugins.inactive = AstraElementorSitesAdmin._removePluginFromQueue(single_plugin.slug, pluginsList);

							// Enable Demo Import Button
							AstraElementorSitesAdmin._enableImport();
						}
					}
				});
			});
			AstraSitesAjaxQueue.run();
		},

		/**
		 * Remove plugin from the queue.
		 */
		_removePluginFromQueue: function (removeItem, pluginsList) {
			return jQuery.grep(pluginsList, function (value) {
				return value.slug != removeItem;
			});
		},

		/**
		 * Get plugin from the queue.
		 */
		_getPluginFromQueue: function (item, pluginsList) {

			var match = '';
			for (ind in pluginsList) {
				if (item == pluginsList[ind].slug) {
					match = pluginsList[ind];
				}
			}
			return match;
		},

		_bulkPluginInstallActivate: function () {

			console.groupCollapsed('Bulk Plugin Install Process Started');

			// If has class the skip-plugins then,
			// Avoid installing 3rd party plugins.
			var not_installed = AstraElementorSitesAdmin.requiredPlugins.notinstalled || '';
			var activate_plugins = AstraElementorSitesAdmin.requiredPlugins.inactive || '';

			console.log(AstraElementorSitesAdmin.requiredPlugins);

			// First Install Bulk.
			if (not_installed.length > 0) {
				AstraElementorSitesAdmin._installAllPlugins(not_installed);
			}

			// Second Activate Bulk.
			if (activate_plugins.length > 0) {
				AstraElementorSitesAdmin._activateAllPlugins(activate_plugins);
			}

			if (activate_plugins.length <= 0 && not_installed.length <= 0) {
				AstraElementorSitesAdmin._enableImport();
			}
		},

		_importTemplate: function (e) {

			if (!AstraElementorSitesAdmin.canImport) {
				if ($(this).attr('data-demo-link') != undefined) {
					window.open($(this).attr('data-demo-link'), '_blank');
				}
				return;
			}

			AstraElementorSitesAdmin.canImport = false;

			var str = (AstraElementorSitesAdmin.type == 'pages') ? astraElementorSites.template : astraElementorSites.block;

			$(this).addClass('installing');
			$(this).text('Saving ' + str + '...');

			AstraElementorSitesAdmin.action = 'import';

			AstraElementorSitesAdmin._bulkPluginInstallActivate();
		},

		_unescape: function (input_string) {
			var title = _.unescape(input_string);

			// @todo check why below character not escape with function _.unescape();
			title = title.replace('&#8211;', '-');

			return title;
		},

		_unescape_lower: function (input_string) {
			input_string = $("<textarea/>").html(input_string).text()
			var input_string = AstraElementorSitesAdmin._unescape(input_string);
			return input_string.toLowerCase();
		},

		_search: function () {

			let search_term = $(this).val() || '';
			search_term = search_term.toLowerCase();

			if ('pages' == AstraElementorSitesAdmin.type) {

				var items = AstraElementorSitesAdmin._getSearchedPages(search_term);

				if (search_term.length) {
					$(this).addClass('has-input');
					AstraElementorSitesAdmin._addSites(items);
				} else {
					$(this).removeClass('has-input');
					AstraElementorSitesAdmin._appendSites(astraElementorSites.default_page_builder_sites);
				}
			} else {

				var items = AstraElementorSitesAdmin._getSearchedBlocks(search_term);

				if (search_term.length) {
					$(this).addClass('has-input');
					AstraElementorSitesAdmin._appendBlocks(items);
				} else {
					$(this).removeClass('has-input');
					AstraElementorSitesAdmin._appendBlocks(astraElementorSites.astra_blocks);
				}
			}
		},

		_getSearchedPages: function (search_term) {
			var items = [];
			search_term = search_term.toLowerCase();

			for (site_id in astraElementorSites.default_page_builder_sites) {

				var current_site = astraElementorSites.default_page_builder_sites[site_id];

				// Check in site title.
				if (current_site['title']) {
					var site_title = AstraElementorSitesAdmin._unescape_lower(current_site['title']);

					if (site_title.toLowerCase().includes(search_term)) {

						for (page_id in current_site['pages']) {

							items[page_id] = current_site['pages'][page_id];
							items[page_id]['type'] = 'page';
							items[page_id]['site_id'] = site_id;
							items[page_id]['astra-sites-type'] = current_site['astra-sites-type'] || '';
							items[page_id]['parent-site-name'] = current_site['title'] || '';
							items[page_id]['pages-count'] = 0;
						}
					}
				}

				// Check in page title.
				if (Object.keys(current_site['pages']).length) {
					var pages = current_site['pages'];

					for (page_id in pages) {

						// Check in site title.
						if (pages[page_id]['title']) {

							var page_title = AstraElementorSitesAdmin._unescape_lower(pages[page_id]['title']);

							if (page_title.toLowerCase().includes(search_term)) {
								items[page_id] = pages[page_id];
								items[page_id]['type'] = 'page';
								items[page_id]['site_id'] = site_id;
								items[page_id]['astra-sites-type'] = current_site['astra-sites-type'] || '';
								items[page_id]['parent-site-name'] = current_site['title'] || '';
								items[page_id]['pages-count'] = 0;
							}
						}

					}
				}
			}

			return items;
		},

		_getSearchedBlocks: function (search_term) {

			var items = [];

			if (search_term.length) {

				for (block_id in astraElementorSites.astra_blocks) {

					var current_site = astraElementorSites.astra_blocks[block_id];

					// Check in site title.
					if (current_site['title']) {
						var site_title = AstraElementorSitesAdmin._unescape_lower(current_site['title']);

						if (site_title.toLowerCase().includes(search_term)) {
							items[block_id] = current_site;
							items[block_id]['type'] = 'site';
							items[block_id]['site_id'] = block_id;
						}
					}

				}
			}

			return items;
		},

		_addSites: function (data) {

			if (data) {
				let single_template = wp.template('astra-sites-search');
				pages_list = single_template(data);
				$elscope.find('.dialog-lightbox-content').html(pages_list);
				AstraElementorSitesAdmin._loadLargeImages();

			} else {
				$elscope.find('.dialog-lightbox-content').html(wp.template('astra-sites-no-sites'));
			}
		},

		_appendSites: function (data) {

			let single_template = wp.template('astra-sites-list');
			pages_list = single_template(data);
			$elscope.find('.dialog-lightbox-message-block').hide();
			$elscope.find('.dialog-lightbox-message').show();
			$elscope.find('.dialog-lightbox-content').html(pages_list);
			AstraElementorSitesAdmin._loadLargeImages();
		},

		_appendBlocks: function (data) {

			let single_template = wp.template('astra-blocks-list');
			let blocks_list = single_template(data);
			$elscope.find('.dialog-lightbox-message').hide();
			$elscope.find('.dialog-lightbox-message-block').show();
			$elscope.find('.dialog-lightbox-content-block').html(blocks_list);
			AstraElementorSitesAdmin._masonry();
		},

		_appendPaginationBlocks: function (data) {

			let single_template = wp.template('astra-blocks-list');
			let blocks_list = single_template(data);
			$elscope.find('.dialog-lightbox-message').hide();
			$elscope.find('.dialog-lightbox-message-block').show();
			$elscope.find('.dialog-lightbox-content-block').append(blocks_list);
			AstraElementorSitesAdmin._masonry();
		},

		_masonry: function () {

			//create empty var masonryObj
			var masonryObj;
			var container = document.querySelector('.dialog-lightbox-content-block');
			// initialize Masonry after all images have loaded
			imagesLoaded(container, function () {
				masonryObj = new Masonry(container, {
					itemSelector: '.astra-sites-library-template'
				});
			});
		},

		_enableImport: function () {

			console.log('Required Plugins Process Done.');
			console.groupEnd();

			if ('pages' == AstraElementorSitesAdmin.type) {

				AstraElementorSitesAdmin._importWPForm(AstraElementorSitesAdmin.templateData['astra-site-wpforms-path'], function (form_response) {

					$.ajax({
						url: astraElementorSites.ajaxurl,
						type: 'POST',
						data: {
							action: 'astra-sites-remote-request',
							url: AstraElementorSitesAdmin.templateData['astra-page-api-url'],
							_ajax_nonce: astraElementorSites._ajax_nonce,
						},
						beforeSend: function () {
							console.groupCollapsed('Get Template Details.');
						},
					})
					.fail(function (jqXHR) {
						console.log(jqXHR);
						console.groupEnd();
					})
					.done(function (response) {
						console.log( response );
						console.groupEnd();

						if( response.success ) {
							AstraElementorSitesAdmin.insertData = response.data;
							if ('insert' == AstraElementorSitesAdmin.action) {
								AstraElementorSitesAdmin._insertDemo(response.data);
							} else {
								AstraElementorSitesAdmin._createTemplate();
							}
						}
					});
				});

			} else {

				let url = (undefined != AstraElementorSitesAdmin.templateData['post-meta']) ? AstraElementorSitesAdmin.templateData['post-meta']['astra-site-wpforms-path'] : '';

				AstraElementorSitesAdmin._importWPForm(url, function (form_response) {
					AstraElementorSitesAdmin.insertData = AstraElementorSitesAdmin.templateData;
					if ('insert' == AstraElementorSitesAdmin.action) {
						AstraElementorSitesAdmin._insertDemo(AstraElementorSitesAdmin.templateData);
					} else {
						AstraElementorSitesAdmin._createTemplate();
					}
				});


			}
		},

		_insert_from_link: function (e) {

			if (AstraElementorSitesAdmin.processing) {
				return;
			}

			AstraElementorSitesAdmin.processing = true;

			$elscope.find('.astra-sites-content-wrap').addClass('processing');

			console.groupCollapsed('Inserting Demo.');

			$(this).find('.elementor-button-title').text('Processing..');

			AstraElementorSitesAdmin.page_id = $(this).closest('.astra-theme').data('template-id');
			AstraElementorSitesAdmin.block_id = $(this).closest('.astra-theme').data('block-id');

			let actual_id = 0;
			AstraElementorSitesAdmin.canInsert = true;

			if (AstraElementorSitesAdmin.type == 'pages') {
				actual_id = AstraElementorSitesAdmin.page_id.replace('id-', '');
			} else {
				actual_id = AstraElementorSitesAdmin.block_id.replace('id-', '');
			}

			if (0 != actual_id) {

				console.log('Checking Required Plugin status.');

				var api_post = {
					slug: 'site-pages' + '/' + actual_id
				};

				if ('blocks' == AstraElementorSitesAdmin.type) {
					api_post = {
						slug: 'astra-blocks' + '/' + actual_id
					};
				}

				var params = {
					method: 'GET',
					cache: 'default',
				};

				fetch(astraElementorSites.ApiURL + api_post.slug, params).then(response => {
					if (response.status === 200) {
						return response.json().then(items => ({
							items: items,
							items_count: response.headers.get('x-wp-total'),
							item_pages: response.headers.get('x-wp-totalpages'),
						}))
					} else {
						return response.json();
					}
				})
					.then(data => {
						if ('object' === typeof data) {
							if (undefined !== data && undefined !== data['items']) {
								AstraElementorSitesAdmin.templateData = data['items'];
								let requiredPlugins = [];
								if (AstraElementorSitesAdmin.type == 'pages') {

									if (undefined !== AstraElementorSitesAdmin.templateData['site-pages-required-plugins']) {
										requiredPlugins = AstraElementorSitesAdmin.templateData['site-pages-required-plugins'];
									}
								} else {
									if (undefined !== AstraElementorSitesAdmin.templateData['post-meta']['astra-blocks-required-plugins']) {
										requiredPlugins = AstraElementorSitesAdmin.templateData['post-meta']['astra-blocks-required-plugins'];
									}
								}
								if (undefined != requiredPlugins && null != requiredPlugins && requiredPlugins.length > 0) {

									$.ajax({
										url: astraElementorSites.ajaxurl,
										type: 'POST',
										data: {
											action: 'astra-required-plugins',
											_ajax_nonce: astraElementorSites._ajax_nonce,
											required_plugins: requiredPlugins
										},
									})
										.fail(function (jqXHR) {
											console.log(jqXHR);
											console.groupEnd();
										})
										.done(function (response) {
											AstraElementorSitesAdmin.requiredPlugins = response.data['required_plugins'];
											AstraElementorSitesAdmin.canImport = true;
											AstraElementorSitesAdmin.canInsert = true;
										});
								}
							}
						}

						console.log('Insert Process for Demo "' + actual_id + '" has started.');

						AstraElementorSitesAdmin.canInsert = false;
						AstraElementorSitesAdmin.action = 'insert';
						AstraElementorSitesAdmin._bulkPluginInstallActivate();
					});

			} else {
				AstraElementorSitesAdmin.canInsert = true;
				AstraElementorSitesAdmin.processing = false;
				$elscope.find('.astra-sites-content-wrap').removeClass('processing');
				console.log('Import Failed. Error: Incorrect Import ID');
				$(this).find('.elementor-button-title').text('Insert');
			}

		},

		_insert: function (e) {

			if (!AstraElementorSitesAdmin.canInsert) {
				return;
			}

			AstraElementorSitesAdmin.canInsert = false;
			var str = (AstraElementorSitesAdmin.type == 'pages') ? astraElementorSites.template : astraElementorSites.block;

			$(this).addClass('installing');
			$(this).text('Importing ' + str + '...');

			AstraElementorSitesAdmin.action = 'insert';

			AstraElementorSitesAdmin._bulkPluginInstallActivate();
		},

		_insertDemo: function (data) {

			if (undefined !== data && undefined !== data['post-meta']['_elementor_data']) {

				let templateModel = new Backbone.Model({
					getTitle() {
						return data['title']
					},
				});
				let page_content = JSON.parse(data['post-meta']['_elementor_data']);
				let page_settings = '';
				let api_url = '';

				if ('blocks' == AstraElementorSitesAdmin.type) {
					api_url = astraElementorSites.ApiURL + 'astra-blocks/' + data['id'] + '/';
				} else {
					api_url = AstraElementorSitesAdmin.templateData['astra-page-api-url'] + '/';
				}

				$.ajax({
					url: astraElementorSites.ajaxurl,
					type: 'POST',
					data: {
						action: 'astra-page-elementor-insert-page',
						id: elementor.config.document.id,
						url: api_url,
						_ajax_nonce: astraElementorSites._ajax_nonce,
					},
					beforeSend: function () {
						console.groupCollapsed('Inserting Demo.');
					},
				})
					.fail(function (jqXHR) {
						console.log(jqXHR);
						console.groupEnd();
					})
					.done(function (response) {

						AstraElementorSitesAdmin.processing = false;
						$elscope.find('.astra-sites-content-wrap').removeClass('processing');

						page_content = response.data;

						page_content = page_content.map(function (item) {
							item.id = Math.random().toString(36).substr(2, 7);
							return item;
						});

						console.log(page_content);
						console.groupEnd();
						if (undefined !== page_content && '' !== page_content) {
							if (undefined != $e && 'undefined' != typeof $e.internal) {
								elementor.channels.data.trigger('document/import', templateModel);
								elementor.getPreviewView().addChildModel(page_content, { at: AstraElementorSitesAdmin.index } || {});
								elementor.channels.data.trigger('template:after:insert', {});
								$e.internal('document/save/set-is-modified', { status: true })
							} else {
								elementor.channels.data.trigger('document/import', templateModel);
								elementor.getPreviewView().addChildModel(page_content, { at: AstraElementorSitesAdmin.index } || {});
								elementor.channels.data.trigger('template:after:insert', {});
								elementor.saver.setFlagEditorChange(true);
							}
						}
						AstraElementorSitesAdmin.insertActionFlag = true;
						AstraElementorSitesAdmin._close();
					});
			}
		},

		_goBack: function (e) {

			if (AstraElementorSitesAdmin.processing) {
				return;
			}

			let step = $(this).attr('data-step');

			$elscope.find('#ast-sites-floating-notice-wrap-id.error').hide();

			$elscope.find('.astra-sites-step-1-wrap').show();
			$elscope.find('.astra-preview-actions-wrap').remove();

			$elscope.find('.ast-template-library-toolbar').show();
			$elscope.find('.ast-sites-modal__header').removeClass('ast-preview-mode');

			if ('pages' == AstraElementorSitesAdmin.type) {

				if (3 == step) {
					$(this).attr('data-step', 2);
					$(document).trigger('astra-sites__elementor-goback-step-2');
				} else if (2 == step) {
					$(this).attr('data-step', 1);
					$(document).trigger('astra-sites__elementor-goback-step-1');
				}
			} else {
				$(this).attr('data-step', 1);
				$(document).trigger('astra-sites__elementor-goback-step-1');
			}

			$elscope.find('.astra-sites-content-wrap').trigger('scroll');
		},

		_goStep1: function (e) {


			// Reset site and page ids to null.
			AstraElementorSitesAdmin.site_id = '';
			AstraElementorSitesAdmin.page_id = '';
			AstraElementorSitesAdmin.block_id = '';
			AstraElementorSitesAdmin.requiredPlugins = [];
			AstraElementorSitesAdmin.templateData = {};
			AstraElementorSitesAdmin.canImport = false;
			AstraElementorSitesAdmin.canInsert = false;

			// Hide Back button.
			$elscope.find('.back-to-layout').css('visibility', 'hidden');
			$elscope.find('.back-to-layout').css('opacity', '0');

			// Hide Preview Page.
			$elscope.find('.theme-preview').hide();
			$elscope.find('.theme-preview').html('');
			$elscope.find('.theme-preview-block').hide();
			$elscope.find('.theme-preview-block').html('');
			$elscope.find('.ast-template-library-toolbar').show();

			// Show listing page.
			if (AstraElementorSitesAdmin.type == 'pages') {

				$elscope.find('.dialog-lightbox-content').show();
				$elscope.find('.dialog-lightbox-content-block').hide();

				// Set listing HTML.
				AstraElementorSitesAdmin._appendSites(astraElementorSites.default_page_builder_sites);
			} else {

				// Set listing HTML.
				AstraElementorSitesAdmin._appendBlocks(astraElementorSites.astra_blocks);

				$elscope.find('.dialog-lightbox-content-block').show();
				$elscope.find('.dialog-lightbox-content').hide();

				if ('' !== $elscope.find('#wp-filter-search-input').val()) {
					$elscope.find('#wp-filter-search-input').trigger('keyup');
				}
			}
		},

		_goStep2: function (e) {

			// Set page and site ids.
			AstraElementorSitesAdmin.site_id = $elscope.find('#astra-blocks').data('site-id');
			AstraElementorSitesAdmin.page_id = '';

			if (undefined === AstraElementorSitesAdmin.site_id) {
				return;
			}

			// Single Preview template.
			let single_template = wp.template('astra-sites-list-search');
			let passing_data = astraElementorSites.default_page_builder_sites[AstraElementorSitesAdmin.site_id]['pages'];
			passing_data['site_id'] = AstraElementorSitesAdmin.site_id;
			pages_list = single_template(passing_data);
			$elscope.find('.dialog-lightbox-content').html(pages_list);

			// Hide Preview page.
			$elscope.find('.theme-preview').hide();
			$elscope.find('.theme-preview').html('');
			$elscope.find('.ast-template-library-toolbar').show();
			$elscope.find('.theme-preview-block').hide();
			$elscope.find('.theme-preview-block').html('');

			// Show listing page.
			$elscope.find('.dialog-lightbox-content').show();
			$elscope.find('.dialog-lightbox-content-block').hide();

			AstraElementorSitesAdmin._loadLargeImages();

			if ('' !== $elscope.find('#wp-filter-search-input').val()) {
				$elscope.find('#wp-filter-search-input').trigger('keyup');
			}
		},

		_step1: function (e) {

			if ('pages' == AstraElementorSitesAdmin.type) {

				let passing_data = astraElementorSites.default_page_builder_sites[AstraElementorSitesAdmin.site_id]['pages'];

				var count = 0;
				var one_page = [];
				var one_page_id = '';

				for (key in passing_data) {
					if (undefined == passing_data[key]['site-pages-type']) {
						continue;
					}
					if ('gutenberg' == passing_data[key]['site-pages-page-builder']) {
						continue;
					}
					count++;
					one_page = passing_data[key];
					one_page_id = key;
				}

				if (count == 1) {

					// Logic for one page sites.
					AstraElementorSitesAdmin.page_id = one_page_id;

					$elscope.find('.back-to-layout').css('visibility', 'visible');
					$elscope.find('.back-to-layout').css('opacity', '1');

					$elscope.find('.back-to-layout').attr('data-step', 2);
					$(document).trigger('astra-sites__elementor-do-step-2');

					return;
				}


				let single_template = wp.template('astra-sites-list-search');
				passing_data['site_id'] = AstraElementorSitesAdmin.site_id;
				pages_list = single_template(passing_data);
				$elscope.find('.dialog-lightbox-content-block').hide();
				$elscope.find('.astra-sites-step-1-wrap').show();
				$elscope.find('.astra-preview-actions-wrap').remove();
				$elscope.find('.theme-preview').hide();
				$elscope.find('.theme-preview').html('');
				$elscope.find('.ast-template-library-toolbar').show();
				$elscope.find('.theme-preview-block').hide();
				$elscope.find('.theme-preview-block').html('');
				$elscope.find('.dialog-lightbox-content').show();
				$elscope.find('.dialog-lightbox-content').html(pages_list);

				AstraElementorSitesAdmin._loadLargeImages();

			} else {

				$elscope.find('.dialog-lightbox-content').hide();
				$elscope.find('.dialog-lightbox-content-block').hide();
				$elscope.find('.dialog-lightbox-message').animate({ scrollTop: 0 }, 50);
				$elscope.find('.theme-preview-block').show();
				$elscope.find('.ast-template-library-toolbar').hide();
				$elscope.find('.ast-sites-modal__header').addClass('ast-preview-mode');

				// Hide.
				$elscope.find('.theme-preview').hide();
				$elscope.find('.theme-preview').html('');

				let import_template = wp.template('astra-sites-elementor-preview');
				let import_template_header = wp.template('astra-sites-elementor-preview-actions');
				let template_object = astraElementorSites.astra_blocks[AstraElementorSitesAdmin.block_id];

				template_object['id'] = AstraElementorSitesAdmin.block_id;

				preview_page_html = import_template(template_object);
				$elscope.find('.theme-preview-block').html(preview_page_html);

				$elscope.find('.astra-sites-step-1-wrap').hide();

				preview_action_html = import_template_header(template_object);
				$elscope.find('.elementor-templates-modal__header__items-area').append(preview_action_html);
				AstraElementorSitesAdmin._masonry();

				let actual_id = AstraElementorSitesAdmin.block_id.replace('id-', '');
				$(document).trigger('astra-sites__elementor-plugin-check', { 'id': actual_id });
			}
		},

		_step2: function (e) {

			$elscope.find('.dialog-lightbox-content').hide();
			$elscope.find('.dialog-lightbox-message').animate({ scrollTop: 0 }, 50);
			$elscope.find('.theme-preview').show();

			$elscope.find('.ast-sites-modal__header').addClass('ast-preview-mode');

			if (undefined === AstraElementorSitesAdmin.site_id) {
				return;
			}

			let import_template = wp.template('astra-sites-elementor-preview');
			let import_template_header = wp.template('astra-sites-elementor-preview-actions');
			let template_object = astraElementorSites.default_page_builder_sites[AstraElementorSitesAdmin.site_id]['pages'][AstraElementorSitesAdmin.page_id];

			if (undefined === template_object) {
				return;
			}

			template_object['id'] = AstraElementorSitesAdmin.site_id;

			preview_page_html = import_template(template_object);
			$elscope.find('.theme-preview').html(preview_page_html);

			$elscope.find('.astra-sites-step-1-wrap').hide();

			preview_action_html = import_template_header(template_object);
			$elscope.find('.elementor-templates-modal__header__items-area').append(preview_action_html);

			let actual_id = AstraElementorSitesAdmin.page_id.replace('id-', '');
			$(document).trigger('astra-sites__elementor-plugin-check', { 'id': actual_id });
		},

		_preview: function (e) {

			if (AstraElementorSitesAdmin.processing) {
				return;
			}

			let step = $(this).attr('data-step');

			AstraElementorSitesAdmin.site_id = $(this).closest('.astra-theme').data('site-id');
			AstraElementorSitesAdmin.page_id = $(this).closest('.astra-theme').data('template-id');
			AstraElementorSitesAdmin.block_id = $(this).closest('.astra-theme').data('block-id');

			$elscope.find('.back-to-layout').css('visibility', 'visible');
			$elscope.find('.back-to-layout').css('opacity', '1');

			$elscope.find('.ast-template-library-toolbar').hide();
			$elscope.find('.ast-sites-modal__header').removeClass('ast-preview-mode');

			if (1 == step) {

				$elscope.find('.back-to-layout').attr('data-step', 2);
				$(document).trigger('astra-sites__elementor-do-step-1');

			} else {

				$elscope.find('.back-to-layout').attr('data-step', 3);
				$(document).trigger('astra-sites__elementor-do-step-2');

			}
		},

		_pluginCheck: function (e, data) {

			var args = encodeURI( '?site_url=' + astraElementorSites.siteURL + '&version=' + astraElementorSites.version );

			var api_post = {
				slug: 'site-pages' + '/' + data['id'] + args
			};

			if ('blocks' == AstraElementorSitesAdmin.type) {
				api_post = {
					slug: 'astra-blocks' + '/' + data['id'] + args
				};
			}

			var params = {
				method: 'GET',
				cache: 'default',
			};

			fetch(astraElementorSites.ApiURL + api_post.slug, params).then(response => {
				if (response.status === 200) {
					return response.json().then(items => ({
						items: items,
						items_count: response.headers.get('x-wp-total'),
						item_pages: response.headers.get('x-wp-totalpages'),
					}))
				} else {
					//$(document).trigger( 'astra-sites-api-request-error' );
					return response.json();
				}
			})
				.then(data => {
					if ('object' === typeof data) {
						if (undefined !== data && undefined !== data['items']) {
							AstraElementorSitesAdmin.templateData = data['items'];
							if (AstraElementorSitesAdmin.type == 'pages') {

								if (undefined !== AstraElementorSitesAdmin.templateData['site-pages-required-plugins']) {
									AstraElementorSitesAdmin._requiredPluginsMarkup(AstraElementorSitesAdmin.templateData['site-pages-required-plugins']);
								}
							} else {
								if (undefined !== AstraElementorSitesAdmin.templateData['post-meta']['astra-blocks-required-plugins']) {
									AstraElementorSitesAdmin._requiredPluginsMarkup(PHP.parse(AstraElementorSitesAdmin.templateData['post-meta']['astra-blocks-required-plugins']));
								}
							}
						}
					}
				});
		},

		_requiredPluginsMarkup: function (requiredPlugins) {

			if ('' === requiredPlugins) {
				return;
			}

			if (
				AstraElementorSitesAdmin.type == 'pages' &&
				astraElementorSites.default_page_builder_sites[AstraElementorSitesAdmin.site_id]['astra-sites-type'] != undefined &&
				astraElementorSites.default_page_builder_sites[AstraElementorSitesAdmin.site_id]['astra-sites-type'] != 'free'
			) {

				if (!astraElementorSites.license_status) {

					output = '<p class="ast-validate">' + astraElementorSites.license_msg + '</p>';

					$elscope.find('.required-plugins-list').html(output);
					$elscope.find('.ast-tooltip-wrap').css('opacity', 1);
					$elscope.find('.astra-sites-tooltip').css('opacity', 1);

					/**
					 * Enable Demo Import Button
					 * @type number
					 */
					AstraElementorSitesAdmin.requiredPlugins = [];
					AstraElementorSitesAdmin.canImport = true;
					AstraElementorSitesAdmin.canInsert = true;
					$elscope.find('.astra-sites-import-template-action > div').removeClass('disabled');
					return;
				}

			}

			// Required Required.
			$.ajax({
				url: astraElementorSites.ajaxurl,
				type: 'POST',
				data: {
					action: 'astra-required-plugins',
					_ajax_nonce: astraElementorSites._ajax_nonce,
					required_plugins: requiredPlugins
				},
			})
				.fail(function (jqXHR) {
					console.log(jqXHR);
					console.groupEnd();
				})
				.done(function (response) {
					if (false === response.success) {

						$elscope = $('#ast-sites-modal');
						$elscope.find('#ast-sites-floating-notice-wrap-id').show().removeClass('error');
						$elscope.find('#ast-sites-floating-notice-wrap-id .ast-sites-floating-notice').show().html('<span class="message">Insufficient Permission. Please contact your Super Admin to allow the install required plugin permissions.<span>');
						$elscope.find('#ast-sites-floating-notice-wrap-id').addClass('error slide-in').removeClass('refreshed-notice');

					} else {
						var output = '';

						/**
						 * Count remaining plugins.
						 * @type number
						 */
						var remaining_plugins = 0;
						var required_plugins_markup = '';

						required_plugins = response.data['required_plugins'];

						if (response.data['third_party_required_plugins'].length) {
							$( response.data['third_party_required_plugins'] ).each(function (index, plugin) {
								output += '<li class="plugin-card plugin-card-' + plugin.slug + '" data-slug="' + plugin.slug + '" data-init="' + plugin.init + '" data-name="' + plugin.name + '">' + plugin.name + '</li>';
							});
						}

						/**
						 * Not Installed
						 *
						 * List of not installed required plugins.
						 */
						if (typeof required_plugins.notinstalled !== 'undefined') {

							// Add not have installed plugins count.
							remaining_plugins += parseInt(required_plugins.notinstalled.length);

							$(required_plugins.notinstalled).each(function (index, plugin) {
								if ('elementor' == plugin.slug) {
									return;
								}
								output += '<li class="plugin-card plugin-card-' + plugin.slug + '" data-slug="' + plugin.slug + '" data-init="' + plugin.init + '" data-name="' + plugin.name + '">' + plugin.name + '</li>';
							});
						}

						/**
						 * Inactive
						 *
						 * List of not inactive required plugins.
						 */
						if (typeof required_plugins.inactive !== 'undefined') {

							// Add inactive plugins count.
							remaining_plugins += parseInt(required_plugins.inactive.length);

							$(required_plugins.inactive).each(function (index, plugin) {
								if ('elementor' == plugin.slug) {
									return;
								}
								output += '<li class="plugin-card plugin-card-' + plugin.slug + '" data-slug="' + plugin.slug + '" data-init="' + plugin.init + '" data-name="' + plugin.name + '">' + plugin.name + '</li>';
							});
						}

						/**
						 * Active
						 *
						 * List of not active required plugins.
						 */
						if (typeof required_plugins.active !== 'undefined') {

							$(required_plugins.active).each(function (index, plugin) {
								if ('elementor' == plugin.slug) {
									return;
								}
								output += '<li class="plugin-card plugin-card-' + plugin.slug + '" data-slug="' + plugin.slug + '" data-init="' + plugin.init + '" data-name="' + plugin.name + '">' + plugin.name + '</li>';
							});
						}

						if ('' != output) {
							output = '<li class="plugin-card-head"><strong>' + astraElementorSites.install_plugin_text + '</strong></li>' + output;
							$elscope.find('.required-plugins-list').html(output);
							$elscope.find('.ast-tooltip-wrap').css('opacity', 1);
							$elscope.find('.astra-sites-tooltip').css('opacity', 1);
						}


						/**
						 * Enable Demo Import Button
						 * @type number
						 */
						AstraElementorSitesAdmin.requiredPlugins = response.data['required_plugins'];
						AstraElementorSitesAdmin.canImport = true;
						AstraElementorSitesAdmin.canInsert = true;
						$elscope.find('.astra-sites-import-template-action > div').removeClass('disabled');
					}
				});
		},

		_libraryClick: function (e) {
			$elscope.find(".elementor-template-library-menu-item").each(function () {
				$(this).removeClass('elementor-active');
			});
			$(this).addClass('elementor-active');
		},

		_loadLargeImage: function (el) {

			if (el.hasClass('loaded')) {
				return;
			}

			if (el.parents('.astra-theme').isInViewport()) {
				var large_img_url = el.data('src') || '';
				var imgLarge = new Image();
				imgLarge.src = large_img_url;
				imgLarge.onload = function () {
					el.removeClass('loading');
					el.addClass('loaded');
					el.css('background-image', 'url(\'' + imgLarge.src + '\'');
				};
			}
		},

		_loadLargeImages: function () {
			$elscope.find('.theme-screenshot').each(function (key, el) {
				AstraElementorSitesAdmin._loadLargeImage($(el));
			});
		},

		_close: function (e) {
			console.groupEnd('Process Done.');
			$(document).trigger('astra-sites__elementor-close-before');
			setTimeout(function () {
				$elscope.fadeOut();
				$('body').removeClass('astra-sites__elementor-open');
			}, 300);
			$(document).trigger('astra-sites__elementor-close-after');
		},

		_open: function (e) {
			$(document).trigger('astra-sites__elementor-open-before');

			$('body').addClass('astra-sites__elementor-open');

			let add_section = $(this).closest('.elementor-add-section');

			if (add_section.hasClass('elementor-add-section-inline')) {
				AstraElementorSitesAdmin.index = add_section.prevAll().length;
			} else {
				AstraElementorSitesAdmin.index = add_section.prev().children().length;
			}
			AstraElementorSitesAdmin._home();
			$elscope.fadeIn();
			if ($('.refreshed-notice').length == 1) {
				setTimeout(
					function () {
						$('.refreshed-notice').find('.notice-dismiss').click();
					},
					2500
				);
			}
			$(document).trigger('astra-sites__elementor-open-after');
		},

		_beforeOpen: function (e) {

			let userPrefersDark = matchMedia('(prefers-color-scheme: dark)').matches;
			let uiTheme = elementor.settings.editorPreferences.model.get('ui_theme');

			if ('dark' === uiTheme || ('auto' === uiTheme && userPrefersDark)) {
				$('body').addClass('ast-sites-dark-mode');
			} else {
				$('body').removeClass('ast-sites-dark-mode');
			}

			// Hide preview page.
			$elscope.find('.theme-preview').hide();
			$elscope.find('.theme-preview').html('');

			// Show site listing page.
			$elscope.find('.dialog-lightbox-content').show();

			// Hide Back button.
			$elscope.find('.back-to-layout').css('visibility', 'hidden');
			$elscope.find('.back-to-layout').css('opacity', '0');
		},

		_initSites: function (e) {
			AstraElementorSitesAdmin._appendSites(astraElementorSites.default_page_builder_sites);
			AstraElementorSitesAdmin._goBack();
		},

		_initBlocks: function (e) {
			AstraElementorSitesAdmin._appendBlocks(astraElementorSites.astra_blocks);
			AstraElementorSitesAdmin._goBack();
		},

		/**
		 * Install Success
		 */
		_installSuccess: function (event, response) {

			event.preventDefault();

			// Transform the 'Install' button into an 'Activate' button.
			var $init = $('.plugin-card-' + response.slug).data('init');
			var $name = $('.plugin-card-' + response.slug).data('name');

			// Reset not installed plugins list.
			var pluginsList = AstraElementorSitesAdmin.requiredPlugins.notinstalled;
			var curr_plugin = AstraElementorSitesAdmin._getPluginFromQueue(response.slug, pluginsList);

			AstraElementorSitesAdmin.requiredPlugins.notinstalled = AstraElementorSitesAdmin._removePluginFromQueue(response.slug, pluginsList);


			// WordPress adds "Activate" button after waiting for 1000ms. So we will run our activation after that.
			setTimeout(function () {

				console.log('Activating Plugin - ' + curr_plugin.name);

				$.ajax({
					url: astraElementorSites.ajaxurl,
					type: 'POST',
					data: {
						'action': 'astra-required-plugin-activate',
						'init': curr_plugin.init,
						'_ajax_nonce': astraElementorSites._ajax_nonce,
					},
				})
					.done(function (result) {

						if (result.success) {
							var pluginsList = AstraElementorSitesAdmin.requiredPlugins.inactive;

							console.log('Activated Plugin - ' + curr_plugin.name);

							// Reset not installed plugins list.
							AstraElementorSitesAdmin.requiredPlugins.inactive = AstraElementorSitesAdmin._removePluginFromQueue(response.slug, pluginsList);

							// Enable Demo Import Button
							AstraElementorSitesAdmin._enableImport();

						}
					});

			}, 1200);

		},

		/**
		 * Plugin Installation Error.
		 */
		_installError: function (event, response) {
			console.log(response);
			console.log('Error Installing Plugin - ' + response.slug);
			console.log(response.errorMessage);
		},

		/**
		 * Installing Plugin
		 */
		_pluginInstalling: function (event, args) {
			console.log('Installing Plugin - ' + args.slug);
		},
	};

	/**
	 * Initialize AstraElementorSitesAdmin
	 */
	$(function () {
		AstraElementorSitesAdmin.init();
	});

})(jQuery);
