﻿//	Copyright 2008 Idexis SARL; droits d'utilisation concédés pour le site ASSUR-TV

//	0 = 2008
//	1 = 2007

var indexFiscalite = 0;

//	CSG CRDS PS
var tauxCSG = 0.082;
var tauxCRDS = 0.005;
var tauxPS = 0.023;
var tauxCSG_CRDS = tauxCSG + tauxCRDS + tauxPS;

//	ISF

/* 2007 */
/*
var auDelaISF = 2420000;
var limitsISF = new Array(0, 760000, 1220000, 2420000, 3800000, 7270000, 15810000);
var ratesISF = new Array(0, 0.55, 0.75, 1, 1.3, 1.65, 1.8);
*/

/* 2008 */
var auDelaISF = 2450000;
var limitsISF = new Array(0, 770000, 1240000, 2450000, 3850000, 7360000, 16020000);
var ratesISF = new Array(0, 0.55, 0.75, 1, 1.3, 1.65, 1.8);

var reductionParEnfant = 150;
var reductionMin = 11660;

//	Succession

/* 2007 */
/*
var abbattement = 150000;
*/
var abbattementSucc = 151950;
var limitsSucc = new Array(0, 7699, 11548, 15195, 526760, 861050, 1722100);
var ratesSucc = new Array(5, 10, 15, 20, 30, 35, 40);

//	IR
var tauxPlusValues = .18;
var donsMax =  new Array(488, 479);

var yearAbatt = new Array(2007, 2006, 2005, 2004, 2003, 2002);

var abatT1rate = .1;
var abatT1Max = new Array(13501, 13328, 13093, 12862, 12648, 12437);
var abatT1Min = new Array(401, 396, 389, 382, 376, 370);

function getT1(value, frais, isFraisReels)
{
	if (value < 0) value = 0;
	var tmp = value;
	var abat = 0;
	if (isFraisReels)
		abat = frais;
	else
	{
		abat = abatT1rate * tmp;
		if (abat > abatT1Max[indexFiscalite]) abat = abatT1Max[indexFiscalite];
	};
	if (abat < abatT1Min[indexFiscalite]) abat = abatT1Min[indexFiscalite];
	tmp -= abat;
	if (tmp < 0) tmp = 0;
	return tmp;
};

var abatT2rate = .1;
var abatT2Max = new Array(3491, 3446);
var abatT2Min = new Array(357, 352);

function getT2(value, adults)
{
	if (value < 0) value = 0;
	var tmp = value;
	var abat = abatT2rate * tmp;
	if (abat > abatT2Max[indexFiscalite]) abat = abatT2Max[indexFiscalite];
	var pensionMin = abatT2Max[indexFiscalite] * adults;
	if (abat < pensionMin ) abat = pensionMin;
	tmp -= abat;
	if (tmp < 0) tmp = 0;
	return tmp;
};

function getTEx(value, adults, abatRate, base)
{
	if (value < 0) value = 0;
	var tmp = value;
	tmp *= 1 - abatRate;
	tmp -= base * adults;
	if (tmp < 0) tmp = 0;
	return tmp;
};

var abatT4 = 4600;

function getT4(value, adults)
{
	return getTEx(value, adults, 0, abatT4);
};

var abatT5 = 1525;
var abatT5rate = .4;

function getT5(value, adults)
{
	return getTEx(value, adults, 0, abatT5);
};

var T8rate = 1.25;

function getT8(value, majorer)
{
	var tmp = value;
	if (majorer) tmp *= T8rate;
	return tmp;
};

//	plafonds micro BIC
var plafondMicroBICGoods = 76300;
var plafondMicroBICServices = 27000;
var plafondMicroBICGoods1 = 84000;
var plafondMicroBICServices1 = 30500;

var abattementMicroBICGoods = .71;
var abattementMicroBICServices = .5;
var abattementMicroBNC = .34;
var abatMicroMin = 305;

