function getTotalMonths(dateBirthday, insuranceReceivingStartAge, insurancePaymentStart, insurancePaymentStop) {
    if (insurancePaymentStop) {
        datePaymentEnd = insurancePaymentStop;
    } else if ((dateBirthday) && !isNaN(insuranceReceivingStartAge)) {
        dateBirthday = dateBirthday.split('.');
        datePaymentEnd = dateBirthday[0] +'.'+ dateBirthday[1] +'.'+ (parseFloat(dateBirthday[2]) + parseFloat(insuranceReceivingStartAge));
    }

    if (insurancePaymentStart && datePaymentEnd) {
        insurancePaymentStart = insurancePaymentStart.split('.');
        datePaymentEnd = datePaymentEnd.split('.');

        var yPaymentStart = (insurancePaymentStart[2].length == 2)
            ? parseInt('20'+insurancePaymentStart[2])
            : parseInt(insurancePaymentStart[2]);
        var mPaymentStart = parseInt(insurancePaymentStart[1]);

        var yPaymentEnd = (datePaymentEnd[2].length == 2)
            ? parseInt('20'+datePaymentEnd[2])
            : parseInt(datePaymentEnd[2]);
        var	mPaymentEnd = parseInt(datePaymentEnd[1]);

        var months = ((yPaymentEnd - yPaymentStart) * 12) + (mPaymentEnd - mPaymentStart);

        return months;
    }

    return false;
}

function getPaymentInterval(paymentIntervalValue) {
    switch (Utf8.encode(paymentIntervalValue)) {
        case 'monatlich'		: var paymentInterval = 12; break;
        case 'pro Quartal'		: var paymentInterval = 4;	break;
        case 'halbjährlich'		: var paymentInterval = 2;	break;
        case 'jährlich'			: var paymentInterval = 1;	break;
        case 'Einmalbeitrag'    : var paymentInterval = 0;  break;
        default					: var paymentInterval = null; break;
    }

    return paymentInterval;
}

/* TODO - Move this class to other file */
var Utf8 = {

	// public method for url encoding
	encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	},

	// public method for url decoding
	decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}

		return string;
	}

}

function calculateRIY(capitalValue, bidsValue, simContributionPerMonthValue, birthdayValue, insuranceReceivingStartAgeValue, insurancePaymentStartValue, insurancePaymentStopValue, paymentIntervalValue, growthCommentValue)
{
    var total = [];

    var capital = stringToDouble(capitalValue);
    var bids = stringToPerc(bidsValue);
    var valueToPay = stringToDouble(simContributionPerMonthValue) * -1;
    var estimation = (bids / 12) / 100;
    var months = getTotalMonths(birthdayValue,insuranceReceivingStartAgeValue,insurancePaymentStartValue,insurancePaymentStopValue);
    var growComment = growthCommentValue;
    var paymentPerYear = getPaymentInterval(paymentIntervalValue);

    if (paymentPerYear) {
        var valuePerMonth = (valueToPay * paymentPerYear) / 12;

        if (growComment) {
            var numberOfMonths = 0;

            for (var i = 0; i < months; i++) {
                if (numberOfMonths == 12) {
                    numberOfMonths = 0;
                    valuePerMonth = valuePerMonth + (valuePerMonth * parseFloat(growComment) / 100);
                }

                numberOfMonths++;

                total.push(valuePerMonth);
            }

        } else {
            for (var x = 0; x < months; x++) {
                total.push(valueToPay);
            }
        }
    } else {
        total.push(valueToPay);
    }

    total.push(capital);
    
    var irrVal = irr(total, estimation);
    var iruVal = iru(irrVal);
    
    return percToString(Math.round((bids - iruVal) * 100) / 100);
}