(function() { 'use strict'; window.utils = window.utils || {}; var registeredSetupListeners = {}; window.utils.setup = function(utilType, scope, options) { if (!utilType || !scope) { return; } options = options || {}; var listener = function(event) { if (event.detail.targetUtil !== utilType) { return false; } if (options.setupFunction) { options.setupFunction(scope, options); } else { var util = window.utils[utilType]; if (!util) { throw new Error('"' + utilType + '" is not a known js util'); } util(scope, options); } }; if (registeredSetupListeners[utilType] && !options.singleton) { registeredSetupListeners[utilType].push(listener); } else { window.utils.teardown(utilType); registeredSetupListeners[utilType] = [ listener ]; } document.addEventListener('setup', listener); document.dispatchEvent(new CustomEvent('setup', { detail: { targetUtil: utilType, module: 'none' }, bubbles: true, cancelable: true, })); }; window.utils.teardown = function(utilType) { if (registeredSetupListeners[utilType]) { registeredSetupListeners[utilType].forEach(function(listener) { document.removeEventListener('setup', listener); }); delete registeredSetupListeners[utilType]; } } })();