/* CIRSPM
	
	Calculette IMPOTS SUR LE REVENU de Saint-Pierre-et-Miquelon
	REPUBLIQUE FRANCAISE - DIRECTION GENERALE des IMPOTS
	CELLULE DE DEVELOPPEMENT du Centre de Services Informatiques de Rouen
	
	cirspm.js
	Fonctions JavaScript
	v1.44 du 01/02/2011
*/

// Trim pour JavaScript
// Source : http://www.developingskills.com/ =====
function strltrim() {
return this.replace(/^\s+/,'');
}
function strrtrim() {
return this.replace(/\s+$/,'');
}
function strtrim() {
return this.replace(/^\s+/,'').replace(/\s+$/,'');
}
String.prototype.ltrim = strltrim;
String.prototype.rtrim = strrtrim;
String.prototype.trim = strtrim;
// ===============================================

// Bascule les revenus exceptionnels
function  revexc() {
	var divre = document.getElementById("revexc");
	if (Flag_RE == "oui") {
		divre.style.display = "none";
		Flag_RE = "non";
	} else {
		divre.style.display = "block";
		Flag_RE = "oui";
	}
}

// Vérifie qu'un nombre est un entier
// Source : http://www.codetoad.com/javascript/isnumeric.asp

function est_entier(sText) {

	var Valid = "-0123456789";
	var IsN = true;
	var Char;
	
	if (sText.trim().length == 0) { IsN = false }
	else {
		for (i = 0; i < sText.length && IsN == true; i++) {
			Char = sText.charAt(i);
			if (Valid.indexOf(Char) == -1) IsN = false;
		}
	}
	
	return IsN;
}

// ===============================================

// Validation numérique d'une zone
function val(zone) {
	if (!est_entier(zone.value)) {
		zone.value = 0;
	} else {
		zone.value = parseInt(zone.value);
	}
}

// Application d'une déduction
function ded(v, taux, lim) {
	var r = 0;
	var s = parseInt(v);
	if (s > 0) {
		r = Math.round(s * taux / 100);
		if ((r < lim) && (lim > 0)) r = lim;
	}
	return r; 
}

// Plafonne un montant
function plaf(montant, maxi, enf, plus) {
	if (!enf) enf = 0;
	if (!plus) plus = 0;
	var v = maxi + Math.floor(enf * plus);
	if (montant > v) var rc = v;
	else var rc = montant;
	return rc;	
}

// Met à zéro si négatif
function zero(v) {
	var rc = v;
	if (v < 0) rc = 0;
	return rc;
}

// Actualise les zones en fonction de la situation de famille
function actualise() {
	
	var sf = document.getElementById("sf");
	var pi = document.getElementById("pi");
	var age = document.getElementById("age");
	var nbpac = document.getElementById("nbpac");
	var pac1 = document.getElementById("pac1");
	var pac2 = document.getElementById("pac2");
	var pac3 = document.getElementById("pac3");
	var pac4 = document.getElementById("pac4");
	var pac5 = document.getElementById("pac5");
	
	var span_pi = document.getElementById("span_pi");
	var span_pac3 = document.getElementById("span_pac3");
	var span_pac4 = document.getElementById("span_pac4");
	var span_pac5 = document.getElementById("span_pac5");
	
	var si = sf.selectedIndex;
	
	if (si > 0) {
		/* Parent isolé */
		pi.disabled = false;
		pi.style.visibility = "visible";
		span_pi.style.visibility = "visible";
		/* Conjoint invalide */
		pac3.checked = false;
		pac3.disabled = true;
		pac3.style.visibility = "hidden";
		span_pac3.style.visibility = "hidden";
		/* Enfants majeurs */
		pac5.disabled = false;
		pac5.style.visibility = "visible";
		span_pac5.style.visibility = "visible";
	} else {
		/* Parent isolé */
		pi.checked = false;
		pi.disabled = true;
		pi.style.visibility = "hidden";
		span_pi.style.visibility = "hidden";
		/* Conjoint invalide */
		pac3.disabled = false;
		pac3.style.visibility = "visible";
		span_pac3.style.visibility = "visible";
		/* Enfants majeurs */
		pac5.checked = false;
		pac5.disabled = true;
		pac5.style.visibility = "hidden";
		span_pac5.style.visibility = "hidden";
	}
	
	if (si == 1) {
		/* Veuf */
		pac4.disabled = false;
		pac4.style.visibility = "visible";
		span_pac4.style.visibility = "visible";
	} else {
		/* Veuf */
		pac4.checked = false;
		pac4.disabled = true;
		pac4.style.visibility = "hidden";
		span_pac4.style.visibility = "hidden";
	}
	
	if (pi.checked || ((si > 0) && (parseInt(nbpac.value) > 0))) {
		/* Enfants majeurs */
		pac5.checked = false;
		pac5.disabled = true;
		pac5.style.visibility = "hidden";
		span_pac5.style.visibility = "hidden";
	}
}