function getTEx2(value, abatRate, min)
{
	if (min == undefined) min = 0;
	if (value < 0) value = 0;
	var tmp = value;
	if (tmp > 0)
	{
		var abat = tmp * abatRate;
		if (abat <= min) abat = min;
		tmp -= abat;
		if (tmp < 0) tmp = 0
	};
	return tmp
};

var pensionMaxParEnfant =  new Array(5568, 5495);
var T17rate = 1.25;

function getT17(value, majorer, maxArray)
{
	var tmp = value;
	if (majorer) tmp *= T17rate;
	if (maxArray != undefined)
		if (tmp > maxArray[indexFiscalite]) tmp = maxArray[indexFiscalite];
	return tmp;
};

function abatted2Max(value, abat, max)
{
	tmp = value;
	if (tmp < 0) tmp = 0;
	if (tmp > max) tmp = max;
	return tmp * abat;
};

var plafondDF1 = 12000;
var plafondDF2 = 20000;
var plafondDF3 = 1500;
var plafondDF4 = 15000;

function getPlafondDF(acharge, isInvalid)
{
	var plafond = plafondDF1;
	if (isInvalid)
		plafond = plafondDF2
	else
	{
		plafond += acharge * plafondDF3;
		if (plafond > plafondDF4) plafond = plafondDF4;
	};
	return plafond
};

var plafondGZ1 = 1525;
var plafondGZ2 = 300;
var coeffGZ = .25;

function getGZ(value, acharge)
{
	var plafond = plafondGZ1 + plafondGZ2 * acharge;
	if (value > plafond) value = plafond;
	return coeffGZ * value;
};

var hab_rates1 = new Array(.15, .4, .5);
var plafondHab1 = 8000;	

var hab_rates2 = new Array(.15, .25);
var plafondHab2 = 5000;	

function getPlafond(adults, acharge, base)
{
	var plafond = adults * base;
	if (acharge > 0)
	{
		plafond += 400;
		acharge -= 1;
	};
	if (acharge > 0)
	{
		plafond += 500;
		acharge -= 1;
	};
	while (acharge > 0)
	{
		plafond += 600;
		acharge -= 1;
	};
	return plafond;
};

function invSumItems(valArray, index)
{
	var ret = 0;
	for (var i = valArray.length - 1; i >= index; i--)
		ret += valArray[i];
	return ret;
};

function creditX(values, rates, base, adults, acharge)
{
	//	rates() croissant avec values
	var restePlafond = getPlafond(adults, acharge, base);
	for (var i = values.length - 1; i >= 0; i--)
	{
		if (invSumItems(values, i) > restePlafond)
		{
			values[i] = restePlafond;
			for (var j = i - 1; j >= 0; j--)
				values[j] = 0;
			break;
		}
		else restePlafond -= values[i];
	};
	var temp = 0;
	for (var i = 0; i < values.length; i++)
	{
		temp += values[i] * rates[i];
	};
	return temp;
};

function getPlafondCreditIR(interets, isFirst, isInvalid, adults, acharge)
{
	var plafond = 3750 * adults + 500 * acharge;
	if (isInvalid) plafond *= 2;
	var taux = .2;
	if (isFirst) taux *= 2;
	var creditIR = taux * interets;
	if (creditIR > plafond) creditIR = plafond
	return creditIR
};

//	fiscalité

var csgcrds = "0.11";
var limts = new Array(67546, 25196, 11345, 5688, 0);
var trchs = new Array(0.4, 0.3, 0.14, 0.055, 0);
var fctrs = new Array(12062.83, 5308.23, 1277.03, 312.79, 0);
var lieuRes = new Array();
lieuRes[0] = "Métropole";
lieuRes[1] = "Guyane";
lieuRes[2] = "Autres dom";
var dcs = new Array(0, 0, 0.4, 6700, 0.3, 5100, 2058, 2058, 2058, 10700, 15300, 0, 0.11);
var coeff1 = 3852;
var coeff2 = 2227;
var coeff3 = 855;

