# cartflows/1.1.13/assets/js/import.js

CartFlows – Funnel Builder &amp; Checkout Plugin for WooCommerce, version 1.1.13. 1,472 lines.

- Page: https://pluginprobe.com/plugins/cartflows/1.1.13/code/assets/js/import.js
- Raw: https://pluginprobe.com/plugins/cartflows/1.1.13/raw/assets/js/import.js
- Modified: 2019-04-09T12:04:34+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/cartflows/1.1.13/code/assets/js/import.js#L10-L20`.

```javascript
/**
 * AJAX Request Queue
 *
 * - add()
 * - remove()
 * - run()
 * - stop()
 *
 * @since 1.0.0
 */

var CartFlowsAjaxQueue = (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($){

	CartFlowsImport = {

		doc     : $( document ),
		wrap    : $( '.wcf-flow-steps-data-wrap' ),
		inner   : $( '.wcf-flow-steps-data-wrap-importer' ),
		post_id : $( '#post_ID' ).val(),

		_ref			: null,

		_api_step_type : {},
		_api_params		: {},

		all_steps       : 0,
		remaining_steps : 0,
		remaining_install_plugins : 0,
		remaining_active_plugins : 0,

		/**
		 * Init
		 */
		init: function()
		{
			this._bind();

			if( 'other' !== CartFlowsImportVars.default_page_builder ) {
				if( $('.post-type-cartflows_flow').hasClass('edit-php') ) {
					this._process_cache_remote_flows();
				}
				if( $('.post-type-cartflows_flow').hasClass('post-php') ) {
					this._process_cache_remote_steps();
				}
			}

			if( $('.post-type-cartflows_flow').hasClass('edit-php') && null !== this._getParamFromURL('add-new-flow') ) {
				this._render_remote_flows();
			}
			if( $('.post-type-cartflows_flow').hasClass('post-php') && null !== this._getParamFromURL('add-new-step') ) {
				this._render_remote_steps();
			}

	        if( this._getParamFromURL('highlight-step-id') ) {
	        	var selector = $('.wcf-step-wrap[data-id="'+this._getParamFromURL('highlight-step-id')+'"]');
	        	if( selector.length ) {
        		    $('html, body').animate({
				        scrollTop: selector.offset().top
				    }, 1500);
	        	}
	        }

	        if( $('.post-type-cartflows_flow').hasClass('edit-php') ) {
				var $product_screen = $( '.edit-php.post-type-cartflows_flow' ),
					$title_action   = $product_screen.find( '.page-title-action:first' );

				$title_action.after('<a href="'+CartFlowsImportVars.export_url+'" class="page-title-action">Export</a>' );
				$title_action.after('<a href="'+CartFlowsImportVars.import_url+'" class="page-title-action">Import</a>');
			}

		},

		/**
		 * Get URL param.
		 */
		_getParamFromURL: function(name, url)
		{
		    if (!url) url = window.location.href;
		    name = name.replace(/[\[\]]/g, "\\$&");
		    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
		        results = regex.exec(url);
		    if (!results) return null;
		    if (!results[2]) return '';
		    return decodeURIComponent(results[2].replace(/\+/g, " "));
		},

		/**
		 * Binds events
		 */
		_bind: function()
		{
			var self = CartFlowsImport;

			self.doc.on('click', '.wcf-install-plugin',	self._install_plugin);

			self.doc.on( 'cartflows-api-request-fail', self._api_request_failed );
			self.doc.on('click', '#wcf-get-started-steps a, .wcf-create-from-scratch-link',	self._toggle_ready_templates);
			self.doc.on('click', '.cartflows-flow-import-blank',	self._create_default_flow);
			self.doc.on('click', '#wcf-remote-flow-importer .wcf-page-builder-links a',	self._filterFlowPageBuilderClick);
			self.doc.on('click', '#wcf-remote-step-importer #wcf-categories .step-type-filter-links a', self._filterBlankStepCategoryClick );
			self.doc.on('change', '#wcf-remote-step-importer #wcf-scratch-steps-categories .step-type-filter-links', self._filterBlankStepCategoryChange );
			self.doc.on('click', '#wcf-remote-step-importer .wcf-page-builder-links a', self._filterStepPageBuilderClick );

			self.doc.on('click'                 , '.cartflows-step-import-blank:not(.get-pro)',	self._create_blank_step);
			self.doc.on('click'                 , '#wcf-remote-step-importer .cartflows-step-import',	self._process_import_step);
			self.doc.on('click'                 , '#wcf-remote-flow-importer .cartflows-step-import',	self._process_import_flow);

			self.doc.on('click'                 , '.cartflows-preview-flow-step',	self._preview_individual);

			self.doc.on( 'add_template_to_page-fail', self._add_template_to_page_fail);

			$( 'body' ).on('thickbox:iframe:loaded', 					self._previewLoaded );

			// Event's for API request.
			$( document ).on('keyup input', '#wcf-remote-step-importer .wcf-flow-search-input', 	self._remote_step_search );

			$( document ).on('click', '.actions a', 					self._previewResponsive );

			$( document ).on( 'click', '.page-title-action:first', self._render_remote_flows );
			$( document ).on( 'click', '.wcf-trigger-popup', self._render_remote_steps );

			$( document ).on( 'click', '.wcf-templates-popup-overlay', self._close_template_popup );
			$( document ).on( 'click', '.wcf-popup-close-wrap .close-icon', self._close_template_popup );

			$( document ).on('wp-plugin-install-success' , self._installSuccess);
		},

		_install_plugin: function( event ) {
			event.preventDefault();

			var btn = $( this );

			if( btn.hasClass('updating-message') ) {
				return;
			}

			$('#wcf-remote-flow-importer').addClass('request-process');
			$('#wcf-remote-step-importer').addClass('request-process');

			btn.addClass('updating-message button');

			var page_builder_plugins = CartFlowsImportVars.required_plugins[ CartFlowsImportVars.default_page_builder ]['plugins'];
			
			$.each( page_builder_plugins, function( index, plugin ) {
				if( 'install' === plugin.status ) {
					CartFlowsImport.remaining_install_plugins++;
				}
				if( 'activate' === plugin.status ) {
					CartFlowsImport.remaining_active_plugins++;
				}
			});

			// Have any plugin for install?
			if( CartFlowsImport.remaining_install_plugins ) {
				CartFlowsImport._install_all_plugins();
			} else if( CartFlowsImport.remaining_active_plugins ) {
				CartFlowsImport._activate_all_plugins();
			} else {
				if( $('#wcf-remote-flow-importer').length ) {
					CartFlowsImport._cache_remote_flows();
				} else if( $('#wcf-remote-step-importer').length ) {
					CartFlowsImport._cache_remote_steps();
				}
			}
		},

		_install_all_plugins: function() {

			var page_builder_plugins = CartFlowsImportVars.required_plugins[ CartFlowsImportVars.default_page_builder ]['plugins'];

			$.each( page_builder_plugins, function( index, plugin ) {
				if( 'install' === plugin.status ) {
					// 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: plugin.slug
						}
					} );
				}
			});

			// Required to set queue.
			wp.updates.queueChecker();
		},

		_activate_all_plugins: function() {

			if( ! CartFlowsImport.remaining_active_plugins && ! CartFlowsImport.remaining_install_plugins ) {
				if( $('#wcf-remote-flow-importer').length ) {
					CartFlowsImport._cache_remote_flows();
				} else if( $('#wcf-remote-step-importer').length ) {
					CartFlowsImport._cache_remote_steps();
				}
			} else {
				var page_builder_plugins = CartFlowsImportVars.required_plugins[ CartFlowsImportVars.default_page_builder ]['plugins'];

				// Activate ALl Plugins.
				CartFlowsAjaxQueue.stop();
				CartFlowsAjaxQueue.run();

				$.each( page_builder_plugins, function( index, plugin ) {
					if( 'activate' === plugin.status ) {

						CartFlowsAjaxQueue.add({
							url: CartFlowsImportVars.ajaxurl,
							type: 'POST',
							data: {
								action      : 'cartflows_activate_plugin',
								plugin_init : plugin.init
							},
							success: function( result ) {

								CartFlowsImport.remaining_active_plugins--;

								if( ! CartFlowsImport.remaining_active_plugins && ! CartFlowsImport.remaining_install_plugins ) {
									if( $('#wcf-remote-flow-importer').length ) {
										CartFlowsImport._cache_remote_flows();
									} else if( $('#wcf-remote-step-importer').length ) {
										CartFlowsImport._cache_remote_steps();
									}
								}

							}
						});
					}
				});
			}

		},

		_installSuccess: function( event, response ) {

			event.preventDefault();

			var page_builder_plugins = CartFlowsImportVars.required_plugins[ CartFlowsImportVars.default_page_builder ]['plugins'];

			$.each( page_builder_plugins, function( index, plugin ) {
				if( 'install' === plugin.status && response.slug === plugin.slug ) {

					$.ajax({
						url  : ajaxurl,
						type : 'POST',
						data : {
							action      : 'cartflows_activate_plugin',
							plugin_init : plugin.init
						},
					})
					.done(function( request, status, XHR )
					{
						CartFlowsImport.remaining_install_plugins--;

						if( ! CartFlowsImport.remaining_install_plugins ) {
							CartFlowsImport._activate_all_plugins();
						}
					});
				}
			});

		},

		_api_request_failed: function( event, data, jqXHR, textStatus ) {
			if( 'error' == textStatus ) {
				if( ! $('#wcf-remote-content-failed').length ) {
					$('#wcf-ready-templates').html( wp.template('cartflows-website-unreachable') );
				}
			}
		},

		_toggle_ready_templates: function( event ) {
			event.preventDefault();

			var slug = $(this).data('slug') || '';

			$('#wcf-get-started-steps').find('a').removeClass('current');
			$('#wcf-get-started-steps').find('a[data-slug="'+slug+'"]').addClass('current');

			if( 'canvas' == slug ) {
				$('#wcf-ready-templates').hide();
				$('#wcf-start-from-scratch').show();
			} else {
				$('#wcf-ready-templates').show();
				$('#wcf-start-from-scratch').hide();
			}

			if( ! $('.wcf-page-builder-notice').length && $('#wcf-remote-step-importer').length ) {
				CartFlowsImport._showSteps();
			}
		},

		_switch_step_tab: function( event ) {

			event.preventDefault();//stop browser to take action for clicked anchor
						
			//get displaying tab content jQuery selector
			var active_tab_selector = $('.wcf-tab > li.active > a').attr('href');					
						
			//find actived navigation and remove 'active' css
			var actived_nav = $('.wcf-tab > li.active');
			actived_nav.removeClass('active');
						
			//add 'active' css into clicked navigation
			$(this).parents('li').addClass('active');
						
			//hide displaying tab content
			$(active_tab_selector).removeClass('active');
			$(active_tab_selector).addClass('hide');
						
			//show target tab content
			var target_tab_selector = $(this).attr('href');
			$(target_tab_selector).removeClass('hide');
			$(target_tab_selector).addClass('active');
	    },

		/**
		 * Search Site.
		 *
		 * Prepare Before API Request:
		 * - Remove Inline Height
		 * - Added 'hide-me' class to hide the 'No more sites!' string.
		 * - Added 'loading-content' for body.
		 * - Show spinner.
		 */
		_remote_step_search: function( event ) {

			event.preventDefault();//stop browser to take action for clicked anchor

			// Remove all filter classes.
	        $('.step-type-filter-links').find('option').removeClass('current');
	        $('.step-type-filter-links').find('option:first-child').addClass('current');

			window.clearTimeout(CartFlowsImport._ref);
			CartFlowsImport._ref = window.setTimeout(function () {
				CartFlowsImport._ref = null;
				CartFlowsImport._showSteps();
	        }, 500);

		},

		/**
		 * Responsive On Click.
		 */
		_previewResponsive: function( event ) {

			event.preventDefault();

			var icon = $(this).find('.dashicons');

			var viewClass = icon.attr('data-view') || '';

			$('#TB_window').removeClass( 'desktop tablet mobile' );
			$('#TB_window').addClass( viewClass );

			$('.actions .dashicons').removeClass('active');
			icon.addClass('active');

			$('#TB_iframeContent').removeClass();
			$('#TB_iframeContent').addClass( viewClass );

		},

		/**
		 * On Filter Clicked
		 */
		_filterStepPageBuilderClick: function( event ) {
			event.preventDefault();

			$(this).parents('ul').find('a').removeClass('current');
			$(this).addClass('current');

			var step_type = $('.step-type-filter-links .current').data('slug') || '';

			if ( 'upsell' === step_type || 'downsell' === step_type ) {
				$( '.wcf-template-notice' ).show();

			}else{
				$( '.wcf-template-notice' ).hide();
			}

			$('.wcf-page-builder-notice').html( '' );

			$('#wcf-remote-step-list').html( '<span class="spinner is-active"></span>' );

			CartFlowsImport._showSteps();
		},

		_filterBlankStepCategoryClick: function( event ) {
			event.preventDefault();

			$('.wcf-page-builder-notice').html( '' );

			var val = $(this).data('group') || '';
			if( val ) {
				$('#wcf-scratch-steps-categories .step-type-filter-links').val( val );
				$('#wcf-scratch-steps-categories .step-type-filter-links option').removeClass('current');
				$('#wcf-scratch-steps-categories .step-type-filter-links option[data-group="'+val+'"]').addClass('current');
			}

			$('.step-type-filter-links').find('a').removeClass('current');
			$(this).addClass('current');

			$step_type = $(this).data('slug');

			if ( 'upsell' === $step_type || 'downsell' === $step_type ) {
				$( '.wcf-template-notice' ).show();

			}else{
				$( '.wcf-template-notice' ).hide();
			}

			if( '' == CartFlowsImportVars._is_pro_active && ( 'upsell' == $step_type || 'downsell' == $step_type ) ) {
				$('.cartflows-step-import-blank').text( 'Get Pro' );
				$('.cartflows-step-import-blank').attr( 'href', CartFlowsImportVars.domain_url );
				$('.cartflows-step-import-blank').attr( 'target', '_blank' );
				$('.cartflows-step-import-blank').addClass('get-pro');
				// 	// $('#wcf-remote-step-list').find('.cartflows-step-import-blank').attr( 'class', 'button button-primary' );
			} else {
				$('.cartflows-step-import-blank').text( 'Create Step' );
				$('.cartflows-step-import-blank').removeClass( 'get-pro' );
				$('.cartflows-step-import-blank').removeAttr( 'target' );
			}

			$('#wcf-remote-step-list').html( '<span class="spinner is-active"></span>' );
			CartFlowsImport._showSteps();
		},

		_filterBlankStepCategoryChange: function( event ) {
			event.preventDefault();

			var val = $(this).find('option:selected').val() || '';
			if( val ) {
				$('.step-type-filter-links').val( val );
				$('.step-type-filter-links').find('a').removeClass('current');
				$('.step-type-filter-links').find('a[data-group="'+val+'"]').addClass('current');
			}

			$('.step-type-filter-links').find('option').removeClass('current');
			$('.step-type-filter-links').find('option:selected').addClass('current');

			$step_type = $(this).find('option:selected').data('slug');

			if ( 'upsell' === $step_type || 'downsell' === $step_type ) {
				$( '.wcf-template-notice' ).show();
			}else{
				$( '.wcf-template-notice' ).hide();
			}

			if( '' == CartFlowsImportVars._is_pro_active && ( 'upsell' == $step_type || 'downsell' == $step_type ) ) {
				$('.cartflows-step-import-blank').text( 'Get Pro' );
				$('.cartflows-step-import-blank').attr( 'href', CartFlowsImportVars.domain_url );
				$('.cartflows-step-import-blank').attr( 'target', '_blank' );
				$('.cartflows-step-import-blank').addClass('get-pro');
				// 	// $('#wcf-remote-step-list').find('.cartflows-step-import-blank').attr( 'class', 'button button-primary' );
			} else {
				$('.cartflows-step-import-blank').text( 'Create Step' );
				$('.cartflows-step-import-blank').removeClass( 'get-pro' );
				$('.cartflows-step-import-blank').removeAttr( 'target' );
			}

			if( ! $('.wcf-page-builder-notice').length && $('#wcf-remote-step-importer').length ) {
				$('#wcf-remote-step-list').html( '<span class="spinner is-active"></span>' );
				CartFlowsImport._showSteps();
			}
		},

		_showSteps: function() {

			// Add Params for API request.
			var api_params = {
				licence_args : CartFlowsImportVars.licence_args,
				per_page     : 15,
				_fields      : CartFlowsImportVars.step_fields.toString(),
			};

			var type 		= $('#wcf-categories .step-type-filter-links').find('.current').data('group') || '';
			var step_type 	= $('#wcf-categories .step-type-filter-links').find('.current').data('slug') || '';

			if( '' !== type && 'all' !== type ) {
				api_params[ CartFlowsImportVars.step_type ] = type;
			}

			// Page Builder.
			var type      = $('#wcf-page-builders .wcf-page-builder-links').find('.current').data('group') || '';
			var step_type = $('#wcf-page-builders .wcf-page-builder-links').find('.current').data('slug') || '';
			var title     = $('#wcf-page-builders .wcf-page-builder-links').find('.current').data('title') || 'Page Builder';
			if( '' !== type && 'all' !== type ) {
				api_params[ CartFlowsImportVars.step_page_builder ] = type;
			}

			// API Request.
			var api_post = {
				remote_slug : CartFlowsImportVars.step,
				slug        : CartFlowsImportVars.step + '?' + decodeURIComponent( $.param( api_params ) ),
			};

			CartFlowsAPI._api_request( api_post, function( data ) {

				data.current_step_type = step_type;

				var template = wp.template('cartflows-steps-list');
				if( parseInt( data.items_count ) ) {
					$('#wcf-remote-step-list').html( template( data ) );
				} else {
					$('#wcf-remote-step-list').html( wp.template('cartflows-no-steps') );
					$('.cartflows-no-steps').find( '.description' ).html( 'We are working on ready templates designed with '+title+'.<br/>Meanwhile you can <a href="#" data-slug="canvas" class="wcf-create-from-scratch-link">create your own designs</a> easily.' );
				}

				$('.wcf-page-builder-notice').remove();
				$('#wcf-remote-step-importer').removeClass('request-process');
			} );
		},

		_apiAddParam_per_page: function() {
			CartFlowsImport._api_params['per_page'] = 15;
		},

		// Add Params for API request.
		_apiAddParam_licence_args: function() {
			CartFlowsImport._api_params['licence_args'] = CartFlowsImportVars.licence_args;
		},

		// Add 'search'
		_apiAddParam_search: function() {
			var search_val = $('.wcf-flow-search-input').val() || '';
			if( '' !== search_val ) {
				CartFlowsImport._api_params['search'] = search_val;
			}
		},

		_close_popup: function() {
			$('#cartflows-steps').fadeOut();
			$('body').removeClass('cartflows-popup-is-open');
		},

		_post_auto_save: function() {
			var post_title       = $( '#title' );
			var post_prompt_text = $( '#title-prompt-text' );
			var self = CartFlowsImport;

			if ( ! post_title.val() ) {
				post_title.val( 'CartFlows #' + self.post_id );
				if( post_prompt_text.length ) {
					post_prompt_text.remove();
				}
			}

			if ( wp.autosave ) {
				wp.autosave.server.triggerSave();
			}
		},

		_process_cache_remote_flows: function() {


			if( 'gutenberg' == CartFlowsImportVars.default_page_builder ) {
				CartFlowsImport._cache_remote_flows();
			} else {
				var page_builder_plugins = CartFlowsImportVars.required_plugins[ CartFlowsImportVars.default_page_builder ]['plugins'];

				var anyInactive = true;

				$.each( page_builder_plugins, function( index, plugin ) {

					if( anyInactive ) {
						if( 'install' === plugin.status || 'activate' === plugin.status ) {
							anyInactive = false;
						}
					}
				});

				if( false === anyInactive ) {
					$('.wcf-page-builder-notice').html( wp.template('cartflows-page-builder-notice') );
					$('#wcf-remote-flow-list').find( '.spinner' ).remove();
				} else {
					CartFlowsImport._cache_remote_flows();
				}
			}


		},

		_cache_remote_flows: function() {

			var self = CartFlowsImport;

			// Add Params for API request.
			var api_params = {
				search       : CartFlowsImportVars.default_page_builder,
				licence_args : CartFlowsImportVars.licence_args,
				hide_empty   : false,
				_fields      : CartFlowsImportVars.flow_page_builder_fields.toString(),
			};

			// API Request.
			var api_post = {
				remote_slug   : CartFlowsImportVars.flow_page_builder,
				slug          : CartFlowsImportVars.flow_page_builder + '?'+decodeURIComponent( $.param( api_params ) ),
				wrapper_class : 'wcf-page-builder-links filter-links',
				show_all      : false,
			};

			CartFlowsAPI._api_request( api_post, function( data ) {

				var template = wp.template('cartflows-term-filters');
				$('#wcf-page-builders').html(template( data ));
				$('#wcf-page-builders').find('li:first a').addClass('current');

				// Step 2: Categories.
				// Add Params for API request.
				var api_params = {
					licence_args : CartFlowsImportVars.licence_args,
					hide_empty   : true,
					_fields      : CartFlowsImportVars.flow_type_fields.toString(),
				};

				// API Request.
				var api_post = {
					remote_slug   : CartFlowsImportVars.flow_type,
					slug          : CartFlowsImportVars.flow_type + '?'+decodeURIComponent( $.param( api_params ) ),
					wrapper_class : 'flow-type-filter-links filter-links',
					show_all      : false,
				};

				CartFlowsAPI._api_request( api_post, function( data ) {
					var template = wp.template('cartflows-term-filters');
					$('#wcf-categories').html(template( data ));
					$('#wcf-categories').find('li:first a').addClass('current');

					// Step 3: Flows.
					CartFlowsImport._showFlows();
				} );
			} );
		},

		_render_remote_flows: function( event ) {

			if( event ) {
				event.preventDefault();
			}

			$("#wcf-remote-flow-importer").addClass('open');

			$("html").addClass('wcf-popup-open');

		},

		_process_cache_remote_steps: function() {

			if( 'gutenberg' == CartFlowsImportVars.default_page_builder ) {
				CartFlowsImport._cache_remote_steps();
			} else {

				var page_builder_plugins = CartFlowsImportVars.required_plugins[ CartFlowsImportVars.default_page_builder ]['plugins'];
				

				var anyInactive = true;

				$.each( page_builder_plugins, function( index, plugin ) {

					if( anyInactive ) {
						if( 'install' === plugin.status || 'activate' === plugin.status ) {
							anyInactive = false;
						}
					}
				});

				if( false === anyInactive ) {
					$('.wcf-page-builder-notice').html( wp.template('cartflows-page-builder-notice') );
					$('#wcf-remote-step-list').find( '.spinner' ).remove();
				} else {
					CartFlowsImport._cache_remote_steps();
				}
			}

		},

		_cache_remote_steps: function() {

			var self = CartFlowsImport;

			// Disable the button until caching the data.
			$( 'html' ).addClass('wcf-steps-loading');

			// Add Params for API request.
			var api_params = {
				search       : CartFlowsImportVars.default_page_builder,
				licence_args : CartFlowsImportVars.licence_args,
				hide_empty   : false,
				_fields      : CartFlowsImportVars.step_page_builder_fields.toString(),
			};

			// API Request.
			var api_post = {
				remote_slug   : CartFlowsImportVars.step_page_builder,
				slug          : CartFlowsImportVars.step_page_builder + '?'+decodeURIComponent( $.param( api_params ) ),
				wrapper_class : 'wcf-page-builder-links filter-links',
				show_all      : false,
			};

			CartFlowsAPI._api_request( api_post, function( data ) {
				var template = wp.template('cartflows-term-filters');
				$('#wcf-page-builders').html(template( data ));
				$('#wcf-page-builders').find('li:first a').addClass('current');
			} );

			// Add Params for API request.
			var api_params = {
				licence_args : CartFlowsImportVars.licence_args,
				_fields      : CartFlowsImportVars.step_type_fields.toString(),
			};

			// API Request.
			var api_post = {
				remote_slug   : CartFlowsImportVars.step_type,
				slug          : CartFlowsImportVars.step_type + '?'+decodeURIComponent( $.param( api_params ) ),
				wrapper_class : 'step-type-filter-links filter-links',
				show_all      : false,
			};

			CartFlowsAPI._api_request( api_post, function( data ) {

				var step_type_response_data = data;
				var step_types_count        = data.items_count;

				// Send other request for JS caching.
				if( data.items ) {
					for ( key in data.items ) {

						// Add Params for API request.
						var api_params = {
							licence_args : CartFlowsImportVars.licence_args,
							per_page     : 15,
							_fields      : CartFlowsImportVars.step_fields.toString(),
						};

						api_params[ CartFlowsImportVars.step_type ] = data.items[ key ].id;

						// API Request.
						var api_post = {
							remote_slug : CartFlowsImportVars.step,
							slug        : CartFlowsImportVars.step + '?' + decodeURIComponent( $.param( api_params ) ),
						};

						CartFlowsAPI._api_request( api_post, function( data ) {
							var template = wp.template('cartflows-steps-list');
							if( parseInt( data.items_count ) ) {
								$('#wcf-remote-step-list').html( template( data ) );
							} else {
								$('#wcf-remote-step-list').html( wp.template('cartflows-no-steps') );
							}

							step_types_count--;

							if( 0 == step_types_count ) {

								var template_dropdown = wp.template('cartflows-term-filters-dropdown');
								var template          = wp.template('cartflows-term-filters');
								$('#wcf-categories').html(template( step_type_response_data ));
								$('#wcf-scratch-steps-categories').html(template_dropdown( step_type_response_data ));
								$('#wcf-categories, #wcf-scratch-steps-categories').find('option:first').addClass('current');
								$('#wcf-categories').find('li:first a').addClass('current');

								$('.wcf-page-builder-notice').remove();
								$('#wcf-remote-content').find( '.spinner' ).remove();

								CartFlowsImport._showSteps();

								$( 'html' ).removeClass('wcf-steps-loading');
							}
						});
					}
				}
			} );
		},

		_render_remote_steps: function( event ) {
			if( event ) {
				event.preventDefault();
			}

			$("#wcf-remote-step-importer").addClass('open');

			$("html").addClass('wcf-popup-open');
		},

		_categorize_data: function( items ) {
				
			var categorised_data = [];

			$.each( items, function( index, value ) {

				var step_type = value.step_type.slug;

				if( 'undefined' == typeof categorised_data[step_type] ) {
					categorised_data[step_type] = [];
				}
					
				categorised_data[step_type].push( value );

			});

			return categorised_data;

		},
		
		_close_template_popup: function( event ) {
			if ( $( event.target ).hasClass('wcf-templates-popup-overlay') 
			 || $( event.target ).hasClass('close-icon') ) {

				// New step creation/importing is in process..
			 	if( ! $( '.wcf-templates-popup-overlay' ).hasClass('request-process') ) {
					$("html").removeClass('wcf-popup-open');
					$(".wcf-templates-popup-overlay").removeClass( 'open' );
			 	}
			}
		},

		_ajax: function( data, callback, trigger ) {

			var self = CartFlowsImport;

			$.ajax({
				url  : ajaxurl,
				type : 'POST',
				data : data,
			})
			.done(function( request, status, XHR )
			{
				var data = {
					request : request,
					status  : status,
					XHR     : XHR,
				};

				if( callback && typeof callback == "function"){
					callback( data );
				}

				self.doc.trigger( trigger + '-done', [request, status, XHR] );
			})
			.fail(function( jqXHR, textStatus )
			{
				self.doc.trigger( trigger + '-fail', [jqXHR, textStatus] );
			})
			.always(function()
			{
				self.doc.trigger( trigger + '-always' );
			});

		},

		_load_templates: function( args, trigger_name ) {
			var self = CartFlowsImport;

			if( $('body').hasClass('processing') ) {
				return;
			}

			$('body').addClass('processing');

			$.ajax({
				url  : ajaxurl,
				type : 'POST',
				data : {
					action  : 'cartflows_load_steps',
					security: cartflows_admin.cf_load_steps_nonce,
					args    : args,
				},
			})
			.done(function( items, status, XHR )
			{
				self.doc.trigger( trigger_name, [items] );
				$('body').removeClass('processing');
			})
			.fail(function( jqXHR, textStatus )
			{
			})
			.always(function()
			{
			});
		},

		_empty: function(data)
		{
		  if(typeof(data) == 'number' || typeof(data) == 'boolean')
		  { 
		    return false; 
		  }
		  if(typeof(data) == 'undefined' || data === null)
		  {
		    return true; 
		  }
		  if(typeof(data.length) != 'undefined')
		  {
		    return data.length == 0;
		  }
		  var count = 0;
		  for(var i in data)
		  {
		    if(data.hasOwnProperty(i))
		    {
		      count ++;
		    }
		  }
		  return count == 0;
		},

		_preview_individual: function()
		{
			var id    = $(this).data('id') || '';
			var href  = $(this).data('href') || '';

			// Active.
			$('.cartflows-preview-flow-step').removeClass('active');
			$('.cartflows-preview-flow-step[data-id="'+id+'"]').addClass('active');

			$('#TB_window').addClass('cartflows-thickbox-loading');

			$('#TB_iframeContent').removeAttr('onload');
			$('#TB_iframeContent').removeAttr('src');
			$('#TB_iframeContent').attr('src', href );
			$('#TB_iframeContent').attr('onload', 'CartFlowsImport.showIframe()' )
		},
		showIframe: function() {
			$("#TB_load").remove();
			$("#TB_window").css({'visibility':'visible'});
			// $("#TB_window").css({'visibility':'visible'}).trigger( 'thickbox:iframe:loaded' );
			$('#TB_window').removeClass('cartflows-thickbox-loading');
		},

		/**
		 * Remove thickbox loading class
		 * 
		 * @param  object event Event object.
		 * @return void.
		 */
		_previewLoaded: function( event ) {
			event.preventDefault();
			$('#TB_window').removeClass('cartflows-thickbox-loading');
		},

		_filterFlowPageBuilderClick: function( event ) {
			event.preventDefault();

			$(this).parents('ul').find('a').removeClass('current');
			$(this).addClass('current');

			$('.wcf-page-builder-notice').html( '' );

			$('#wcf-remote-flow-list').html( '<span class="spinner is-active"></span>' );

			CartFlowsImport._showFlows();
		},

		_showFlows: function() {
			// Add Params for API request.
			var api_params = {
				licence_args : CartFlowsImportVars.licence_args,
				_fields      : CartFlowsImportVars.flow_fields.toString(),
			};

			// Page Builder.
			var type      = $('#wcf-page-builders .wcf-page-builder-links').find('.current').data('group') || '';
			var step_type = $('#wcf-page-builders .wcf-page-builder-links').find('.current').data('slug') || '';
			var title     = $('#wcf-page-builders .wcf-page-builder-links').find('.current').data('title') || 'Page Builder';
			if( '' !== type && 'all' !== type ) {
				api_params[ CartFlowsImportVars.flow_page_builder ] = type;
			}

			// API Request.
			var api_post = {
				remote_slug : CartFlowsImportVars.flow,
				slug        : CartFlowsImportVars.flow + '?' + decodeURIComponent( $.param( api_params ) ),
			};

			CartFlowsAPI._api_request( api_post, function( data ) {

				var template = wp.template('cartflows-flows-list');
				if( parseInt( data.items_count ) ) {
					$('#wcf-remote-flow-list').html( template( data ) );
				} else {
					$('#wcf-remote-flow-list').html( wp.template('cartflows-no-flows') );
					// $('.cartflows-no-flows').find( '.description' ).html( 'We are working on ready templates designed with '+title+'.<br/>Meanwhile you can <a href="#" data-slug="canvas" class="wcf-create-from-scratch-link">create your own designs</a> easily.' );
				}

				$('.wcf-page-builder-notice').remove();
				$('#wcf-remote-flow-importer').removeClass('request-process');
			} );
		},

		_create_default_flow: function( event )
		{
			event.preventDefault();
			var self = CartFlowsImport;
			var btn = $( this );

			if( btn.hasClass('updating-message') ) {
				return;
			}

			$('#wcf-remote-flow-importer').addClass('request-process');

			btn.addClass('updating-message').text( 'Creating Flow..' );
			btn.parents('.template').addClass('importing');

			var data = {
				action : 'cartflows_default_flow',
				security: cartflows_admin.cf_default_flow_nonce
			};

			// Import Template AJAX.
			self._ajax( data, function( data ) {

				if( data.request.success ) {

					var flow_id = data.request.data;

					// Created.
					setTimeout(function() {
						btn.removeClass('updating-message').text('Flow Created! Redirecting..');
						window.location = CartFlowsImportVars.admin_url + 'post.php?post='+flow_id+'&action=edit';
					}, 3000);

				}
			});

		},

		_activate_plugin: function( plugin_init ) {

			var self = CartFlowsImport;

			var data = {
				action      : 'cartflows_activate_plugin',
				plugin_init : plugin_init
			};

			self._ajax( data, function( data ) {
			});
		},

		_process_import_flow: function( event )
		{
			event.preventDefault();

			var btn = $( this );

			if( btn.hasClass('updating-message') ) {
				return;
			}

			$('#wcf-remote-flow-importer').addClass('request-process');

			var self = CartFlowsImport;

			btn.text( 'Creating Flow..' );

			btn.addClass('updating-message');
			btn.parents('.template').addClass('importing');

			var flow_steps_string = btn.data('flow-steps') || '';
			var flow_steps = ( '' !== flow_steps_string ) ? JSON.parse("[" + flow_steps_string + "]") : [];

			var data = {
				action : 'cartflows_create_flow',
				security: cartflows_admin.cf_create_flow_nonce
			};

			// Import Template AJAX.
			self._ajax( data, function( data ) {

				if( data.request.success ) {

					var flow_id = data.request.data;

					if( flow_steps ) {

						// Activate ALl Plugins.
						CartFlowsAjaxQueue.stop();
						CartFlowsAjaxQueue.run();

						CartFlowsImport.all_steps = flow_steps.length;

						// Importing.
						btn.addClass('updating-message').text('Importing Step 1 of ' + CartFlowsImport.all_steps );

						$.each(flow_steps, function(index, template_id) {

							CartFlowsAjaxQueue.add({
								url: CartFlowsImportVars.ajaxurl,
								type: 'POST',
								data: {
									action      : 'cartflows_import_flow_step',
									flow_id     : flow_id,
									template_id : template_id,
									security    : cartflows_admin.cf_import_flow_step_nonce
								},
								success: function( result ) {
									CartFlowsImport.remaining_steps = CartFlowsImport.remaining_steps + 1;

									if( CartFlowsImport.remaining_steps === CartFlowsImport.all_steps ) {

										// Imported.
										btn.addClass('updating-message').text('Imported Step ' + CartFlowsImport.remaining_steps  + ' of ' + CartFlowsImport.all_steps );

										setTimeout(function() {
											btn.removeClass('updating-message').text('All Imported! Redirecting..');
											window.location = CartFlowsImportVars.admin_url + 'post.php?post='+flow_id+'&action=edit';
										}, 3000);

									} else {
										// Importing.
										btn.addClass('updating-message').text('Importing Step ' + CartFlowsImport.remaining_steps  + ' of ' + CartFlowsImport.all_steps );
									}
								},
								error: function( result ) {
									CartFlowsImport.remaining_steps = CartFlowsImport.remaining_steps + 1;

									template = btn.parents('.template.importing');
									template.find('.preview')
										.addClass('notice notice-warning')
										.removeClass('preview')
										.text( result.statusText );

									if( CartFlowsImport.remaining_steps === CartFlowsImport.all_steps ) {

										// Imported.
										btn.addClass('updating-message').text('Failed ' + CartFlowsImport.remaining_steps  + ' of ' + CartFlowsImport.all_steps );

										setTimeout(function() {
											btn.removeClass('updating-message button-primary').addClass('disabled');
											// location.reload();
										}, 3000);

									} else {
										// Importing.
										btn.addClass('updating-message').text('Failed ' + CartFlowsImport.remaining_steps  + ' of ' + CartFlowsImport.all_steps );
									}
								},
								fail: function( result ) {
									
									CartFlowsImport.remaining_steps = CartFlowsImport.remaining_steps + 1;

									if( CartFlowsImport.remaining_steps === CartFlowsImport.all_steps ) {

										// Imported.
										btn.addClass('updating-message').text('Imported ' + CartFlowsImport.remaining_steps  + ' of ' + CartFlowsImport.all_steps );

										setTimeout(function() {
											btn.removeClass('updating-message').text('All Step Imported! Reloading..');
											location.reload();
										}, 3000);

									} else {
										// Importing.
										btn.addClass('updating-message').text('Importing ' + CartFlowsImport.remaining_steps  + ' of ' + CartFlowsImport.all_steps );
									}
								}
							});
						});
					}
				}
			});
		},

		_handle_error: function( response ) 
		{
			var btn = $( '.cartflows-step-import.updating-message' );

			btn.addClass('updating-message').text( response.errorMessage );
		},

		_create_blank_step: function( event )
		{
			event.preventDefault();

			var btn    	   		  = $(this),
				self              = CartFlowsImport,
				flow_id           = $("#post_ID").val(),
				step_slug         = $('#wcf-scratch-steps-categories .step-type-filter-links .current').data('slug') || '',
				step_title        = $('#wcf-scratch-steps-categories .step-type-filter-links .current').data('title') || '',
				step_type         = step_slug,
				step_count        = $('.wcf-step-wrap[data-term-slug="'+step_slug+'"]').length || 1;
				step_custom_title = `${step_title} ${step_count+1}`;

			$('#wcf-start-from-scratch .wcf-notice-wrap').remove();

			if( '' === step_type ) {
				$('#wcf-start-from-scratch .inner').append( '<div class="wcf-notice-wrap"><div class="notice notice-info"><p>Please select the step type.</p></div></div>' );
				return;
			}

			if ( ! CartFlowsImportVars._is_pro_active && ( 'upsell' === step_type || 'downsell' === step_type )) {
				return;
			}

			btn.parents('.template').addClass('importing');
			
			if ( ! CartFlowsImportVars._is_pro_active ) {
				
				if ( 'checkout' === step_type ) {
					var checkout_steps = $( '.wcf-step-wrap[data-term-slug="checkout"]');

					if ( 0 < checkout_steps.length ) {

						var parent_template = btn.parents('.template.importing');

						btn.removeClass('importing updating-message')
							.text('Import Failed!');

						$('#wcf-start-from-scratch .inner').append( '<div class="wcf-notice-wrap"><div class="notice notice-warning"><p>Upgrade to Pro for adding more than one Checkout step.</p></div></div>' );

						return;
					}
				}
			}

			$('#wcf-remote-step-importer').addClass('request-process');

			$('.cartflows-step-import').addClass('disabled');
			btn.addClass('importing updating-message').text('Creating..');

			// Process Import Page.
			if( $( 'body' ).hasClass( 'post-type-cartflows_flow' ) ) {
				var data = {
					action     : 'cartflows_step_create_blank',
					flow_id    : flow_id,
					step_type  : step_type,
					step_title : step_custom_title,
					security   : cartflows_admin.cf_step_create_blank_nonce
				};

				// Import Template AJAX.
				self._ajax( data, function( data ) {
					
					var self     = CartFlowsImport;
					var template = btn.parents('.template.importing');

					if( data.request.success ) {
						btn.text('Created. Reloading..');
						setTimeout(function() {
							window.location.href = window.location.href + '&highlight-step-id=' + data.request.data;
						}, 3000);

					} else {

						btn.removeClass('importing updating-message')
							.text('Creating Failed!');

						$('#wcf-remote-step-importer').removeClass('request-process');

						template.find('.cartflows-step-preview').append( "<div class='preview'></div>" );

						template.find('.preview')
							.addClass('notice notice-warning')
							.removeClass('preview')
							.text( data.request.data );
					}
				} );
			}
		},

		_process_import_step: function( event ) {

			event.preventDefault();

			var btn               = $( this ),
				step_slug         = btn.data('slug') || '',
				step_count        = $('.wcf-step-wrap[data-term-slug="'+step_slug+'"]').length || 1;
				step_title        = btn.data('title') || '',
				step_custom_title = `${step_title} ${step_count+1}`,
				self 		      = CartFlowsImport;

			if ( ! CartFlowsImportVars._is_pro_active ) {
				
				if ( 'checkout' === step_slug ) { 

					var checkout_steps = $( '.wcf-step-wrap[data-term-slug="checkout"]');

					if ( 0 < checkout_steps.length ) {

						var parent_template = btn.parents('.template');

						btn.removeClass('importing updating-message')
							.text('Import Failed!');

						parent_template.find('.preview').hide();
						var notice_wrap = parent_template.find('#wcf_create_notice')
							.show();

						notice_wrap.find('a')
							.addClass('notice notice-warning ')
							.text ( 'Upgrade to Pro for adding more than one Checkout step' );

						$('#wcf-remote-step-importer').removeClass('request-process');
						return;
					}
				}
			}

			if( btn.hasClass('updating-message') ) {
				return;
			}

			$('#wcf-remote-step-importer').addClass('request-process');

			var self = CartFlowsImport;

			btn.addClass('updating-message');
			btn.parents('.template').addClass('importing');
			
			// var plugin_slug = '';
			// plugin = response.slug;

			// switch ( plugin ) {
			// 	case 'elementor':
			// 		plugin_slug = 'elementor/elementor.php';
			// 	break;
			// 	case 'beaver-builder-lite-version':
			// 		plugin_slug = 'beaver-builder-lite-version/fl-builder.php';
			// 	break;
			// }

			// self._activate_plugin( plugin_slug );

			var template_id = btn.data('template-id') || '';
			var flow_id     = $("#post_ID").val();
			var step_type   = step_slug; 
			var self        = CartFlowsImport;

			$('.cartflows-step-import-blank').addClass('disabled');
			$('.cartflows-step-import').addClass('disabled');
			btn.addClass('importing updating-message').text('Importing..');

			// Process Import Page.
			if( $( 'body' ).hasClass( 'post-type-cartflows_flow' ) )
			{
				var data = {
					action      : 'cartflows_step_import',
					flow_id     : flow_id,
					template_id : template_id,
					step_title  : step_custom_title,
					step_type   : step_type,
					security    : cartflows_admin.cf_step_import_nonce   
				};

				// Import Template AJAX.
				self._ajax( data, function( data ) {


					var self     = CartFlowsImport;
					var template = btn.parents('.template.importing');

					if( data.request.success ) {
						btn.text('Imported. Reloading..');
						setTimeout(function() {
							window.location.href = window.location.href + '&highlight-step-id=' + data.request.data;

						}, 3000);

					} else {

						$( '.wcf-templates-popup-overlay' ).removeClass('request-process');

						btn.removeClass('importing updating-message')
							.text('Import Failed!');

						template.find('.preview')
							.addClass('notice notice-warning')
							.removeClass('preview')
							.text( data.request.data );
					}

				}, 'add_template_to_page' );
			}
		},

		_add_template_to_page_fail: function( event, jqXHR, textStatus ) {
			event.preventDefault();
			var self = CartFlowsImport,
				template = $('.wcf-flow-steps-data-wrap-importer .template.importing');

			template.find('.cartflows-step-import')
				.removeClass('importing updating-message')
				.text('Import Failed!');


			template.find('.preview')
				.addClass('notice notice-warning')
				.removeClass('preview')
				.text( jqXHR.responseText );
		}

	};

	/**
	 * Initialization
	 */
	$(function(){
		CartFlowsImport.init();
	});

})(jQuery);	
```
