function calculateInterests(rate, start, end, capitalInitial) {
  var rate = getRateFromString(rate);
  var startDate = getDateFromString(start);
  var endDate = getDateFromString(end);
  
  var date = new Date(startDate);
  var iml = 0; // interessi maturati lordi
  var imn = 0; // interessi maturati netti
  var divisor = getYearDaysNumber(date.getFullYear());
  var isQuarter = getIsQuarter(date);
  var mil = 0; // monte interessi lordi
  var min = 0; // monte interessi netti
  var capital = capitalInitial;
  var cml = capital + mil; // capitale maturato lordo
  var cmn = capital + min; // capitale maturato netto
  var ilordi = cml - capitalInitial; // interessi lordi
  var inetti = cmn - capitalInitial; // interessi netti
  var i = 0;

  while(date.setDate(date.getDate() + 1) <= endDate) {
    divisor = getYearDaysNumber(date.getFullYear());
    yesterdayIsQuarter = isQuarter;
    isQuarter = getIsQuarter(date);
    yesterdayMil = mil;
    yesterdayMin = min;

    if (i == 0) {
      iml = capital * rate / divisor; // interessi maturati lordi
      imn = capital * (1 - 0.27) * rate / divisor; // interessi maturati netti
      mil = iml;
      min = imn;
      capital = yesterdayIsQuarter ? capitalInitial + mil : capitalInitial;
    } else {
      capital = yesterdayIsQuarter ? capital + yesterdayMil : capital;
      iml = capital * rate / divisor; // interessi maturati lordi
      imn = capital * (1 - 0.27) * rate / divisor; // interessi maturati netti
      mil = yesterdayIsQuarter ? iml : yesterdayMil + iml; // monte interessi lordi
      min = yesterdayIsQuarter ? imn : yesterdayMin + imn; // monte interessi netti
    }
    cml = capital + mil; // capitale maturato lordo
    cmn = capital + min; // capitale maturato netto
    ilordi = cml - capitalInitial; // interessi lordi
    inetti = cmn - capitalInitial; // interessi netti
    
    i++;
  }

  //ilordi = "euro " + formatCurrency(ilordi);
  //inetti = "euro " + formatCurrency(inetti);
  //cmn = "euro " + formatCurrency(cmn);

	inetti = ilordi - (ilordi * 0.27);
	cmn = "euro " + formatCurrency(capitalInitial + inetti);
  inetti = "euro " + formatCurrency(inetti);
  ilordi = "euro " + formatCurrency(ilordi);
  
  return [ilordi, inetti, cmn];
}

function getRateFromString(rate) {
  var str = rate.replace(/,/, ".").replace(/%/, "");
  var res = parseFloat(str);
  res = res / 100;
  return res;
}

function isValidPercent(str) {
  var rate = getRateFromString(str);
  return !isNaN(rate) && (rate > 0);
}

function getDateFromString(dateStr) {
  var parts = dateStr.split(/[\/\.]+/);
  var result = new Date(parts[2], parts[1] - 1, parts[0]);
  return result;
}

function getYearDaysNumber(year) {
  return (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0)) ? 366 : 365;
}

function getIsQuarter(date) {
  var dateStr = getDateDayMonth(date);
  var quarterDays = new Array(
    "31.03", 
    "30.06",
    "30.09", 
    "31.12"  
  );
  return inArray(dateStr, quarterDays);
}

function getDateDayMonth(date) {
  var day = ("0" + date.getDate()).slice(-2);
  var month = ("0" + (date.getMonth() + 1)).slice(-2);
  return day + "." + month;
}

function inArray(elem, arr) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == elem) {
      return true;
    }
  }
  return false;
}

function roundCents(num) {
  return Math.round(num * 100) / 100;
}

function formatCurrency(num) {
  return digit_grouping(roundCents(num).toString().replace(/\./, ","), true);
}

function currencyToFloat(str) {
  var val = parseFloat(str.replace(/\./g, "").replace(/\,/g, "."));
  if (isNaN(val)) {
    return 0;
  }
  return val;
}

function auto_currency(id, digits){  
    if (digits == undefined) {
      digits = false;
    }
    var variable = document.getElementById(id);  
    var new_value =  variable.value.replace(/\./g,"");  
    variable.value = digit_grouping(new_value, digits);  
}

function digit_grouping(nStr, digits){  
    if (digits == undefined) {
      digits = false;
    }
    nStr += '';  
    x = nStr.split(',');  
    x1 = x[0];  
    x2 = x.length > 1 ? ',' + (x[1] + "00").slice(0, 2) : (digits ? ',00' : '');  
    var rgx = /(\d+)(\d{3})/;  
    while (rgx.test(x1)) {  
        x1 = x1.replace(rgx, '$1' + '.' + '$2');  
    }  
    return x1 + x2;  
}