// JavaScript Document
// copyright and written by Dominique Peladeau
// www.1stop-canadian-mortgage-calculator.com
// 1stop@videotron.ca
function montremess(quel){
	if(quel == 'help') { 
		var message    = 
		"Entrer le Principal, le Taux d'intérêt, l'Amortissement (mois), le Terme (mois) et \n" +
		"le type de Paiement et cliquer sur \"Calculer le paiement\" pour trouver \n" +
		"le paiement périodique.\n\n"+
		"Ou indiquer le paiement périodique que vous désirez effectuer (au bas du formulaire),\n" +
		"et cliquer sur \"Calculer le principal\" pour calculer le montant que vous pouvez emprunter.\n" +
		"Vous pouvez spécifier le taux d'intérêt, l'amortissement, le terme et le type de paiement.\n" +
		"     Exemple...: \n" + 
		"     Avec un paiment de 700 $, un taux d'intérêt de 6 % et un amortissement de 300 mois\n "  +
		"     -- quel est le Principal ?\n " +
		"    Taper 700 dans \"Ou entrer paiement\" (au bas du formulaire), taper 6 dans Taux\n" +
		"     d'intérêt, taper 300 dans Amort. (mois) et cliquer sur \"Calculer le Principal\".\n\n" +
		"     Amort. (mois) représente l'amortissement de l'emprunt (en mois).\n" +
		"     Terme (mois) représente la durée du contrat de l'emprunt (en mois).\n\n" +
		"     L'option « Terme (mois) » peut être utilisée pour calculer l'amortissement après\n" +
		"     x mois. On peut donc savoir ce qui a été payé en intérêts après x mois (Terme: Intérêts),\n" +
		"     la partie du principal qui a été payée après x mois (Terme: principal payé)\n" +
		"     et la balance du principal qui reste à payer après x mois (Terme: balance due).\n\n" +
		" \nMerci.";
		 		
	}
	if(quel == 'about') { 
		var message    = 
				"Calculateur d'hypothèque canadien.\n\n" + 
				"Les taux canadiens sont composés semi-annuellement.\n\n" +
				"Ce calculateur d'hypothèque utilise le JavaScript pour effectuer\n" +
				"ses calculs. Il est possible que vos paiements périodiques soient \n" +
				"différents de ceux affichés ici.\n\n" +
				"Merci.\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;}
		nouvalpos = nouvalpos+" $";
        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);
	}
	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;
}

var _ONE=1;
function Switch(item,OldChar,NewChar)
{
  var _ret="";
  var _flag=0;
  var _item=item.split("");
  for(var i=0;i<_item.length;i++)
  {
    if(!_flag&&_item[i]==OldChar)
	{
	  _item[i]=NewChar;
      _flag=_ONE;
	}
	_ret+=_item[i];
  }
  return(_ret);
}

