var tassolow, tassohigh, tasso_annuo
var iMesi, importo, numRate, rata, loop
var sommaImp, tegcalc, taegcalc, err
var iDurGiorni = [31,28,31,30,31,30,31,31,30,31,30,31]
var iGiorni    = [31,59,90,120,151,181,212,243,273,304,334,365]

function computeForm(form)
{
    if (form.importvalue.value == null || form.importvalue.value == 0 || form.importvalue.value.length == 0){
        alert("Inserire il valore netto dell'importo erogato di mutuo.");
        form.importvalue.focus();
        return(0);
    }       
    if (form.numrates.value == null || form.numrates.value == 0 || form.numrates.value.length == 0){
        alert("Inserire il numero di rate mensili.");
        form.numrates.focus();
        return(0);
    }       
    if (form.imprata.value == null || form.imprata.value == 0 || form.imprata.value.length == 0){
        alert("Inserire l'importo della rata mensile.");
        form.imprata.focus();
        return(0);
    }                             

    if (!checkNumber(form.importvalue, .001, 999999999999, "Importo erogato")){
        form.importvalue.focus();
        return(0);        
    }
    if (!checkNumber(form.numrates, 1, 9999, "Numero rate")){
        form.numrates.focus();
        return(0);        
    }
    if (!checkNumber(form.imprata, .001, 999999999999, "Importo rata")){
        form.imprata.focus();
        return(0);        
    }

    /* TEG interesse semplice */
    importo  = unformat(form.importvalue.value);
    importo  = v2dot(importo);
    numRate  = form.numrates.value;
   	rata     = v2dot(form.imprata.value);
    iMesi    = 1;

    CaricaGiorni(iGiorni, iMesi, numRate);
    tegcalc  = (IteraValue(importo,rata,iGiorni,0,1,0.0001,numRate,1)) * 100;
    taegcalc = (IteraValue(importo,rata,iGiorni,0,1,0.0001,numRate,2)) * 100;
    
    form.importvalue.value = format(importo);
    form.tegcalc.value     = format(tegcalc);
    form.taegcalc.value    = format(taegcalc);
    return(1);
}

function CaricaGiorni(iGiorni, iMesi, entries)
{
   var iConta,iCiclo,iValue,iPos,iAnno,lyr;
   
   iPos  = 0;
   iAnno = 2005
   lyr   = isleapyear(iAnno);
   for(iConta=0;iConta < entries;iConta++){
       iValue = 0;
       for(iCiclo = 0;iCiclo < iMesi;iCiclo++,iPos++){
           if(iPos > 11){ 
               iPos = 0;
           }
           iValue = iValue + iDurGiorni[iPos];
       }
       if((iConta > 0) && (iConta % 12) == 0){
          iAnno++;
          lyr    = isleapyear(iAnno);
          iValue = iValue + lyr;
       }  
       if(iConta > 0){
          iGiorni[iConta] = iValue + iGiorni[iConta-1];
       }else{   
          iGiorni[iConta] = iValue;
       }
   }
}

function isleapyear(year)
{
    var lyr = 0;

    if(year < 100)
        year += 1900;  // se anno = 82 si presume 1982
    else
    if(year < 1000)
        year += 2000;  // se anno = 182 si presume 2182
    if(year == (4*(parseInt((year/4)))) )
        lyr = 1;
    if(year == (100*(parseInt((year/100)))) )
        lyr = 0;
    if(year == (400*(parseInt((year/400)))) )
        lyr = 1;
        
    return(lyr);
}

function IteraValue(fImporto, iRata, iGiorni, iMin, iMax, iPrec, entries, iFlag)
{
    var lfRata;

    if((iMax - iMin) < iPrec){
        SommaRata(iRata,iGiorni,((iMax+iMin)/2.0),entries,iFlag);
        return((iMax + iMin)/2.0);
    }
    lfRata = SommaRata(iRata,iGiorni,((iMax+iMin)/2.0),entries,iFlag);
    if(lfRata > fImporto){
        return(IteraValue(fImporto,iRata,iGiorni,((iMax+iMin)/2.0),iMax,iPrec,entries,iFlag));
    }
    return(IteraValue(fImporto,iRata,iGiorni,iMin,((iMax+iMin)/2.0),iPrec,entries,iFlag));
}

