/*=========================================================================================

  File Name: app-menu.js

  Description: Menu navigation, custom scrollbar, hover scroll bar, multilevel menu

  initialization and manipulations

  ----------------------------------------------------------------------------------------

  Item Name: Modern Admin - Clean Bootstrap 4 Dashboard HTML Template

  Author: Pixinvent

  Author URL: hhttp://www.themeforest.net/user/pixinvent

==========================================================================================*/

(function (window, document, $) {

  "use strict";



  $.app = $.app || {};



  var $body = $("body");

  var $window = $(window);

  var menuWrapper_el = $('div[data-menu="menu-wrapper"]').html();

  var menuWrapperClasses = $('div[data-menu="menu-wrapper"]').attr("class");



  // Main menu

  $.app.menu = {

    expanded: null,

    collapsed: null,

    hidden: null,

    container: null,

    horizontalMenu: false,



    is_touch_device: function () {

      var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');

      var mq = function (query) {

        return window.matchMedia(query).matches;

      }

      if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {

        return true;

      }

      // include the 'heartz' as a way to have a non matching MQ to help terminate the join

      // https://git.io/vznFH

      var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');

      return mq(query);

    },



    manualScroller: {

      obj: null,



      init: function () {

        // console.log($.app.menu.is_touch_device())

        if (!$.app.menu.is_touch_device()) {

          this.obj = new PerfectScrollbar(".main-menu-content", {

            suppressScrollX: true,

            wheelPropagation: false

          });

        }

        else {

          $(".main-menu").addClass("menu-native-scroll")

        }



      },



      update: function () {

        if (this.obj) {

          // Scroll to currently active menu on page load if data-scroll-to-active is true

          if ($(".main-menu").data("scroll-to-active") === true) {

            var activeEl, menu, activeElHeight;

            activeEl = document.querySelector(".main-menu-content li.active");

            menu = document.querySelector(".main-menu-content");

            if ($body.hasClass("menu-collapsed")) {

              if ($(".main-menu-content li.menu-collapsed-open").length) {

                activeEl = document.querySelector(

                  ".main-menu-content li.menu-collapsed-open"

                );

              }

            }

            if (activeEl) {

              activeElHeight =

                activeEl.getBoundingClientRect().top + menu.scrollTop;

            }

            // If active element's top position is less than 2/3 (66%) of menu height than do not scroll

            if (activeElHeight > parseInt((menu.clientHeight * 2) / 3)) {

              var start = menu.scrollTop,

                change =

                  activeElHeight - start - parseInt(menu.clientHeight / 2);

            }

            setTimeout(function () {

              $.app.menu.container.stop().animate(

                {

                  scrollTop: change

                },

                300

              );

              $(".main-menu").data("scroll-to-active", "false");

            }, 300);

          }

          this.obj.update();

        }

      },



      enable: function () {

        if (!$(".main-menu-content").hasClass("ps")) {

          this.init();

        }

      },



      disable: function () {

        if (this.obj) {

          this.obj.destroy();

        }

      },



      updateHeight: function () {

        if (

          ($body.data("menu") == "vertical-menu" ||

            $body.data("menu") == "vertical-menu-modern" ||

            $body.data("menu") == "vertical-overlay-menu") &&

          $(".main-menu").hasClass("menu-fixed")

        ) {

          $(".main-menu-content").css(

            "height",

            $(window).height() -

            $(".header-navbar").height() -

            $(".main-menu-header").outerHeight()

          );

          this.update();

        }

      }

    },



    init: function (compactMenu) {

      if ($(".main-menu-content").length > 0) {

        this.container = $(".main-menu-content");



        var menuObj = this;

        var defMenu = "";



        if (compactMenu === true) {

          defMenu = "collapsed";

        }



        this.change(defMenu);

      }



      if (defMenu === "collapsed") {

        this.collapse();

      }

    },



    change: function (defMenu) {

      var currentBreakpoint = Unison.fetch.now(); // Current Breakpoint



      this.reset();



      var menuType = $body.data("menu");



      if (currentBreakpoint) {

        switch (currentBreakpoint.name) {

          case "xl":

            if (menuType === "vertical-overlay-menu") {

              this.hide();

            } else if (menuType === "vertical-compact-menu") {

              this.open();

            } else {

              if (defMenu === "collapsed") this.collapse(defMenu);

              else this.expand();

            }

            break;

          case "lg":

            if (menuType === "vertical-overlay-menu") {

              this.hide();

            } else if (menuType === "vertical-compact-menu") {

              this.open();

            } else if (menuType === "horizontal-menu") {

              this.hide();

            } else {

              if (defMenu === "collapsed") this.collapse(defMenu);

              else this.expand();

            }

            break;

          case "md":

            if (

              menuType === "vertical-overlay-menu" ||

              menuType === "vertical-menu-modern"

            ) {

              this.hide();

            } else if (menuType === "vertical-compact-menu") {

              this.open();

            } else if (menuType === "horizontal-menu") {

              this.hide();

            } else {

              this.collapse();

            }

            break;

          case "sm":

            this.hide();

            break;

          case "xs":

            this.hide();

            break;

        }

      }



      // On the small and extra small screen make them overlay menu

      if (

        menuType === "vertical-menu" ||

        menuType === "vertical-compact-menu" ||

        menuType === "vertical-content-menu" ||

        menuType === "vertical-menu-modern"

      ) {

        this.toOverlayMenu(currentBreakpoint.name, menuType);

      }



      if (

        $body.is(".horizontal-layout") &&

        !$body.hasClass(".horizontal-menu-demo")

      ) {

        this.changeMenu(currentBreakpoint.name);



        $(".menu-toggle").removeClass("is-active");

      }



      // Dropdown submenu on large screen on hover For Large screen only

      // ---------------------------------------------------------------

      if (currentBreakpoint.name == "xl") {

        $('body[data-open="hover"] .dropdown')

          .off("mouseenter")

          .on("mouseenter", function (e) {

            if (!$(this).hasClass("show")) {

              $(this).addClass("show");

            } else {

              $(this).removeClass("show");

            }

          })

          .off("mouseleave")

          .on("mouseleave", function (event) {

            $(this).removeClass("show");

          });

      }



      // Added data attribute brand-center for navbar-brand-center

      // TODO:AJ: Shift this feature in PUG.

      if ($(".header-navbar").hasClass("navbar-brand-center")) {

        $(".header-navbar").attr("data-nav", "brand-center");

      }

      if (currentBreakpoint.name == "sm" || currentBreakpoint.name == "xs") {

        $(".header-navbar[data-nav=brand-center]").removeClass(

          "navbar-brand-center"

        );

      } else {

        $(".header-navbar[data-nav=brand-center]").addClass(

          "navbar-brand-center"

        );

      }



      // Dropdown submenu on small screen on click

      // --------------------------------------------------

      $("ul.dropdown-menu [data-toggle=dropdown]").on("click", function (event) {

        if ($(this).siblings("ul.dropdown-menu").length > 0) {

          event.preventDefault();

        }

        event.stopPropagation();

        $(this)

          .parent()

          .siblings()

          .removeClass("show");

        $(this)

          .parent()

          .toggleClass("show");

      });



      // Horizontal layout submenu open left based on available space (click event)

      if (menuType == 'horizontal-menu') {

        $('li.dropdown-submenu .dropdown-item').on('click', function () {

          var dd = $(this).parent().find('.dropdown-menu');

          if (dd.length) {

            var pageHeight = $(window).height(),

              ddTop = dd.offset().top,

              ddLeft = dd.offset().left,

              ddWidth = dd.width(),

              ddHeight = dd.height();

            if (((pageHeight - ddTop) - ddHeight - 28) < 1) {

              var maxHeight = (pageHeight - ddTop - 25);

              if ($("body").data("open") === "click") {

                $(this).parent().find('.dropdown-menu').css({ 'max-height': maxHeight + 'px', 'overflow-y': 'auto', 'overflow-x': 'hidden' });

                var menu_content = new PerfectScrollbar('li.dropdown-submenu.show .dropdown-menu', {

                  wheelPropagation: false

                });

              }

            }

            // Add class to open left in horizontal sub menu if screen width is small in LTR

            if ($("html").data("textdirection") === "ltr" && ddLeft + ddWidth - (window.innerWidth - 16) >= 0) {

              $(this).parent().find('.dropdown-menu').addClass('open-left');

            }

            // Add class to open right in horizontal sub menu if screen width is small in RTL

            else if ($("html").data("textdirection") === "rtl" && ddLeft + ddWidth - (window.innerWidth - 1000) <= 0) {

              $(this).parent().find('.dropdown-menu').addClass('open-left');

            }

          }

        });

        // Horizontal layout submenu open left based on available space (hover event)

        $('li.dropdown-submenu').on('mouseenter', function () {

          var dd = $(this).find('.dropdown-menu');

          if (dd.length) {

            var pageHeight = $(window).height(),

              ddTop = dd.offset().top,

              ddLeft = dd.offset().left,

              ddWidth = dd.width(),

              ddHeight = dd.height();

            if (((pageHeight - ddTop) - ddHeight - 28) < 1) {

              var maxHeight = (pageHeight - ddTop - 25);

              if ($("body").data("open") === "hover") {

                $(this).find('.dropdown-menu').css({ 'max-height': maxHeight + 'px', 'overflow-y': 'auto', 'overflow-x': 'hidden' });

                var mouseEnterPS = new PerfectScrollbar('li.dropdown-submenu.show .dropdown-menu', {

                  wheelPropagation: false

                });

              }

            }

            // Add class to open left in horizontal sub menu if screen width is small in LTR

            if ($("html").data("textdirection") === "ltr" && ddLeft + ddWidth - (window.innerWidth - 16) >= 0) {

              $(this).parent().find('.dropdown-menu').addClass('open-left');

            }

            // Add class to open right in horizontal sub menu if screen width is small in RTL

            else if ($("html").data("textdirection") === "rtl" && ddLeft + ddWidth - (window.innerWidth - 1000) <= 0) {

              $(this).parent().find('.dropdown-menu').addClass('open-left');

            }

          }

        });

      }

      // Horizontal Fixed Nav Sticky hight issue on small screens

      if (menuType == "horizontal-menu") {

        if (currentBreakpoint.name == "xl") {

          if ($(".navbar-fixed").length) {

            $(".navbar-fixed").sticky();

          }

        } else {

          if ($(".menu-fixed").length) {

            $(".menu-fixed").unstick();

          }

        }

      }

    },

    transit: function (callback1, callback2) {

      var menuObj = this;

      $body.addClass("changing-menu");



      callback1.call(menuObj);



      if ($body.hasClass("vertical-layout")) {

        if ($body.hasClass("menu-open") || $body.hasClass("menu-expanded")) {

          $(".menu-toggle").addClass("is-active");



          // Show menu header search when menu is normally visible

          if (

            $body.data("menu") === "vertical-menu" ||

            $body.data("menu") === "vertical-content-menu"

          ) {

            if ($(".main-menu-header")) {

              $(".main-menu-header").show();

            }

          }

        } else {

          $(".menu-toggle").removeClass("is-active");



          // Hide menu header search when only menu icons are visible

          if (

            $body.data("menu") === "vertical-menu" ||

            $body.data("menu") === "vertical-content-menu"

          ) {

            if ($(".main-menu-header")) {

              $(".main-menu-header").hide();

            }

          }

        }

      }



      setTimeout(function () {

        callback2.call(menuObj);

        $body.removeClass("changing-menu");



        menuObj.update();

      }, 500);

    },



    open: function () {

      this.transit(

        function () {

          $body.removeClass("menu-hide menu-collapsed").addClass("menu-open");

          this.hidden = false;

          this.expanded = true;



          if ($body.hasClass("vertical-overlay-menu")) {

            $(".sidenav-overlay")

              .removeClass("d-none")

              .addClass("d-block");

            $body.css("overflow", "hidden");

          }

        },

        function () {

          if (

            !$(".main-menu").hasClass("menu-native-scroll") &&

            $(".main-menu").hasClass("menu-fixed")

          ) {

            this.manualScroller.enable();

            $(".main-menu-content").css(

              "height",

              $(window).height() -

              $(".header-navbar").height() -

              $(".main-menu-header").outerHeight()

            );

            // this.manualScroller.update();

          }



          if (

            $body.data("menu") == "vertical-compact-menu" &&

            !$body.hasClass("vertical-overlay-menu")

          ) {

            $(".sidenav-overlay").removeClass("d-block d-none");

            $("body").css("overflow", "auto");

          }

        }

      );

    },



    hide: function () {

      this.transit(

        function () {

          $body.removeClass("menu-open menu-expanded").addClass("menu-hide");

          this.hidden = true;

          this.expanded = false;



          if ($body.hasClass("vertical-overlay-menu")) {

            $(".sidenav-overlay")

              .removeClass("d-block")

              .addClass("d-none");

            $("body").css("overflow", "auto");

          }

        },

        function () {

          if (

            !$(".main-menu").hasClass("menu-native-scroll") &&

            $(".main-menu").hasClass("menu-fixed")

          ) {

            this.manualScroller.enable();

          }



          if (

            $body.data("menu") == "vertical-compact-menu" &&

            !$body.hasClass("vertical-overlay-menu")

          ) {

            $(".sidenav-overlay").removeClass("d-block d-none");

            $("body").css("overflow", "auto");

          }

        }

      );

    },



    expand: function () {

      if (this.expanded === false) {

        if ($body.data("menu") == "vertical-menu-modern") {

          $(".modern-nav-toggle")

            .find(".toggle-icon")

            .removeClass("ft-toggle-left")

            .addClass("ft-toggle-right");



        }

        this.transit(

          function () {

            $body.removeClass("menu-collapsed").addClass("menu-expanded");

            this.collapsed = false;

            this.expanded = true;



            $(".sidenav-overlay").removeClass("d-block d-none");

          },

          function () {

            if (

              $(".main-menu").hasClass("menu-native-scroll") ||

              $body.data("menu") == "horizontal-menu"

            ) {

              this.manualScroller.disable();

            } else {

              if ($(".main-menu").hasClass("menu-fixed"))

                this.manualScroller.enable();

            }



            if (

              ($body.data("menu") == "vertical-menu" ||

                $body.data("menu") == "vertical-menu-modern") &&

              $(".main-menu").hasClass("menu-fixed")

            ) {

              $(".main-menu-content").css(

                "height",

                $(window).height() -

                $(".header-navbar").height() -

                $(".main-menu-header").outerHeight()

              );

            }

          }

        );

      }

    },



    collapse: function (defMenu) {

      if (this.collapsed === false) {

        if ($body.data("menu") == "vertical-menu-modern") {

          $(".modern-nav-toggle")

            .find(".toggle-icon")

            .removeClass("ft-toggle-right")

            .addClass("ft-toggle-left");



        }

        this.transit(

          function () {

            $body.removeClass("menu-expanded").addClass("menu-collapsed");

            this.collapsed = true;

            this.expanded = false;



            $(".content-overlay").removeClass("d-block d-none");

          },

          function () {

            if ($body.data("menu") == "vertical-content-menu") {

              this.manualScroller.disable();

            }



            if (

              $body.data("menu") == "horizontal-menu" &&

              $body.hasClass("vertical-overlay-menu")

            ) {

              if ($(".main-menu").hasClass("menu-fixed"))

                this.manualScroller.enable();

            }

            if (

              ($body.data("menu") == "vertical-menu" ||

                $body.data("menu") == "vertical-menu-modern") &&

              $(".main-menu").hasClass("menu-fixed")

            ) {

              $(".main-menu-content").css(

                "height",

                $(window).height() - $(".header-navbar").height()

              );

              if (!$(".main-menu-content").hasClass("ps")) {

                this.manualScroller.enable();

              }

            }

          }

        );

      }

    },



    toOverlayMenu: function (screen, menuType) {

      var menu = $body.data("menu");

      if (menuType == "vertical-menu-modern") {

        if (screen == "md" || screen == "sm" || screen == "xs") {

          if ($body.hasClass(menu)) {

            $body.removeClass(menu).addClass("vertical-overlay-menu");

          }

        } else {

          if ($body.hasClass("vertical-overlay-menu")) {

            $body.removeClass("vertical-overlay-menu").addClass(menu);

          }

        }

      } else {

        if (screen == "sm" || screen == "xs") {

          if ($body.hasClass(menu)) {

            $body.removeClass(menu).addClass("vertical-overlay-menu");

          }

          if (menu == "vertical-content-menu") {

            $(".main-menu").addClass("menu-fixed");

          }

        } else {

          if ($body.hasClass("vertical-overlay-menu")) {

            $body.removeClass("vertical-overlay-menu").addClass(menu);

          }

          if (menu == "vertical-content-menu") {

            $(".main-menu").removeClass("menu-fixed");

          }

        }

      }

    },



    changeMenu: function (screen) {

      // Replace menu html

      $('div[data-menu="menu-wrapper"]').html("");

      $('div[data-menu="menu-wrapper"]').html(menuWrapper_el);



      var menuWrapper = $('div[data-menu="menu-wrapper"]'),

        menuContainer = $('div[data-menu="menu-container"]'),

        menuNavigation = $('ul[data-menu="menu-navigation"]'),

        megaMenu = $('li[data-menu="megamenu"]'),

        megaMenuCol = $("li[data-mega-col]"),

        dropdownMenu = $('li[data-menu="dropdown"]'),

        dropdownSubMenu = $('li[data-menu="dropdown-submenu"]');



      if (screen === "xl") {

        // Change body classes

        $body

          .removeClass("vertical-layout vertical-overlay-menu fixed-navbar")

          .addClass($body.data("menu"));



        // Remove navbar-fix-top class on large screens

        $("nav.header-navbar").removeClass("fixed-top");



        // Change menu wrapper, menu container, menu navigation classes

        menuWrapper.removeClass().addClass(menuWrapperClasses);



        $("a.dropdown-item.nav-has-children").on("click", function () {

          event.preventDefault();

          event.stopPropagation();

        });

        $("a.dropdown-item.nav-has-parent").on("click", function () {

          event.preventDefault();

          event.stopPropagation();

        });

      } else {

        // Change body classes

        $body

          .removeClass($body.data("menu"))

          .addClass("vertical-layout vertical-overlay-menu fixed-navbar");



        // Add navbar-fix-top class on small screens

        $("nav.header-navbar").addClass("fixed-top");



        // Change menu wrapper, menu container, menu navigation classes

        menuWrapper

          .removeClass()

          .addClass("main-menu menu-light menu-fixed menu-shadow");

        // menuContainer.removeClass().addClass('main-menu-content');

        menuNavigation.removeClass().addClass("navigation navigation-main");



        // If Mega Menu

        megaMenu.removeClass("dropdown mega-dropdown").addClass("has-sub");

        megaMenu.children("ul").removeClass();

        megaMenuCol.each(function (index, el) {

          var megaMenuSub = $(el).find(".mega-menu-sub");

          megaMenuSub

            .find("li")

            .has("ul")

            .addClass("has-sub");



          // if mega menu title is given, remove title and make it list item with mega menu title's text

          var first_child = $(el)

            .children()

            .first(),

            first_child_text = "";



          if (first_child.is("h6")) {

            first_child_text = first_child.html();

            first_child.remove();

            $(el)

              .prepend('<a href="#">' + first_child_text + "</a>")

              .addClass("has-sub mega-menu-title");

          }

        });

        megaMenu.find("a").removeClass("dropdown-toggle");

        megaMenu.find("a").removeClass("dropdown-item");



        // If Dropdown Menu

        dropdownMenu.removeClass("dropdown").addClass("has-sub");

        dropdownMenu.find("a").removeClass("dropdown-toggle nav-link");

        dropdownMenu

          .children("ul")

          .find("a")

          .removeClass("dropdown-item");

        dropdownMenu.find("ul").removeClass("dropdown-menu");

        dropdownSubMenu.removeClass().addClass("has-sub");



        $.app.nav.init();



        // Dropdown submenu on small screen on click

        // --------------------------------------------------

        $("ul.dropdown-menu [data-toggle=dropdown]").on("click", function (

          event

        ) {

          event.preventDefault();

          event.stopPropagation();

          $(this)

            .parent()

            .siblings()

            .removeClass("open");

          $(this)

            .parent()

            .toggleClass("open");

        });

      }

    },



    toggle: function () {

      var currentBreakpoint = Unison.fetch.now(); // Current Breakpoint

      var collapsed = this.collapsed;

      var expanded = this.expanded;

      var hidden = this.hidden;

      var menu = $body.data("menu");



      switch (currentBreakpoint.name) {

        case "xl":

          if (expanded === true) {

            if (

              menu == "vertical-compact-menu" ||

              menu == "vertical-overlay-menu"

            ) {

              this.hide();

            } else {

              this.collapse();

            }

          } else {

            if (

              menu == "vertical-compact-menu" ||

              menu == "vertical-overlay-menu"

            ) {

              this.open();

            } else {

              this.expand();

            }

          }

          break;

        case "lg":

          if (expanded === true) {

            if (

              menu == "vertical-compact-menu" ||

              menu == "vertical-overlay-menu" ||

              menu == "horizontal-menu"

            ) {

              this.hide();

            } else {

              this.collapse();

            }

          } else {

            if (

              menu == "vertical-compact-menu" ||

              menu == "vertical-overlay-menu" ||

              menu == "horizontal-menu"

            ) {

              this.open();

            } else {

              this.expand();

            }

          }

          break;

        case "md":

          if (expanded === true) {

            if (

              menu == "vertical-compact-menu" ||

              menu == "vertical-overlay-menu" ||

              menu == "vertical-menu-modern" ||

              menu == "horizontal-menu"

            ) {

              this.hide();

            } else {

              this.collapse();

            }

          } else {

            if (

              menu == "vertical-compact-menu" ||

              menu == "vertical-overlay-menu" ||

              menu == "vertical-menu-modern" ||

              menu == "horizontal-menu"

            ) {

              this.open();

            } else {

              this.expand();

            }

          }

          break;

        case "sm":

          if (hidden === true) {

            this.open();

          } else {

            this.hide();

          }

          break;

        case "xs":

          if (hidden === true) {

            this.open();

          } else {

            this.hide();

          }

          break;

      }

    },



    update: function () {

      this.manualScroller.update();

    },



    reset: function () {

      this.expanded = false;

      this.collapsed = false;

      this.hidden = false;

      $body.removeClass("menu-hide menu-open menu-collapsed menu-expanded");

    }

  };



  // Navigation Menu

  $.app.nav = {

    container: $(".navigation-main"),

    initialized: false,

    navItem: $(".navigation-main")

      .find("li")

      .not(".navigation-category"),



    config: {

      speed: 300

    },



    init: function (config) {

      this.initialized = true; // Set to true when initialized

      $.extend(this.config, config);



      this.bind_events();

    },



    // Detect IE

    detectIE: function ($menuItem) {

      var ua = window.navigator.userAgent;



      // Test values; Uncomment to check result …



      // IE 10

      // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';



      // IE 11

      // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';



      // Edge 12 (Spartan)

      // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';



      // Edge 13

      // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';



      var msie = ua.indexOf("MSIE ");

      if (msie > 0) {

        // IE 10 or older => return version number

        return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10);

      }



      var trident = ua.indexOf("Trident/");

      if (trident > 0) {

        // IE 11 => return version number

        var rv = ua.indexOf("rv:");

        return parseInt(ua.substring(rv + 3, ua.indexOf(".", rv)), 10);

      }



      var edge = ua.indexOf("Edge/");

      if (edge > 0) {

        // Edge (IE 12+) => return version number

        return parseInt(ua.substring(edge + 5, ua.indexOf(".", edge)), 10);

      }



      // other browser

      return false;

    },



    bind_events: function () {

      var menuObj = this;



      $(".navigation-main")

        .on("mouseenter.app.menu", "li", function () {

          var $this = $(this);

          $(".hover", ".navigation-main").removeClass("hover");

          if (

            ($body.hasClass("menu-collapsed") &&

              $body.data("menu") != "vertical-menu-modern") ||

            ($body.data("menu") == "vertical-compact-menu" &&

              !$body.hasClass("vertical-overlay-menu"))

          ) {

            $(".main-menu-content")

              .children("span.menu-title")

              .remove();

            $(".main-menu-content")

              .children("a.menu-title")

              .remove();

            $(".main-menu-content")

              .children("ul.menu-content")

              .remove();



            // Title

            var menuTitle = $this.find("span.menu-title").clone(),

              tempTitle,

              tempLink;

            if (!$this.hasClass("has-sub")) {

              tempTitle = $this.find("span.menu-title").text();

              tempLink = $this.children("a").attr("href");

              if (tempTitle !== "") {

                menuTitle = $("<a>");

                menuTitle.attr("href", tempLink);

                menuTitle.attr("title", tempTitle);

                menuTitle.text(tempTitle);

                menuTitle.addClass("menu-title");

              }

            }



            var fromTop;

            if ($this.css("border-top")) {

              fromTop =

                $this.position().top + parseInt($this.css("border-top"), 10);

            } else {

              fromTop = $this.position().top;

            }



            if ($body.hasClass("material-vertical-layout")) {

              fromTop = $(".user-profile").height() + $this.position().top;

            }



            // Get IE or Edge browser version

            var version = menuObj.detectIE();



            if (version !== false) {

              if ($body.hasClass("material-vertical-layout")) {

                fromTop =

                  $(".user-profile").height() +

                  $this.position().top +

                  $(".header-navbar").height();

              }

            }



            if ($body.data("menu") !== "vertical-compact-menu") {

              menuTitle.appendTo(".main-menu-content").css({

                position: "fixed",

                top: fromTop

              });

            }



            // Content

            if ($this.hasClass("has-sub") && $this.hasClass("nav-item")) {

              var menuContent = $this.children("ul:first");

              if ($body.data("menu") !== "vertical-compact-menu") {

                menuObj.adjustSubmenu($this);

              } else {

                menuObj.fullSubmenu($this);

              }

            }

          }

          $this.addClass("hover");

        })

        .on("mouseleave.app.menu", "li", function () {

          // $(this).removeClass('hover');

        })

        .on("active.app.menu", "li", function (e) {

          $(this).addClass("active");

          e.stopPropagation();

        })

        .on("deactive.app.menu", "li.active", function (e) {

          $(this).removeClass("active");

          e.stopPropagation();

        })

        .on("open.app.menu", "li", function (e) {

          var $listItem = $(this);

          $listItem.addClass("open");



          menuObj.expand($listItem);



          // If menu collapsible then do not take any action

          if ($(".main-menu").hasClass("menu-collapsible")) {

            return false;

          }

          // If menu accordion then close all except clicked once

          else {

            $listItem

              .siblings(".open")

              .find("li.open")

              .trigger("close.app.menu");

            $listItem.siblings(".open").trigger("close.app.menu");

          }



          e.stopPropagation();

        })

        .on("close.app.menu", "li.open", function (e) {

          var $listItem = $(this);



          $listItem.removeClass("open");

          menuObj.collapse($listItem);



          e.stopPropagation();

        })

        .on("click.app.menu", "li", function (e) {

          var $listItem = $(this);

          if ($listItem.is(".disabled")) {

            e.preventDefault();

          } else {

            if (

              ($body.hasClass("menu-collapsed") &&

                $body.data("menu") != "vertical-menu-modern") ||

              ($body.data("menu") == "vertical-compact-menu" &&

                $listItem.is(".has-sub") &&

                !$body.hasClass("vertical-overlay-menu"))

            ) {

              e.preventDefault();

            } else {

              if ($listItem.has("ul")) {

                if ($listItem.is(".open")) {

                  $listItem.trigger("close.app.menu");

                } else {

                  $listItem.trigger("open.app.menu");

                }

              } else {

                if (!$listItem.is(".active")) {

                  $listItem.siblings(".active").trigger("deactive.app.menu");

                  $listItem.trigger("active.app.menu");

                }

              }

            }

          }



          e.stopPropagation();

        });



      $(".navbar-header, .main-menu")

        .on("mouseenter", modernMenuExpand)

        .on("mouseleave", modernMenuCollapse);



      function modernMenuExpand() {

        if ($body.data("menu") == "vertical-menu-modern") {

          $(".main-menu, .navbar-header").addClass("expanded");

          if ($body.hasClass("menu-collapsed")) {

            var $listItem = $(".main-menu li.menu-collapsed-open"),

              $subList = $listItem.children("ul");



            $subList.hide().slideDown(200, function () {

              $(this).css("display", "");

            });



            $listItem.addClass("open").removeClass("menu-collapsed-open");

          }

        }

      }



      function modernMenuCollapse() {

        if (

          $body.hasClass("menu-collapsed") &&

          $body.data("menu") == "vertical-menu-modern"

        ) {

          setTimeout(function () {

            if (

              $(".main-menu:hover").length === 0 &&

              $(".navbar-header:hover").length === 0

            ) {

              $(".main-menu, .navbar-header").removeClass("expanded");

              // Hide dropdown of user profile section for material templates

              if ($(".user-profile .user-info .dropdown").hasClass("show")) {

                $(".user-profile .user-info .dropdown").removeClass("show");

                $(

                  ".user-profile .user-info .dropdown .dropdown-menu"

                ).removeClass("show");

              }

              if ($body.hasClass("menu-collapsed")) {

                var $listItem = $(".main-menu li.open"),

                  $subList = $listItem.children("ul");

                $listItem.addClass("menu-collapsed-open");



                $subList.show().slideUp(200, function () {

                  $(this).css("display", "");

                });



                $listItem.removeClass("open");

              }

            }

          }, 1);

        }

      }



      $(".main-menu-content").on("mouseleave", function () {

        if (

          $body.hasClass("menu-collapsed") ||

          $body.data("menu") == "vertical-compact-menu"

        ) {

          $(".main-menu-content")

            .children("span.menu-title")

            .remove();

          $(".main-menu-content")

            .children("a.menu-title")

            .remove();

          $(".main-menu-content")

            .children("ul.menu-content")

            .remove();

        }

        $(".hover", ".navigation-main").removeClass("hover");

      });



      // If list item has sub menu items then prevent redirection.

      $(".navigation-main li.has-sub > a").on("click", function (e) {

        e.preventDefault();

      });



      $("ul.menu-content").on("click", "li", function (e) {

        var $listItem = $(this);

        if ($listItem.is(".disabled")) {

          e.preventDefault();

        } else {

          if ($listItem.has("ul")) {

            if ($listItem.is(".open")) {

              $listItem.removeClass("open");

              menuObj.collapse($listItem);

            } else {

              $listItem.addClass("open");



              menuObj.expand($listItem);



              // If menu collapsible then do not take any action

              if ($(".main-menu").hasClass("menu-collapsible")) {

                return false;

              }

              // If menu accordion then close all except clicked once

              else {

                $listItem

                  .siblings(".open")

                  .find("li.open")

                  .trigger("close.app.menu");

                $listItem.siblings(".open").trigger("close.app.menu");

              }



              e.stopPropagation();

            }

          } else {

            if (!$listItem.is(".active")) {

              $listItem.siblings(".active").trigger("deactive.app.menu");

              $listItem.trigger("active.app.menu");

            }

          }

        }



        e.stopPropagation();

      });

    },



    /**

     * Ensure an admin submenu is within the visual viewport.

     * @param {jQuery} $menuItem The parent menu item containing the submenu.

     */

    adjustSubmenu: function ($menuItem) {

      var menuHeaderHeight,

        menutop,

        topPos,

        winHeight,

        bottomOffset,

        subMenuHeight,

        popOutMenuHeight,

        borderWidth,

        scroll_theme,

        $submenu = $menuItem.children("ul:first"),

        ul = $submenu.clone(true);



      menuHeaderHeight = $(".main-menu-header").height();

      menutop = $menuItem.position().top;

      winHeight = $window.height() - $(".header-navbar").height();

      borderWidth = 0;

      subMenuHeight = $submenu.height();



      if (parseInt($menuItem.css("border-top"), 10) > 0) {

        borderWidth = parseInt($menuItem.css("border-top"), 10);

      }



      popOutMenuHeight = winHeight - menutop - $menuItem.height() - 30;

      scroll_theme = $(".main-menu").hasClass("menu-dark") ? "light" : "dark";



      if ($body.data("menu") === "vertical-compact-menu") {

        topPos = menutop + borderWidth;

        popOutMenuHeight = winHeight - menutop - 30;

      } else if ($body.data("menu") === "vertical-content-menu") {

        topPos = menutop + $menuItem.height() + borderWidth - 5;

        popOutMenuHeight =

          winHeight -

          $(".content-header").height() -

          $menuItem.height() -

          menutop -

          60;

        if ($body.hasClass("material-vertical-layout")) {

          topPos =

            menutop +

            $menuItem.height() +

            $(".user-profile").height() +

            borderWidth;

        }

      } else if ($body.hasClass("material-vertical-layout")) {

        topPos =

          menutop +

          $menuItem.height() +

          $(".user-profile").height() +

          borderWidth;

      } else {

        topPos = menutop + $menuItem.height() + borderWidth;

      }



      // Get IE or Edge browser version

      var version = this.detectIE();



      if (version !== false) {

        if ($body.hasClass("material-vertical-layout")) {

          topPos =

            menutop +

            $menuItem.height() +

            $(".user-profile").height() +

            borderWidth +

            $(".header-navbar").height();

        }

      }



      if ($body.data("menu") == "vertical-content-menu") {

        ul.addClass("menu-popout")

          .appendTo(".main-menu-content")

          .css({

            top: topPos,

            position: "fixed"

          });

      } else {

        ul.addClass("menu-popout")

          .appendTo(".main-menu-content")

          .css({

            top: topPos,

            position: "fixed",

            "max-height": popOutMenuHeight

          });



        var menu_content = new PerfectScrollbar(

          ".main-menu-content > ul.menu-content"

        );

      }

    },



    fullSubmenu: function ($menuItem) {

      var $submenu = $menuItem.children("ul:first"),

        ul = $submenu.clone(true);



      ul.addClass("menu-popout")

        .appendTo(".main-menu-content")

        .css({

          top: 0,

          position: "fixed",

          height: "100%"

        });



      var menu_content = new PerfectScrollbar(

        ".main-menu-content > ul.menu-content"

      );

    },



    collapse: function ($listItem, callback) {

      var $subList = $listItem.children("ul");



      $subList.show().slideUp($.app.nav.config.speed, function () {

        $(this).css("display", "");



        $(this)

          .find("> li")

          .removeClass("is-shown");



        if (callback) {

          callback();

        }



        $.app.nav.container.trigger("collapsed.app.menu");

      });

    },



    expand: function ($listItem, callback) {

      var $subList = $listItem.children("ul");

      var $children = $subList.children("li").addClass("is-hidden");



      $subList.hide().slideDown($.app.nav.config.speed, function () {

        $(this).css("display", "");



        if (callback) {

          callback();

        }



        $.app.nav.container.trigger("expanded.app.menu");

      });



      setTimeout(function () {

        $children.addClass("is-shown");

        $children.removeClass("is-hidden");

      }, 0);

    },



    refresh: function () {

      $.app.nav.container.find(".open").removeClass("open");

    }

  };

})(window, document, jQuery);

