(function() { 'use strict'; window.utils = window.utils || {}; var registeredSetupListeners = {}; /** * setup function to initiate a util (utilName) on a scope (sope) with options (options). * * A util has to define an itself at `window.utils` as shown for the `autoSubmit` util: * `window.utils.autoSubmit = function(wrapper, options) { ... };` */ window.utils.setup = function(utilName, scope, options) { if (!utilName || !scope) { return; } options = options || {}; var listener = function(event) { if (event.detail.targetUtil !== utilName) { return false; } if (options.setupFunction) { options.setupFunction(scope, options); } else { var util = window.utils[utilName]; if (!util) { throw new Error('"' + utilName + '" is not a known js util'); } util(scope, options); } }; if (registeredSetupListeners[utilName] && !options.singleton) { registeredSetupListeners[utilName].push(listener); } else { window.utils.teardown(utilName); registeredSetupListeners[utilName] = [ listener ]; } document.addEventListener('setup', listener); document.dispatchEvent(new CustomEvent('setup', { detail: { targetUtil: utilName, module: 'none' }, bubbles: true, cancelable: true, })); }; window.utils.teardown = function(utilName) { if (registeredSetupListeners[utilName]) { registeredSetupListeners[utilName].forEach(function(listener) { document.removeEventListener('setup', listener); }); delete registeredSetupListeners[utilName]; } } })();