function formatRound(number,precision) {
   if (precision==null) precision = 2;
   if (precision==0) {
      return Math.round(number);
   }
   lnFactor = Math.floor(Math.pow(10,precision));
   if (precision<0) {
      return  Math.round(number/lnFactor)*lnFactor;
   }
   
   return Math.round(number*lnFactor)/lnFactor;
}

function calcPayment (amount,rate,time,balloon) {
   if (rate<=0) {
      if (time<=0) {
      	return amount;
      } else {
      	return amount/time;
      }
   }
   if (balloon==null) balloon = 0;
   
   var ln = Math.pow(1+rate,time);
   return (amount-balloon/ln)/((1-(1/ln))/rate);
}
   
function formatNumber(number,precision,commas) {
   if (precision==null) precision = 2;
   number = formatRound(number,precision);
   var llSign = number<0;
   number = Math.abs(number);
   var ln = precision+1;
   var lc = "";
   number = Math.floor(number*Math.pow(10,precision));
   while (((ln--)>0) || (number>0)) {
      lc = (number%10)+lc;
      number = Math.floor(number/10);
      if (ln==1) lc = "."+lc;
   }
   if (llSign) lc = "-"+lc;
   var lc2 = "";
   if (commas) {
      var lc3 = lc;
      ln = lc.length;
      if (lc.indexOf(".")!=-1) {
         lc2 = lc.substring(lc.indexOf("."),ln);
         lc3 = lc.substring(0,lc.indexOf("."));
      }
      ln = lc3.length;
      var lnCount = 0;
      while (ln>0) {
         lnCount++;
         if (lnCount==4) {
            lc2 = ","+lc2;
            lnCount = 1;
         } 
         lc2 = lc3.substring(ln-1,ln)+lc2;
         ln--;
      }
   } else {
      lc2 = lc;
   }
   return lc2;
}
function checkNumber(number, msg, min, max) {
   msg = msg+" field has invalid numeric data: "+number.value;
   var str = number.value;
   if (str==null || str=="" || !str) return true;
   if (str.substring(1,1)=="$") {
      str = str.substring(2);
   }
   if (!validNumber(str)) {
      alert(msg);
      return false;
   }
   var num = parseFloat(str);
   if (min!=null && max!=null) {
      if (num<min || num>max) {
         alert(msg+" not in range ["+min+".."+max+"]");
         return false;
      }
   }
   number.value = str;
   return true;
}

function validNumber(number) {
   var checknum = parseFloat(number);
   if (isNaN(checknum)) return false;
   return true;
}

function calcFV(startamt, addamt, rate, periodsadded, periodsheld) {
   var lnResult = startamt;
   for (var ln=1; ln<periodsadded; ln++) {
      lnResult = lnResult+(lnResult*rate)+addamt;
   }
   if (periodsheld>0) {
      for (var ln=1; ln<periodsheld; ln++) {
         lnResult = lnResult+(lnResult*rate);
      }
   }
   return lnResult;
}

function padLeft(tcString,tnLength,tcChar) {
   if (tcChar==null) tcChar = " ";
   if (tcString.length>tnLength) {
      return "~"+tcString.substring(tcString.length-(tnLength-1),tcString.length);
   } else {
      if (tcString.length==tnLength) {
         return tcString;
      } else {
         var lnx = tnLength-tcString.length;
         for (var ln=0; ln<lnx; ln++) {
            tcString = tcChar+tcString;
         }  
         return tcString;
      }  
   }  
}  
function padRight(tcString,tnLength,tcChar) {
   if (tcChar==null) tcChar = " ";
   if (tcString.length>tnLength) {
      return tcString.substring(0,tnLength-1)+"~";
   } else {
      if (tcString.length==tnLength) {
         return tcString;
      } else {
         var lnx = tnLength-tcString.length;
         for (var ln=0; ln<lnx; ln++) {
            tcString = tcString+tcChar;
         }  
         return tcString;
      }  
   }  
}  
function mathRemainder(tnValue,tnDivisor) {
   if (tnValue==null) return 0;
   if (tnDivisor==null) return 0;
   var lnTimes = Math.floor(tnValue/tnDivisor);
   return tnValue-(lnTimes*tnDivisor);
}  // function
