jQuery( function( $ ) {

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

		var requests = [];

		return {

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

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

			/**
			 * Run / Process AJAX request
			 *
			 * @since 1.2.0.8
			 */
			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.2.0.8
			 */
			stop:  function() {

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

	}());

	jQuery(document).ready(function($) {
		
		/**
		 *	Lazy Load
		 */
		jQuery(".uabb-template-screenshot img").lazyload({
		    effect : "fadeIn",
		    event : "sporty"
		});
		jQuery(window).bind("load", function() {
		    var timeout = setTimeout(function() {
		        jQuery(".uabb-template-screenshot img").trigger("sporty")
		    }, 1000);
		});

		/**
		 *	Shuffle JS
		 */
		var grid = jQuery('.uabb-templates-page-templates');

		grid.shuffle({
			itemSelector: '.uabb-single-page-templates',
		});

		// ReShuffle - When user clicks a filter item
		jQuery('.uabb-templates-filter a').click(function (e) {
			e.preventDefault();

			// set active class
			jQuery('.uabb-templates-filter a').removeClass('active');
			jQuery(this).addClass('active');

			// get group name from clicked item
			var groupName = jQuery(this).attr('data-group');

			// reshuffle grid
			grid.shuffle('shuffle', groupName );

		});

		// ReShuffle - When user clicks a tab
		jQuery('body').on('click', '.fl-settings-nav li a', function (event) {
			var hash = jQuery(this).attr('href') || '';
			if( hash == '#uabb-cloud-templates' ) {
				jQuery( window ).trigger( "resize.shuffle" );
			}
		});

	});

	/**
	 * Templates Preview
	 */
	jQuery('body').on('click', '.uabb-template-screenshot', function (event) {

		var template_preview_url = jQuery(this).attr( 'data-preview-url' ) || '',
			template_name        = jQuery(this).attr( 'data-template-name' ) || '',
			is_downlaoded        = jQuery(this).parents( '.uabb-template-block' ).attr('data-is-downloaded') || '',
			template_id          = jQuery(this).attr( 'data-template-id' ),
			template_type        = jQuery(this).attr( 'data-template-type' ),
			template_dat_url     = jQuery(this).attr( 'data-template-dat-url' );

		if( '' != template_preview_url ) {

			/**
			 * Thickbox options
			 */
			template_preview_url = template_preview_url + '?TB_iframe=true'; // Required

			/**
			 * Open ThickBox
			 */
			tb_show( template_name , template_preview_url );

			// jQuery('#TB_title').addClass('UABB_TB_title');
			jQuery('#TB_window').addClass('UABB_TB_window');
			jQuery("#TB_window").append("<div class='UABB_TB_loader spinner is-active'></div>");
			jQuery('#TB_iframeContent').addClass('UABB_TB_iframeContent');

			/**
			 * Add Download Button
			 */
			if( is_downlaoded != 'true' ) {

				var output   = '<span class="button button-primary button-small uabb-cloud-process" data-operation="download">'
							 + '<i class="dashicons dashicons-update"></i>'
							 + '<span class="msg"> '+UABBCloudTemplates.btnTextDownload+' </span>'
							 + '<input type="hidden" class="template-dat-meta-id" value="'+ template_id +'" />'
							 + '<input type="hidden" class="template-dat-meta-type" value="'+ template_type +'" />'
							 + '<input type="hidden" class="template-dat-meta-dat_url" value="'+ template_dat_url +'" />';
							 + '</span>';

				jQuery('#TB_title').append( output );

				/**
				 * Popup download template process
				 */
				jQuery( window ).on( 'uabb-template-downloaded', function( event, template_dat_url_local, template_id ) {

					jQuery('#TB_title .uabb-cloud-process').remove();
					var output  = '<span class="uabb-cloud-process">'
								 + '<i class="dashicons dashicons-yes"></i>'
								 + '<span class="msg"> '+UABBCloudTemplates.btnTextInstall+' </span>'
								 + '</span>';
					jQuery('#TB_title').append( output );

					jQuery('#' + template_id ).addClass( 'uabb-downloaded' );
					jQuery('#' + template_id ).attr('data-is-downloaded', true );
					jQuery('#' + template_id ).attr('data-groups', '' );

					var output   = '<span class="button button-primary uabb-cloud-process" data-operation="remove">'
								 + '	<i class="dashicons dashicons-no" style="padding: 3px;"></i>'
								 + '	<span class="msg"> '+UABBCloudTemplates.btnTextRemove+' </span>'
								 + '	<input type="hidden" class="template-dat-meta-id" value="'+ template_id +'" />'
								 + '	<input type="hidden" class="template-dat-meta-type" value="'+ template_type +'" />'
								 + '	<input type="hidden" class="template-dat-meta-dat_url_local" value="'+ template_dat_url_local +'" />'
								 + '</span>'
								 + '<span class="button button-sucess uabb-installed-btn">'
								 + '	<i class="dashicons dashicons-yes" style="padding: 3px;"></i>'
								 + '	<span class="msg">'+UABBCloudTemplates.btnTextInstall+'</span>'
								 + '</span>';

					jQuery('#' + template_id ).find('.uabb-template-actions').html( output );

				});
			} else {

				var output  = '<span class="uabb-cloud-process installed"><i class="dashicons dashicons-yes"></i>'
							+ '<span class="msg"> '+UABBCloudTemplates.btnTextInstall+' </span></span>';
				jQuery('#TB_title').append( output );
			}
	
			//	hide iframe until complete load and show loader
			//	once complete iframe loaded then disable loader
			jQuery('#TB_iframeContent').hide();
			jQuery('#TB_iframeContent').bind('load', function(){
		        jQuery("#TB_window").find(".spinner").remove();
		        jQuery('#TB_iframeContent').show();
		    });
		}
	});


	/**
	 *	Template Tabs
	 */
	jQuery("#uabb-cloud-templates-tabs").tabs();

	/**
	 * Templates Count
	 */
	jQuery('body').on('click', '.uabb-filter-links a', function (event) {
		var count = jQuery(this).attr( 'data-count' ) || 0;
		jQuery('.filter-count .count').html( count );

		//	Reshuffle
		// jQuery( window ).trigger( "resize.shuffle" );
	});

	/**
	 * Process of cloud templates - (download, remove & fetch)
	 */
	UABBajaxQueue.run();

	jQuery('body').on('click', '.uabb-cloud-process', function (event) {
		event.preventDefault();

		var btn             	= jQuery(this),
			meta_id             = btn.find('.template-dat-meta-id').val() || '',
			meta_type           = btn.find('.template-dat-meta-type').val() || '',
			btn_template        = btn.parents('.uabb-template-block'),
			btn_template_image  = btn_template.find('.uabb-template-screenshot');
			btn_template_groups = btn_template.attr( 'data-groups' ) || '',
			btn_operation       = btn.attr('data-operation') || '',
			errorMessage        = UABBCloudTemplates.errorMessage,
			successMessage      = UABBCloudTemplates.successMessage,
			processAJAX         = true;
			form_nonce = jQuery( '#uabb-cloud-templates-form' ).data( 'uabb-cloud-nonce' );

		//	add processing class
		if( meta_id != 'undefined' ) {
			$('#' + meta_id ).addClass('uabb-template-processing');
		}

		//	remove error message if exist
		if( btn_template_image.find('.notice').length ) {
			btn_template_image.find('.notice').remove();
		}

		if( '' != btn_operation ) {

			btn.find('i').addClass('uabb-reloading-iconfonts');

			switch( btn_operation ) {
				case 'fetch':
									jQuery('.wp-filter').find('.uabb-cloud-process i').addClass('uabb-reloading-iconfonts');
									btn.parents('.uabb-cloud-templates-not-found').find('.uabb-cloud-process i').show();
									var dataAJAX 		=  	{
																action: 'uabb_cloud_dat_file_fetch',
																form_nonce:form_nonce,
															};

					break;

				case 'download':
									var meta_dat_url   = btn.find('.template-dat-meta-dat_url').val() || '',
										successMessage = UABBCloudTemplates.successMessageDownload,
										dataAJAX       = {
															action: 'uabb_cloud_dat_file',
															dat_file: meta_dat_url,
															dat_file_id: meta_id,
															// dat_file_name: meta_name,
															// dat_file_image: meta_image,
															dat_file_type: meta_type,
															// dat_file_dat_url: meta_dat_url,
															form_nonce:form_nonce,
														};

										if( meta_dat_url === '' ) {
											processAJAX = false;
										}
					break;

				case 'remove':
								var meta_url_local = btn.find('.template-dat-meta-dat_url_local').val() || '',
									successMessage = UABBCloudTemplates.successMessageRemove,
									dataAJAX       = {
														action: 'uabb_cloud_dat_file_remove',
														dat_file_id: meta_id,
														dat_file_type: meta_type,
														dat_file_url_local: meta_url_local,
														form_nonce:form_nonce,
													};

									if( meta_id === '' ) {
										processAJAX = false;
									}
					break;
			}
			
			if( processAJAX ) {

		       	UABBajaxQueue.add({
					url: UABBCloudTemplates.ajaxurl,
					type: 'POST',
					data: dataAJAX,
					success: function(data){

						/**
						 * Parse response
						 */
						var status                 = ( data.hasOwnProperty('status') ) ? data.status : '';
						var msg                    = ( data.hasOwnProperty('msg') ) ? data.msg : '';
						var template_id            = ( data.hasOwnProperty('id') ) ? data.id : '';
						var template_type          = ( data.hasOwnProperty('type') ) ? data.type : '';
						var template_dat_url       = ( data.hasOwnProperty('dat_url') ) ? decodeURIComponent( data.dat_url ) : '';
						var template_dat_url_local = ( data.hasOwnProperty('dat_url_local') ) ? decodeURIComponent( data.dat_url_local ) : '';

						if( status == 'success' ) {

							//	remove processing class
							if( meta_id != 'undefined' ) {
								$('#' + meta_id ).removeClass('uabb-template-processing');
							}

							switch( btn_operation ) {
								case 'remove':
													jQuery( window ).trigger( 'uabb-template-removed' );

													btn.removeClass('button-secondary');
													btn.addClass('button-primary');
													btn.find('i').removeClass('uabb-reloading-iconfonts dashicons-no dashicons-update');
													btn.find('i').addClass('dashicons-yes');

													btn.find('.msg').html( UABBCloudTemplates.successMessageRemove );
													setTimeout(function() {

														btn_template.attr('data-is-downloaded', '');
														btn_template.removeClass( 'uabb-downloaded' );
														btn.attr('data-operation', 'download');

														var output   = '<i class="dashicons dashicons-update" style="padding: 3px;"></i>'
																	 + '<span class="msg"> '+UABBCloudTemplates.btnTextDownload+' </span>'
																	 + '<input type="hidden" class="template-dat-meta-id" value="'+ template_id +'" />'
																	 + '<input type="hidden" class="template-dat-meta-type" value="'+ template_type +'" />'
																	 + '<input type="hidden" class="template-dat-meta-dat_url" value="'+ template_dat_url +'" />';

														btn.html( output );
														btn.parents('.uabb-template-actions').find('.uabb-installed-btn').remove();

													}, 1000);

									break;
								case 'download':
													jQuery( window ).trigger( 'uabb-template-downloaded', [ template_dat_url_local, template_id ] );

													btn.removeClass('button-secondary');
													btn.addClass('button-primary');
													btn.find('i').removeClass('uabb-reloading-iconfonts dashicons-no dashicons-update');
													btn.find('i').addClass('dashicons-yes');

													btn.find('.msg').html( UABBCloudTemplates.successMessageDownload );
													setTimeout(function() {

														btn.attr('data-operation', 'remove');
														btn_template.attr('data-is-downloaded', 'true');
														btn_template.addClass( 'uabb-downloaded' );

														var output   = '<i class="dashicons dashicons-no" style="padding: 3px;"></i>'
																	 + '<span class="msg"> '+UABBCloudTemplates.btnTextRemove+' </span>'
																	 + '<input type="hidden" class="template-dat-meta-id" value="'+ template_id +'" />'
																	 + '<input type="hidden" class="template-dat-meta-type" value="'+ template_type +'" />'
																	 + '<input type="hidden" class="template-dat-meta-dat_url_local" value="'+ template_dat_url_local +'" />';

														var outputInstalled = '<span class="button button-sucess uabb-installed-btn">'
																			+ '<i class="dashicons dashicons-yes" style="padding: 3px;"></i>'
																			+ '<span class="msg">'+UABBCloudTemplates.btnTextInstall+'</span>'
																			+ '</span>';

														btn.html( output );
														btn.parents('.uabb-template-actions').append( outputInstalled );

													}, 1000);

													return;
									break;

								case 'fetch':
													jQuery( window ).trigger( 'uabb-template-fetched' );

													btn.parents('.wp-filter').find('.uabb-cloud-process').removeClass('button-secondary');
													btn.parents('.wp-filter').find('.uabb-cloud-process').addClass('button-primary');
													btn.parents('.wp-filter').find('.uabb-cloud-process i').removeClass('uabb-reloading-iconfonts dashicons-no dashicons-update');
													btn.parents('.wp-filter').find('.uabb-cloud-process i').addClass('dashicons-yes');

													btn.parents('.wp-filter').find('.uabb-cloud-process .msg').html( UABBCloudTemplates.successMessageFetch );
													location.reload();

									break;
							}

						} else {

							/**
							 * Something went wrong
							 */
							if( '' != msg ) {
	
								btn.find('.msg').html( UABBCloudTemplates.errorMessageTryAgain );
								btn.find('i').removeClass('uabb-reloading-iconfonts');

								var message = '<div class="notice notice-error uct-notice is-dismissible"><p>' + msg + '	</p></div>';
								btn_template_image.append( message );

							} else {
								btn.find('.msg').html( status );								
							}
						}
					}
				});
			}
		}

	});

} );