function travailForm(quel) {                      // au travail!
      
	var nombrepaym = ""+document.CalHypoCanMois.periodepaym.options[document.CalHypoCanMois.periodepaym.selectedIndex].value;
	var termeans  = parseFloat((document.CalHypoCanMois.terme.value)/12);
	var periodesterme   = termeans * parseInt(nombrepaym);
	var anneesamort    = parseFloat((document.CalHypoCanMois.amortiss.value)/12);
	var periodestotales    = anneesamort*parseInt(nombrepaym);
	var valeurprina   = document.CalHypoCanMois.principal.value;
	var calculepaym    = document.CalHypoCanMois.paymperiodique.value;
	
	var temp3 = document.CalHypoCanMois.interest.value;
	temp3 = Switch(temp3,",",".");
	tauxi = parseFloat(temp3);

	// se debarrasser des signes de $ de l'entree

var temp1 = valeurprina;
valeurprina = StripLe(temp1);

var temp2 = calculepaym;
temp2 = Switch(temp2,",",".");
calculepaym = StripLe(temp2);


	var calcmontant   = parseFloat(calculepaym);
	if (calcmontant  != calculepaym && calculepaym > 0 ) {
		document.CalHypoCanMois.paymperiodique.value = " ERREUR ";
		return;
	}
	if ( ( (document.CalHypoCanMois.interest.value == null || document.CalHypoCanMois.interest.value.length == 0) && quel != 'i') ||
        ( (document.CalHypoCanMois.principal.value == null || document.CalHypoCanMois.principal.value.length == 0) && quel != 'p') ) {
        return;
    }
	diffcalc = 99999;
	nouvpaym = 0;
	tauxcalc = 0.09;
	if (quel == "i" && calculepaym > 0 ) {
		while (Math.abs(diffcalc) > 0.1 ) {
			nouvpaym = (parseFloat(valeurprina) * tauxcalc) / ( 1 - ( 1/ Math.pow((1+tauxcalc),periodestotales)));
			diffcalc = (calculepaym - nouvpaym);
			var signe = (diffcalc) / Math.abs(diffcalc)
			tauxcalc =  (0.01 * signe) * ( Math.abs(diffcalc) > 500 ) + (0.0001 * signe) * ( Math.abs(diffcalc) > 20 ) +  (0.00001 * signe) * ( Math.abs(diffcalc) > 10 ) + (0.000001 * signe) * ( Math.abs(diffcalc) > 1 ) +(0.0000001 * signe)  + tauxcalc;
		}
		tauxi =  2 * ( Math.pow((1+tauxcalc),parseInt(nombrepaym)/2) - 1);  
		tauxi = parseInt(tauxi * 1000000)/10000;
	}

    if (isNaN (tauxi))  {                // Retourner chaine entree si non convertible:
		alert("Le taux d'intérêt ("+temp3+") cause une erreur !  \n" +
		"Entrer les données à nouveau s.v.p. ...");
	
		document.CalHypoCanMois.termebalcan.value = 0;
		document.CalHypoCanMois.termeintcan.value = 0;
		document.CalHypoCanMois.paymentcan.value = 0; 
		document.CalHypoCanMois.intemprunttotcan.value  = 0;
		return;
	}
    if (tauxi < 0.3) {
        tauxi = tauxi * 100.0;   
	}

	temp2 = ""+tauxi;
	temp2 = Switch(temp2,".",",");
    document.CalHypoCanMois.interest.value = temp2+" %";	
	

    tauxi = tauxi / 100.0;   

	var intcan = Math.pow((1+tauxi/2),(2/parseInt(nombrepaym))) - 1;  
	var intcandebase = Math.pow((1+tauxi/2),(2/12)) - 1;  
	var intus  = tauxi / parseInt(nombrepaym);
	var intusdebase  = tauxi / 12;
 
	if (quel == "p" && intcan != 0 ) {
		

		calcpaymdebase = calculepaym;
		calcperiodes = parseInt(nombrepaym);

		if ((nombrepaym == '52a' ||nombrepaym == '26a') && intcan != 0 ) {
			var calcpaymdebase = calculepaym * (parseInt(nombrepaym)/13) ;
			var valeurprina  = (calcpaymdebase/intcandebase) * ( 1 - (1/(Math.pow((1+intcandebase),(anneesamort*12))) ) ) ;
			// For US var valeurprina  = (calcpaymdebase/intusdebase) * ( 1 - (1/(Math.pow((1+intusdebase),(anneesamort*12))) ) ) ;
		} else {
			var valeurprina  = (calculepaym/intcan) * ( 1 - (1/(Math.pow((1+intcan),(periodestotales))) ) ) ;
			// For US var valeurprina  = (calculepaym/intus) * ( 1 - (1/(Math.pow((1+intus),(periodestotales))) ) ) ;
		}
		document.CalHypoCanMois.principal.value = Decimales(valeurprina,0);
	} 
	
	if (quel == "p" && intcan == 0 ) {
		var valeurprina  = (calculepaym*periodestotales) ;
		document.CalHypoCanMois.principal.value = Decimales(valeurprina,0);
	} 

	var montantprin   = parseFloat(valeurprina);
	if (montantprin  != valeurprina) {
		document.CalHypoCanMois.principal.value = " ERREUR ";
		document.CalHypoCanMois.paymperiodique.value = " ERREUR ";
		return;
	}

	if (anneesamort < termeans ) {
		alert("L'amortissement ("+anneesamort+") doit être plus grand que le terme ("+termeans+") !\n" +
		"Entrer les données à nouveau s.v.p. ...");
		document.CalHypoCanMois.termebalcan.value = 0;
		document.CalHypoCanMois.termeintcan.value = 0;
		document.CalHypoCanMois.paymentcan.value = 0; 
		document.CalHypoCanMois.intemprunttotcan.value  = 0;
		return;
	}

	if ( intcan == 0 ) {
		var paymbasecana  = montantprin/ (anneesamort * 12) ;
		var paymbaseusa   = paymbasecana;
	} else {
		var paymbasecana  = (montantprin * intcandebase) / ( 1 - ( 1/ Math.pow((1+intcandebase),(anneesamort*12))));
		var paymbaseusa   = (montantprin * intusdebase ) / ( 1 - ( 1/ Math.pow((1+ intusdebase),(anneesamort*12))));
	}		

	var paymcana = paymbasecana;
	var paymusa  = paymbaseusa;

	if ((nombrepaym == '52a' ||nombrepaym == '26a') && intcan != 0 ) {
		var paymcana = paymbasecana / (parseInt(nombrepaym)/13) ;
		var paymusa  = paymbaseusa /  (parseInt(nombrepaym)/13) ;
	} 

	if ((nombrepaym == '52' || nombrepaym == '26'|| nombrepaym == '2'|| nombrepaym == '1' ) && intcan != 0 ) {
		var paymcana = (montantprin * intcan) / ( 1 - ( 1/ Math.pow((1+intcan),periodestotales)));
		var paymusa  = (montantprin * intus ) / ( 1 - ( 1/ Math.pow((1+ intus),periodestotales)));
	} 

	document.CalHypoCanMois.paymperiodique.value = Decimales(paymcana,2);
	// for US document.CalHypoCanMois.paymperiodique.value = Decimales(paymusa,2);
	document.CalHypoCanMois.paymentcan.value = Decimales(paymcana,2); 
	// for US document.CalHypoCanMois.paymentusa.value  = Decimales(paymusa,2); 

	var balcana = valeurprina;
	var balusa  = balcana;
	var intcana = 0;
	var intusa = 0;
	var inttotcana = 0;
	var inttotusa = 0;
	

    for (var jj = 0; jj < periodesterme ; jj++) {
	 	intcana    = intcan * balcana;
		inttotcana = inttotcana + intcana;
		balcana    = balcana - (paymcana - intcana); 

	 	intusa    = intus * balusa
		inttotusa = inttotusa + intusa
		balusa    = balusa - (paymusa - intusa); 
		if (balusa < 0  ) { 
			balusa = 0;
			break;
		}
		if (balcana < 0 ) { 
			balcana = 0 
			break;
		}
	}
	
	if (balusa < 0  ) { balusa = 0 };
	if (balcana < 0 ) { balcana = 0 };

	// For US document.CalHypoCanMois.termebalusa.value   = Decimales(parseInt(balusa),0);
	// For US document.CalHypoCanMois.termeintusa.value   = Decimales(parseInt(inttotusa),0);
	// For US document.CalHypoCanMois.TermePayUsa.value   = Decimales(montantprin-(parseInt(balusa)),0);

	document.CalHypoCanMois.termebalcan.value  = Decimales(parseInt(balcana),0);
	document.CalHypoCanMois.termeintcan.value  = Decimales(parseInt(inttotcana),0);
	document.CalHypoCanMois.TermePayCan.value   = Decimales(montantprin-(parseInt(balcana)),0);	

	var kk = jj;
    for (var jj = periodesterme; jj < periodestotales; jj++) {
	 	intcana    = intcan * balcana;
		inttotcana = inttotcana + intcana;
		balcana    = balcana - (paymcana - intcana); 

	 	intusa    = intus * balusa
		inttotusa = inttotusa + intusa
		balusa    = balusa - (paymusa - intusa); 
		kk = jj;	
		if (balusa < 0  ) { 
			balusa = 0;
			break;
		}
		if (balcana < 0 ) { 
			balcana = 0 
			break;
		}
	}
	vraiterme = Decimales((kk+1)/parseInt(nombrepaym),2);
	if (intcan == 0 ) {
		vraiterme = anneesamort ;
	} else {
		vraiterme = vraiterme.substring(0,vraiterme.length-1);
	}
	
	document.CalHypoCanMois.amortactuellecan.value  = ""+vraiterme+" ans";
	document.CalHypoCanMois.intemprunttotcan.value = Decimales(parseInt(inttotcana),0);
	// For US document.CalHypoCanMois.intemprunttotusa.value  = Decimales(parseInt(inttotusa),0);
	document.CalHypoCanMois.principal.value = Decimales(montantprin,0);
}
