(function () {
  'use strict';

  var headerCount = 0;
  var footerCount = 0;

  function onReady(callback) {
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', callback);
    } else {
      callback();
    }
  }

  function cleanText(value) {
    return (value || '').replace(/\s+/g, ' ').trim();
  }

  function isMenuButton(button) {
    if (!button) return false;
    var id = button.id || '';
    var label = button.getAttribute('aria-label') || '';
    var classes = button.className || '';
    return id === 'menu-toggle' ||
      id === 'mobile-menu-button' ||
      id === 'mobileMenuBtn' ||
      /menu/i.test(label) ||
      !!button.querySelector('.fa-bars, [class*="fa-bars"], svg') && /hidden|menu|mobile/i.test(classes + ' ' + id + ' ' + label);
  }

  function uniqueRoots() {
    var roots = Array.prototype.slice.call(document.querySelectorAll('header, nav#mainNav, [data-ftb-site-header="true"]'));
    var seen = [];
    return roots.filter(function (root) {
      if (root.closest('footer')) return false;
      if (seen.indexOf(root) !== -1) return false;
      seen.push(root);
      return true;
    });
  }

  function getExistingMenu(root) {
    var localMenu = root.querySelector('#mobile-menu, #mobileMenu, .mobile-menu');
    if (localMenu) return localMenu;

    var ids = ['mobile-menu', 'mobileMenu'];
    for (var i = 0; i < ids.length; i += 1) {
      var menu = document.getElementById(ids[i]);
      if (menu && !menu.closest('footer')) return menu;
    }

    return null;
  }

  function findMenuButton(root) {
    var buttons = Array.prototype.slice.call(root.querySelectorAll('button'));
    for (var i = 0; i < buttons.length; i += 1) {
      if (isMenuButton(buttons[i])) return buttons[i];
    }
    return null;
  }

  function collectHeaderLinks(root) {
    var links = Array.prototype.slice.call(root.querySelectorAll('a[href]'));
    var used = {};

    return links.filter(function (anchor) {
      if (anchor.closest('footer, .tb-mobile-generated-menu, #mobile-menu, #mobileMenu, .mobile-menu')) return false;
      var href = anchor.getAttribute('href');
      var text = cleanText(anchor.textContent || anchor.getAttribute('aria-label'));
      if (!href || !text) return false;

      var key = href + '|' + text.toLowerCase();
      if (used[key]) return false;
      used[key] = true;
      return true;
    }).map(function (anchor) {
      return {
        href: anchor.getAttribute('href'),
        text: cleanText(anchor.textContent || anchor.getAttribute('aria-label'))
      };
    });
  }

  function createButton(root) {
    var button = document.createElement('button');
    button.type = 'button';
    button.className = 'tb-mobile-toggle';
    button.setAttribute('aria-label', 'Open menu');
    button.innerHTML = '<span aria-hidden="true">&#9776;</span>';

    var mount = root.querySelector('.flex.justify-between, .ftb-nav-row, .container > .flex, .max-w-7xl > .flex') ||
      root.firstElementChild ||
      root;
    mount.appendChild(button);
    return button;
  }

  function createMenu(root, links) {
    headerCount += 1;
    var menu = document.createElement('div');
    menu.id = 'tb-mobile-generated-menu-' + headerCount;
    menu.className = 'tb-mobile-generated-menu';
    menu.setAttribute('aria-hidden', 'true');

    var panel = document.createElement('nav');
    panel.className = 'tb-mobile-menu-panel';
    panel.setAttribute('aria-label', 'Mobile menu');

    links.forEach(function (item) {
      var link = document.createElement('a');
      link.className = 'tb-mobile-menu-link';
      link.href = item.href;
      link.textContent = item.text;
      panel.appendChild(link);
    });

    menu.appendChild(panel);
    root.appendChild(menu);
    return menu;
  }

  function setMenuOpen(button, menu, open) {
    button.setAttribute('aria-expanded', String(open));
    menu.setAttribute('aria-hidden', String(!open));
    menu.classList.toggle('tb-open', open);
    menu.classList.toggle('active', open);

    if (menu.classList.contains('hidden') || menu.dataset.tbUsesHidden === 'true') {
      menu.dataset.tbUsesHidden = 'true';
      menu.classList.toggle('hidden', !open);
    }

    var overlay = document.getElementById('menu-overlay');
    if (overlay) overlay.classList.toggle('hidden', !open);
    document.body.classList.toggle('tb-mobile-menu-open', open);
  }

  function attachMenu(button, menu) {
    if (!button || !menu || button.dataset.tbMobileAttached === 'true') return;

    if (!menu.id) {
      headerCount += 1;
      menu.id = 'tb-mobile-menu-' + headerCount;
    }

    button.dataset.tbMobileAttached = 'true';
    button.setAttribute('aria-controls', menu.id);
    button.setAttribute('aria-expanded', 'false');

    button.addEventListener('click', function (event) {
      event.preventDefault();
      event.stopImmediatePropagation();
      setMenuOpen(button, menu, !menu.classList.contains('active') && !menu.classList.contains('tb-open'));
    }, true);

    menu.querySelectorAll('a[href]').forEach(function (link) {
      link.addEventListener('click', function () {
        setMenuOpen(button, menu, false);
      });
    });

    var close = document.getElementById('menu-close');
    if (close) {
      close.addEventListener('click', function () {
        setMenuOpen(button, menu, false);
      }, true);
    }

    var overlay = document.getElementById('menu-overlay');
    if (overlay) {
      overlay.addEventListener('click', function () {
        setMenuOpen(button, menu, false);
      }, true);
    }
  }

  function enhanceHeaders() {
    uniqueRoots().forEach(function (root) {
      if (root.dataset.tbMobileHeaderReady === 'true') return;

      var menu = getExistingMenu(root);
      var button = findMenuButton(root);

      if (!menu) {
        var links = collectHeaderLinks(root);
        if (links.length < 2) return;
        menu = createMenu(root, links);
      }

      if (!button) button = createButton(root);

      root.dataset.tbMobileHeaderReady = 'true';
      attachMenu(button, menu);
    });
  }

  function enhanceFooters() {
    document.querySelectorAll('footer').forEach(function (footer) {
      footer.querySelectorAll('h3, h4').forEach(function (heading) {
        if (heading.closest('.tb-footer-accordion')) return;

        var column = heading.parentElement;
        if (!column || column === footer || !column.querySelector('a, form, input, button')) return;

        var siblings = [];
        var node = heading.nextSibling;
        while (node) {
          var next = node.nextSibling;
          siblings.push(node);
          node = next;
        }
        if (!siblings.length) return;

        footerCount += 1;
        var panel = document.createElement('div');
        panel.className = 'tb-footer-panel';
        panel.id = 'tb-footer-panel-' + footerCount;
        siblings.forEach(function (child) {
          panel.appendChild(child);
        });

        var button = document.createElement('button');
        button.type = 'button';
        button.className = 'tb-footer-toggle';
        button.setAttribute('aria-expanded', 'false');
        button.setAttribute('aria-controls', panel.id);
        button.innerHTML = '<span>' + heading.innerHTML + '</span><span class="tb-footer-chevron" aria-hidden="true"></span>';

        heading.innerHTML = '';
        heading.appendChild(button);
        column.classList.add('tb-footer-accordion');
        column.appendChild(panel);

        button.addEventListener('click', function () {
          var open = !column.classList.contains('tb-open');
          column.classList.toggle('tb-open', open);
          button.setAttribute('aria-expanded', String(open));
        });
      });
    });
  }

  onReady(function () {
    enhanceHeaders();
    enhanceFooters();
  });
})();
