// Add onHover event for dropdowns

;(function ($) {
  if (!$ || !$.fn) return

  const SELECTOR = '[data-bs-toggle=dropdown][data-trigger=hover]'
  const TIMEOUT = 150

  function openDropdown($i) {
    let t = $i.data('dd-timeout')

    if (t) {
      clearTimeout(t)
      t = null
      $i.data('dd-timeout', t)
    }

    if ($i.attr('aria-expanded') !== 'true') $i.dropdown('toggle')
  }

  function closeDropdown($i) {
    let t = $i.data('dd-timeout')

    if (t) clearTimeout(t)

    t = setTimeout(() => {
      let t2 = $i.data('dd-timeout')

      if (t2) {
        clearTimeout(t2)
        t2 = null
        $i.data('dd-timeout', t2)
      }

      if ($i.attr('aria-expanded') === 'true') $i.dropdown('toggle')
    }, TIMEOUT)

    $i.data('dd-timeout', t)
  }

  $(function () {
    $('body')
      .on('mouseenter', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () {
        const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')
        const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu')

        if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return

        // Set hovered flag
        if ($(this).is(SELECTOR)) {
          $(this).data('hovered', true)
        }

        openDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle'))
      })
      .on('mouseleave', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () {
        const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')
        const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu')

        if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return

        // Remove hovered flag
        if ($(this).is(SELECTOR)) {
          $(this).data('hovered', false)
        }

        closeDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle'))
      })
      .on('hide.bs.dropdown', function (e) {
        if ($(this).find(SELECTOR).data('hovered')) e.preventDefault()
      })
  })
})(window.jQuery)