"use strict";

Liferay.Loader.define("layout-admin-web$aria-hidden@1.2.6/dist/es5/index", ['module', 'exports', 'require'], function (module, exports, require) {
    var define = undefined;
    var global = window;
    {
        Object.defineProperty(exports, "__esModule", { value: true });
        exports.suppressOthers = exports.supportsInert = exports.inertOthers = exports.hideOthers = void 0;
        var getDefaultParent = function (originalTarget) {
            if (typeof document === 'undefined') {
                return null;
            }
            var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
            return sampleTarget.ownerDocument.body;
        };
        var counterMap = new WeakMap();
        var uncontrolledNodes = new WeakMap();
        var markerMap = {};
        var lockCount = 0;
        var unwrapHost = function (node) {
            return node && (node.host || unwrapHost(node.parentNode));
        };
        var correctTargets = function (parent, targets) {
            return targets.map(function (target) {
                if (parent.contains(target)) {
                    return target;
                }
                var correctedTarget = unwrapHost(target);
                if (correctedTarget && parent.contains(correctedTarget)) {
                    return correctedTarget;
                }
                console.error('aria-hidden', target, 'in not contained inside', parent, '. Doing nothing');
                return null;
            }).filter(function (x) {
                return Boolean(x);
            });
        };
        /**
         * Marks everything except given node(or nodes) as aria-hidden
         * @param {Element | Element[]} originalTarget - elements to keep on the page
         * @param [parentNode] - top element, defaults to document.body
         * @param {String} [markerName] - a special attribute to mark every node
         * @param {String} [controlAttribute] - html Attribute to control
         * @return {Undo} undo command
         */
        var applyAttributeToOthers = function (originalTarget, parentNode, markerName, controlAttribute) {
            var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
            if (!markerMap[markerName]) {
                markerMap[markerName] = new WeakMap();
            }
            var markerCounter = markerMap[markerName];
            var hiddenNodes = [];
            var elementsToKeep = new Set();
            var elementsToStop = new Set(targets);
            var keep = function (el) {
                if (!el || elementsToKeep.has(el)) {
                    return;
                }
                elementsToKeep.add(el);
                keep(el.parentNode);
            };
            targets.forEach(keep);
            var deep = function (parent) {
                if (!parent || elementsToStop.has(parent)) {
                    return;
                }
                Array.prototype.forEach.call(parent.children, function (node) {
                    if (elementsToKeep.has(node)) {
                        deep(node);
                    } else {
                        try {
                            var attr = node.getAttribute(controlAttribute);
                            var alreadyHidden = attr !== null && attr !== 'false';
                            var counterValue = (counterMap.get(node) || 0) + 1;
                            var markerValue = (markerCounter.get(node) || 0) + 1;
                            counterMap.set(node, counterValue);
                            markerCounter.set(node, markerValue);
                            hiddenNodes.push(node);
                            if (counterValue === 1 && alreadyHidden) {
                                uncontrolledNodes.set(node, true);
                            }
                            if (markerValue === 1) {
                                node.setAttribute(markerName, 'true');
                            }
                            if (!alreadyHidden) {
                                node.setAttribute(controlAttribute, 'true');
                            }
                        } catch (e) {
                            console.error('aria-hidden: cannot operate on ', node, e);
                        }
                    }
                });
            };
            deep(parentNode);
            elementsToKeep.clear();
            lockCount++;
            return function () {
                hiddenNodes.forEach(function (node) {
                    var counterValue = counterMap.get(node) - 1;
                    var markerValue = markerCounter.get(node) - 1;
                    counterMap.set(node, counterValue);
                    markerCounter.set(node, markerValue);
                    if (!counterValue) {
                        if (!uncontrolledNodes.has(node)) {
                            node.removeAttribute(controlAttribute);
                        }
                        uncontrolledNodes.delete(node);
                    }
                    if (!markerValue) {
                        node.removeAttribute(markerName);
                    }
                });
                lockCount--;
                if (!lockCount) {
                    // clear
                    counterMap = new WeakMap();
                    counterMap = new WeakMap();
                    uncontrolledNodes = new WeakMap();
                    markerMap = {};
                }
            };
        };
        /**
         * Marks everything except given node(or nodes) as aria-hidden
         * @param {Element | Element[]} originalTarget - elements to keep on the page
         * @param [parentNode] - top element, defaults to document.body
         * @param {String} [markerName] - a special attribute to mark every node
         * @return {Undo} undo command
         */
        var hideOthers = function (originalTarget, parentNode, markerName) {
            if (markerName === void 0) {
                markerName = 'data-aria-hidden';
            }
            var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
            var activeParentNode = parentNode || getDefaultParent(originalTarget);
            if (!activeParentNode) {
                return function () {
                    return null;
                };
            }
            // we should not hide aria-live elements - https://github.com/theKashey/aria-hidden/issues/10
            // and script elements, as they have no impact on accessibility.
            targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll('[aria-live], script')));
            return applyAttributeToOthers(targets, activeParentNode, markerName, 'aria-hidden');
        };
        exports.hideOthers = hideOthers;
        /**
         * Marks everything except given node(or nodes) as inert
         * @param {Element | Element[]} originalTarget - elements to keep on the page
         * @param [parentNode] - top element, defaults to document.body
         * @param {String} [markerName] - a special attribute to mark every node
         * @return {Undo} undo command
         */
        var inertOthers = function (originalTarget, parentNode, markerName) {
            if (markerName === void 0) {
                markerName = 'data-inert-ed';
            }
            var activeParentNode = parentNode || getDefaultParent(originalTarget);
            if (!activeParentNode) {
                return function () {
                    return null;
                };
            }
            return applyAttributeToOthers(originalTarget, activeParentNode, markerName, 'inert');
        };
        exports.inertOthers = inertOthers;
        /**
         * @returns if current browser supports inert
         */
        var supportsInert = function () {
            return typeof HTMLElement !== 'undefined' && HTMLElement.prototype.hasOwnProperty('inert');
        };
        exports.supportsInert = supportsInert;
        /**
         * Automatic function to "suppress" DOM elements - _hide_ or _inert_ in the best possible way
         * @param {Element | Element[]} originalTarget - elements to keep on the page
         * @param [parentNode] - top element, defaults to document.body
         * @param {String} [markerName] - a special attribute to mark every node
         * @return {Undo} undo command
         */
        var suppressOthers = function (originalTarget, parentNode, markerName) {
            if (markerName === void 0) {
                markerName = 'data-suppressed';
            }
            return ((0, exports.supportsInert)() ? exports.inertOthers : exports.hideOthers)(originalTarget, parentNode, markerName);
        };
        exports.suppressOthers = suppressOthers;
    }
});
//# sourceMappingURL=index.js.map