// JavaScript Document
// copyright and written by Dominique Peladeau
// www.1stop-mortgagecalculator.com
// dom@1stop-mortgagecalculator.com
function montremess(quel){
	if(quel == 'help') { 
		var message    = 
		'Input Principal, Amort. (Yrs), Periodic payment and Payment type and \n' +
		'click on \"Calculate Interest Rate\" to calculate the INTEREST.\n\n'+
		' \nThanks for visiting.';
		 		
	}
	if(quel == 'about') { 
		var message    = 
				'This calculator uses javascript to process its calculations,\n' +
				'your actual interest rate might be slightly different than\n' +
				'the results shown here.\n\n' +
				'Thanks for visiting.\n' ;
	}
	alert (message);
}

function Decimales (entree,decim) {
        entree += "";                         // S'assurer que entree est une chaine texte:
        var original_entree = entree;          // Garder l'original de la chaine entree:
        var montant = parseFloat(entree);      // Prendre la valeur flottante:
		var valpos = "";
		var valdec = "";
        if (isNaN (montant))                  // Retourner chaine entree si non convertible:
                return original_entree;
		if (decim == 2) {
	        montant = Math.round (100 * montant);  // Mettre montant en sous, arrondi au sou:
	        var chaine;

	        if (montant < 10) {
	                chaine = "00" + montant;      // Mettre montant en chaine et mettre des zeros si necessaire:
	        } else if (montant < 100) {
	                chaine = "0" + montant;
			} else {
	                chaine = "" + montant;
			}
			valpos = chaine.substring(0,chaine.length - 2);
			valdec = chaine.substring(chaine.length - 2,chaine.length);
    	} else {
			valpos  = "" + Math.round (montant);  // Exprime le montant
		}

		var chiffresavant = "";
		var chiffresmilieu   = "";

		if (valpos.length > 6) {
			chiffresavant = valpos.substring(0,(valpos.length - (parseInt(valpos.length / 3) * 3) ))+",";
		}
		if (valpos.length > 3){
			chiffresmilieu   = valpos.substring(valpos.length - 6,valpos.length - 3)+",";
		}

		chiffresfin   = valpos.substring(valpos.length - 3, valpos.length);

		nouvalpos = "$ "+chiffresavant+chiffresmilieu+chiffresfin;
		if (decim == 2) {nouvalpos = nouvalpos+"."+valdec;}
        return nouvalpos;                      // Retourne la chaine en format monetaire:
}

function StripLe(LeTexte) {
	LeTexte += "";
	var original_LeTexte = LeTexte;
	var LeMontant = parseFloat(LeTexte);
	while (LeTexte.indexOf("$") == 0 || LeTexte.indexOf(" ") == 0) {
		LeTexte = LeTexte.substring(1, LeTexte.length);
	}
	while (LeTexte.indexOf(",") != -1) {
		var LeTexte = ""+LeTexte.substring(0, LeTexte.indexOf(","))+LeTexte.substring(LeTexte.indexOf(",")+1, LeTexte.length);
	}
	while (LeTexte.indexOf(" ") != -1) {
		var LeTexte = ""+LeTexte.substring(0, LeTexte.indexOf(" "))+LeTexte.substring(LeTexte.indexOf(" ")+1, LeTexte.length);
	}
	if (isNaN(LeTexte)) {
		return original_LeTexte;
	}
	return LeTexte;
}

function error(P, I, N, Y, M) {
  var value;
  value = P - M * (1.0 - binomial(I / Y, -N)) / (I / Y);
  return value;
}

function binomial(a, n) {
  var i;
  var sum, prow, term, cof;
  if(n < 0)
    return 1.0 / binomial(a, -n);
  sum = 1.0;
  prow = n;
  term = 1;
  cof = 1.0
  for(i = 1; i < 10; i++) {
    cof = cof * prow / i;
    prow = prow - 1.0;
    term = term * a;
    sum = sum + cof * term;
  }
  return sum;
}


function travailForm() {                      // au travail!

	var valeurprina   = document.calculator.principal.value; // principal
	var temp1 = StripLe(valeurprina);
	if (isNaN(temp1)) {
	document.calculator.principal.value = "Error!!!";
	return;
	}
	valeurprina = temp1;
	
	var LesMois = parseInt(document.calculator.amortiss.options[document.calculator.amortiss.selectedIndex].value)*12; // months
	
	var calculepaym  = document.calculator.paymperiodique.value;
	var temp2 = StripLe(calculepaym);
	if (isNaN(temp2)) {
	document.calculator.paymperiodique.value = "Error!!!";
	return;
	}
	calculepaym = temp2;
	var nombrepaym = parseInt(document.calculator.periodepaym.options[document.calculator.periodepaym.selectedIndex].value);	
	var Mpay = (calculepaym*nombrepaym)/12; // paid per month
var P, I, N, Y, M;
    P = valeurprina;
    N = LesMois;
    Y = 12;
    M = Mpay;
      var low, high, mid, err_mid;
      var count;
      low  = 0.001;
      high = 10.0;
      count = 0;
      while(count < 30) {
        count = count + 1;
        mid = (high + low) / 2.0;
        err_mid = error(P, mid, N, Y, M);
        if(err_mid == 0.0)
          break;
        if(err_mid < 0.0) {
          low = mid;
          continue;
        }
        if(0.0 < err_mid) {
          high = mid;
          continue;
        }
      }
    tauxi = mid;	  
	tauxi = parseInt(tauxi * 1000000)/10000
	if (tauxi <= 0.1) {
    	document.calculator.interest.value = "0";
		alert('Interest rate is to low!  Please re-enter values ...');
		return; 
	}
    document.calculator.interest.value = tauxi+" %";
}