// Takes an input string which contains a number and rounds it
// appropriately. For example:
// ShowPrecision("$5.609", 2) = $5.61
// ShowPrecision("BlahBlah5.609%", 2) = BlahBlah5.61%
// ShowPrecision("-5.609", 2) = -5.61
// ShowPrecision("5.609", 0) = 6
// ShowPrecision("6", 2) = 6.00
function ShowPrecision(instr,precis,bFalseOnZero)
{
  var sOperand = String(instr);
  var precision = parseInt(precis);
  var i=0,j=0,k=0;
  var DEBUG = 0;
  var bStripNonDigits = true;

  if (typeof(bFalseOnZero) == "undefined")
    bFalseOnZero = false;

  // Check if precision is a valid integer
  if (isNaN(precision))
    return instr;

  // Split the input string up
  var reParseDigit = /^([^\d-]*)([-]*[\d\.]*)([^\d]*)/
  var sPrefix = sOperand.replace(reParseDigit,"$1");
  var sNum = sOperand.replace(reParseDigit,"$2");
  var sSuffix = sOperand.replace(reParseDigit,"$3");
  var iDecimalIdx = sNum.indexOf(".");

  if (isNaN(parseFloat(sNum)))
    if (bFalseOnZero)
      return false;
    else
      return '0';
  if (bFalseOnZero && parseFloat(sNum) == 0)
    return false;
  // Handle precision 0 specially
  if (precision == 0)
    if (bStripNonDigits)
      return Math.round(parseFloat(sNum)).toString();
    else
      return sPrefix + Math.round(parseFloat(sNum)).toString() + sSuffix;

  // See if we have more precision than required
  if ((iDecimalIdx != -1) &&
      (sNum.length - iDecimalIdx - 1 > precision))
  {
    // Split into integer/fraction parts
    sIntPart = sNum.substr(0, iDecimalIdx);
    sFracPart = sNum.substr(iDecimalIdx + 1);
    var sFracLeadingZeros = sFracPart.replace(/^(0*).*/,"$1").substring(0,precision - 1);

    // The fraction part gets broken into 2: the bit which is of the
    // required precision length, and the bit after it.
    sRoundPart = "0." + sFracPart.substr(precision);
    var fFracPart = parseFloat(sFracPart.substr(0, precision));

    // Finally, we actually start the rounding part
    var fRoundPart = Math.round(parseFloat(sRoundPart));
    fFracPart += fRoundPart;
    // If the fraction part is .999... and the round part is 1, then we
    // need to increment sNum. Thus, 4.9999 rounded to 2 decimal places
    // is 5.00
    // 6.09960 rounded to 3dp is 6.100
    if (fFracPart.toString().length > precision)
      sNum = (parseFloat(sIntPart) + 1).toString();
    else if (fFracPart.toString().length + sFracLeadingZeros.length > precision)
      sNum = sIntPart + "." + sFracLeadingZeros.substr(0, sFracLeadingZeros.length - 1) + fFracPart.toString();
    else
      sNum = sIntPart + "." + sFracLeadingZeros + fFracPart.toString();
  }

  // Ensure added zeros and decimal point to make up precision
  if (sNum.indexOf(".") == -1)
    sNum += ".";
  while (sNum.length - sNum.indexOf(".") < precision + 1)
    sNum += "0";

  // Return false if necessary, or reassemble string and return it
  if (bStripNonDigits)
    return sNum;
  else
    return sPrefix + sNum + sSuffix;
}
function cnxAAPRUpdate(obForm)
{
  var obApplet = document.javaapplet;

  obForm.cnxLVR.value = ShowPrecision(obApplet.getLVR(),2);
  obForm.cnxIntroPayment.value = ShowPrecision(obApplet.getInitMonthlyPayment(),0);
  obForm.cnxRevertPayment.value = ShowPrecision(obApplet.getSubsMonthlyPayment(),0);
  obForm.cnxTotalPayment.value = ShowPrecision(obApplet.getTotalPayment(),0);
  obForm.cnxAAPR.value = ShowPrecision(obApplet.getAAPR() * 100,3);
}
function cnxAmountCalc(obInput)
{
  obInput.value = (ShowPrecision(obInput.value,0,true) ||
    ShowPrecision(document.javaapplet.getLoanAmount(),0));
  document.javaapplet.setLoanAmount(ShowPrecision(obInput.value,0));
  cnxAAPRUpdate(obInput.form);
}
function cnxTermCalc(obInput)
{
  obInput.value = (ShowPrecision(obInput.value,0,true) ||
    ShowPrecision(document.javaapplet.getLoanTerm()/12,0));
  document.javaapplet.setLoanTerm(obInput.value * 12);
  cnxAAPRUpdate(obInput.form);
}
function cnxValuationAmountCalc(obInput)
{
  obInput.value = (ShowPrecision(obInput.value,0,true) ||
    ShowPrecision(document.javaapplet.getValuationAmount(),0));
  document.javaapplet.setValuationAmount(obInput.value);
  cnxAAPRUpdate(obInput.form);
}
function cnxIntroTermCalc(obInput)
{
  obInput.value = ShowPrecision(obInput.value,0);
  document.javaapplet.setInitialPeriod(obInput.value);
  cnxAAPRUpdate(obInput.form);
}
function cnxIntroRateCalc(obInput)
{
  obInput.value = ShowPrecision(obInput.value,2);
  document.javaapplet.setHoneymoonRate(obInput.value / 100);
  cnxAAPRUpdate(obInput.form);
}
function cnxRevertRateCalc(obInput)
{
  obInput.value = ShowPrecision(obInput.value,2);
  document.javaapplet.setVariableRate(obInput.value / 100);
  cnxAAPRUpdate(obInput.form);
}
function cnxUpfrontFeesCalc(obInput)
{
  obInput.value = ShowPrecision(obInput.value,0);
  document.javaapplet.setUpfrontFee(obInput.value);
  cnxAAPRUpdate(obInput.form);
}
function cnxOngoingFeesCalc(obInput)
{
  obInput.value = ShowPrecision(obInput.value,0);
  document.javaapplet.setMonthlyFee(obInput.value);
  cnxAAPRUpdate(obInput.form);
}
function cnxEndFeesCalc(obInput)
{
  obInput.value = ShowPrecision(obInput.value,0);
  document.javaapplet.setEndFee(obInput.value);
  cnxAAPRUpdate(obInput.form);
}

