(function () {
  'use strict';

  (function (document, Joomla) {
    if (!Joomla) {
      throw new Error('Joomla API is not properly initialised');
    }
    /* global hotkeys */


    Joomla.addShortcut = function (hotkey, callback) {
      hotkeys(hotkey, 'joomla', function (event) {
        event.preventDefault();
        event.stopPropagation();
        event.stopImmediatePropagation();
        callback.call();
      });
    };

    Joomla.addClickShortcut = function (hotkey, selector) {
      Joomla.addShortcut(hotkey, function () {
        var element = document.querySelector(selector);

        if (element) {
          element.click();
        }
      });
    };

    Joomla.addFocusShortcut = function (hotkey, selector) {
      Joomla.addShortcut(hotkey, function () {
        var element = document.querySelector(selector);

        if (element) {
          element.focus();
        }
      });
    };

    Joomla.addLinkShortcut = function (hotkey, selector) {
      Joomla.addShortcut(hotkey, function () {
        window.location.href = selector;
      });
    };

    var setShortcutFilter = function setShortcutFilter() {
      hotkeys.filter = function (event) {
        var target = event.target || event.srcElement;
        var tagName = target.tagName; // Checkboxes should not block a shortcut event

        if (target.type === 'checkbox') {
          return true;
        } // Default hotkeys filter behavior


        return !(target.isContentEditable || tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA');
      };
    };

    var startupShortcuts = function startupShortcuts() {
      hotkeys('J', function (event) {
        // If we're already in the scope, it's a normal shortkey
        if (hotkeys.getScope() === 'joomla') {
          return;
        }

        event.preventDefault();
        event.stopPropagation();
        event.stopImmediatePropagation();
        hotkeys.setScope('joomla'); // Leave the scope after x milliseconds

        setTimeout(function () {
          hotkeys.setScope(false);
        }, Joomla.getOptions('plg_system_shortcut.timeout', 2000));
      });
    };

    var addOverviewHint = function addOverviewHint() {
      var mainContainer = document.querySelector('.com_cpanel .container-main');

      if (mainContainer) {
        var containerElement = document.createElement('section');
        containerElement.className = 'content pt-4';
        containerElement.insertAdjacentHTML('beforeend', Joomla.Text._('PLG_SYSTEM_SHORTCUT_OVERVIEW_HINT'));
        mainContainer.appendChild(containerElement);
      }
    };

    var initOverviewModal = function initOverviewModal(options) {
      var dlItems = new Map();
      Object.values(options).forEach(function (value) {
        if (!value.shortcut || !value.title) {
          return;
        }

        var titles = [];

        if (dlItems.has(value.shortcut)) {
          titles = dlItems.get(value.shortcut);
          titles.push(value.title);
        } else {
          titles = [value.title];
        }

        dlItems.set(value.shortcut, titles);
      });
      var dl = '<dl>';
      dlItems.forEach(function (titles, shortcut) {
        dl += '<dt><kbd>J</kbd>';
        shortcut.split('+').forEach(function (key) {
          dl += " <kbd>" + key.trim() + "</kbd>";
        });
        dl += '</dt>';
        titles.forEach(function (title) {
          dl += "<dd>" + title + "</dd>";
        });
      });
      dl += '</dl>';
      var modal = "\n      <div class=\"modal fade\" id=\"shortcutOverviewModal\" tabindex=\"-1\" role=\"dialog\" data-bs-backdrop=\"static\" aria-labelledby=\"shortcutOverviewModalLabel\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\" role=\"document\">\n          <div class=\"modal-content\">\n            <div class=\"modal-header\">\n              <h3 id=\"shortcutOverviewModalLabel\" class=\"modal-title\">\n                " + Joomla.Text._('PLG_SYSTEM_SHORTCUT_OVERVIEW_TITLE') + "\n              </h3>\n              <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"" + Joomla.Text._('JCLOSE') + "\"></button>\n            </div>\n            <div class=\"modal-body p-3\">\n              <p>" + Joomla.Text._('PLG_SYSTEM_SHORTCUT_OVERVIEW_DESC') + "</p>\n              <div class=\"mb-3\">\n                " + dl + "\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    ";
      document.body.insertAdjacentHTML('beforeend', modal);
      var bootstrapModal = new bootstrap.Modal(document.getElementById('shortcutOverviewModal'), {
        keyboard: true,
        backdrop: true
      });
      hotkeys('X', 'joomla', function () {
        return bootstrapModal.show();
      });
    };

    document.addEventListener('DOMContentLoaded', function () {
      var options = Joomla.getOptions('plg_system_shortcut.shortcuts');
      Object.values(options).forEach(function (value) {
        if (!value.shortcut || !value.selector) {
          return;
        }

        if (value.selector.startsWith('/') || value.selector.startsWith('http://') || value.selector.startsWith('www.')) {
          Joomla.addLinkShortcut(value.shortcut, value.selector);
        } else if (value.selector.includes('input')) {
          Joomla.addFocusShortcut(value.shortcut, value.selector);
        } else {
          Joomla.addClickShortcut(value.shortcut, value.selector);
        }
      }); // Show hint and overview on logged in backend only (not login page)

      if (document.querySelector('nav')) {
        initOverviewModal(options);
        addOverviewHint();
      }

      setShortcutFilter();
      startupShortcuts();
    });
  })(document, Joomla);

})();
