 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;
 }

 function getDecimal(ctl) {
  try {
   if (ctl==null) return parseFloat(0);
   var num = 0;
   if (ctl.value != null) { num = ctl.value; }
   else if (ctl.innerHTML != null ) { num = ctl.innerHTML; }
   else (num = ctl);
   if ((num==null)||(num=='')||(num=='-')) return parseFloat(0);
   num = num.replace(/\$|\,/g,'');
   num = num.replace('%','');
   if (num.indexOf('(')==0) {
    if (num.lastIndexOf(')')==(num.length-1)) {
     num=num.substring(1,num.length-1);
     num=-num;
    }
    else num=parseFloat(0);
   }
   if(isNaN(num)) return parseFloat(0);
	 return parseFloat(num);
  }
  catch (e) { return parseFloat(0); }
 }

 function formatCurrency(item, useValue) {
  var num='0';
  if (useValue==true) { num = item.value; }
  else { num = item.innerHTML; }
  num = num.toString().replace(/\$|\,/g,'');
  if (isNaN(num)) num = '0';
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num*100+0.50000000001);
  cents = num%100;
  num = Math.floor(num/100).toString();
  if (cents < 10) cents = "0" + cents;
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
  num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
  var formattedNumber = (((sign)?'':'(') + '$' + num + '.' + cents + ((sign)?'':')'));
  if (useValue) { item.value = formattedNumber; }
  else { item.innerHTML = formattedNumber; }
  if (formattedNumber.indexOf('(')!=-1) { item.style.color='red'; }
  else { item.style.color=''; }
 }

 function verifyDecimalInput(element, value, showZero) {
	if (element==null) return;
	var numFormat = new numberFormat(); var isPercent=false;
	numFormat.setInputDecimal('.');
	if (value == null) {
		if (element.value!=null) value = element.value;
		else if (element.innerHTML!=null) value = element.innerHTML;
	}
	if (value == '') return;
	var format = element.getAttribute('format');
//	if (element.format == null) {
    if (format == null) {
		numFormat.setSeparators(true, ',',',');
		numFormat.setCurrency(true);
		numFormat.setCurrencyValue('$');
		numFormat.setCurrencyPosition(numFormat.LEFT_OUTSIDE);
		numFormat.setPlaces(2);
	}
	else {
		try {
			//var attributes = element.format.split(';');
			var attributes = format.split(';');
			for (var x=0; x<attributes.length; x++) {
				var attrib = attributes[x];
				if (attrib != '') {
					var attribName = attrib.split(':')[0];
					var attribVal = attrib.split(':')[1];
					switch (attribName) {
						case 'isCurrency':
							if (attribVal == 'true') {
								numFormat.setSeparators(true, ',',',');
								numFormat.setCurrency(true);
								numFormat.setCurrencyValue('$');
								numFormat.setCurrencyPosition(numFormat.LEFT_INSIDE);
							}
							else { numFormat.setCurrency(false); }
							break;
						case 'isPercent':
							if (attribVal == 'true') { isPercent=true; }
							else { isPercent = false; }
							break;
						case 'precision':
							numFormat.setPlaces(attribVal);
							break;
						case 'commaSeparated':
							if (attribVal == 'true') {
								numFormat.setSeparators(true, ',',',');
							}
							else { numFormat.setSeparators(false); }
							break;
					}
				}
			}
		}
		catch (e) {
			numFormat.setCurrency(true);
			numFormat.setCurrencyValue('$');
			numFormat.setCurrencyPosition(numFormat.LEFT_INSIDE);
			numFormat.setPlaces(2);
		}
	}
	numFormat.setNegativeFormat(numFormat.PARENTHESIS);
	numFormat.setNegativeRed(false);
	var num = getDecimal(value);
	if (isPercent) num = num/100;
	numFormat.setNumber(num);
	if (element.value != null) { 
     if (isPercent) { element.value = numFormat.toPercentage(); } 
     else { element.value = numFormat.toFormatted(); } 
     if ((showZero==null)||(showZero==false)) {
       if (element.value == "$0.00") { element.value = ""; }
       if (element.value == "$0") { element.value = ""; }
       if (element.value.indexOf('$(')!=-1) { element.value = ('($' + element.value.substring(2)); }
     }
  }
	else {
     if (isPercent) { element.innerHTML = numFormat.toPercentage(); } 
     else { element.innerHTML = numFormat.toFormatted(); }
     if ((showZero==null)||(showZero==false)) {
       if (element.innerHTML == "$0.00") { element.innerHTML = ""; }
       if (element.innerHTML == "$0") { element.innerHTML = ""; }
       if (element.innerHTML.indexOf('$(')!=-1) { element.innerHTML = ('($' + element.innerHTML.substring(2)); }
     }
  }
	return numFormat.num;
 }
