
function isOverflow(n)
{return(isNaN(n)||n==Number.POSITIVE_INFINITY||n==Number.NEGATIVE_INFINITY)}
function isNumeric(c)
{return(c==','||c=='.'||c=='-'||(c>='0'&&c<='9'))}
function removeNonNumerics(s)
{if(s==null)return null
s=''+s
var tmp=''
var isLeadingZero=true
for(var i=0;i<s.length;i++)
{var c=s.charAt(i)
if(isNumeric(c))
{if(isLeadingZero==true&&c=='0')
{continue;}
else
{isLeadingZero=false}
tmp=tmp+c}}
return tmp}
function removeCommas(s)
{if(s==null)return null
s=''+s
var tmp=''
var isLeadingZero=true
for(var i=0;i<s.length;i++)
{var c=s.charAt(i)
if(isNumeric(c))
{if(c==',')
{c='.';}
if(isLeadingZero==true&&c=='0')
{continue;}
else
{isLeadingZero=false}
tmp=tmp+c}}
return tmp}
function strToInt(s)
{var n=parseInt(removeNonNumerics(s))
if(isNaN(n))
{n=0}
return(n<0)?0:n;}
function intToStr(i)
{if(i!=0){return i}
else{return"0"}}
function addCommas(tmp)
{var s=''
var len=tmp.length
var end=len-1
for(var i=0;i<len;i++)
{c=tmp.charAt(end-i)
s=c+((i>2&&i%3==0)?' ':'')+s}
return s}
function _numToUnits(n,units_prefix,decimal_places,units_suffix)
{if(isOverflow(n))return'<i>numeric overflow</i>'
var isNegative=(n<0)?true:false
var s=''
var d=strToInt(decimal_places)
var x=Math.abs(Math.round(n*Math.pow(10,decimal_places)))
if(x==0)
{var defaultStr='0'
if(d>0)
{defaultStr+=','
for(var i=0;i<d;i++)defaultStr+='0'}
defaultStr=units_prefix+defaultStr+units_suffix
return defaultStr}
if(d==0)
{var tmp=''+x
s=addCommas(tmp)}
else
{var leftTmp=''+x
var rightTmp=''+x
var len=leftTmp.length
for(var i=0;i<d+1-len;i++)
{leftTmp='0'+leftTmp
rightTmp='0'+rightTmp}
len=leftTmp.length
var decimalSplit=len-d
var leftStr=addCommas(leftTmp.substring(0,decimalSplit))
var rightStr=rightTmp.substring(decimalSplit,len)
s=leftStr+','+rightStr}
s=units_prefix+s+units_suffix
if(isNegative)s='-'+s
return s}
function numToFloat(n)
{if(n!=0){return _numToUnits(n,'',2,'')}
else{return 0}}
function numToDollars(n)
{return _numToUnits(n,'$',0,'')}
function numToPercent(n)
{return _numToUnits(n,'',2,' %')}
function numToUnits(n,units)
{return _numToUnits(n,'',0,' '+units)}
function numToYear(n)
{if(n==1)
{return _numToUnits(n,'',0,' year');}
else
{return _numToUnits(n,'',0,' years');}}
function numToPercentStr(num){var tmp=new String(num)
return tmp+"%"}
function strToFloat(s)
{var n=parseFloat(removeCommas(s))
if(isNaN(n))
{n=0;}
else{var tab=removeCommas(s).split(".")
var toParse=tab[0];if(tab.length>1){toParse=toParse+"."
for(var j=0;j<(tab[1].length<2?tab[1].length:2);j++){toParse=toParse+tab[1].charAt(j);}}
n=parseFloat(toParse);}
return(n<0)?0:n;}
function strToIntRange(s,low,high){var num=strToInt(s);if(num<low)
num=low;else
if(num>high)
num=high;return num;}
function strToFloatRange(s,low,high){var num=strToFloat(s);if(num<low)
num=low;else
if(num>high)
num=high;return num;}
function floatToPrecisionStr(f,n)
{var tmp=''+Math.round(f*Math.pow(10,n))
var decimalSplit=tmp.length-n
return tmp.substring(0,decimalSplit)+'.'+tmp.substring(decimalSplit,n+1)}