var Calculator = {
	warnMsg:      "Wenn die Anzahl der Kinder %d ist, dann koennen nicht mehr Kinder (%d) ab 2008 geboren sein!\n\nBitte korrigieren Sie die Ihre Angaben.",
	tax:          0,
	childRelief:  0,
	aLump:        920,
	bLump:        36,
	specialCosts: 0,
	div:          1,
	fee:          0,
	xuz:          null,
	oud:          0,
	rad:          0,
	form:         null,

	getValue: function(value) {
		value = value.replace(/,/,".");
		value = parseFloat(value);
		return (isNaN(value) ? 0 : value);
	},

	calcForm: function() {
		this.form = this.getForm('calc-form');

		if (this.form.elements["diviting"].checked) {
			this.div = 2;
		} else {
			this.div = 1;
		}

		x = this.getValue(this.form.elements["fee"].value);
		this.form.elements["fee"].value = x;
		this.form.elements["prozentB"].value = x * 0.04;
		this.fee = parseFloat(this.form.elements["fee"].value);

		childsA = this.form.elements["selectKind"].selectedIndex;
		childsB = this.form.elements["selChild"].selectedIndex;

		if (childsB > childsA) {
			alert(this.sprintf(this.warnMsg, this.form.elements["selectKind"].selectedIndex, this.form.elements["selChild"].selectedIndex));
			this.form.elements["selChild"].value = '0';
			this.form.elements["selChild"].focus();
			return;
		}

		this.childRelief = childsA * 5808;
		bonusB = (154 * this.div + childsA * 185 + childsB * 115);
		ownB   = (this.fee * 0.04 - bonusB);

		if (ownB + bonusB > 2100) {
			ownB = (2100 - bonusB);
		}
		if (ownB < 60) {
			ownB = 60;
		}

		this.form.elements["ownB"].value   = ownB;
		this.form.elements["bonusB"].value = bonusB;

		var x = (this.form.elements["prozentB"].value - bonusB) / 12;
		var n = 2;
		var e = Math.pow(10, n);
		var k = (Math.round(x * e) / e).toString();

		if (k.indexOf('.') == -1) {
			k += '.';
		}

		k += e.toString().substring(1);

		var dueC = k.substring(0, k.indexOf('.') + n + 1);

		if (dueC < 5) {
			dueC = 5;
		}

		this.form.elements["dueC"].value = dueC;
		this.specialCosts                = this.calcProvLump();

		outletB  = ownB + bonusB;
		this.oud = ((this.fee - this.aLump - this.bLump - this.specialCosts - this.childRelief) / this.div);
		tax1     = this.calcTax(this.tax);
		tax1     = ((tax1 + tax1 * 0.055) * this.div);
		this.oud = ((this.fee - this.aLump - this.bLump - this.specialCosts - outletB - this.childRelief) / this.div);
		tax2     = this.calcTax(this.tax);
		tax2     = ((tax2 + tax2 * 0.055) * this.div);
		reliefB  = Math.round(tax1 - tax2 - bonusB);

		if (reliefB <= 0){
			reliefB = 0;
		}

		this.form.elements["reliefB"].value = reliefB;
		this.form.elements["dueA"].value    = Math.round(100 * (bonusB + ownB) / 12) / 100;
		this.form.elements["dueB"].value    = Math.round(100 * (ownB - reliefB) / 12) / 100;
		this.form.elements["quote"].value   = Math.round(100 * (eval(this.form.elements["dueA"].value) - eval(this.form.elements["dueB"].value)) / eval(this.form.elements["dueA"].value));
	},

	calcProvLump: function() {
		this.rad = this.fee;
		var xuz1 = 0.32 * this.rad;
		xuz1     = xuz1 * 0.0995;
		var xuz2 = 0.11 * this.rad;
		var vhb  = 1500 * this.div;

		if (xuz2 > vhb) {
			xuz2 = vhb;
		}

		this.xuz = Math.ceil(xuz1 + xuz2);
		return this.xuz;
	},

	calcTax: function(tax) {
		a = Math.floor(this.oud);
		b = (a - 7664) / 10000;
		c = (a - 12739) / 10000;

		if (a < 7665) {
			tax = 0;
		} else {
			if (a < 12740) {
				tax = (883.74 * b + 1500) * b;
			} else {
				if (a < 52152) {
					tax = ((228.74 * c) + 2397) * c + 989;
				} else {
					if (a < 250001) {
						tax = 0.42 * a - 7914;
					} else {
						tax = 0.45 * a - 15414;
					}
				}
			}
		}

		return tax;
	},

	getForm: function(id) {
		return document.getElementById(id);
	},

	clearForm: function() {
		this.form = this.getForm('calc-form');
		this.form.elements["prozentB"].value = '';
		this.form.elements["ownB"].value     = '';
		this.form.elements["bonusB"].value   = '';
		this.form.elements["reliefB"].value  = '';
		this.form.elements["dueA"].value     = '';
		this.form.elements["dueB"].value     = '';
		this.form.elements["dueC"].value     = '';
		this.form.elements["quote"].value    = '';
		this.calcForm();
	},

	sprintf: function() {
		if (this.sprintf.arguments.length < 2) {
			return '';
		}

		var data = this.sprintf.arguments[0];

		for (var k = 1; k < this.sprintf.arguments.length; ++k) {
			switch(typeof(this.sprintf.arguments[k])) {
				case 'string':
					data = data.replace(/%s/, this.sprintf.arguments[k]);
					break;

				case 'number':
					data = data.replace(/%d/, this.sprintf.arguments[k]);
					break;

				case 'boolean':
					data = data.replace(/%b/, this.sprintf.arguments[k] ? 'true' : 'false');
					break;

				default: // function | object | undefined
				break;
			}
		}

		return(data);
	}
}