function getNbParts(adults, acharge, suppl, isParentIsole)
{
	var temp;
	if (acharge <= 2)
		temp = adults + acharge / 2;
	else
		temp = adults + 1 + (acharge - 2);
    if ((adults == 1) && (isParentIsole)) temp += 0.5;
	return (temp + suppl / 2);
};

function getCorrectedIR(rv, rFoncier, adults, acharge, suppl, rd, localisation, mode, isParentIsole)
{
	var tmp;
	var x, trch1, trch2;
	if (isParentIsole == undefined) isParentIsole = false;
	var nbp = getNbParts(adults, acharge, suppl, isParentIsole);
	var r = rv + rFoncier;
	var csg = 0;
	if (rFoncier > 0) csg = csgcrds * rFoncier;
	var tmp1 = getIR(r, nbp);
	var trch1 = getIR(r, nbp, 0);
	if (acharge + suppl == 0)
		if (mode == 0)
			tmp = trch1;
		else
			tmp = getDomRed(tmp1, localisation);
	else
	{
		var tmp2 = getIR(r, adults);
		var trch2 = getIR(r, adults, 0);
		var n = 2 * (nbp - adults);

		//	cas n°1
		x = 0;
		if ((isParentIsole) && (adults == 1))
		{
			/*
			if (acharge >= 1)
				if (n > 2)
					x = coeff1 * 2 + coeff2 * (n - 2)
				else
					x = coeff1 * n;
			*/
			for (var t = 1; t <= n; t++)
			{
				if (x == 0) x = coeff1;
			};
			for (var t = 3; t <= n; t++)
			{
				x += coeff2;
			};
		}
		else
		{
			if ((acharge == 0) && (suppl != 0) && (adults == 1))
				//	cas n°3
				x = coeff3
			else
				//	cas n°2
				x = coeff2 * n;
		};
		
		tmp2 -= x;
		if (mode == 0)
			if (tmp1 > tmp2)
				tmp = trch1;
			else
				tmp = trch2;
		else
			if (tmp1 > tmp2)
				tmp = getDomRed(tmp1, localisation);
			else
				tmp = getDomRed(tmp2, localisation);
	};
    if (mode != 0)
    {
        tmp -= rd;
        if (tmp < 0) tmp = 0;
        tmp += csg;
	};
    return tmp;
};

function getIR(r, n, mode)
{
	var qf = r / n;
	var mytrch = getIRtrch(qf);
	var myfctr = getIRfctr(qf);
	switch (mode)
	{
		case 0:
			return mytrch;
		case 1:
			return myfctr;
		default:
			return r * mytrch - n * myfctr;
	};
};

function getIRfctr(qf)
{
	if (qf <= 0)
		return 0;
	else
	{
		var i = 0;
		while ((qf <= limts[i]) && (i <= limts.length-1))
			i++;
		return fctrs[i];
	};
};

function getIRtrch(qf)
{
	if (qf <= 0)
		return 0;
	else
	{
		var i = 0;
		while ((qf <= limts[i]) && (i <= limts.length-1))
			i++;
		return trchs[i];
	};
};

function getDomRed(IR, localisation)
{
	var red, txRed, plafondRed;
	
	red = 0;
	switch (localisation)
	{
		case lieuRes[0]:
		{
			txRed = dcs[0];
			plafondRed = dcs[1];
			break;
		};
		case lieuRes[1]:
		{
			txRed = dcs[2];
			plafondRed = dcs[3];
			break;
		};
		case lieuRes[2]:
		{
			txRed = dcs[4];
			plafondRed = dcs[5];
			break;
		};
	};
	if (plafondRed != 0)
	{
		red = txRed * IR;
		if (red > plafondRed) red = plafondRed;
	};
	return (IR - red);
};
