// NumberFormat 1.5.3 http://www.mredkj.com

function MM_findObj(n, d) {
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}


function NumberFormat(num, inputDecimal)
{
	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.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)
{
	this.roundToPlaces = !(p == this.NO_ROUNDING);
	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);
	}

	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);
	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;
}