function init() {
	var version = document.getElementById("version");
	version.firstChild.nodeValue = "Calculette IR Saint-Pierre-et-Miquelon - Direction Générale des Impôts - version 1.44 du 01/02/2011";
	actualise();
}

// CONSTANTES
var PLF_MF		= 15000;	// Plafond recettes micro-foncier
var TX_MF		= 60;		// Taux déduction micro-foncier
var PLF_MBIC	= 38000;	// Plafond recettes micro-BIC
var TX_MBIC		= 60;		// Taux déduction micro-BIC
var PLF_MBNC	= 38000;	// Plafond recettes micro-BNC
var TX_MBNC		= 35;		// Taux déduction micro-BNC
var TX_TS1		= 10;		// Pourcentage déduction (salaires)
var MINI_TS1 	= 450;		// Minimum applicable (salaires)
var TX_TS2		= 20;		// Taux de l'abattement (salaires)
var TX_PS1		= 10;		// Pourcentage déduction (pensions)
var MINI_PS1 	= 450;		// Minimum applicable (pensions)
var MAXI_PS1 	= 2750;		// Maximum pour le foyer (pensions)
var TX_PS2		= 20;		// Taux de l'abattement (pensions)
var TX_PLV		= 15;		// Taux sur les plus-values
var ABAT_CELIB	= 350;		// Abattement célibataire
var ABAT_AGES	= 400;		// Abattement personnes âgées ou invalides >= 80 %
var ABAT_RCM_TX = 50;		// Taux abattement RCM distribués
var ABAT_RCM_1	= 1250;		// Abattement RCM personne seule
var ABAT_RCM_2	= 2500;		// Abattement RCM couple
var ABAT_A74BIS	= 500;		// Abattement sur les intérêts perçus au titre de l'art. 74bis §1 (célib.)
var ABAT_A74B_2 = 1000;		// Abattement sur les intérêts perçus au titre de l'art. 74bis §1 (couple)
var TAUX_A74BIS = 15;		// Taux maxi pour l'art. 74bis §1
var DEMI_PART	= 750;		// Limitation de la réduction d'impôt procurée par la 1/2 part
var QUART_PART	= 375;		// Limitation de la réduction d'impôt procurée par la 1/4 part (garde alt.)
var MAX_REVENU	= 11000;	// Revenu global maximal pour bénéficier de l'abattement personnes âgées
var MIN_RECOUV	= 68;		// Minimum recouvrable
// Charges
var CHG_J11		= 4000;		// Plafond intérêts des emprunts
var CHG_J12		= 400;		// Majoration par enfant à charge
var CHG_J21		= 5500;		// Plafond frais de main d'oeuvre
var CHG_J22		= 25;		// Taux retenu frais de main d'oeuvre
var CHG_J31		= 950;		// Plafond dépenses d'isolation
var CHG_J32		= 190;		// Majoration par enfant à charge
var CHG_K1		= 4200;		// Plafond pension à enfants majeurs
var CHG_K		= 865;		// Limitation du gain d'impôt des pensions
var CHG_M		= 1;		// Taux retenu pour les dons
var CHG_N1		= 840;		// Plafond mutuelle personne seule
var CHG_N2		= 1600;		// Plafond couple
var CHG_N3		= 22;		// Majoration par enfant à charge
var CHG_P1		= 1400;		// Plafond assurance décès
var CHG_P2		= 260;		// Majoration par enfant à charge
// Réductions
var RED_A		= 300;		// Ancien combattant
var RED_B1		= 50;		// Taux frais de garde
var RED_B2		= 4600;		// Plafond frais de garde
var RED_C1		= 15;		// Taux pensions ascendants
var RED_C2		= 15;		// Plafond au taux du RNI
var RED_K1		= 8200;		// Plafond oblig. alimentaire pers.seule
var RED_K2		= 11500;	// Plafond oblig. alimentaire couple
var RED_D1		= 25;		// Taux assurance-vie
var RED_D2		= 170;		// Plafond personne seule
var RED_D3		= 340;		// Plafond couple
var RED_D4		= 45;		// Majoration par enfant à charge
var RED_E1		= 66;		// Taux cotisations syndicales
var RED_E2		= 1;		// Limitation au RBI
var RED_F1		= 50;		// Taux emploi d'un salarié à domicile
var RED_F2		= 4600;		// Plafond
var RED_H		= 650;		// Plafond frais adhésion CGA
var RED_I1		= 20;		// Pourcentage des sommes versées
var RED_I2		= 50;		// Taux sur souscription à capital
var RED_J1		= 25;		// Taux épargne retraite
var RED_J2		= 500;		// Plafond personne seule
var RED_J3		= 1000;		// Plafond couple
var RED_J4		= 250;		// Part suppl.
// Tranches d'imposition
var NB_TRANCHES	= 11;
var TRANCHES	= [7320, 7870, 9610, 11050, 14290, 18040, 21630, 25300, 39640, 54520, 69160];
var BASES_FIXES = [0, 366.0, 759.5, 1240.0, 1792.5, 2507.0, 3409.0, 4490.5, 5755.5, 7737.5, 10463.5, 13921.5];

