|
|
|
function bool(x) {
|
|
|
|
return (x === 1 || x === '1' || x === true || x === 'true');
|
|
|
|
}
|
|
|
|
|
|
|
|
function numfmt(x, places) {
|
|
|
|
var pow = Math.pow(10, places);
|
|
|
|
return Math.round(x*pow) / pow;
|
|
|
|
}
|
|
|
|
|
|
|
|
function estimateLoadTime(fs, n) {
|
|
|
|
return (1000/fs)*n+1500;
|
|
|
|
}
|
|
|
|
|
|
|
|
function msNow() {
|
|
|
|
return +(new Date);
|
|
|
|
}
|
|
|
|
|
|
|
|
function msElapsed(start) {
|
|
|
|
return msNow() - start;
|
|
|
|
}
|
|
|
|
|
|
|
|
Math.log10 = Math.log10 || function(x) {
|
|
|
|
return Math.log(x) / Math.LN10;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Perform a substitution in the given string.
|
|
|
|
*
|
|
|
|
* Arguments - array or list of replacements.
|
|
|
|
* Arguments numeric keys will replace {0}, {1} etc.
|
|
|
|
* Named keys also work, ie. {foo: "bar"} -> replaces {foo} with bar.
|
|
|
|
*
|
|
|
|
* Braces are added to keys if missing.
|
|
|
|
*
|
|
|
|
* @returns {String} result
|
|
|
|
*/
|
|
|
|
String.prototype.format = function () {
|
|
|
|
var out = this;
|
|
|
|
|
|
|
|
var repl = arguments;
|
|
|
|
|
|
|
|
if (arguments.length == 1 && (_.isArray(arguments[0]) || _.isObject(arguments[0]))) {
|
|
|
|
repl = arguments[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var ph in repl) {
|
|
|
|
if (repl.hasOwnProperty(ph)) {
|
|
|
|
var ph_orig = ph;
|
|
|
|
|
|
|
|
if (!ph.match(/^\{.*\}$/)) {
|
|
|
|
ph = '{' + ph + '}';
|
|
|
|
}
|
|
|
|
|
|
|
|
// replace all occurrences
|
|
|
|
var pattern = new RegExp(_.escapeRegExp(ph), "g");
|
|
|
|
out = out.replace(pattern, repl[ph_orig]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return out;
|
|
|
|
};
|
|
|
|
|
|
|
|
function copyToClipboard(string) {
|
|
|
|
if (!document.execCommand) return false;
|
|
|
|
|
|
|
|
// create hidden text element, if it doesn't already exist
|
|
|
|
var targetId = "_hiddenCopyText_";
|
|
|
|
|
|
|
|
// must use a temporary form element for the selection and copy
|
|
|
|
target = document.getElementById(targetId);
|
|
|
|
if (!target) {
|
|
|
|
var target = document.createElement("textarea");
|
|
|
|
target.style.position = "absolute";
|
|
|
|
target.style.left = "-9999px";
|
|
|
|
target.style.top = "0";
|
|
|
|
target.id = targetId;
|
|
|
|
document.body.appendChild(target);
|
|
|
|
}
|
|
|
|
target.textContent = string;
|
|
|
|
|
|
|
|
// select the content
|
|
|
|
var currentFocus = document.activeElement;
|
|
|
|
target.focus();
|
|
|
|
target.setSelectionRange(0, target.value.length);
|
|
|
|
|
|
|
|
// copy the selection
|
|
|
|
var succeed;
|
|
|
|
try {
|
|
|
|
succeed = document.execCommand("copy");
|
|
|
|
} catch(e) {
|
|
|
|
succeed = false;
|
|
|
|
}
|
|
|
|
// restore original focus
|
|
|
|
if (currentFocus && typeof currentFocus.focus === "function") {
|
|
|
|
currentFocus.focus();
|
|
|
|
}
|
|
|
|
|
|
|
|
// clear temporary content
|
|
|
|
target.textContent = "";
|
|
|
|
|
|
|
|
return succeed;
|
|
|
|
}
|