Mortgage Loan Calculator

by Jorgelig

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.min.js"></script>
<h2><span  data-bind="text: calcText"></span> | <span  data-bind="text: term"></span> años <span  data-bind="text: paymentType"></span></h2>
<table border="1px">
  <tr>
    <td>Salary:</td>
    <td>
      <input type="text" data-bind="value: salary" />
    </td>
  </tr>
  <tr>
    <td>MonthlyDebt:</td>
    <td>
      <input type="text" data-bind="value: monthlyDebt" />
    </td>
  </tr>
  <tr>
    <td>Valor de propiedad</td>
    <td><span data-bind="text: propertyValue().formatMoney(2, '.', ',')">-</span></td>
  </tr>
  <tr>
    <td>Linea de crédito</td>
    <td><span data-bind="text: creditLine().formatMoney(2, '.', ',')">-</span></td>
  </tr>
  <tr>
    <td>Mensualidad</td>
    <td><span data-bind="text: monthlyPayment().formatMoney(2, '.', ',')">-</span></td>
  </tr>
  <tr>
    <td>Enganche</td>
    <td><span data-bind="text: downPayment().formatMoney(2, '.', ',')">-</span></td>
  </tr>
  <tr>
    <td>Gastos notariales</td>
    <td><span data-bind="text: notaryExpenses().formatMoney(2, '.', ',')">-</span></td>
  </tr>
  <tr>
    <td>Desembolso inicial</td>
    <td><span data-bind="text: initialPayment().formatMoney(2, '.', ',')">-</span></td>
  </tr>
  <tr>
    <td></td>
    <td>
      <button data-bind="click: calcByIncome">Calcular</button>
    </td>
  </tr>
</table>
<br/>
<br/>
<br/>
<table>
  <tr>
    <th style="width: 200px;"></th>
    <th></th>
  </tr>
  <tr>
    <td>Plazo</td>
    <td>
      <input type="radio" name="term" value="10" data-bind="checked: term, visible: isVisibleTerm(10)">
      <label data-bind="visible: isVisibleTerm(10)">10 años</label>
      <input type="radio" name="term" value="15" data-bind="checked: term, visible: isVisibleTerm(15)">
      <label data-bind="visible: isVisibleTerm(15)">15 años</label>
      <input type="radio" name="term" value="20" data-bind="checked: term, visible: isVisibleTerm(20)">
      <label...

JavaScript

Number.prototype.formatMoney = function(c, d, t) {
  c = c || 2;
  d = d || '.';
  t = t || ',';
  var n = this,
    c = isNaN(c = Math.abs(c)) ? 2 : c,
    d = d == undefined ? "." : d,
    t = t == undefined ? "," : t,
    s = n < 0 ? "-" : "",
    i = String(parseInt(n = Math.abs(Number(n) || 0).toFixed(c))),
    j = (j = i.length) > 3 ? j % 3 : 0;
  return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
};

var mortgageLoanTerms = {
  "10": {
    "Fixed": {
      "PaymentToIncomeRatio": "0.42221489",
      "PaymentToDisbursementFactor": "0.945013417",
      "PaymentPerThousand": "13.836844",
      "DamageInsurancePerThousand": "0.337600",
      "LoanToValueRatio": "0.9000",
      "InterestRate": "0.10850000",
      "MonthlyInterestRate": "0.00904166666",
      "DamageInsurancePerThousand": "0.337600",
      "LifeInsurancePerThousand": "0.430000",
      "MonthlyFeeFixedAmount": "290.00"
    }
  },
  "15": {
    "Fixed": {
      "PaymentToIncomeRatio": "0.42221489",
      "PaymentToDisbursementFactor": "0.934091562",
      "PaymentPerThousand": "11.410489",
      "DamageInsurancePerThousand": "0.337600",
      "LoanToValueRatio": "0.9000",
      "InterestRate": "0.10960000",
      "MonthlyInterestRate": "0.00913333333",
      "DamageInsurancePerThousand": "0.337600",
      "LifeInsurancePerThousand": "0.430000",
      "MonthlyFeeFixedAmount": "290.00"
    },
    "Graduaed": {
      "PaymentToIncomeRatio": "0.42381121",
      "PaymentToDisbursementFactor": "0.928184188",
      "PaymentPerThousand": "10.405667",
      "DamageInsurancePerThousand": "0.337600",
      "LoanToValueRatio": "0.9000",
      "InterestRate": "0.10960000",
      "MonthlyInterestRate": "0.00913333333",
      "DamageInsurancePerThousand": "0.337600",
      "LifeInsurancePerThousand": "0.430000",
      "MonthlyFeeFixedAmount": "290.00"
    }
  },
  "20": {
    "Fixed": {
      "PaymentToIncomeRatio":...