diff --git a/public/src/utils.js b/public/src/utils.js index 534ef59273..944929e486 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -272,6 +272,87 @@ return env; } } + }, + + // get all the url params in a single key/value hash + params: function(options) { + var a, hash = {}, params; + + options = options || {}; + options.skipToType = options.skipToType || {}; + + if (options.url) { + a = utils.urlToLocation(options.url); + } + params = (a ? a.search : window.location.search).substring(1).split("&"); + + params.forEach(function(param) { + var val = param.split('='), + key = decodeURI(val[0]), + value = options.skipToType[key] ? decodeURI(val[1]) : utils.toType(decodeURI(val[1])); + + if (key) + hash[key] = value; + }); + return hash; + }, + + param: function(key) { + return this.params()[key]; + }, + + urlToLocation: function(url) { + var a = document.createElement('a'); + a.href = url; + return a; + }, + + // return boolean if string 'true' or string 'false', or if a parsable string which is a number + // also supports JSON object and/or arrays parsing + toType: function(str) { + var type = typeof str; + if (type !== 'string') { + return str; + } else { + var nb = parseFloat(str); + if (!isNaN(nb) && isFinite(str)) + return nb; + if (str === 'false') + return false; + if (str === 'true') + return true; + + try { + str = JSON.parse(str); + } catch (e) {} + + return str; + } + }, + + // Safely get/set chained properties on an object + // set example: utils.props(A, 'a.b.c.d', 10) // sets A to {a: {b: {c: {d: 10}}}}, and returns 10 + // get example: utils.props(A, 'a.b.c') // returns {d: 10} + // get example: utils.props(A, 'a.b.c.foo.bar') // returns undefined without throwing a TypeError + // credits to github.com/gkindel + props: function(obj, props, value) { + if(obj === undefined) + obj = window; + if(props == null) + return undefined; + var i = props.indexOf('.'); + if( i == -1 ) { + if(value !== undefined) + obj[props] = value; + return obj[props]; + } + var prop = props.slice(0, i), + newProps = props.slice(i + 1); + + if(props !== undefined && !(obj[prop] instanceof Object) ) + obj[prop] = {}; + + return util.props(obj[prop], newProps, value); } };