function SommaRata(iRata, iGiorni, iInter, entries, iFlag)
{
   var iConta;
   var fSomma = 0.0;

   for(iConta=0;iConta < entries;iConta++){
      if(iFlag == 1){
         fSomma += TegConta(iRata,iGiorni[iConta],iInter);
      }else{
         fSomma += TaegConta(iRata,iGiorni[iConta],iInter);
      }      
   }
   return(fSomma);
}

function TaegConta(iRata, iGiorni, iInter)
{
   var lfGiorni, lfCalcolo, lfExp, lfNum, lfPow

   lfGiorni  = iGiorni;
   lfExp     = (lfGiorni / 365.0);
   lfNum     = (iInter + 1.0);
   lfPow     = Math.pow(lfNum,lfExp);
   lfCalcolo = (iRata / lfPow );
   return(lfCalcolo);
}

function TegConta(iRata, iGiorni, iInter)
{
   var lfGiorni, lfCalcolo, lfExp, lfNum, lfPow

   lfGiorni  = iGiorni;
   lfExp     = (lfGiorni / 365.0);
   lfPow     = iInter * lfExp;
   lfNum     = (lfPow + 1.0);
   lfCalcolo = (iRata / lfNum );   
   return(lfCalcolo);
}

function clearForm(form)
{
    form.importvalue.value = "";
    form.numrates.value    = "";
    form.imprata.value     = "";
    form.tegcalc.value     = "";
    form.taegcalc.value    = "";    
}

function format(number)
{
    number = (Math.round(number*1000)/1000);
    var oldNum = '' + number;      
    var newNum = '';
    decPos = oldNum.indexOf('.');
    if(decPos >= 0) {
        newNum = ','+oldNum.substring(decPos+1,oldNum.length);
    }else{
        newNum = '';
        decPos = oldNum.length;
    }

    for (var i=decPos; i>0; i -= 3) {
        if (i > 3) {
          newNum = '.'+oldNum.substring(i-3,i)+newNum;
        }else {
          newNum = oldNum.substring(i-3,i)+newNum;
        }
    }
    return(newNum);
}

function unformat(number)
{
      var oldNum = '' + number;
      var newNum = '';
	  var pPos   = oldNum.indexOf('.');
      while (pPos > 0) {
         newNum = oldNum.substring(0,pPos)+oldNum.substring(pPos+1,oldNum.length);
		 oldNum = newNum;
		 pPos   = oldNum.indexOf('.');
      }
      newNum = oldNum;
      return(newNum);
}

function v2dot(number)
{
      var oldNum = '' + number;
      var newNum = '';
	  var pPos   = oldNum.indexOf(',');
      if ( pPos>0){ 
         newNum = oldNum.substring(0,pPos) + "."+ oldNum.substring(pPos+1,oldNum.length);
	  }else{ 
         newNum = oldNum;
      }
      return(newNum);
}

function checkNumber(input, min, max, msg)
{
    msg = "Il valore " + " del campo \"" + msg + "\"" + " non è corretto.\nModifica il valore " + input.value;
    var str = input.value;
    for (var i = 0; i < str.length; i++) {
        var ch = str.substring(i, i + 1)
        if ((ch < "0" || "9" < ch) && ch != '.' && ch != ',') {
            alert(msg);
            return(false);
        }
    }

    var num = parseFloat(str)
    if (num < min || max < num) {
        alert(msg + " che non è compreso nel range [" + min + ".." + max + "]");
        return(false);
    }
    input.value = str;
    return(true);
}
