(function ($) {

	/**
	 * Helper class for header layout logic.
	 *
	 * @since 1.4.15
	 * @class PPHeaderLayout
	 */
	PPHeaderLayout = {

		/**
		 * A reference to the window object for this page.
		 *
		 * @since 1.4.15
		 * @property {Object} win
		 */
		win: null,

		/**
		 * A reference to the body object for this page.
		 *
		 * @since 1.4.15
		 * @property {Object} body
		 */
		body: null,

		/**
		 * A reference to the header object for this page.
		 *
		 * @since 1.4.15
		 * @property {Object} header
		 */
		header: null,

		/**
		 * Whether this header overlays the content or not.
		 *
		 * @since 1.4.15
		 * @property {Boolean} overlay
		 */
		overlay: false,

		/**
		 * Whether the page has the WP admin bar or not.
		 *
		 * @since 1.4.15
		 * @property {Boolean} hasAdminBar
		 */
		hasAdminBar: false,

		/**
		 * Initializes header layout logic.
		 *
		 * @since 1.4.15
		 * @method init
		 */
		init: function () {
			var isEditMode = false,
				header = $('.pp-elementor-header[data-type=header]');

			if (elementorFrontend.isEditMode()) {
				var isEditMode = true;
			}

			if (!isEditMode && header.length) {
				header.imagesLoaded($.proxy(function () {

					this.win = $(window);
					this.body = $('body');
					this.header = header.eq(0);
					this.overlay = !!Number(header.attr('data-overlay'));
					this.hasAdminBar = !!$('body.admin-bar').length;

					if (Number(header.attr('data-sticky'))) {

						this.header.data('original-top', this.header.offset().top);
						//this.win.on( 'resize', $.throttle( 500, $.proxy( this._initSticky, this ) ) );
						this._initSticky();

						if (Number(header.attr('data-shrink'))) {
							this.header.data('original-height', this.header.outerHeight());
							//this.win.on( 'resize', $.throttle( 500, $.proxy( this._initShrink, this ) ) );
							this._initShrink();
						}
					}

				}, this));
			}
		},

		/**
		 * Initializes sticky logic for a header.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _initSticky
		 */
		_initSticky: function () {

			var breakpoint = this.header.data("breakpoint");

			if (this._matchDevice(breakpoint)) {
				this.win.on('scroll.pp-header-sticky', $.proxy(this._doSticky, this));
				this._doSticky();
			} else {
				this.win.off('scroll.pp-header-sticky');
				this.header.removeClass('pp-header-sticky');
				this.body.css('padding-top', '0');
			}
		},

		/**
		 * Matches the current device for set breakpoint.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _matchDevice
		 */
		_matchDevice: function (breakpoint) {

			var breakpoints = elementorFrontend.config.breakpoints;

			var match = false;

			if ('all' === breakpoint) {
				match = true;
			} else if ('large' === breakpoint) {
				match = window.innerWidth > breakpoints.md;
			} else if ('large-medium' === breakpoint) {
				match = window.innerWidth > breakpoints.sm;
			} else if ('medium' === breakpoint) {
				match = window.innerWidth > breakpoints.sm && window.innerWidth <= breakpoints.md;
			} else if ('medium-responsive' === breakpoint) {
				match = window.innerWidth <= breakpoints.md;
			} else if ('responsive' === breakpoint) {
				match = window.innerWidth <= breakpoints.sm;
			}

			return match;
		},

		/**
		 * Sticks the header when the page is scrolled.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _doSticky
		 */
		_doSticky: function () {
			var winTop = this.win.scrollTop(),
				headerTop = this.header.data('original-top'),
				hasStickyClass = this.header.hasClass('pp-header-sticky'),
				hasScrolledClass = this.header.hasClass('pp-header-scrolled');

			if (this.hasAdminBar) {
				winTop += 32;
			}

			if (winTop >= headerTop) {
				if (!hasStickyClass) {
					this.header.addClass('pp-header-sticky');
					if (!this.overlay) {
						this.body.css('padding-top', this.header.outerHeight() + 'px');
					}
				}
			}
			else if (hasStickyClass) {
				this.header.removeClass('pp-header-sticky');
				this.body.css('padding-top', '0');
			}

			if (winTop > headerTop) {
				if (!hasScrolledClass) {
					this.header.addClass('pp-header-scrolled');
				}
			} else if (hasScrolledClass) {
				this.header.removeClass('pp-header-scrolled');
			}
		},

		/**
		 * Initializes shrink logic for a header.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _initShrink
		 */
		_initShrink: function () {
			//elementorBreakpoints = elementorFrontend.config.breakpoints
			var breakpoint = this.header.data("breakpoint");

			if (this._matchDevice(breakpoint)) {
				this.win.on('scroll.pp-header-shrink', $.proxy(this._doShrink, this));
				this._setImageMaxHeight();
			} else {
				this.body.css('padding-top', '0');
				this.win.off('scroll.pp-header-shrink');
				this._removeShrink();
				this._removeImageMaxHeight();
			}
		},

		/**
		 * Shrinks the header when the page is scrolled.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _doShrink
		 */
		_doShrink: function () {
			var winTop = this.win.scrollTop(),
				headerTop = this.header.data('original-top'),
				headerHeight = this.header.data('original-height'),
				hasClass = this.header.hasClass('pp-header-shrink');

			if (this.hasAdminBar) {
				winTop += 32;
			}

			if (winTop > headerTop + headerHeight) {

				if (!hasClass) {

					this.header.addClass('pp-header-shrink');

					this.header.find('.elementor-section').each(function () {

						var row = $(this);

						if (parseInt(row.css('padding-bottom')) > 5) {
							row.addClass('pp-header-shrink-row-bottom');
						}

						if (parseInt(row.css('padding-top')) > 5) {
							row.addClass('pp-header-shrink-row-top');
						}
					});

					this.header.find('.elementor-top-column').each(function () {

						var module = $(this);

						if (parseInt(module.css('margin-bottom')) > 5) {
							module.addClass('pp-header-shrink-module-bottom');
						}

						if (parseInt(module.css('margin-top')) > 5) {
							module.addClass('pp-header-shrink-module-top');
						}
					});
				}
			} else if (hasClass) {
				this._removeShrink();
			}
		},

		/**
		 * Removes the header shrink effect.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _removeShrink
		 */
		_removeShrink: function () {
			var rows = this.header.find('.elementor-section'),
				modules = this.header.find('.elementor-top-column');

			rows.removeClass('pp-header-shrink-row-bottom');
			rows.removeClass('pp-header-shrink-row-top');
			modules.removeClass('pp-header-shrink-module-bottom');
			modules.removeClass('pp-header-shrink-module-top');
			this.header.removeClass('pp-header-shrink');
		},

		/**
		 * Adds max height to images in modules for smooth scrolling.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _setImageMaxHeight
		 */
		_setImageMaxHeight: function () {
			var head = $('head'),
				stylesId = 'pp-header-styles-' + this.header.data('header-id'),
				styles = '',
				images = this.header.find('.elementor-element img');

			if ($('#' + stylesId).length) {
				return;
			}

			images.each(function (i) {
				var image = $(this),
					height = image.height(),
					node = image.closest('.elementor-element').data('id'),
					className = 'elementor-element-' + node + '-img-' + i;

				image.addClass(className);
				image.attr('data-no-lazy', 1);
				styles += '.' + className + ' { max-height: ' + height + 'px }';
			});

			if ('' !== styles) {
				head.append('<style id="' + stylesId + '">' + styles + '</style>');
			}
		},

		/**
		 * Removes max height on images in modules for smooth scrolling.
		 *
		 * @since 1.4.15
		 * @access private
		 * @method _removeImageMaxHeight
		 */
		_removeImageMaxHeight: function () {
			$('#pp-header-styles-' + this.header.data('header-id')).remove();
		},
	};

	$(function () { PPHeaderLayout.init(); });

})(jQuery);
