(function() { 'use strict'; window.utils = window.utils || {}; var registeredSetupListeners = {}; window.utils.setup = function(utilType, scope, options) { if (!utilType) { return; } var listener = function(event) { if (event.detail.targetUtil !== utilType) { return false; } if (options && 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]) { registeredSetupListeners[utilType].push(listener); } else { 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); }); } } })();