window.state = window.state || {}; state = window.state; state.utils = { triggerEvent: function triggerEvent(element, event) { if (! element) { return; } element.dispatchEvent(new Event(event.trim())); return element; }, setValue: function setValue(element, value, event) { switch (element.type) { case 'checkbox': element.checked = value === 'true'; this.triggerEvent(element, event); break; case 'radio': if (element.value === value) { element.checked = true; this.triggerEvent(element, event); } else { element.checked = false; } break; default: element.value = value; this.triggerEvent(element, event); } }, txtToId: function txtToId(txt) { return txt.split(' ').join('-').toLowerCase(); }, callXTimes: function callXTimes(func, times) { let called = 0; return function() { if (called < times) { called++; return func.apply(this); } } }, debounce: function debounce(func, delay) { let lastCallTime = 0; return function() { const currentCallTime = new Date().getTime(); if (currentCallTime - lastCallTime > delay) { lastCallTime = currentCallTime; func.apply(this, arguments); } } }, onNextUiUpdates: function (func) { // brute force this to to ensure that the method is called after next few updates onUiUpdate(this.callXTimes(function () { setTimeout(func, 10); }, 50)); } };