// // license: // // sprintf function: // - http://creativecommons.org/licenses/by/2.0/uk/ // // jsonPath function // - MIT License (Stefan Goessner) // // json2 stuff // - public domain // // stuff that says it's from some web url has whatever license that url says // // everything else: // - public domain //////////////////////////// // misc pairs = function (a) { var p = [] foreach(a, function (v, k) { p.push([k, v]) }) return p } // from http://stackoverflow.com/questions/1293147/javascript-code-to-parse-csv-data unCsv = function ( strData, strDelimiter ){ strDelimiter = (strDelimiter || ","); var objPattern = new RegExp( ( "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" + "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" + "([^\"\\" + strDelimiter + "\\r\\n]*))" ), "gi" ); var arrData = [[]]; var arrMatches = null; while (arrMatches = objPattern.exec( strData )){ var strMatchedDelimiter = arrMatches[ 1 ]; if (strMatchedDelimiter.length && (strMatchedDelimiter != strDelimiter)) { arrData.push( [] ); } if (arrMatches[ 2 ]){ var strMatchedValue = arrMatches[ 2 ].replace( new RegExp( "\"\"", "g" ), "\"" ); } else { var strMatchedValue = arrMatches[ 3 ]; } arrData[ arrData.length - 1 ].push( strMatchedValue ); } return( arrData ); } gaussian = function (x, mean, stdDev) { if (mean == null) mean = 0 if (stdDev == null) stdDev = 1 var d = x - mean var v = stdDev * stdDev return (1/Math.sqrt(2 * Math.PI * v)) * Math.exp(-(d * d) / (2 * v)) } ensure = function () { if (arguments.length <= 3) { if (!(arguments[1] in arguments[0])) { arguments[0][arguments[1]] = arguments[2] } return arguments[0][arguments[1]] } var args = Array.prototype.slice.call(arguments) var prev = ensure.apply(null, args.slice(0, 2).concat([typeof(args[2]) == "string" ? {} : []])) return ensure.apply(null, [prev].concat(args.slice(2))) } makeSet = function (o) { var s = {} foreach(o, function (e) { s[e] = true }) return s } setTimeoutRepeat = function (func, interval) { setTimeout(function () { func() setTimeoutRepeat(func, interval) }, interval) } cap = function (t, t0, t1) { if (t < t0) return t0 if (t > t1) return t1 return t } lerpCap = function (t0, v0, t1, v1, t) { var t = cap(t, t0, t1) return (t - t0) * (v1 - v0) / (t1 - t0) + v0 } lerp = function (t0, v0, t1, v1, t) { return (t - t0) * (v1 - v0) / (t1 - t0) + v0 } trim = function (s) { return s.replace(/^\s+|\s+$/g,""); } values = function (obj) { var a = [] foreach(obj, function (e) {a.push(e)}) return a } keys = function (obj) { var a = [] foreach(obj, function (v, k) {a.push(k)}) return a } compare = function (a, b) { if (a < b) return -1 if (a > b) return 1 return 0 } lines = function (s) { return s.split(/\r?\n/) } merge = function (objA, objB) { foreach(objB, function (v, k) { objA[k] = v }) return objA } time = function () { return new Date().getTime() } getFragment = function (url) { if (url === undefined) { url = window.location.href } var m = url.match(/#(.*)/) return m ? m[1] : "" } setFragment = function (frag) { url = window.location.href url = url.replace(/(#[^#]*)?$/, '#' + frag) window.location.href = url } getUrlParams = function (url) { if (url === undefined) { url = window.location.href } var params = {} var m = url.match(/\?([^#]+)/) if (m) { foreach(m[1].split(/&/), function (m) { if (m.length > 0) { var a = m.split(/=/) params[unescapeUrl(a[0])] = a.length > 1 ? unescapeUrl(a[1]) : true } }) } return params } //////////////////////////// // random var digitChars = "0123456789" var lowerChars = "abcdefghijklmnopqrstuvwxyz" var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" randomIdentifier = function (size) { var firstChars = '_' + lowerChars + upperChars var nextChars = firstChars + digitChars var s = [] for (var i = 0; i < size; i++) { var chars = i == 0 ? firstChars : nextChars s.push(chars[randomIndex(chars.length)]) } return s.join('') } randomIndex = function (n) { return Math.floor(Math.random() * n) } pick = function (a) { if (a instanceof Array) { return a[randomIndex(a.length)] } else { return a[pick(keys(a))] } return a } shuffle = function (a) { for (var i = 0; i < a.length; i++) { var ri = randomIndex(a.length) var temp = a[i] a[i] = a[ri] a[ri] = temp } return a } //////////////////////////// // escapeing escapeUnicodeChar = function (c) { var code = c.charCodeAt(0) var hex = code.toString(16) if (code < 16) return '\\u000' + hex if (code < 256) return '\\u00' + hex if (code < 4096) return '\\u0' + hex return '\\u' + hex } escapeString = function (s) { return s. replace(/\\/g, '\\\\'). replace(/\t/g, '\\t'). replace(/\n/g, '\\n'). replace(/\r/g, '\\r'). replace(/'/g, '\\\''). replace(/"/g, '\\\"'). replace(/[\u0000-\u001F]|[\u0080-\uFFFF]/g, escapeUnicodeChar) } escapeRegex = function (s) { return escapeString(s).replace(/([\{\}\(\)\|\[\]\^\$\.\*\+\?])/g, "\\$1") } escapeUrl = function (s) { return encodeURIComponent(s) } unescapeUrl = function (s) { return decodeURIComponent(s.replace(/\+/g, "%20")) } escapeXml = function (s) { s = s.replace(/&/g, "&") s = s.replace(//g, ">"). replace(/'/g, "'"). replace(/"/g, """). // replace(/[\u0000-\u001F]|[\u0080-\uFFFF]/g, function (c) { replace(/[\u0080-\uFFFF]/g, function (c) { var code = c.charCodeAt(0) return '&#' + code + ';' // if we want hex: var hex = code.toString(16) return '&#x' + hex + ';' }) return s; } unescapeXml = function (s) { return s.replace(/&[^;]+;/g, function (s) { switch(s.substring(1, s.length - 1)) { case "amp": return "&"; case "lt": return "<"; case "gt": return ">"; case "apos": return "'"; case "quot": return '"'; default: if (s.charAt(1) == "#") { if (s.charAt(2) == "x") { return String.fromCharCode(parseInt(s.substring(3, s.length - 1), 16)); } else { return String.fromCharCode(parseInt(s.substring(2, s.length - 1))); } } else { throw "unknown XML escape sequence: " + s } } }) } //////////////////////////// // list processing foreach = function (a, func) { if (a instanceof Array) { for (var i = 0; i < a.length; i++) { if (func(a[i], i) == false) break } } else { for (var k in a) { if (a.hasOwnProperty(k)) { if (func(a[k], k) == false) break } } } return a } filter = function (a, func) { if (a instanceof Array) { var b = [] for (var i = 0; i < a.length; i++) { var v = a[i] if (func(v, i)) { b.push(v) } } return b } else { var b = {} for (var k in a) { if (a.hasOwnProperty(k)) { var v = a[k] if (func(v, k)) { b[k] = v } } } return b } } map = function (a, func) { if (a instanceof Array) { var b = [] for (var i = 0; i < a.length; i++) { b.push(func(a[i], i)) } return b } else { var b = {} for (var k in a) { if (a.hasOwnProperty(k)) { b[k] = func(a[k], k) } } return b } } mapToSelf = function (a, func) { if (a instanceof Array) { for (var i = 0; i < a.length; i++) { a[i] = func(a[i], i) } return a } else { for (var k in a) { if (a.hasOwnProperty(k)) { a[k] = func(a[k], k) } } return a } } group = function (a, func) { var b = {} foreach(a, function (e) { var k = func(e) if (k) { if (!b[k]) b[k] = [] b[k].push(e) } }) return b } max = function (a, func) { var bestScore = null var best = null foreach(a, function (e, k) { var score = e if (func) score = func(e, k) if (score > 0 || score <= 0) { if (bestScore == null || score > bestScore) { bestScore = score best = e } } }) return best } find = function (a, func) { var ret = null foreach(a, function (e, k) { if (func(e, k)) { ret = e return false } }) return ret } ////////////////////////////////////////////// // json that handles circular references myJson = function (o) { var touched = [] var result = [] var appendAtEnd = [] function my_json_helper(result, o, indent, path) { switch (typeof o) { case 'object': // special case for Java strings try { if (o instanceof Packages.java.lang.String) { result.push('"') result.push(escapeString('' + o)); result.push('" /* was a Java String */') break } } catch (e) { } // special case for null if (o == null) { result.push('null') break } if (o.__temp_json_path) { result.push("/* ") result.push(o.__temp_json_path) result.push(" */0") appendAtEnd.push("\t" + path + " = " + o.__temp_json_path + "\n") break } o.__temp_json_path = path touched.push(o) if (o instanceof Array) { result.push("[\n") var indentMore = indent + "\t" for (var i = 0; i < o.length; i++) { result.push(indentMore) my_json_helper(result, o[i], indentMore, path + "[" + i + "]") if (i + 1 < o.length) { result.push(",\n") } else { result.push("\n") } } result.push(indent) result.push("]") } else if (o instanceof Date) { result.push("(function () {var d = new Date(); d.setTime(") result.push(o.getTime()) result.push("); return d})()") } else { result.push("{\n") var indentMore = indent + "\t" var first = true for (var k in o) { if (o.hasOwnProperty(k)) { if (k == "__temp_json_path") continue; if (first) { first = false } else { result.push(",\n") } result.push(indentMore) result.push('"') var escapedK = escapeString(k) result.push(escapedK) result.push('" : ') my_json_helper(result, o[k], indentMore, path + "[\"" + escapedK + "\"]") } } if (!first) { result.push("\n") } result.push(indent) result.push("}") } break case 'string': result.push('"') result.push(escapeString(o)); result.push('"') break case 'function': result.push(o) break case 'null': result.push('null') break case 'number': result.push(o) break case 'boolean': result.push(o) break case 'undefined': result.push('undefined') break default: throw "error: type not supported: " + (typeof o) } } my_json_helper(result, o, "\t", "data") if (appendAtEnd.length > 0) { result.unshift("(function () {\n\tvar data = ") result.push("\n") result = result.concat(appendAtEnd) result.push("\treturn data\n})()") } else if (touched.length > 0) { result.unshift("(") result.push(")") } for (var i = 0; i < touched.length; i++) { delete touched[i].__temp_json_path } return result.join("") } /** * * Javascript sprintf * http://www.webtoolkit.info/ * * licensed under creative commons attribute: * http://creativecommons.org/licenses/by/2.0/uk/ * **/ sprintfWrapper = { init : function () { if (typeof arguments == "undefined") { return null; } if (arguments.length < 1) { return null; } if (typeof arguments[0] != "string") { return null; } if (typeof RegExp == "undefined") { return null; } var string = arguments[0]; var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g); var matches = new Array(); var strings = new Array(); var convCount = 0; var stringPosStart = 0; var stringPosEnd = 0; var matchPosEnd = 0; var newString = ''; var match = null; while (match = exp.exec(string)) { if (match[9]) { convCount += 1; } stringPosStart = matchPosEnd; stringPosEnd = exp.lastIndex - match[0].length; strings[strings.length] = string.substring(stringPosStart, stringPosEnd); matchPosEnd = exp.lastIndex; matches[matches.length] = { match: match[0], left: match[3] ? true : false, sign: match[4] || '', pad: match[5] || ' ', min: match[6] || 0, precision: match[8], code: match[9] || '%', negative: parseInt(arguments[convCount]) < 0 ? true : false, argument: String(arguments[convCount]) }; } strings[strings.length] = string.substring(matchPosEnd); if (matches.length == 0) { return string; } if ((arguments.length - 1) < convCount) { return null; } var code = null; var match = null; var i = null; for (i=0; i