// Global
var TAUX_MARGINAL = 0;
var Flag_RE = "non";		// Affichage des revenus exceptionnels
var Ded_Pens = 0;			// Montant des déductions de pension consommé
var Rvr_Pens = 0;			// Somme des revenus désactivant l'abattement sur les pensions

// Application du barème
function impot(qf, rni, n, tm) {
	var i = 0;
	while ((qf > TRANCHES[i]) && (i < NB_TRANCHES))	i++;
	var rc = (rni * 0.05 * i) - (BASES_FIXES[i] * n);
	if (tm == 1) TAUX_MARGINAL = 5 * i;
	// alert(rni + ' ' + i + ' ' + BASES_FIXES[i] + ' ' + n);
	return rc;
}

// Application du barème avec ses limitations
function impot_effectif(qf, rni, nb, tm, celib, pa, palim, ha) {
	var i = Math.round(impot(qf, rni, nb, tm));
	/* limitation du gain en impôt des pensions alimentaires */
	if (pa > 0) {
		var qf2 = Math.round(((rni + pa) / nb) * 100) / 100;
		var ipa = Math.round(impot_effectif(qf2, rni + pa, nb, 0, celib, 0, 0, ha));
		var dif = ipa - i;
		if (dif > palim) i = ipa - palim;
	}
	/* Atténuation de l'impact de la demi-part supplémentaire */
	if (celib > 0) {
		var qf2 = Math.round((rni / (nb - celib)) * 100) / 100;
		j = Math.round(impot_effectif(qf2, rni, (nb - celib), 0, 0, pa, palim, ha));
		if (celib > 0.25) {
			if ((j - i) > DEMI_PART) i = j - DEMI_PART;
		} else {
			if ((j - i) > QUART_PART) i = j - QUART_PART;
		}
	}
	// Revenus Hors Archipel
	var rni_base = parseInt(document.getElementById("RNI").value);
	if ((ha > 0) && (rni > 0)) i = Math.round((i / rni_base) * (rni_base - ha));
	return i;
}

// Revenus exceptionnels ou différés
function revex(rex, rexs, quotient, rni_interm, simple, nb, dps, t, lim, ha) {
	var rvx = parseInt(rex.value);
	if (rvx > 0) {
		var sel = rexs.selectedIndex;
		if (sel == 0) {
			/* Salaire */
			var d1 = plaf(ded(rvx, TX_TS1, MINI_TS1), rvx);
			rvx -= d1;
			var d2 = ded(rvx, TX_TS2, 0);
			var rn = zero(rvx - d2);
		} else {
			/* Pension */
			if (Rvr_Pens <= 0) {
				var d1 = plaf(ded(rvx, TX_PS1, MINI_PS1), rvx);
				var reste = MAXI_PS1 - Ded_Pens;
				if (d1 > reste) d1 = reste;
				Ded_Pens += d1;
				rvx -= d1;
			}
			var d2 = ded(rvx, TX_PS2, 0);
			var rn = zero(rvx - d2);
		}
		var rnire = Math.floor((rni_interm + Math.round(rn / quotient)) / 10) * 10;
		var reimp = impot_effectif(Math.round((rnire / nb) * 100 / 100), rnire, nb, 0, dps, t, lim, ha);
		var diff = reimp - simple;
		reimp = diff * quotient;
		return reimp;
	} else return 0;
}

