//	1. version du navigateur

var isNewGen = (document.getElementById);
var versionAgent = 0;
var strAgent = 0;
var mIsIe = -1;

function getAgent(st)
{
	strAgent = window.navigator.userAgent;
	var intIndex = strAgent.indexOf(st);
	if (intIndex != -1)
		versionAgent = parseInt(strAgent.substring(intIndex + st.length, intIndex + st.length + 1), 10);
    else
    	versionAgent = 0;
	return (intIndex != -1);
};

function isPPC()
{
	return getAgent("Windows CE");
};

function isIE()
{
	if (mIsIe == -1) mIsIe = getAgent("MSIE ")
	return mIsIe;
};

function isNS()
{
	var tmp1, tmp2;

	tmp2 = isIE();
	tmp1 = getAgent("Netscape/");
	if (!tmp1 && !tmp2) tmp1 = getAgent("Mozilla/");
	return tmp1;
};

//	2. dhtml

function getEl(id, doc)
{
	if (doc == undefined) doc = document;
    if (isNewGen)
		return doc.getElementById(id);
    else
		if (isIE())
		{
			if (versionAgent <= 4)
				return findId(id, doc);
			else
				return doc.all[id];
		}
		else
			return doc.layers[id];
};

function getObj(strObj, isMainForm)
{
	var ret;
	if (isPPC())
	{
		if (isMainForm == undefined) isMainForm = true;
		if (isMainForm)
			ret = eval("mainForm" + "." + strObj);
		else
			ret = eval(strObj);
		if (ret == undefined) ret = eval(strObj);
		return ret;
	}
	else
		return getEl(strObj);
};

//	service

var decSep = ".";

function toInt(v)
{
	if (v == undefined)
		return 0;
	else
		if (v == NaN)
			return 0;
		else
			if (v == "")
				return 0;
			else
				return parseInt(v, 10);
};

function numeric(s)
{
	if ((s == "") || (s == nbsp))
		return 0;
	else
		return parseFloat(s);
};

function format(number, nbDecimals)
{
	var init = nbDecimals;
	var s = number.toString();
	var intIndex = s.indexOf(decSep);
	if (intIndex == -1)
	{
		var tmp = s;
		if (nbDecimals != 0)
			tmp += decSep + stringDup("0", nbDecimals);
		return tmp;
	}
	else
	{
		var temp = "";
		var i = intIndex + 1;
		while ((i <= s.length - 1) && (nbDecimals != 0))
		{
			temp += s.substring(i, i + 1);
			i++;
			nbDecimals --;
		};
		while (nbDecimals > 0)
		{
			temp += "0";
			nbDecimals --;
		};
		var tmp = s.substring(0, intIndex);
		if (init != 0)
			tmp += decSep + temp ;
		return tmp;
	};
};

function stringDup(st, n)
{
	var tmp = "";
	for (var i = 1; i <= n; i++)
		tmp += st;
	return tmp;
};

//	fiscalit?

var limts = new Array(66670, 24873, 11199, 5615, 0);
var trchs = new Array(0.4, 0.3, 0.14, 0.055, 0);
var fctrs = new Array(11908.02, 5240.12, 1260.6, 308.77, 0);

var domtom = new Array();
domtom[0] = "";
domtom[1] = "Caledonie";
domtom[2] = "Polynesie";
domtom[3] = "Autres";

var lieuRes = new Array();
lieuRes[0] = "Metropole";
lieuRes[1] = "Guyane";
lieuRes[2] = "Autres dom";

var csgcrds = "0.11";
var dcs = new Array(0, 0, 0.4, 6700, 0.3, 5100, 1959, 1959, 1959, 10700, 15300, 0, 0.11);

var dr5 = 10700;

var coeff1 = 3803;
var coeff2 = 2198;
var coeff3 = 844;

var idField = "field";

//	calcul imp?t

function plafondDeficitFoncier()
{
	return -dr5;
};

function getAbbat(abatt, r, charges)
{
	var abattMax = 13328;
	var abattMin = 396;
	
	var temp = r * abatt;
	if (abatt == .1)
	{
		if (temp > abattMax) temp = abattMax;
		if (temp < abattMin) temp = abattMin;
	};
	temp = r - temp - charges;
	return temp;
};

function getRFoncier(rv, rFoncier)
{
	if (rFoncier < plafondDeficitFoncier())
    	rFoncier = plafondDeficitFoncier();
	return rv + rFoncier;
};

function getRFoncierPlafonne(rFoncier)
{
	if (rFoncier < plafondDeficitFoncier())
    	rFoncier = plafondDeficitFoncier();
	return rFoncier;
};

function getCorrectedIR(rv, rFoncier, adults, acharge, suppl, rd, localisation, mode, isParentIsole)
{
	var tmp;
	var x, trch1, trch2;
	var nbp = getNbParts(adults, acharge, suppl, isParentIsole);
	if (isParentIsole == undefined) isParentIsole = false;
	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))
		{
			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 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 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);
};

function getCorrectedIR(rv, rFoncier, adults, acharge, suppl, rd, localisation, mode, isParentIsole)
{
	var tmp;
	var x, trch1, trch2;
	var nbp = getNbParts(adults, acharge, suppl, isParentIsole);
	if (isParentIsole == undefined) isParentIsole = false;
	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))
		{
			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 computeIR()
{
	var r = toInt(getObj("SF1" + idField).value);
	var rFoncier = toInt(getObj("SF2" + idField).value);
	var rBic = toInt(getObj("SFX" + idField).value);
		
	var adults = toInt(getObj("SF3" + idField).value);
	var acharge = toInt(getObj("SF4" + idField).value);
	var suppl = toInt(getObj("SF5" + idField).value);
	var temp = getObj("SF6" + idField);
	temp = temp.options[temp.selectedIndex].text;
	var intIndex1 = temp.indexOf("-");
	var intIndex2 = temp.indexOf("%");
	var charges = toInt(getObj("SF7" + idField).value);
	var reductions = toInt(getObj("SF9" + idField).value);

	var abatt = toInt(temp.substring(intIndex1 + 1, intIndex2 + 1)) / 100;
	r = getAbbat(abatt, r, charges);

	var ees = getObj("SFC" + idField).checked;
	var n = getNbParts(adults, acharge, suppl, ees);

	rFoncier = getRFoncierPlafonne(rFoncier);
	getObj("SF8" + idField).innerHTML = toInt(r + rFoncier + rBic);

	locx = getObj("SFF" + idField).value;
	getObj("SFB" + idField).innerHTML = toInt(getCorrectedIR(r, rFoncier + rBic, adults, acharge, suppl, reductions, locx, 1, ees));
	getObj("SFA" + idField).innerHTML = format(100 * getCorrectedIR(r, rFoncier + rBic, adults, acharge, suppl, 0, locx, 0, ees), 2);
};
