/** * Shallow object clone and merge * * @param a Object A * @param b Object B * @returns {Object} New object with all of A's properties, and all of B's properties, overwriting A's properties */ exports.extend = function(a, b) { var c = {}; for (var x in a) { if (a.hasOwnProperty(x)) { c[x] = a[x]; } } if (b != null) { for (var y in b) { if (b.hasOwnProperty(y)) { c[y] = b[y]; } } } return c; }; /** * Takes a k/v list of CSS properties and returns a rule * * @param props CSS properties object */ exports.cssProps = function(props) { var ret = []; for (var p in props) { if (props.hasOwnProperty(p)) { ret.push(p + ':' + props[p]); } } return ret.join(';'); }; /** * Encodes HTML entities in a string * * @param str Input string */ exports.encodeHtmlEntity = function(str) { var buf = []; var charCode = 0; for (var i = str.length - 1; i >= 0; i--) { charCode = str.charCodeAt(i); if (charCode > 128) { buf.unshift(['&#', charCode, ';'].join('')); } else { buf.unshift(str[i]); } } return buf.join(''); }; /** * Converts a value into an array of DOM nodes * * @param val A string, a NodeList, a Node, or an HTMLCollection */ exports.getNodeArray = function(val) { var retval = null; if (typeof(val) == 'string') { retval = document.querySelectorAll(val); } else if (global.NodeList && val instanceof global.NodeList) { retval = val; } else if (global.Node && val instanceof global.Node) { retval = [val]; } else if (global.HTMLCollection && val instanceof global.HTMLCollection) { retval = val; } else if (val instanceof Array) { retval = val; } else if (val === null) { retval = []; } return retval; }; /** * Checks if an image exists * * @param src URL of image * @param callback Callback to call once image status has been found */ exports.imageExists = function(src, callback) { var image = new Image(); image.onerror = function() { callback.call(this, false); }; image.onload = function() { callback.call(this, true); }; image.src = src; }; /** * Decodes HTML entities in a string * * @param str Input string */ exports.decodeHtmlEntity = function(str) { return str.replace(/&#(\d+);/g, function(match, dec) { return String.fromCharCode(dec); }); }; /** * Returns an element's dimensions if it's visible, `false` otherwise. * * @private * @param el DOM element */ exports.dimensionCheck = function(el) { var dimensions = { height: el.clientHeight, width: el.clientWidth }; if (dimensions.height && dimensions.width) { return dimensions; } else { return false; } };