  var g_fRateStep = 0.05; // The smallest amount the interest rate can be modified by
  var g_nRateMultiple = 190;
  var g_nTermMultiple = 5;
  var g_strMonthly = 0; // Used by UpdateTotalCost
  var g_fPurchasePrice = 0;
  var strAppName = navigator.appName;

  // Install event handlers...
  window.onload = OnFormLoad;

  function OnFormLoad(event)
      {
      UpdateTargetValue();
      document.financeCalc.downPayment.focus();
      }
  function UpdateTargetValue()
      {
      UpdateMonthly();
      }
  function FormatCurrency(strValue)
      {
      var strDecimalSeparator = '.';
      var strThousandSeparator = ',';
      var nPos = strValue.indexOf('.');
      var nLen = parseInt(strValue, 10).toString().length;

      if (nPos > 0)
          strValue = strValue.substr(0, nPos) + strDecimalSeparator + strValue.substr(nPos + 1, strValue.length - nPos);
      else
          nPos = strValue.length;

      while (nLen > 3)
          {
          nPos -= 3;
          strValue = strValue.substr(0, nPos) + strThousandSeparator + strValue.substr(nPos, strValue.length - nPos + 1);
          nLen -= 3;
          }
      return strValue;
      }
  function UpdateTotalCost()
      {
      var nDownPayment = isNaN(parseInt(document.financeCalc.downPayment.value, 10)) ? 0 : parseInt(document.financeCalc.downPayment.value, 10);
      var nTerm = g_nTermMultiple * 12;
      
      var fMonthlyPayment = parseFloat(g_strMonthly);
      
      var fTotalCost = parseFloat(parseInt(nDownPayment, 10) + (fMonthlyPayment * nTerm));

      fTotalCost = Math.round(fTotalCost);

      document.financeCalc.totalCost.value = FormatCurrency(fTotalCost.toString());
      
      }

  function UpdateInterestPaid()
      {
      var nDownPayment = isNaN(parseInt(document.financeCalc.downPayment.value, 10)) ? 0 : parseInt(document.financeCalc.downPayment.value, 10);
      var nTerm = g_nTermMultiple * 12;
      
      var fMonthlyPayment = parseFloat(g_strMonthly);
      
      var fTotalCost = parseFloat(parseInt(nDownPayment, 10) + (fMonthlyPayment * nTerm));
      
      var nPrice = isNaN(parseInt(document.financeCalc.purchasePrice.value, 10)) ? 0 : parseInt(document.financeCalc.purchasePrice.value, 10);
      
      var fTotalInterest = Math.round(fTotalCost - (nPrice - nDownPayment));
      document.financeCalc.totalInterest.value = FormatCurrency(fTotalInterest.toString());
      
      }

  function UpdatePrice()
      {
      var fRate = g_nRateMultiple * g_fRateStep;
      var nTerm = g_nTermMultiple * 12;
      var nDownPayment = isNaN(parseInt(document.financeCalc.downPayment.value, 10)) ? 0 : parseInt(document.financeCalc.downPayment.value, 10);
      var nPayment = isNaN(parseInt(document.financeCalc.purchasePrice.value, 10)) ? 0 : parseInt(document.financeCalc.purchasePrice.value, 10);
      var fMonthlyRate = (fRate * 0.01) / 12.0;
      var fPower = Math.pow(1.0 + fMonthlyRate, -nTerm);
      var fPrice = parseInt((fMonthlyRate == 0 ? ((nPayment * nTerm) + nDownPayment) :
                                                 ((nPayment * ((1.0 - fPower) / fMonthlyRate)) + nDownPayment)), 10);

      
      g_fPurchasePrice = fPrice;

  
      UpdateMonthly();
      }


  function UpdateMonthly()
	{
      var fRate = g_nRateMultiple * g_fRateStep;
      var nTerm = g_nTermMultiple * 12;
      var nDownPayment = isNaN(parseInt(document.financeCalc.downPayment.value, 10)) ? 0 : parseInt(document.financeCalc.downPayment.value, 10);
      var nPrice = isNaN(parseInt(document.financeCalc.purchasePrice.value, 10)) ? 0 : parseInt(document.financeCalc.purchasePrice.value, 10);

      if (nDownPayment > nPrice)
      {
         nDownPayment = nPrice;
      }
      
      var fMonthlyRate = (fRate * 0.01) / 12.0;
      var fPower = Math.pow(1.0 + fMonthlyRate, -nTerm);
      var fMonthly = (fPower == 1.0 ? (nPrice - nDownPayment) / nTerm : (nPrice - nDownPayment) * (fMonthlyRate / (1.0 - fPower))) ;

      if(fMonthly.toString().substr(0, 1) == '.')
      {
          fMonthly = '0' + fMonthly.toString();
      }
     
      if (strAppName.indexOf("Explorer") > -1  )
      {
         // IE Only Code
         g_strMonthly = parseInt(fMonthly, 10).toString() + (Math.round((fMonthly - parseInt(fMonthly, 10)) * 100) / 100).toString().substr(1, 3);
      }
      else
      {
         // Netscape Only Code
         var strFraction = (Math.round((fMonthly - parseInt(fMonthly, 10)) * 100) / 100).toString();
         if (strFraction == '0') strFraction = '';
         strFraction = strFraction.substr(strFraction.indexOf('.', 0), 3);
         g_strMonthly = parseInt(fMonthly, 10).toString() + strFraction;
      }
    
      if ((g_strMonthly.toString().indexOf('.', 0) > 0) && (g_strMonthly.toString().length - g_strMonthly.toString().indexOf('.', 0) == 2))
          g_strMonthly = g_strMonthly.toString() + '0';
      
      document.financeCalc.monthlyPayment.value = FormatCurrency(g_strMonthly);
         //alert(g_strMonthly);
      UpdateTotalCost();
      UpdateInterestPaid();
      }


  function UpdateRate(bDoUpdate)
      {
      with (document.financeCalc.interestRate)
          {
          var fTemp = options[selectedIndex].value / 0.05;
          
          g_nRateMultiple = fTemp;
          if (g_nRateMultiple - parseInt(fTemp) > 0) 
              g_nRateMultiple = parseInt(g_nRateMultiple) + 1;
          }
      if (bDoUpdate)
          UpdateTargetValue();
      }


  function UpdateTerm(bDoUpdate)
      {
      with (document.financeCalc.loanTerm)
          {
          var fTemp = options[selectedIndex].value / 12;

          g_nTermMultiple = fTemp;
          if (g_nTermMultiple - parseInt(fTemp) > 0) 
              g_nTermMultiple = parseInt(g_nTermMultiple) + 1;
          }
      if (bDoUpdate)
          UpdateTargetValue();
      }


  function ValidKey(nKeyCode, bShift, bCTRL)
      {
      if (nKeyCode != 37 &&                  // Left cursor
          nKeyCode != 39 &&                  // Right cursor
          nKeyCode != 8  &&                  // Backspace
          nKeyCode != 9  &&                  // Tab
          
          nKeyCode != 46 &&                  // Delete
          
          nKeyCode != 16 &&                  // Shift
          nKeyCode != 35 &&                  // End
          nKeyCode != 36 &&                  // Home
          
          (nKeyCode < 96 || nKeyCode > 105) &&  // 0 - 9 on keypad
          
          (nKeyCode < 48 || nKeyCode > 57))  // 0 - 9
          return false;
      else
          return true;
      }


  function Validate()
      {
      
      var nKeyCode = window.event.keyCode;
      var bShift = window.event.shiftKey;
      var bCTRL = window.event.ctrlKey;
      

      if (!ValidKey(nKeyCode, bShift, bCTRL))
          return false;
      else
          return true; 
      }


  function UpdateDownPayment()
      {
      
      var nDownPayment = isNaN(parseInt(document.financeCalc.downPayment.value, 10)) ? 0 : parseInt(document.financeCalc.downPayment.value, 10);
      var nPurchasePrice = parseInt(document.financeCalc.purchasePrice.value, 10);

      UpdateMonthly();
      
      }


  function Update()
      {
      
      var nDownPayment = parseInt(document.financeCalc.downPayment.value, 10);
      var nPurchasePrice = parseInt(document.financeCalc.purchasePrice.value, 10);
     
      UpdateMonthly();
      
      }
