// function from http://forums.devshed.com/t39065/s84ded709f924610aa44fff827511aba3.html
// author appears to be Robert Pollard

function sprintf(format) {
	if (!arguments || !RegExp) {
		return undefined;
	}
	var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
	var a = b = [], numSubstitutions = 0, numMatches = 0;
	while (a = re.exec(format)) {
		var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
		var pPrecision = a[5], pType = a[6], rightPart = a[7];

		numMatches++;
		if (pType == '%')  {
			subst = '%';
		}
		else {
			numSubstitutions++;
			if (numSubstitutions >= arguments.length) {
				alert('Error! Not enough function arguments (' + (arguments.length - 1)
					+ ', excluding the string)\n'
					+ 'for the number of substitution parameters in string ('
					+ numSubstitutions + ' so far).');
			}
			var param = arguments[numSubstitutions];
			var pad = '';
			if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
			else if (pPad) pad = pPad;
			var justifyRight = true;
			if (pJustify && pJustify === "-") justifyRight = false;
			var minLength = -1;
			if (pMinLength) minLength = parseInt(pMinLength);
			var precision = -1;
			if (pPrecision && pType == 'f')
				precision = parseInt(pPrecision.substring(1));
			var subst = param;
			switch (pType) {
				case 'b':
					subst = parseInt(param).toString(2);
					break;
				case 'c':
					subst = String.fromCharCode(parseInt(param));
					break;
				case 'd':
					subst = parseInt(param) ? parseInt(param) : 0;
					break;
				case 'u':
					subst = Math.abs(param);
					break;
				case 'f':
					subst = (precision > -1)
					? Math.round(parseFloat(param) * Math.pow(10, precision))
					/ Math.pow(10, precision)
					: parseFloat(param);
					break;
				case 'o':
					subst = parseInt(param).toString(8);
					break;
				case 's':
					subst = param;
					break;
				case 'x':
					subst = ('' + parseInt(param).toString(16)).toLowerCase();
					break;
				case 'X':
					subst = ('' + parseInt(param).toString(16)).toUpperCase();
					break;
			}
			var padLeft = minLength - subst.toString().length;
			var padding = "";
			if (padLeft > 0) {
				var arrTmp = new Array(padLeft+1);
				padding = arrTmp.join(pad ? pad : " ");
			}
		}
		format = leftpart + padding + subst + rightPart;
	}
	return format;
}