// Calcul de l'impôt
function calcul() {

	/* Zones de données */
	
	var T1a = document.getElementById("T1a");
	var T1b = document.getElementById("T1b");
	var T1c = document.getElementById("T1c");
	var abatrcm = document.getElementById("abatrcm");
	var T1 = document.getElementById("T1");
	var a74bis = document.getElementById("a74bis");
	var mf = document.getElementById("mf");
	var mfded = document.getElementById("mfded");
	var rf = document.getElementById("rf");
	var T2 = document.getElementById("T2");
	var TH = document.getElementById("TH");
	var mbic = document.getElementById("mbic");
	var mbicded = document.getElementById("mbicded");
	var mbnc = document.getElementById("mbnc");
	var mbncded = document.getElementById("mbncded");
	var breel = document.getElementById("breel");
	var T3 = document.getElementById("T3");
	var T4 = document.getElementById("T4");
	var T5 = document.getElementById("T5");
	var T6 = document.getElementById("T6");
	var T7 = document.getElementById("T7");
	var T8 = document.getElementById("T8");
	var T9 = document.getElementById("T9");
	var i1 = document.getElementById("i1");
	var i2 = document.getElementById("i2");
	var i3 = document.getElementById("i3");
	var T10 = document.getElementById("T10");
	var T11 = document.getElementById("T11");
	var T12 = document.getElementById("T12");
	
	var RNI = document.getElementById("RNI");
	var N = document.getElementById("N");
	var QF = document.getElementById("QF");
	var DU = document.getElementById("DU");
	
	var tsav = document.getElementById("tsav");
	var tsac= document.getElementById("tsac");
	var tsap = document.getElementById("tsap");
	var tsbv = document.getElementById("tsbv");
	var tsbc= document.getElementById("tsbc");
	var tsbp = document.getElementById("tsbp");
	var tsrv = document.getElementById("tsrv");
	var tsrc= document.getElementById("tsrc");
	var tsrp = document.getElementById("tsrp");
	var tscv = document.getElementById("tscv");
	var tscc= document.getElementById("tscc");
	var tscp = document.getElementById("tscp");
	var tstv = document.getElementById("tstv");
	var tstc= document.getElementById("tstc");
	var tstp = document.getElementById("tstp");
	
	var pgv = document.getElementById("pgv");
	var pgc= document.getElementById("pgc");
	var pgp = document.getElementById("pgp");
	var phv = document.getElementById("phv");
	var phc= document.getElementById("phc");
	var php = document.getElementById("php");
	var piv = document.getElementById("piv");
	var pic= document.getElementById("pic");
	var pip = document.getElementById("pip");
	var ptv = document.getElementById("ptv");
	var ptc= document.getElementById("ptc");
	var ptp = document.getElementById("ptp");
	
	var rvv = document.getElementById("rvv");
	var rvc= document.getElementById("rvc");
	var rvp = document.getElementById("rvp");

	var chgj1 = document.getElementById("chgj1");
	var chgj2 = document.getElementById("chgj2");
	var chgj3 = document.getElementById("chgj3");
	var chgk1 = document.getElementById("chgk1");
	var chgk2 = document.getElementById("chgk2");
	var chgk3 = document.getElementById("chgk3");
	var chgl = document.getElementById("chgl");
	var chgm = document.getElementById("chgm");
	var chgn = document.getElementById("chgn");
	var chgo = document.getElementById("chgo");
	var chgp = document.getElementById("chgp");
	
	var retj = document.getElementById("retj");
	var retk = document.getElementById("retk");
	var retl = document.getElementById("retl");
	var retm = document.getElementById("retm");
	var retn = document.getElementById("retn");
	var reto = document.getElementById("reto");
	var retp = document.getElementById("retp");
	
	var sf = document.getElementById("sf");
	var pi = document.getElementById("pi");
	var age = document.getElementById("age");
	var nbpac = document.getElementById("nbpac");
	var pac1 = document.getElementById("pac1");
	var pac2 = document.getElementById("pac2");
	var pac3 = document.getElementById("pac3");
	var pac4 = document.getElementById("pac4");
	var pac5 = document.getElementById("pac5");
	var ga1 = document.getElementById("ga1");
	var ga2 = document.getElementById("ga2");
	
	var ria = document.getElementById("ria");
	var rib = document.getElementById("rib");
	var ric = document.getElementById("ric");
	var rik = document.getElementById("rik");
	var rid = document.getElementById("rid");
	var rie1 = document.getElementById("rie1");
	var rie2 = document.getElementById("rie2");
	var rie3 = document.getElementById("rie3");
	var rif = document.getElementById("rif");
	var rig = document.getElementById("rig");
	var rih = document.getElementById("rih");
	var rii = document.getElementById("rii");
	var rij = document.getElementById("rij");
	
	var rreta = document.getElementById("rreta");
	var rretb = document.getElementById("rretb");
	var rretc = document.getElementById("rretc");
	var rretk = document.getElementById("rretk");
	var rretd = document.getElementById("rretd");
	var rrete = document.getElementById("rrete");
	var rretf = document.getElementById("rretf");
	var rretg = document.getElementById("rretg");
	var rreth = document.getElementById("rreth");
	var rreti = document.getElementById("rreti");
	var rretj = document.getElementById("rretj");
	
	var plv = document.getElementById("plv");

	var minirec_info = document.getElementById("minirec");

	var rex41 = document.getElementById("rex41");
	var rex41s = document.getElementById("rex41s");
	var rex42 = document.getElementById("rex42");
	var rex42s = document.getElementById("rex42s");
	var rex43 = document.getElementById("rex43");
	var rex43s = document.getElementById("rex43s");
	var rex31 = document.getElementById("rex31");
	var rex31s = document.getElementById("rex31s");
	var rex32 = document.getElementById("rex32");
	var rex32s = document.getElementById("rex32s");
	var rex33 = document.getElementById("rex33");
	var rex33s = document.getElementById("rex33s");
	var rex21 = document.getElementById("rex21");
	var rex21s = document.getElementById("rex21s");
	var rex22 = document.getElementById("rex22");
	var rex22s = document.getElementById("rex22s");
	var rex23 = document.getElementById("rex23");
	var rex23s = document.getElementById("rex23s");
	var rex11 = document.getElementById("rex11");
	var rex11s = document.getElementById("rex11s");
	var rex12 = document.getElementById("rex12");
	var rex12s = document.getElementById("rex12s");
	var rex13 = document.getElementById("rex13");
	var rex13s = document.getElementById("rex13s");
	
	/* Validation des zones */
	
	val(T1a);
	val(T1b);
	val(T1c);
	val(a74bis);
	val(mf);
	val(rf);
	val(TH);
	val(mbic);
	val(mbnc);
	val(breel);
	
	val(tsav);
	val(tsac);
	val(tsap);
	val(tsrv);
	val(tsrc);
	val(tsrp);

	val(pgv);
	val(pgc);
	val(pgp);
	
	val(rvv);
	val(rvc);
	val(rvp);
	
	val(chgj1);
	val(chgj2);
	val(chgj3);
	val(chgk1);
	val(chgk2);
	val(chgk3);
	val(chgl);
	val(chgm);
	val(chgn);
	val(chgo);
	val(chgp);
	
	val(nbpac);
	val(pac1);
	val(ga1);
	val(ga2);
	
	val(rib);
	val(ric);
	val(rik);
	val(rid);
	val(rie1);
	val(rie2);
	val(rie3);
	val(rif);
	val(rig);
	val(rih);
	val(rii);
	val(rij);

	val(rex41);
	val(rex42);
	val(rex43);
	val(rex31);
	val(rex32);
	val(rex33);
	val(rex21);
	val(rex22);
	val(rex23);
	val(rex11);
	val(rex12);
	val(rex13);
	
	val(plv);
	
	/* ------------- */
	/* Vérifications */
	/* ------------- */
	
	if (parseInt(nbpac.value) < parseInt(pac1.value)) {
		alert("Le nombre de personnes à charges doit être\nsupérieur au nombre de personnes invalides.");
		pac1.focus();
		return false;
	}
	
	if (parseInt(ga1.value) < parseInt(ga2.value)) {
		alert("Le nombre d'enfants en garde alternée\ndoit être supérieur au nombre d'enfants\nen garde alternée invalides.");
		ga2.focus();
		return false;
	}
	
	if (mf.value > PLF_MF) {
		var msg = "Montant remis à zéro";
		if (rf.value == 0) {
			rf.value = mf.value;
			msg = "Montant déplacé dans le régime normal des revenus fonciers."
		}
		mf.value = 0;
		alert("Pour bénéficier du régime micro-foncier,\nles recettes ne doivent pas dépasser 15 000 €.\n" + msg);
	}
	
	if (mbic.value > PLF_MBIC) {
		var msg = "Montant remis à zéro";
		if (breel.value == 0) {
			breel.value = mbic.value;
			msg = "Montant déplacé dans le régime réel des revenus non salariés."
		}
		mbic.value = 0;
		alert("Pour bénéficier du régime micro-BIC,\nles bénéfices ne doivent pas dépasser 38 000 €.\n" + msg);
	}

	if (mbnc.value > PLF_MBNC) {
		var msg = "Montant remis à zéro";
		if (breel.value == 0) {
			breel.value = mbnc.value;
			msg = "Montant déplacé dans le régime réel des revenus non salariés."
		}
		mbnc.value = 0;
		alert("Pour bénéficier du régime micro-BNC,\nles bénéfices ne doivent pas dépasser 38 000 €.\n" + msg);
	}

	/* ------- */
	/* Calculs */
	/* ------- */
	
	/* Nombre de parts */
	
	var nb = 0.0;
	var dps = 0;	// Demi-part supplémentaire personnes seules avec enfant à charge
	if ((sf.selectedIndex == 0) || ((sf.selectedIndex == 1) && (pac4.checked))) {
		nb += 2.0;
	} else {
		nb += 1.0;
		if ((pi.checked) && (parseInt(nbpac.value) > 0)) {
			nb += 0.5;
			dps = 0.5;
		} else {
			if ((pi.checked) && (parseInt(ga1.value) > 0)) {
				nb += 0.25;
				dps = 0.25;
			}
		}
	}
	nb += (parseInt(nbpac.value) * 0.5);
	nb += (parseInt(pac1.value) * 0.5);
	if (pac2.checked) nb += 0.5;
	if (pac3.checked) nb += 0.5;
	if (pac5.checked) nb += 0.5;
	nb += (parseInt(ga1.value) * 0.25);
	nb += (parseInt(ga2.value) * 0.25);
	
	N.value = String(nb).replace("\.", ",");

	/* RCM */
	abatrcm.value = Math.round(parseInt(T1b.value) * ABAT_RCM_TX / 100, 0);
	if (sf.selectedIndex == 0) abatrcm.value = parseInt(abatrcm.value) + ABAT_RCM_2;
	else abatrcm.value = parseInt(abatrcm.value) + ABAT_RCM_1;
	T1.value = zero(parseInt(T1a.value) + parseInt(T1b.value));
	if (parseInt(T1.value) < parseInt(abatrcm.value)) abatrcm.value = parseInt(T1.value);
	T1.value = (parseInt(T1.value) + parseInt(T1c.value) - parseInt(abatrcm.value));

	/* Revenus fonciers */
	if (parseInt(mf.value) > 0) {
		mfded.value = ded(mf.value, TX_MF, 0);
		T2.value = parseInt(rf.value) + parseInt(mf.value) - parseInt(mfded.value);
	} else {
		mfded.value = 0;
		T2.value = rf.value;
	}
	
	/* Bénéfices */
	if (parseInt(mbic.value) > 0) {
		mbicded.value = ded(mbic.value, TX_MBIC, 0);
	} else {
		mbicded.value = 0;
	}
	if (parseInt(mbnc.value) > 0) {
		mbncded.value = ded(mbnc.value, TX_MBNC, 0);
	} else {
		mbncded.value = 0;
	}
	T3.value = parseInt(breel.value)
		+ parseInt(mbic.value) - parseInt(mbicded.value)
		+ parseInt(mbnc.value) - parseInt(mbncded.value);
	
	/* Traitements et salaires */
	
	tsbv.value = plaf(ded(tsav.value, TX_TS1, MINI_TS1), parseInt(tsav.value));
	tsbc.value = plaf(ded(tsac.value, TX_TS1, MINI_TS1), parseInt(tsac.value));
	tsbp.value = plaf(ded(tsap.value, TX_TS1, MINI_TS1), parseInt(tsap.value));
	if (parseInt(tsrv.value) > parseInt(tsbv.value)) var bv = parseInt(tsrv.value);
	else var bv = parseInt(tsbv.value);
	if (parseInt(tsrc.value) > parseInt(tsbc.value)) var bc = parseInt(tsrc.value);
	else var bc = parseInt(tsbc.value);
	if (parseInt(tsrp.value) > parseInt(tsbp.value)) var bp = parseInt(tsrp.value);
	else var bp = parseInt(tsbp.value);
	
	tscv.value = ded(parseInt(tsav.value) - bv, TX_TS2, 0);
	tscc.value = ded(parseInt(tsac.value) - bc, TX_TS2, 0);
	tscp.value = ded(parseInt(tsap.value) - bp, TX_TS2, 0);
	
	tstv.value = zero(parseInt(tsav.value) - bv - parseInt(tscv.value));
	tstc.value = zero(parseInt(tsac.value) - bc - parseInt(tscc.value));
	tstp.value = zero(parseInt(tsap.value) - bp - parseInt(tscp.value));
	
	T4.value = parseInt(tstv.value) + parseInt(tstc.value) + parseInt(tstp.value);
	
	/* Pensions */
	
	phv.value = 0;
	phc.value = 0;
	php.value = 0;
	
	/* Le premier abattement sur les pensions est invalidé
	   si présence de salaires, revenus HA ou fonciers ou non salariés */
	Rvr_Pens = parseInt(mf.value) + parseInt(rf.value)
		+ parseInt(TH.value) + parseInt(T3.value)
		+ parseInt(tsav.value) + parseInt(tsac.value) + parseInt(tsap.value);
	if (Rvr_Pens <= 0) {
		phv.value = plaf(ded(pgv.value, TX_PS1, MINI_PS1), parseInt(pgv.value));
		phc.value = plaf(ded(pgc.value, TX_PS1, MINI_PS1), parseInt(pgc.value));
		php.value = plaf(ded(pgp.value, TX_PS1, MINI_PS1), parseInt(pgp.value));
		
		if ((parseInt(phv.value) + parseInt(phc.value) + parseInt(php.value)) > MAXI_PS1) {
			var s = Math.round(parseInt(pgv.value) + parseInt(pgc.value) + parseInt(pgp.value));
			phv.value = Math.round(parseInt(pgv.value) * MAXI_PS1 / s);
			phc.value = Math.round(parseInt(pgc.value) * MAXI_PS1 / s);
			php.value = Math.round(parseInt(pgp.value) * MAXI_PS1 / s);
		}
		Ded_Pens = parseInt(phv.value) + parseInt(phc.value) + parseInt(php.value);
	}
	
	piv.value = ded(parseInt(pgv.value) - parseInt(phv.value), TX_PS2, 0);
	pic.value = ded(parseInt(pgc.value) - parseInt(phc.value), TX_PS2, 0);
	pip.value = ded(parseInt(pgp.value) - parseInt(php.value), TX_PS2, 0);
	
	ptv.value = parseInt(pgv.value) - parseInt(phv.value) - parseInt(piv.value);
	ptc.value = parseInt(pgc.value) - parseInt(phc.value) - parseInt(pic.value);
	ptp.value = parseInt(pgp.value) - parseInt(php.value) - parseInt(pip.value);
	
	T5.value = parseInt(ptv.value) + parseInt(ptc.value) + parseInt(ptp.value);
	
	/* Rentes */
	
	T6.value = parseInt(rvv.value) + parseInt(rvc.value) + parseInt(rvp.value);
	
	/* RBI */
	
	T7.value = parseInt(T1.value) + parseInt(T2.value) + parseInt(T3.value)
		+ parseInt(T4.value) + parseInt(T5.value) + parseInt(T6.value);
		
	/* Abattements */
		
	T9.value = 0;
	var revbrut = parseInt(T1.value) + parseInt(T2.value) + parseInt(TH.value) + parseInt(T3.value)
		+ parseInt(tsav.value) + parseInt(tsac.value) + parseInt(tsap.value)
		+ parseInt(pgv.value) + parseInt(pgc.value) + parseInt(pgp.value)
		+ parseInt(rvv.value) + parseInt(rvc.value) + parseInt(rvp.value);
	if (N.value == 1) T9.value = ABAT_CELIB;
	if ((age.checked) && (revbrut <= MAX_REVENU)) T9.value = parseInt(T9.value) + ABAT_AGES;
	
	/* ===== Charges déductibles ===== */
	
	var neac = parseInt(nbpac.value) + (parseInt(ga1.value) / 2);	// Nombre d'enfants à charge
	
	/* Dépenses afférentes à l'habitation principale */
	
	var t = plaf(parseInt(chgj1.value), CHG_J11, neac, CHG_J12);
	t += plaf(Math.round(parseInt(chgj2.value) * CHG_J22 / 100.0), CHG_J21);
	t += plaf(parseInt(chgj3.value), CHG_J31, neac, CHG_J32);
	retj.value = t;
	
	/* Pensions alimentaires */
	
	t = plaf(parseInt(chgk1.value), parseInt(chgk2.value) * CHG_K1);
	retk.value = t + parseInt(chgk3.value);
		
	/* Autres charges */
	
	retl.value = parseInt(chgl.value);
	if (sf.selectedIndex == 0) t = CHG_N2;
	else t = CHG_N1;
	retn.value = plaf(parseInt(chgn.value), t, neac, CHG_N3);
	reto.value = parseInt(chgo.value);
	retp.value = plaf(parseInt(chgp.value), CHG_P1, neac, CHG_P2);
	
	t = parseInt(retj.value) + parseInt(retk.value) + parseInt(retl.value)
		+ parseInt(retn.value) + parseInt(retp.value);
	
	retm.value = zero(plaf(parseInt(chgm.value),
		Math.round((parseInt(T7.value) - t - parseInt(T9.value)) * CHG_M / 100.0)));
	
	T8.value = t + parseInt(retm.value) + parseInt(reto.value);
	
	/* ===== RNI ===== */

	var rni_interm = zero(parseInt(T7.value) - parseInt(T8.value) - parseInt(T9.value));
	RNI.value = Math.floor((rni_interm / 10) * 10);
	
	/* Calcul de l'impôt */

	/* Revenus Hors Archipel */
	ha = parseInt(TH.value);
	if (ha > 0) {
		T7.value = parseInt(T7.value) + ha;
		rni_interm += ha;
		RNI.value = Math.floor((rni_interm / 10) * 10);
	}

	var qf = Math.round((parseInt(RNI.value) / nb) * 100) / 100;
	QF.value = String(qf).replace("\.", ",");
	
	t = parseInt(retk.value) - parseInt(chgk3.value)
	var lim = parseInt(chgk2.value) * CHG_K;
	
	var i = Math.round(impot_effectif(qf, parseInt(RNI.value), nb, 1, dps, t, lim, ha));
	var simple = i;
	
	/* Intérêts art.74bis §1 */
	
	var a74 = 0;
	if ((parseInt(a74bis.value) > 0) && (TAUX_MARGINAL > 0)) {
		if (sf.selectedIndex == 0) a74 = parseInt(a74bis.value) - ABAT_A74B_2;
		else a74 = parseInt(a74bis.value) - ABAT_A74BIS;		
		if (a74 < 0) a74 = 0;
		var tm = TAUX_MARGINAL;
		if (tm > TAUX_A74BIS) tm = TAUX_A74BIS;
		a74 = Math.round((a74 * tm) / 100);
	}

	i1.value = i;
	i2.value = a74;
	i += a74;

	/* Revenus exceptionnels ou différés */

	var impre = revex(rex41, rex41s, 4, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex42, rex42s, 4, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex43, rex43s, 4, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex31, rex31s, 3, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex32, rex32s, 3, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex33, rex33s, 3, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex21, rex21s, 2, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex22, rex22s, 2, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex23, rex23s, 2, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex11, rex11s, 4, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex12, rex12s, 4, rni_interm, simple, nb, dps, t , lim, ha);
	impre += revex(rex13, rex13s, 4, rni_interm, simple, nb, dps, t , lim, ha);
	
	i3.value = impre;

	i += impre;
	if ((i != 0) && (i < MIN_RECOUV)) {
		i = 0;
		minirec_info.style.visibility = "visible";
	} else minirec_info.style.visibility = "hidden";
	
	T10.value = i;

	/* Réductions */
	
	if (ria.checked) rreta.value = RED_A;
	else rreta.value = 0;
	var plafB2 = RED_B2;
	if (parseInt(nbpac.value) == 0) {
		if (parseInt(ga1.value) == 0) plafB2 = 0;
		else plafB2 = Math.floor(RED_B2 / 2);
	}
	rretb.value = Math.round(plaf(parseInt(rib.value), plafB2) * RED_B1 / 100);
	rretc.value = Math.round(plaf(parseInt(ric.value),
		Math.round(parseInt(RNI.value) * RED_C2 / 100)) * RED_C1 / 100);
	if (sf.selectedIndex == 0) t = RED_K2;
	else t = RED_K1;
	rretk.value = Math.round(plaf(parseInt(rik.value), t) * RED_C1 / 100);
	if (sf.selectedIndex == 0) t = RED_D3;
	else t = RED_D2;
	rretd.value = plaf(Math.round(parseInt(rid.value) * RED_D1 / 100), t, neac, RED_D4);
	if (parseInt(tsrv.value) > 0) rie1.value = 0;
	if (parseInt(tsrc.value) > 0) rie2.value = 0;
	if (parseInt(tsrp.value) > 0) rie3.value = 0;
	rrete.value = plaf(Math.round((parseInt(rie1.value) + parseInt(rie2.value) + parseInt(rie3.value))
		* RED_E1 / 100), Math.round(parseInt(T7.value) * RED_E2 / 100));
	rretf.value = Math.round(plaf(parseInt(rif.value), RED_F2) * RED_F1 / 100);
	rretg.value = parseInt(rig.value);
	rreth.value = plaf(parseInt(rih.value), RED_H);
	rreti.value = Math.round(Math.round(parseInt(rii.value) * RED_I1 / 100) * RED_I2 / 100);	
	if (sf.selectedIndex == 0) t = RED_J3;
	else t = RED_J2;
	rretj.value = plaf(Math.round(parseInt(rij.value) * RED_J1 / 100), t, neac, RED_J4);
	
	T11.value = parseInt(rreta.value) + parseInt(rretb.value) + parseInt(rretc.value)
		+ parseInt(rretd.value) + parseInt(rrete.value) + parseInt(rretf.value)
		+ parseInt(rretg.value) + parseInt(rreth.value) + parseInt(rreti.value)
		+ parseInt(rretj.value) + parseInt(rretk.value);
	
	T12.value = Math.round(parseInt(plv.value) * TX_PLV / 100);
	
	/* Impôt dû */
	
	var du = zero(parseInt(T10.value) - parseInt(T11.value) + parseInt(T12.value));
	if (du < 0) du = 0;
	
	DU.value = du + " €";
}

