function p5Utils__format(str, args) {
	return args.reduce(
		function (ret, arg, idx) {
			return ret.replace(new RegExp('\\{' + idx + '\\}', 'gm'), arg)
		},
		str
	)
}

function p5Utils__parseFloatOrZero(strToParse) {
	if (!strToParse) return 0
	if ("string" === typeof strToParse) {
		strToParse = strToParse.replace(/,/g, '.')
		strToParse = strToParse.replace(/ /g, '')
	}
	var floatVal = parseFloat(strToParse)
	return (!isNaN(floatVal))? floatVal : 0
}

function p5Utils__pricePrint(value, defaultValue) {
	return p5Utils__pricePrintFormat(value, defaultValue, '.', ',');
}

function p5Utils__pricePrintPL(value, defaultValue) {
	return p5Utils__pricePrintFormat(value, defaultValue, ',', ' ');
}

function p5Utils__pricePrintFormat(value, defaultValue, decPoint, thousands_sep) {
	if (undefined === defaultValue) defaultValue = '';
	if (!value && value !== 0 && value !== '0') return defaultValue;
	if ("number" === typeof value) {
	} else if ("string" === typeof value) {
		value = p5Utils__parseFloatOrZero(value);
		if (isNaN(value)) {
			return defaultValue;
		}
	} else {
		return defaultValue;
	}
	var valueParts = value.toFixed(2).split('.'),
			firstPart = valueParts[0],
			secondPart = valueParts[1],
			parts = [],
			minus = ''
	;
	if ('-' === firstPart.substr(0, 1)) {
		minus = '-';
		firstPart = firstPart.substr(1);
	}
	var len = firstPart.length,
			str = firstPart,
			i = 0
	;
	while (len > 3) {
		parts.unshift(str.substr(-3));
		len -= 3;
		str = str.substr(0, len);
		i++;
	}
	if (len > 0) {
		parts.unshift(str);
	}
	return '' + minus + parts.join(thousands_sep) + decPoint + secondPart;
}

function p5Utils__clearNode(node) {
	if (!node || !node.lastChild) return;
	var lastNode;
	while (lastNode = node.lastChild) node.removeChild(lastNode);
}

function p5Utils__nodeStyle(node, style) {
	if (!node || !style) return;
	for (i in style) node.style[i] = style[i];
}

function p5Utils__promisify(fun) {
	return function () {
		var args = new Array(arguments.length);
		for (var i = 0; i < args.length; ++i) args[i] = arguments[i];
		return new Promise(function (resolve, reject) {
			fun.apply(fun, [].concat(args, function (err, res) {
				return (err) ? reject(err) : resolve(res)
			}))
		})
	}
}

// Object.prototype.toString.call([]) // "[object Array]"
// Object.prototype.toString.call('') // "[object String]"
// Object.prototype.toString.call({}) // "[object Object]"
// Object.prototype.toString.call(null) // "[object Null]"
// Object.prototype.toString.call() // "[object Undefined]"
function p5Utils__isString(arg) { return ('string' === typeof arg); }// '[object String]' === Object.prototype.toString.call(arg); }
function p5Utils__isArray(arg) { return (Array.isArray) ? Array.isArray(arg) : '[object Array]' === Object.prototype.toString.call(arg); }
function p5Utils__isObject(arg) { return ('object' === typeof arg && null !== arg && 'function' === typeof arg.constructor && !p5Utils__isArray(arg)); } // '[object Object]' === Object.prototype.toString.call(arg); }

global.p5Utils__format = p5Utils__format
global.p5Utils__parseFloatOrZero = p5Utils__parseFloatOrZero
global.p5Utils__pricePrint = p5Utils__pricePrint
global.p5Utils__pricePrintPL = p5Utils__pricePrintPL
global.p5Utils__pricePrintFormat = p5Utils__pricePrintFormat
global.p5Utils__clearNode = p5Utils__clearNode
global.p5Utils__nodeStyle = p5Utils__nodeStyle
global.p5Utils__promisify = p5Utils__promisify
global.p5Utils__isString = p5Utils__isString
global.p5Utils__isArray = p5Utils__isArray
global.p5Utils__isObject = p5Utils__isObject
