// Java Document
 function NumberFormat(num, inputDecimal)
			{
			this.VERSION = 'Number Format v1.5.4';
			this.COMMA = ',';
			this.PERIOD = '.';
			this.DASH = '-'; 
			this.LEFT_PAREN = '('; 
			this.RIGHT_PAREN = ')'; 
			this.LEFT_OUTSIDE = 0; 
			this.LEFT_INSIDE = 1;  
			this.RIGHT_INSIDE = 2;  
			this.RIGHT_OUTSIDE = 3;  
			this.LEFT_DASH = 0; 
			this.RIGHT_DASH = 1; 
			this.PARENTHESIS = 2; 
			this.NO_ROUNDING = -1 
			this.num;
			this.numOriginal;
			this.hasSeparators = false;  
			this.separatorValue;  
			this.inputDecimalValue; 
			this.decimalValue;  
			this.negativeFormat; 
			this.negativeRed; 
			this.hasCurrency;  
			this.currencyPosition;  
			this.currencyValue;  
			this.places;
			this.roundToPlaces; 
			this.truncate; 
			this.setNumber = setNumberNF;
			this.toUnformatted = toUnformattedNF;
			this.setInputDecimal = setInputDecimalNF; 
			this.setSeparators = setSeparatorsNF; 
			this.setCommas = setCommasNF;
			this.setNegativeFormat = setNegativeFormatNF; 
			this.setNegativeRed = setNegativeRedNF; 
			this.setCurrency = setCurrencyNF;
			this.setCurrencyPrefix = setCurrencyPrefixNF;
			this.setCurrencyValue = setCurrencyValueNF; 
			this.setCurrencyPosition = setCurrencyPositionNF; 
			this.setPlaces = setPlacesNF;
			this.toFormatted = toFormattedNF;
			this.toPercentage = toPercentageNF;
			this.getOriginal = getOriginalNF;
			this.moveDecimalRight = moveDecimalRightNF;
			this.moveDecimalLeft = moveDecimalLeftNF;
			this.getRounded = getRoundedNF;
			this.preserveZeros = preserveZerosNF;
			this.justNumber = justNumberNF;
			this.expandExponential = expandExponentialNF;
			this.getZeros = getZerosNF;
			this.moveDecimalAsString = moveDecimalAsStringNF;
			this.moveDecimal = moveDecimalNF;
			this.addSeparators = addSeparatorsNF;
			if (inputDecimal == null) {
			this.setNumber(num, this.PERIOD);
			} else {
			this.setNumber(num, inputDecimal); 
			}
			this.setCommas(true);
			this.setNegativeFormat(this.LEFT_DASH); 
			this.setNegativeRed(false); 
			this.setCurrency(false); 
			this.setCurrencyPrefix('$');
			this.setPlaces(2);
			}
			function setInputDecimalNF(val)
			{
			this.inputDecimalValue = val;
			}
			function setNumberNF(num, inputDecimal)
			{
			if (inputDecimal != null) {
			this.setInputDecimal(inputDecimal); 
			}
			this.numOriginal = num;
			this.num = this.justNumber(num);
			}
			function toUnformattedNF()
			{
			return (this.num);
			}
			function getOriginalNF()
			{
			return (this.numOriginal);
			}
			function setNegativeFormatNF(format)
			{
			this.negativeFormat = format;
			}
			function setNegativeRedNF(isRed)
			{
			this.negativeRed = isRed;
			}
			function setSeparatorsNF(isC, separator, decimal)
			{
			this.hasSeparators = isC;
			if (separator == null) separator = this.COMMA;
			if (decimal == null) decimal = this.PERIOD;
			if (separator == decimal) {
			this.decimalValue = (decimal == this.PERIOD) ? this.COMMA : this.PERIOD;
			} else {
			this.decimalValue = decimal;
			}
			this.separatorValue = separator;
			}
			function setCommasNF(isC)
			{
			this.setSeparators(isC, this.COMMA, this.PERIOD);
			}
			function setCurrencyNF(isC)
			{
			this.hasCurrency = isC;
			}
			function setCurrencyValueNF(val)
			{
			this.currencyValue = val;
			}
			function setCurrencyPrefixNF(cp)
			{
			this.setCurrencyValue(cp);
			this.setCurrencyPosition(this.LEFT_OUTSIDE);
			}
			function setCurrencyPositionNF(cp)
			{
			this.currencyPosition = cp
			}
			function setPlacesNF(p, tr)
			{
			this.roundToPlaces = !(p == this.NO_ROUNDING); 
			this.truncate = (tr != null && tr); 
			this.places = (p < 0) ? 0 : p; 
			}
			function addSeparatorsNF(nStr, inD, outD, sep)
			{
			nStr += '';
			var dpos = nStr.indexOf(inD);
			var nStrEnd = '';
			if (dpos != -1) {
			nStrEnd = outD + nStr.substring(dpos + 1, nStr.length);
			nStr = nStr.substring(0, dpos);
			}
			var rgx = /(\d+)(\d{3})/;
			while (rgx.test(nStr)) {
			nStr = nStr.replace(rgx, '$1' + sep + '$2');
			}
			return nStr + nStrEnd;
			}
			function toFormattedNF()
			{	
			var pos;
			var nNum = this.num; 
			var nStr;            
			var splitString = new Array(2);   
			if (this.roundToPlaces) {
			nNum = this.getRounded(nNum);
			nStr = this.preserveZeros(Math.abs(nNum)); 
			} else {
			nStr = this.expandExponential(Math.abs(nNum)); 
			}
			/*if (this.hasSeparators) {
			nStr = this.addSeparators(nStr, this.PERIOD, this.decimalValue, this.separatorValue);
			} else {
			nStr = nStr.replace(new RegExp('\\' + this.PERIOD), this.decimalValue); 
			}*/
			var c0 = '';
			var n0 = '';
			var c1 = '';
			var n1 = '';
			var n2 = '';
			var c2 = '';
			var n3 = '';
			var c3 = '';
			var negSignL = (this.negativeFormat == this.PARENTHESIS) ? this.LEFT_PAREN : this.DASH;
			var negSignR = (this.negativeFormat == this.PARENTHESIS) ? this.RIGHT_PAREN : this.DASH;
			if (this.currencyPosition == this.LEFT_OUTSIDE) {
			if (nNum < 0) {
			if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n1 = negSignL;
			if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n2 = negSignR;
			}
			if (this.hasCurrency) c0 = this.currencyValue;
			} else if (this.currencyPosition == this.LEFT_INSIDE) {
			if (nNum < 0) {
			if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n0 = negSignL;
			if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n3 = negSignR;
			}
			if (this.hasCurrency) c1 = this.currencyValue;
			}
			else if (this.currencyPosition == this.RIGHT_INSIDE) {
			if (nNum < 0) {
			if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n0 = negSignL;
			if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n3 = negSignR;
			}
			if (this.hasCurrency) c2 = this.currencyValue;
			}
			else if (this.currencyPosition == this.RIGHT_OUTSIDE) {
			if (nNum < 0) {
			if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n1 = negSignL;
			if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n2 = negSignR;
			}
			if (this.hasCurrency) c3 = this.currencyValue;
			}
			nStr = c0 + n0 + c1 + n1 + nStr + n2 + c2 + n3 + c3;
			if (this.negativeRed && nNum < 0) {
			nStr = '<font color="red">' + nStr + '</font>';
			}
			return (nStr);
			}
			function toPercentageNF()
			{
			nNum = this.num * 100;
			nNum = this.getRounded(nNum);
			return nNum + '%';
			}
			function getZerosNF(places)
			{
			var extraZ = '';
			var i;
			for (i=0; i<places; i++) {
			extraZ += '0';
			}
			return extraZ;
			}
			function expandExponentialNF(origVal)
			{
			if (isNaN(origVal)) return origVal;
			var newVal = parseFloat(origVal) + ''; 
			var eLoc = newVal.toLowerCase().indexOf('e');
			if (eLoc != -1) {
			var plusLoc = newVal.toLowerCase().indexOf('+');
			var negLoc = newVal.toLowerCase().indexOf('-', eLoc); 
			var justNumber = newVal.substring(0, eLoc);
			if (negLoc != -1) {
			var places = newVal.substring(negLoc + 1, newVal.length);
			justNumber = this.moveDecimalAsString(justNumber, true, parseInt(places));
			} else {
			if (plusLoc == -1) plusLoc = eLoc;
			var places = newVal.substring(plusLoc + 1, newVal.length);
			justNumber = this.moveDecimalAsString(justNumber, false, parseInt(places));
			}
			newVal = justNumber;
			}
			return newVal;
			} 
			function moveDecimalRightNF(val, places)
			{
			var newVal = '';
			if (places == null) {
			newVal = this.moveDecimal(val, false);
			} else {
			newVal = this.moveDecimal(val, false, places);
			}
			return newVal;
			}
			function moveDecimalLeftNF(val, places)
			{
			var newVal = '';
			if (places == null) {
			newVal = this.moveDecimal(val, true);
			} else {
			newVal = this.moveDecimal(val, true, places);
			}
			return newVal;
			}
			function moveDecimalAsStringNF(val, left, places)
			{
			var spaces = (arguments.length < 3) ? this.places : places;
			if (spaces <= 0) return val; 
			var newVal = val + '';
			var extraZ = this.getZeros(spaces);
			var re1 = new RegExp('([0-9.]+)');
			if (left) {
			newVal = newVal.replace(re1, extraZ + '$1');
			var re2 = new RegExp('(-?)([0-9]*)([0-9]{' + spaces + '})(\\.?)');		
			newVal = newVal.replace(re2, '$1$2.$3');
			} else {
			var reArray = re1.exec(newVal); 
			if (reArray != null) {
			newVal = newVal.substring(0,reArray.index) + reArray[1] + extraZ + newVal.substring(reArray.index + reArray[0].length); 
			}
			var re2 = new RegExp('(-?)([0-9]*)(\\.?)([0-9]{' + spaces + '})');
			newVal = newVal.replace(re2, '$1$2$4.');
			}
			newVal = newVal.replace(/\.$/, ''); 
			return newVal;
			}
			function moveDecimalNF(val, left, places)
			{
			var newVal = '';
			if (places == null) {
			newVal = this.moveDecimalAsString(val, left);
			} else {
			newVal = this.moveDecimalAsString(val, left, places);
			}
			return parseFloat(newVal);
			}
			function getRoundedNF(val)
			{
			val = this.moveDecimalRight(val);
			if (this.truncate) {
			val = val >= 0 ? Math.floor(val) : Math.ceil(val); 
			} else {
			val = Math.round(val);
			}
			val = this.moveDecimalLeft(val);
			return val;
			}
			function preserveZerosNF(val)
			{
			var i;
			val = this.expandExponential(val);
			if (this.places <= 0) return val; 
			var decimalPos = val.indexOf('.');
			if (decimalPos == -1) {
			val += '.';
			for (i=0; i<this.places; i++) {
			val += '0';
			}
			} else {
			var actualDecimals = (val.length - 1) - decimalPos;
			var difference = this.places - actualDecimals;
			for (i=0; i<difference; i++) {
			val += '0';
			}
			}
			return val;
			}
			function justNumberNF(val)
			{
			newVal = val + '';
			var isPercentage = false;
			if (newVal.indexOf('%') != -1) {
			newVal = newVal.replace(/\%/g, '');
			isPercentage = true; 
			}
			var re = new RegExp('[^\\' + this.inputDecimalValue + '\\d\\-\\+\\(\\)eE]', 'g');	
			newVal = newVal.replace(re, '');
			var tempRe = new RegExp('[' + this.inputDecimalValue + ']', 'g');
			var treArray = tempRe.exec(newVal); 
			if (treArray != null) {
			var tempRight = newVal.substring(treArray.index + treArray[0].length); 
			newVal = newVal.substring(0,treArray.index) + this.PERIOD + tempRight.replace(tempRe, ''); 
			}
			if (newVal.charAt(newVal.length - 1) == this.DASH ) {
			newVal = newVal.substring(0, newVal.length - 1);
			newVal = '-' + newVal;
			}
			else if (newVal.charAt(0) == this.LEFT_PAREN
			&& newVal.charAt(newVal.length - 1) == this.RIGHT_PAREN) {
			newVal = newVal.substring(1, newVal.length - 1);
			newVal = '-' + newVal;
			}
			newVal = parseFloat(newVal);
			if (!isFinite(newVal)) {
			newVal = 0;
			}
			if (isPercentage) {
			newVal = this.moveDecimalLeft(newVal, 2);
			}
			return newVal;
			}

function tryNumberFormat(obj)
{
	return new NumberFormat(obj).toFormatted();
}
