function replace(szBuf, szFind, szReplace, lStart) {
  var lFind = 0;
  if (!lStart) lStart = 0;

  while (lFind != -1) {
    lFind = szBuf.indexOf(szFind, lStart);

    if (lFind != -1) {
      szBuf = szBuf.substring(0,lFind) + szReplace + szBuf.substring(lFind + szFind.length);
      lStart = lFind + szReplace.length;
    }
  }
  return szBuf;
}

function pmt(rate, nper, pv, fv) {
  var rVal;

  if (rate==0) {
    rVal=-(fv + pv)/nper;
  } else {
    ir=Math.pow(1 + rate,nper);
    rVal=-((rate * (fv + ir * pv))/(ir-1));
  }
  return rVal;
}

function cleanNumber(strNum) {
  if (!strNum) return strNum;
  strNum = replace(strNum, '$', '', 0);
  strNum = replace(strNum, ',', '', 0);
  strNum = replace(strNum, '%', '', 0);
  return strNum;
}

function format(value, lead, sep) {
  var strValue = new String(value);
  var len = strValue.length;
  var n;
  var strRet = '';
  var ctChar = 3 - (len%3);

  if (ctChar == 3) ctChar =0;

  for (n=0; len > n; n++) {
    if (ctChar == 3) {
      strRet += sep;
      ctChar = 0;
    }
    ctChar++;
    strRet += strValue.substring(n,n+1);
  }

  if (lead == '%') {
    return strRet + lead;
  } else {
    return lead + strRet;
  }
}

function numFormat(elem, lead, sep) {
  if (elem.value == '') {
    elem.value = format('0', lead, sep);
    return true;
  }

  var value = parseInt(cleanNumber(elem.value), 10);

  if (lead == '') {
    if (0 > value) {
      alert('You have exceeded the range for the interior size.\nPlease check your information and try again.');
      value = 0;
    }

    if (value > 99999) {
      alert('You have exceeded the range for the interior size.\nPlease check your information and try again.');
      value = 99999;
		}
  }

  if (lead == '$') {
    if (0 > value) {
      alert('You have exceeded the range for the price.\nPlease check your information and try again.');
      value = 0;
    }

    if (value > 100000000) {
      alert('You have exceeded the range for the price.\nPlease check your information and try again.');
      value = 100000000;
    }
  }

  if (isNaN(value)) {
    alert('You have entered an incorrect character on this field. \nPlease check your information and try again.');
    elem.value = format('0', lead, sep);
    elem.focus();
    return false;
  }
  elem.value = format(value, lead, sep);
  return true;
}

function dpCalc(dp,pr) {
  var price = pr;
  var percent = dp;
  var rvalue = 0;

  rvalue = price * (dp/100);
  return rvalue;
}

function calcRate(lfform, fErrors) {
  if (lfform == null) return;

  var price = cleanNumber(lfform.ap.value);
  var priceErr = false;

  var dpIndex = lfform.dp.selectedIndex;
  var dpValue = lfform.dp.options[dpIndex].value;
  var downpayment = dpCalc(dpValue,price);

  var intIndex = lfform.ir.selectedIndex;
  var intValue = lfform.ir.options[intIndex].value;
  var numpayments = 360; // 30 Years Fixed Mortgage

  numFormat(lfform.ap,'$',',');

  if ((price == 0) && (fErrors != 0)) {
    alert('Please enter an asking price that is greater than zero.');
    lfform.ep.value = '';
  } else {
    var payment = parseInt(-pmt(intValue/1200, numpayments, price - downpayment,0));
    if (payment < 0) {
      lfform.ep.value = '';
    } else {
      lfform.ep.value = payment;
      numFormat(lfform.ep,'$',',');
    }
  }
}

