( function( $ ) {

	var loadStatus = true;
	var count = 1;
	var loader = '';
	var total = 0;
	
	function equalHeight( slider_wrapper ) {
		var slickSlider = slider_wrapper.find('.pp-posts-carousel'),
            equalHeight = slickSlider.data( 'equal-height' );
		
		if ( 'yes' != equalHeight ) {
        	return;
        }
		
		slickSlider.find('.slick-slide').height('auto');

		var slickTrack = slickSlider.find('.slick-track'),
			slickTrackHeight = $(slickTrack).height();

		slickSlider.find('.slick-slide').css('height', slickTrackHeight + 'px');
	}
	
	var PostsHandler = function( $scope, $ ) {
		
		var container = $scope.find( '.pp-posts-container' ),
			selector = $scope.find( '.pp-posts' ),
			layout = $scope.find( '.pp-posts' ).data( 'layout' ),
			search = $scope.find( '.pp-post-filters-container' ).data( 'search-form' ),
			$search_input = $scope.find( '.pp-search-form-input' ),
			search_action = $scope.find( '.pp-post-filters-container' ).data( 'search-action' ),
			loader = $scope.find( '.pp-posts-loader' );
			post_filter = $scope.find( '.pp-post-filters' );

		var coupon_container = $scope.find( '.pp-coupons' );

		if ( 'masonry' == layout ) {

			$scope.imagesLoaded( function(e) {

				selector.isotope({
					layoutMode: layout,
					itemSelector: '.pp-grid-item-wrap',
				});

			});
		}

		set_posts_count( $scope, 1 );
		
		// Post Filter
		post_filter.find( '.pp-post-filter' ).off( 'click' ).on( 'click', function() {
			$( this ).siblings().removeClass( 'pp-filter-current' );
			$( this ).addClass( 'pp-filter-current' );
			count = 1;

			if ( coupon_container.length > 0 ) {
				_postsFilterAjax( $scope, $( this ), 'coupon' );
			} else {
				_postsFilterAjax( $scope, $( this ), '' );
			}

		});

		if ( post_filter.length > 0 ) {
			// Trigger filter by hash parameter in URL.
			if ( '' !== location.hash ) {
				var filterHash = location.hash.split('#')[1];
				post_filter.find('li[data-filter=".' + filterHash + '"]').trigger('click');
			}
			// Trigger filter on hash change in URL.
			$( window ).on( 'hashchange', function() {
				if ( '' !== location.hash ) {
					var filterHash = location.hash.split('#')[1];
					post_filter.find('li[data-filter=".' + filterHash + '"]').trigger('click');
				}
			} );
		}
		
		if ( 'show' == search ) {
			$search_input.on({
                focus: function focus() {
                    $scope.find( '.pp-search-form' ).addClass('pp-search-form-focus');
                },
                blur: function blur() {
                    $scope.find( '.pp-search-form' ).removeClass('pp-search-form-focus');
                }
            });
			
			if ( 'instant' == search_action ) {
				$scope.find('.pp-search-form-input').keyup(debounce(function () {
					_postsSearchAjax( $scope, $( this ) );
				}));      

				// debounce so filtering doesn't happen every millisecond
				function debounce(pp, threshold) {
					var timeout;
					threshold = threshold || 100;
					return function debounced() {
						clearTimeout(timeout);
						var args = arguments;
						var _this = this;

						function delayed() {
							pp.apply(_this, args);
						}
						timeout = setTimeout(delayed, threshold);
					};
				}
			} else if ( 'button-click' == search_action ) {
				$scope.find( '.pp-search-form-submit' ).on( 'click', function() {

					_postsSearchAjax( $scope, $( this ) );

				});
			}
		}
		
		if ( container.find('.pp-posts').hasClass( 'pp-posts-skin-checkerboard' ) && $scope.hasClass( 'pp-equal-height-yes' ) ) {
			function setEqualHeight() {
				var elementorBreakpoints = elementorFrontend.config.breakpoints,
					maxHeight = 0,
					$height = 'auto';
				
				$scope.find('.pp-post-wrap').each( function() {
					if( $(this).find('.pp-post-content').outerHeight() > maxHeight ){
						maxHeight = $(this).find('.pp-post-content').outerHeight();
					}
				});
				if ($(window).width() >= elementorBreakpoints.md) {
					$height = maxHeight;
				}
				$scope.find('.pp-post-wrap').css('height',$height);
			}

			if ( container.find('.pp-posts').hasClass( 'pp-posts-height-auto' ) ) {
				$(setEqualHeight);
				$(window).resize(setEqualHeight);
			}
		}

		if ( container.hasClass( 'pp-posts-infinite-scroll' ) || coupon_container.hasClass( 'pp-coupons-infinite-scroll' ) ) {

			var windowHeight50 = jQuery( window ).outerHeight() / 1.25;

			$( window ).scroll( function () {

				if ( elementorFrontend.isEditMode() ) {
					loader.show();
					return false;
				}

				if ( coupon_container.hasClass( 'pp-coupons-infinite-scroll' ) ) {
					if ( ( $( window ).scrollTop() + windowHeight50 ) >= ( $scope.find( '.pp-coupons-grid-wrapper:last' ).offset().top ) ) {
						var $args = {
							'page_id':		$scope.find( '.pp-coupons-grid-wrapper' ).data('page'),
							'widget_id':	$scope.data( 'id' ),
							'filter':		$scope.find( '.pp-filter-current' ).data( 'filter' ),
							'taxonomy':		$scope.find( '.pp-filter-current' ).data( 'taxonomy' ),
							'skin':			$scope.find( '.pp-coupons-grid-wrapper' ).data( 'skin' ),
							'page_number':	$scope.find( '.page-numbers.current' ).next( 'a' ).html(),
							'ajax_for':     'coupon'
						};

						total = $scope.find( '.pp-posts-pagination' ).data( 'total' );

						if( true == loadStatus ) {
	
							if ( count < total ) {
								loader.show();
								_callAjax( $scope, $args, true );
								count++;
								loadStatus = false;
							}
	
						}
					}
				} else {
					if ( ( $( window ).scrollTop() + windowHeight50 ) >= ( $scope.find( '.pp-post:last' ).offset().top ) ) {

						var $args = {
							'page_id':		$scope.find( '.pp-posts' ).data('page'),
							'widget_id':	$scope.data( 'id' ),
							'filter':		$scope.find( '.pp-filter-current' ).data( 'filter' ),
							'taxonomy':		$scope.find( '.pp-filter-current' ).data( 'taxonomy' ),
							'skin':			$scope.find( '.pp-posts' ).data( 'skin' ),
							'page_number':	$scope.find( '.pp-posts-pagination .current' ).next( 'a' ).html(),
							'ajax_for':     ''
						};
	
						total = $scope.find( '.pp-posts-pagination' ).data( 'total' );
	
						if( true == loadStatus ) {
	
							if ( count < total ) {
								loader.show();
								_callAjax( $scope, $args, true );
								count++;
								loadStatus = false;
							}
	
						}
					}
				}
			} );
		}
		
		if ( 'carousel' == layout ) {
			var $carousel		= $scope.find( '.pp-posts-carousel' ).eq( 0 ),
				$slider_options	= JSON.parse( $carousel.attr('data-slider-settings') );

			if ( $carousel.length > 0 ) {
				$scope.imagesLoaded( function() {
					$carousel.slick($slider_options);
				});
			}

			$($carousel).on('setPosition', function () {
				equalHeight($scope);
			});
		}
	}

	$( document ).on( 'click', '.pp-post-load-more', function( e ) {

		$scope = $( this ).closest( '.elementor-widget-pp-posts' );
		loader = $scope.find( '.pp-posts-loader' );

		//Coupon widget
		var $coupon_scope = $( this ).closest( '.elementor-widget-pp-coupons' );
		coupon_loader = $coupon_scope.find( '.pp-posts-loader' );

		e.preventDefault();

		if( elementorFrontend.isEditMode() ) {
			loader.show();
			coupon_loader.show();
			return false;
		}

		if ( $coupon_scope.length > 0 ) {
			var page_count = get_posts_count( $coupon_scope ),
			category = $coupon_scope.find( '.pp-filter-current' ).data( 'filter' ),
			taxonomy = $coupon_scope.find( '.pp-filter-current' ).data( 'taxonomy' );

			var $args = {
				'page_id':		$coupon_scope.find( '.pp-coupons-grid-wrapper' ).data('page'),
				'widget_id':	$coupon_scope.data( 'id' ),
				'filter':		( category ) ? category : '',
				'taxonomy':		( taxonomy ) ? taxonomy : '',
				'page_number':	( page_count + 1 ),
				'ajax_for':     'coupon'
			};

			total = $coupon_scope.find( '.pp-posts-pagination' ).data( 'total' );

			if ( true == loadStatus ) {
				if ( page_count < total ) {
					coupon_loader.show();
					$( this ).hide();
					_callAjax( $coupon_scope, $args, true, page_count );
					page_count++;
					loadStatus = false;
				}
			}

		} else {
			var page_count = get_posts_count( $scope ),
			category = $scope.find( '.pp-filter-current' ).data( 'filter' ),
			taxonomy = $scope.find( '.pp-filter-current' ).data( 'taxonomy' );

			var $args = {
				'page_id':		$scope.find( '.pp-posts' ).data('page'),
				'widget_id':	$scope.data( 'id' ),
				'filter':		( category ) ? category : '',
				'taxonomy':		( taxonomy ) ? taxonomy : '',
				'skin':			$scope.find( '.pp-posts' ).data( 'skin' ),
				'page_number':	( page_count + 1 ),
				'ajax_for':     ''
			};

			total = $scope.find( '.pp-posts-pagination' ).data( 'total' );

			if ( true == loadStatus ) {

				if ( page_count < total ) {
					loader.show();
					$( this ).hide();
					_callAjax( $scope, $args, true, page_count );
					page_count++;
					loadStatus = false;
				}

			}
		}
	} );

	function get_posts_count( $scope ) {
		return $scope.find('.pp-post-load-more').data('count');
	}
	function set_posts_count( $scope, count ) {
		$scope.find('.pp-post-load-more').attr('data-count', count);
	}

	$( 'body' ).on( 'click', '.pp-posts-pagination-ajax .page-numbers', function( e ) {

		$scope = $( this ).closest( '.elementor-widget-pp-posts' );

		// Coupon widget
		var $coupon_scope = $( this ).closest( '.elementor-widget-pp-coupons' );
		
		if ( 'main' == $scope.find( '.pp-posts' ).data( 'query-type' ) ) {
			return;
		}

		e.preventDefault();

		if ( $coupon_scope.length > 0 ) {
			$coupon_scope.find( '.pp-coupons-grid-wrapper .pp-coupon' ).last().after( '<div class="pp-post-loader"><div class="pp-loader"></div><div class="pp-loader-overlay"></div></div>' );

			var page_number = 1;
			var curr = parseInt( $coupon_scope.find( '.pp-posts-pagination .page-numbers.current' ).html() );

			if ( $( this ).hasClass( 'next' ) ) {
				page_number = curr + 1;
			} else if ( $( this ).hasClass( 'prev' ) ) {
				page_number = curr - 1;
			} else {
				page_number = $( this ).html();
			}

			var $args = {
				'page_id':		$coupon_scope.find( '.pp-coupons-grid-wrapper' ).data('page'),
				'widget_id':	$coupon_scope.data( 'id' ),
				'filter':		$coupon_scope.find( '.pp-filter-current' ).data( 'filter' ),
				'taxonomy':		$coupon_scope.find( '.pp-filter-current' ).data( 'taxonomy' ),
				'page_number':	page_number,
				'ajax_for':     'coupon'
			};

			$('html, body').animate({
				scrollTop: ( ( $coupon_scope.find( '.pp-coupons-wrap' ).offset().top ) - 30 )
			}, 'slow');

			_callAjax( $coupon_scope, $args );

		} else {
			$scope.find( '.pp-posts .pp-post' ).last().after( '<div class="pp-post-loader"><div class="pp-loader"></div><div class="pp-loader-overlay"></div></div>' );

			var page_number = 1;
			var curr = parseInt( $scope.find( '.pp-posts-pagination .page-numbers.current' ).html() );

			if ( $( this ).hasClass( 'next' ) ) {
				page_number = curr + 1;
			} else if ( $( this ).hasClass( 'prev' ) ) {
				page_number = curr - 1;
			} else {
				page_number = $( this ).html();
			}

			var $args = {
				'page_id':		$scope.find( '.pp-posts' ).data('page'),
				'widget_id':	$scope.data( 'id' ),
				'filter':		$scope.find( '.pp-filter-current' ).data( 'filter' ),
				'taxonomy':		$scope.find( '.pp-filter-current' ).data( 'taxonomy' ),
				'skin':			$scope.find( '.pp-posts' ).data( 'skin' ),
				'page_number':	page_number,
				'ajax_for':     ''
			};

			$('html, body').animate({
				scrollTop: ( ( $scope.find( '.pp-posts-container' ).offset().top ) - 30 )
			}, 'slow');

			_callAjax( $scope, $args );
		}

	} );

	var _postsFilterAjax = function( $scope, $this, $coupon ) {

		if ( 'coupon' === $coupon ) {
			$scope.find( '.pp-coupons-grid-wrapper .pp-grid-item-wrap' ).last().after( '<div class="pp-posts-loader-wrap"><div class="pp-loader"></div><div class="pp-loader-overlay"></div></div>' );
			var $args = {
				'page_id':		$scope.find( '.pp-coupons-grid-wrapper' ).data('page'),
				'widget_id':	$scope.data( 'id' ),
				'filter':		$this.data( 'filter' ),
				'taxonomy':		$this.data( 'taxonomy' ),
				'page_number':	1,
				'ajax_for':     'coupon'
			};

			_callAjax( $scope, $args );
		} else {
			$scope.find( '.pp-posts .pp-grid-item-wrap' ).last().after( '<div class="pp-posts-loader-wrap"><div class="pp-loader"></div><div class="pp-loader-overlay"></div></div>' );

			var $args = {
				'page_id':		$scope.find( '.pp-posts' ).data('page'),
				'widget_id':	$scope.data( 'id' ),
				'filter':		$this.data( 'filter' ),
				'taxonomy':		$this.data( 'taxonomy' ),
				'skin':			$scope.find( '.pp-posts' ).data( 'skin' ),
				'page_number':	1,
				'ajax_for':     ''
			};

			_callAjax( $scope, $args );
		}
	}
    
    var _postsSearchAjax = function( $scope, $this ) {

		$scope.find( '.pp-posts .pp-grid-item-wrap' ).last().after( '<div class="pp-posts-loader-wrap"><div class="pp-loader"></div><div class="pp-loader-overlay"></div></div>' );

		var $args = {
			'page_id':		$scope.find( '.pp-posts' ).data('page'),
			'widget_id':	$scope.data( 'id' ),
			'search':		$scope.find( '.pp-search-form-input' ).val(),
			'page_number':	1
		};
        
		_callAjax( $scope, $args );
	}

	var _callAjax = function( $scope, $obj, $append, $count ) {

		var loader = $scope.find( '.pp-posts-loader' );
		
		$.ajax({
			url: pp_posts_script.ajax_url,
			data: {
				action:			'pp_get_post',
				page_id:		$obj.page_id,
				widget_id:		$obj.widget_id,
				category:		$obj.filter,
				search:			$obj.search,
				taxonomy:		$obj.taxonomy,
				skin:			$obj.skin,
				page_number:	$obj.page_number,
				ajax_for:		$obj.ajax_for,
				nonce:			pp_posts_script.posts_nonce,
			},
			dataType: 'json',
			type: 'POST',
			success: function( data ) {
				if ( 'coupon' === $obj.ajax_for ) {
					var sel = $scope.find( '.pp-coupons-grid-wrapper' );
					var not_found = $scope.find( '.pp-posts-empty' );

					not_found.remove();

					if ( $( not_found ).length == 0 ) {
						$(data.data.not_found).insertBefore(sel);
					}

					if ( true == $append ) {
						var html_str = data.data.html;
						sel.append( html_str );
					} else {
						sel.html( data.data.html );
					}

					$scope.find( '.pp-posts-pagination-wrap' ).html( data.data.pagination );

					//	Complete the process 'loadStatus'
					loadStatus = true;
					if ( true == $append ) {
						loader.hide();
						$scope.find( '.pp-post-load-more' ).show();
					}

					set_posts_count( $scope, $obj.page_number );
					
					$count = $count + 1;
					
					if( $count == total ) {
						$scope.find( '.pp-post-load-more' ).hide();
					}

					$scope.trigger('posts.rendered');

				} else {
					var sel = $scope.find( '.pp-posts' );
					var not_found = $scope.find( '.pp-posts-empty' );

					not_found.remove();

					if ( $( not_found ).length == 0 ) {
						$(data.data.not_found).insertBefore(sel);
					}

					if ( true == $append ) {

						var html_str = data.data.html;

						sel.append( html_str );
					} else {
						sel.html( data.data.html );
					}

					$scope.find( '.pp-posts-pagination-wrap' ).html( data.data.pagination );

					var layout = $scope.find( '.pp-posts' ).data( 'layout' ),
						selector = $scope.find( '.pp-posts' );

					if ( 'masonry' == layout ) {

						$scope.imagesLoaded( function() {
							selector.isotope( 'destroy' );
							selector.isotope({
								layoutMode: layout,
								itemSelector: '.pp-grid-item-wrap',
							});
						});
					}

					//	Complete the process 'loadStatus'
					loadStatus = true;
					if ( true == $append ) {
						loader.hide();
						$scope.find( '.pp-post-load-more' ).show();
					}

					set_posts_count( $scope, $obj.page_number );
					
					$count = $count + 1;
					
					if( $count == total ) {
						$scope.find( '.pp-post-load-more' ).hide();
					}

					$scope.trigger('posts.rendered');
				}
			}
		});
	}

	$( window ).on( 'elementor/frontend/init', function () {

		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.classic', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.card', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.checkerboard', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.creative', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.event', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.news', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.portfolio', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.overlap', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-posts.template', PostsHandler );
		
		elementorFrontend.hooks.addAction( 'frontend/element_ready/pp-coupons.default', PostsHandler );

	});

} )( jQuery );