WPBFPremium.menu = (function ($) {
	var isInsideCustomizer = WPBFPremium.site.isInsideCustomizer;
	var breakpoints = WPBFPremium.site.breakpoints;

	/**
	 * Call main functions.
	 */
	function init() {
		setupMenuToggle();
		setupSubmenuToggle();
		setupMenuClose();
		stopPropagation();
	}

	/**
	 * Check if a menu is enabled.
	 * 
	 * @param {string} type The menu type.
	 */
	function isMenuEnabled(type) {
		switch (type) {
			case 'full-screen':
				return (document.querySelector('.wpbf-menu-full-screen') ? true : false);

			case 'off-canvas':
				return (document.querySelector('.wpbf-menu-off-canvas') ? true : false);

			case 'mobile-off-canvas':
				return (document.querySelector('.wpbf-mobile-menu-off-canvas') ? true : false);

			default:
				return false;
		}
	}

	/**
	 * Check if a transparent header is disabled on mobiles.
	 */
	function isTransparentHeaderDisabled(device) {
		return (document.querySelector('[data-transparent-header-disabled="' + device + '"]') ? true : false);
	}

	/**
	 * Setup menu toggle.
	 */
	function setupMenuToggle() {
		$(document).on('click', '.wpbf-menu-toggle', function () {
			if (isMenuEnabled('full-screen')) {
				toggleMenu('full-screen');
			} else if (isMenuEnabled('off-canvas')) {
				toggleMenu('off-canvas');
			}
		});

		$(document).on('click', '.wpbf-mobile-menu-toggle', function () {
			if (isMenuEnabled('mobile-off-canvas')) {
				toggleMenu('mobile-off-canvas');
			}
		});

		// Close mobile menu on anchor link clicks but only if menu item doesn't have submenus.
		$(document).on('click', '.wpbf-mobile-menu a', function () {
			if (!isMenuEnabled('mobile-off-canvas')) return;

			var hasSubMenu = this.parentNode.classList.contains('menu-item-has-children');

			if (this.href.match("#") || this.href.match("/#")) {

				if (!hasSubMenu) {
					toggleMenu('mobile-off-canvas');
				} else {
					toggleSubmenuOnEmptyLink(this);
				}
			}
		});

		// Close fullscreen menu on anchor link clicks but only if menu item doesn't have submenus.
		$(document).on('click', '.wpbf-menu-full-screen a', function () {

			var hasSubmenu = this.parentNode.classList.contains('menu-item-has-children');

			if (this.href.match("#") || this.href.match("/#")) {

				if (!hasSubmenu) {
					toggleMenu('full-screen');
				} else {
					toggleSubmenuOnEmptyLink(this);
				}
			}

		});
	}

	/**
	 * Setup submenu toggle.
	 */
	function setupSubmenuToggle() {
		$(document).on('click', '.wpbf-menu-off-canvas .wpbf-submenu-toggle', function (e) {
			e.preventDefault();

			if (this.classList.contains("active")) {
				$('i', this).removeClass('wpbff-arrow-up').addClass('wpbff-arrow-down');
				$(this).removeClass('active').attr('aria-expanded', 'false').siblings('.sub-menu').stop().slideUp();
			} else {
				$('i', this).removeClass('wpbff-arrow-down').addClass('wpbff-arrow-up');
				$(this).addClass('active').attr('aria-expanded', 'true').siblings('.sub-menu').stop().slideDown();
			}
		});

		$(document).on('click', '.wpbf-mobile-menu-off-canvas .wpbf-submenu-toggle', function (e) {
			e.preventDefault();
			toggleSubmenu(this);
		});
	}

	/**
 	 * Setup menu close.
 	 */
	function setupMenuClose() {
		$(document).on('click', '.wpbf-menu-full-screen .wpbf-close', function () {
			closeMenu('full-screen');
		});

		$(document).on('click', '.wpbf-menu-off-canvas .wpbf-close', function () {
			toggleMenu('off-canvas');
		});

		$(document).on('click', '.wpbf-mobile-menu-off-canvas .wpbf-close', function () {
			toggleMenu('mobile-off-canvas');
		});

		window.addEventListener('click', function () {
			if (isMenuEnabled('off-canvas')) {
				closeMenu('off-canvas');
			}

			if (isMenuEnabled('mobile-off-canvas')) {
				closeMenu('mobile-off-canvas');
			}
		});

		$(document).on('keyup', function (e) {
			if (e.key !== 'Escape' && e.key !== 'Esc' && e.keyCode !== 27) return;

			if (isMenuEnabled('full-screen')) {
				closeMenu('full-screen');
			} else if (isMenuEnabled('off-canvas')) {
				closeMenu('off-canvas');
			}

			if (isMenuEnabled('mobile-off-canvas')) {
				closeMenu('mobile-off-canvas');
			}
		});

		$(window).on( 'resize', function () {
			var windowWidth = $(window).width();

			if( isTransparentHeaderDisabled('mobile') ) {

				var mobileLogo = $('.wpbf-logo').data("menu-mobile-logo");
				var transparentLogo = $('.wpbf-logo').data("menu-transparent-logo");

				if (windowWidth < breakpoints.desktop) {
					$('body').removeClass('wpbf-transparent-header');
					$('.wpbf-navigation').removeClass('wpbf-navigation-transparent');
					// $('.wpbf-mobile-logo img').attr('src', mobileLogo);
				} else {
					$('body').addClass('wpbf-transparent-header');
					$('.wpbf-navigation').addClass('wpbf-navigation-transparent');
					// $('.wpbf-mobile-logo img').attr('src', transparentLogo);
				}

			}

			if (isMenuEnabled('off-canvas')) {
				if (windowWidth < breakpoints.desktop) {
					closeMenu('off-canvas');
				}
			}

			if (isMenuEnabled('mobile-off-canvas')) {
				if (windowWidth > breakpoints.desktop) {
					closeMenu('mobile-off-canvas');

					if ($('.wpbf-mobile-mega-menu').length) {
						$('.wpbf-mobile-mega-menu').removeClass('wpbf-mobile-mega-menu').addClass('wpbf-mega-menu');
					}
				} else {
					if ($('.wpbf-mega-menu').length) {
						$('.wpbf-mega-menu').removeClass('wpbf-mega-menu').addClass('wpbf-mobile-mega-menu');
					}
				}
			}
		});
	}

	/**
	 * Specific setup for both off-canvas & mobile-off-canvas.
	 */
	function stopPropagation() {
		$(document).on('click', '.wpbf-menu-off-canvas, .wpbf-menu-toggle', function (e) {
			e.stopPropagation();
		});

		$(document).on('click', '.wpbf-mobile-menu-container, .wpbf-mobile-menu-toggle', function (e) {
			e.stopPropagation();
		});
	}

	/**
	 * Setup menu toggle.
	 *
	 * @param {string} type The menu type.
	 */
	function toggleMenu(type) {
		var toggle = document.querySelector('.wpbf-menu-toggle');
		var menu;

		if (type === 'full-screen') {

			menu = document.querySelector('.wpbf-menu-full-screen');

			if (menu.classList.contains('active')) {
				toggle.classList.remove("active");
				toggle.setAttribute('aria-expanded', 'false');
				menu.classList.remove('active');
				$(menu).stop().fadeOut(150);
			} else {
				toggle.classList.add("active");
				toggle.setAttribute('aria-expanded', 'true');
				menu.classList.add('active');
				$(menu).stop().fadeIn(150);
			}

		} else if (type === 'off-canvas') {

			menu = document.querySelector('.wpbf-menu-off-canvas');

			if (menu.classList.contains("active")) {

				toggle.classList.remove("active");
				toggle.setAttribute('aria-expanded', 'false');
				menu.classList.remove('active');
				document.body.classList.remove('active');
				$('.wpbf-menu-overlay').stop().animate({ opacity: '0' }, 300, function () {
					this.style.display = 'none';
				});

			} else {

				menu.setAttribute('tabindex', '-1');
				menu.focus();
				toggle.classList.add("active");
				toggle.setAttribute('aria-expanded', 'true');
				menu.classList.add('active');
				document.body.classList.add('active');
				$('.wpbf-menu-overlay').stop().css({ display: 'block' }).animate({ opacity: '1' }, 300);

			}

		} else if (type === 'mobile-off-canvas') {

			toggle = document.querySelector('.wpbf-mobile-menu-toggle');

			if (toggle.classList.contains('active')) {
				document.body.classList.remove('active-mobile');
				toggle.classList.remove("active")
				toggle.setAttribute('aria-expanded', 'false');
				$('.wpbf-mobile-menu-container').removeClass('active');
				$('.wpbf-mobile-menu-overlay').stop().animate({ opacity: '0' }, 300, function () {
					this.style.display = 'none';
				});
			} else {
				document.body.classList.add('active-mobile');
				toggle.classList.add("active");
				toggle.setAttribute('aria-expanded', 'true');
				$('.wpbf-mobile-menu-container').addClass('active');
				$('.wpbf-mobile-menu-overlay').css({ display: 'block' }).stop().animate({ opacity: '1' }, 300);
			}

		}
	}

	/**
	 * Close menu.
	 * 
	 * @param {string} type The menu type.
	 */
	function closeMenu(type) {
		var toggle = document.querySelector('.wpbf-menu-toggle');
		var menu;

		if (type === 'full-screen') {

			menu = document.querySelector('.wpbf-menu-full-screen');
			if (!menu.classList.contains('active')) return;

			menu.classList.remove('active');
			$(menu).stop().fadeOut(150);

		} else if (type === 'off-canvas') {

			menu = document.querySelector('.wpbf-menu-off-canvas');
			if (!menu.classList.contains('active')) return;

			toggle.classList.remove("active");
			toggle.setAttribute('aria-expanded', 'false');
			menu.classList.remove('active');
			document.body.classList.remove('active');

			$('.wpbf-menu-overlay').stop().animate({ opacity: '0' }, 300, function () {
				this.style.display = 'none';
			});

		} else if (type === 'mobile-off-canvas') {

			toggle = document.querySelector('.wpbf-mobile-menu-toggle');

			if (!toggle.classList.contains('active')) return;

			document.body.classList.remove('active-mobile');
			toggle.classList.remove("active");
			toggle.setAttribute('aria-expanded', 'false');
			$('.wpbf-mobile-menu-container').removeClass('active');

			$('.wpbf-mobile-menu-overlay').stop().animate({ opacity: '0' }, 300, function () {
				this.style.display = 'none';
			});

		}
	}

	/**
	 * Toggle mobile off-canvas submenu.
	 * 
	 * @param {HTMLElement} menu The menu.
	 */
	function toggleSubmenu(menu) {
		if (menu.classList.contains("active")) {
			$('i', menu).removeClass('wpbff-arrow-up').addClass('wpbff-arrow-down');
			$(menu).removeClass('active').attr('aria-expanded', 'false').siblings('.sub-menu').slideUp();
		} else {
			$('i', menu).removeClass('wpbff-arrow-down').addClass('wpbff-arrow-up');
			$(menu).addClass('active').attr('aria-expanded', 'true').siblings('.sub-menu').slideDown();
		}
	}

	/**
	 * Toggle mobile off-canvas submenu.
	 * 
	 * @param {HTMLElement} menu The menu.
	 */
	function toggleSubmenuOnEmptyLink(menu) {
		var $toggle = $(menu).siblings('.wpbf-submenu-toggle');

		if ($toggle.hasClass("active")) {
			$('i', $toggle).removeClass('wpbff-arrow-up').addClass('wpbff-arrow-down');
			$toggle.removeClass('active').attr('aria-expanded', 'false').siblings('.sub-menu').slideUp();
		} else {
			$('i', $toggle).removeClass('wpbff-arrow-down').addClass('wpbff-arrow-up');
			$toggle.addClass('active').attr('aria-expanded', 'true').siblings('.sub-menu').slideDown();
		}
	}

	init();
})(jQuery);