window.Util = { isNumber: function (n) { return typeof n === 'number' && !isNaN(n); }, isFunction: function (fn) { return typeof fn === 'function'; }, hasClass: function (element, className) { return element.classList.contains(className); }, getByClass: function (element, className) { return element.getElementsByClassName ? element.getElementsByClassName(className) : element.querySelectorAll('.' + className); }, createImage: function (attrs) { var container = document.createElement('div'); var image = new Image(); var attr; if (typeof attrs !== 'object') { attrs = {}; } if (!attrs.src) { attrs.src = '../docs/images/picture.jpg'; } for (attr in attrs) { if (attrs.hasOwnProperty(attr)) { image[attr] = attrs[attr]; } } container.className = 'container'; container.appendChild(image); document.body.appendChild(container); return image; }, dispatchEvent: function (element, type, data) { var event; if (element.dispatchEvent) { // Event and CustomEvent on IE9-11 are global objects, not constructors if (typeof Event === 'function' && typeof CustomEvent === 'function') { if (!data) { event = new Event(type, { bubbles: true, cancelable: true }); } else { event = new CustomEvent(type, { detail: data, bubbles: true, cancelable: true }); } } else if (!data) { event = document.createEvent('Event'); event.initEvent(type, true, true); } else { event = document.createEvent('CustomEvent'); event.initCustomEvent(type, true, true, data); } // IE9+ return element.dispatchEvent(event); } else if (element.fireEvent) { // IE6-10 (native events only) return element.fireEvent('on' + type); } } };