// mredkj.com
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;
}
