<!-- 

// Messaggio che viene visualizzato per i browser che non possono
var Messaggio = "<br>Il tuo browser non č in grado eseguire correttamente"
   + " il calcolo dell'ICI<br>";

// Elenco degli errori
var Errori = new Array();
Errori['NulDov'] = "- Non č dovuta alcuna somma per questo immobile\n(č comunque necessario utilizzare 'Totalizza')";
Errori['SelImm'] = "- Devi selezionare un immobile su cui calcolare l'ICI";
Errori['ProNum'] = "- Il numero di poprietari residenti deve essere numerico";
Errori['ImmNum'] = "- Il valore dell'immobile deve essere numerico";
Errori['RenZer'] = "- Importo della rendita catastale uguale a 0!";
Errori['PerNum'] = "- La percentuale di possesso dell'immobile deve essere un valore numerico";
Errori['MesAnt'] = "- Il mese di inizio possesso č antecedente al mese di fine possesso";
Errori['PerPosInc'] = "- La percentuale di possesso č incongruente";
Errori['PerPosIncPro'] = "- La percentuale di possesso č incongruente con il numero di proprietari residenti";
Errori['DetConImm'] = "- Tipo di detrazione non consentito per questo immobile";
Errori['CoeDetRid'] = "- Non č consentita la coesistenza di detrazione e riduzione";
Errori['NesImm'] = "- Nessun nuovo immobile calcolato";
Errori['PerPosPriCas'] = "- Il numero di mesi di possesso di una prima casa č superiore a 12!";

// Nome della pagina che viene aperta per visualizzare il totale degli
// importi 
var jsNomePagina = "pdsici/tot.htm";

var jsCALCOLATO = 0;
var jsPOSSESSOPRIMACASA = 0;
var jsTOTALEEDIFICI = 0;
var jsPOSSESSO1 = 0.0;
var jsPOSSESSO2 = 0.0;
var jsIMPORTO1 = 0.0;
var jsIMPORTO2 = 0.0;
var jsDETRA1 = 0.0;
var jsDETRA2 = 0.0;
var jsSBILANCIATO = false;

// Usate, da rivedere se si possono levare da una 'situazione' globale
var jsRestoDetra = 0.0;

/////////////////////////////////////////////////////////////////////////////
// Funzioni per la gestione/inizializzazione del form
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// Funzione che: resetta il form, inizializza le variabili e legge i dati dal 
// file di testo
function jsAvvio()
{
   // resetto il form
   jsResetta();

   with (document.form) {
      totedifici.value = 0.0;
      agri1.value = 0.0;
      agri2.value = 0.0;
      fabb1.value = 0.0;
      fabb2.value = 0.0;
      prin1.value = 0.0;
      prin2.value = 0.0;
      altr1.value = 0.0;
      altr2.value = 0.0;
      detr1.value = 0.0;
      detr2.value = 0.0;
      detr11.value = 0.0;
      detr12.value = 0.0;
	  arrotondato.value = 0;
   }
   // Annullo le variabili globali a livello "applicazione"
   jsPOSSESSOPRIMACASA = 0;
   jsTOTALEEDIFICI = 0.0;

   // Array usato per tenere memoria degli immobili su cui e' stato fatto il calcolo
   jsMemoriaImm = new Array();

   jsSettaListe();

   if (nav.nuovagenerazione) window.resizeBy(-10, -10);
   if (nav.nuovagenerazione) window.resizeBy(+10, +10);
}

/////////////////////////////////////////////////////////////////////////////
// Funzione che resetta il form
function jsResetta()
{
   // Annullo tutti i campi presenti nella form
   with(document.form) {
      selimmobile.selectedIndex = 0;
      seldetrazione.selectedIndex = 0;
      selriduzione.selectedIndex = 0;
      dalmese.selectedIndex = 0;
      almese.selectedIndex = 11;
      aliquota.value = 0;
      detrazione.value = 0;
      riduzione.value = 0;
      helpaliquota.value = "";
      helpdetrazione.value = "";
      helpriduzione.value = "";
      valore.value = "";
      percpossesso.value = 100;
      npossessori.value = 1;
      rata.value = 0.0;
   }
   // Annullo le variabili globali utili ad ogni calcolo
   jsCALCOLATO = 0;
   jsPOSSESSO1 = 0;
   jsPOSSESSO2 = 0;
   jsIMPORTO1 = 0.0;
   jsIMPORTO2 = 0.0;
   jsDETRA1 = 0.0;
   jsDETRA2 = 0.0;
   jsSBILANCIATO = false;
}

/////////////////////////////////////////////////////////////////////////////
// Funzione che crea in maniera coerente con quanto letto dal file di testo
// le select list della form
function jsSettaListe()
{
   var i = 0;

   with (document.form.selimmobile) 
   {
      // Impongo la dimensione della select list a zero
      options.length = 0;

      // Setto le altre opzioni della select list recuperandole dall'array
      for (i = 0; i < aliquote.length; i++)
         options[i] = new Option(aliquote[i].descrizione);

      options[0].selected = true;
   }

   with (document.form.seldetrazione) 
   {
      // Impongo la dimensione della select list a zero
      options.length = 0;

      // Setto le altre opzioni della select list recuperandole dall'array
      for (i = 0; i < detrazioni.length; i++)
         options[i] = new Option(detrazioni[i].descrizione);

      options[0].selected = true;
   }

   with (document.form.selriduzione) 
   {
      // Impongo la dimensione della select list a zero
      options.length = 0;

      // Setto le altre opzioni della select list recuperandole dall'array
      for (i = 0; i < riduzioni.length; i++)
         options[i] = new Option(riduzioni[i].descrizione);

      options[0].selected = true;
   }
}

/////////////////////////////////////////////////////////////////////////////
// Funzione per impostare in automatico le giuste detrazioni e riduzioni
/////////////////////////////////////////////////////////////////////////////

// Funzione che in automatico imposta il giusto commento e le giuste aliquote
// e nel caso l'utente stia calcolando l'ICI per una tipologia di 
// immobili prestabiliti imposta la giusta detrazione/riduzione 
function jsSettaImmobile(jsImmobileSel)
{
   with (document.form) 
   {
      aliquota.value = aliquote[jsImmobileSel].percentuale;
      helpaliquota.value = aliquote[jsImmobileSel].help;

      // Imposto eventuali detrazioni per l'immobile selezionato
      seldetrazione.selectedIndex = aliquote[jsImmobileSel].detrazione;
      jsSettaDetrazione(aliquote[jsImmobileSel].detrazione);

      // Nel caso sia rimasta parte della detarzione per la pertinenza
      if (aliquote[jsImmobileSel].tipo == 5 && jsRestoDetra > 0)
      {
         seldetrazione.selectedIndex = 1; 
         detrazione.value = jsRestoDetra;
         helpdetrazione.value = "DETRAZIONE CONSENTITA PER LA PERTINENZA DELL'ABITAZIONE PRINCIPALE";
      }

      // Imposto eventuali riduzioni per l'immobile selezionato
      selriduzione.selectedIndex = aliquote[jsImmobileSel].riduzione;
      jsSettaRiduzione(aliquote[jsImmobileSel].riduzione);
   }
}

// Funzione che in automatico imposta il giusto commento e le giuste aliquote
function jsSettaDetrazione(jsDetrazioneSel)
{
   with (document.form) 
   {
      detrazione.value = detrazioni[jsDetrazioneSel].valore;
      helpdetrazione.value = detrazioni[jsDetrazioneSel].help;
   }
}

// Funzione che in automatico imposta il giusto commento e le giuste aliquote
function jsSettaRiduzione(jsRiduzioneSel)
{
   with (document.form) {
      riduzione.value = riduzioni[jsRiduzioneSel].frazione;
      helpriduzione.value = riduzioni[jsRiduzioneSel].help;
   }
}

/////////////////////////////////////////////////////////////////////////////
// Funzioni per il calcolo dell'ICI
/////////////////////////////////////////////////////////////////////////////

// Funzione per fare il calcolo dell'ICI in base alle scelte dell'utente
function jsCalcolaIci()
{
   if (!jsCheckForm()) 
      return;

   jsForm = document.form;

   // Recupero i mesi di possesso
   var jsDalMese = jsForm.dalmese.options.selectedIndex;
   var jsAlMese = jsForm.almese.options.selectedIndex;
   
   if ((jsDalMese < 6) && (jsAlMese < 6))
   {
      jsPOSSESSO1 = jsAlMese - jsDalMese + 1;
      jsPOSSESSO2 = jsPOSSESSO1;
   }
   if ((jsDalMese < 6) && (jsAlMese >= 6))
   {
      jsPOSSESSO1 = 6 - jsDalMese;
      jsPOSSESSO2 = parseInt(jsPOSSESSO1 + parseInt(jsAlMese - 5));
   }
   if ((jsDalMese >= 6) && (jsAlMese >= 6))
   {
      jsPOSSESSO1 = 0;
      jsPOSSESSO2 = jsAlMese - jsDalMese + 1;
   }

   if (!jsCheckDetrazioniRiduzioni()) 
      return;

   // Recupero gli indici delle select selezionati
   var jsImmobileSel = jsForm.selimmobile.options.selectedIndex;
   var jsDetrazioneSel = jsForm.seldetrazione.options.selectedIndex;
   var jsRiduzioneSel = jsForm.selriduzione.options.selectedIndex;
   var jsImporto = 0;
   
   // Calcolo l'importo (partendo dalla rendita catastale) 
   // su cui calcolare l'ICI
   jsImporto = jsCalcolaImporto(jsForm.valore.value, 
      aliquote[jsImmobileSel].tipo,
	  aliquote[jsImmobileSel].rivalutazione);

   ///////////////
   // RIDUZIONI //
   ///////////////
   // Nel caso sia stata scelta una riduzione del 50% del valore catastale
   // per l'inagibilitā dell'immobile
   if (jsRiduzioneSel == 1)
      jsImporto = (jsImporto / 2.0);

   if (jsRiduzioneSel ==  2)
   {
      var jsTmp = 0;

      if (jsImporto > 25822.84)
      {
         var jsTmp1 = jsImporto - 25822.84;
         if (jsTmp1 < 36151.99) jsTmp += ((jsTmp1 / 100.0) * 30.0);
         else jsTmp += 10845.59;
      }
      if (jsImporto > 61974.83)
      {
         var jsTmp1 = jsImporto - 61974.83;
         if (jsTmp1 < 41316.55) jsTmp += ((jsTmp1 / 100.0) * 50.0);
         else jsTmp += 20658.28;
      }
      if (jsImporto > 103291.38)
      {
         var jsTmp1 = jsImporto - 103291.38;
         if (jsTmp1 < 25822,84) jsTmp += ((jsTmp1 / 100.0) * 75.0);
         else jsTmp += 19367.13;
      }
      if (jsImporto > 129114.22)
      {
         var jsTmp1 = jsImporto - 129114.22;
         jsTmp += jsTmp1;
      }
      jsImporto = jsTmp;
   }

   jsImporto /= 1000.0;
   jsImporto *= aliquote[jsImmobileSel].percentuale;
   jsImporto = ((jsImporto / 12.0) * jsPOSSESSO2);
   jsImporto = ((jsImporto / 100.0) * jsForm.percpossesso.value);

   // Calcolo l'importo della prima rata
   jsIMPORTO1 = jsArrotonda((jsImporto / jsPOSSESSO2) * jsPOSSESSO1);

   // Calcolo l'importo della seconda rata come la differenza
   jsIMPORTO2 = jsArrotonda(jsImporto - jsIMPORTO1);

   if ( (jsPOSSESSO1 == (jsPOSSESSO2 / 2) ) && (jsIMPORTO1 != jsIMPORTO2) )
   {
	  // Setto a vero il campo arrotondato del form, lo uso
	  // nella pagina dei totali per mostrare il messaggio
      if (!jsSBILANCIATO) window.document.form.arrotondato.value = 1;

      if (jsIMPORTO1 < jsIMPORTO2) 
	     jsIMPORTO2 = jsIMPORTO1;
      else 
	     jsIMPORTO1 = jsIMPORTO2;
   }

   if ( jsPOSSESSO1 != (jsPOSSESSO2 / 2) )
   {
      jsSBILANCIATO = true;
      window.document.form.arrotondato.value = 0;
   }

   ////////////////
   // DETRAZIONE //
   ////////////////
   // Calcolo l'eventuale detrazione
   var jsDetraz = 0.0;
   if (aliquote[jsImmobileSel].tipo == 3)
   {
      jsDetraz = ((jsForm.detrazione.value / 12) * jsPOSSESSO2);
      jsDetraz /= jsForm.npossessori.value;
   }
   
   // Nel caso in cui da un precedente calcolo sia avanzata parte
   // della detrazione per la prima casa
   if ((jsRestoDetra != 0) && (aliquote[jsImmobileSel].tipo == 5))
   {
      window.document.form.resto.value = 1;

      // Nel caso la parte della detrazione copra completamente
      // tutto l'importo della pertinenza
      if ((jsImporto - jsRestoDetra) < 0)
         jsRestoDetra = jsImporto;

      // Detrazione della pertinenza
      jsDetraz = jsRestoDetra;
      // Annullo il resto, puo' essere utilizzato per una sola pertinenza
      jsRestoDetra = 0;
   }

   if (((jsImporto - jsDetraz) < 0) && (aliquote[jsImmobileSel].tipo == 3))
   {
      window.alert(Errori['NulDov']);
      jsForm.rata.value = 0;
      jsRestoDetra = jsArrotonda(jsDetraz - jsImporto);
      jsDetraz -= jsRestoDetra;
   }
   else
   {
      // Se anche in questo caso non č dovuto nulla mostro il messaggio
      if ((jsImporto - jsDetraz) == 0)
      {
         window.alert(Errori['NulDov']);
         jsForm.rata.value = 0;
      }
	  else
         jsForm.rata.value = jsArrotonda(jsImporto - jsDetraz);
   }
   
   jsDETRA1 = (jsDetraz / jsPOSSESSO2) * jsPOSSESSO1;
   jsDETRA2 = Math.abs(jsDetraz - jsDETRA1);
   jsDETRA1 = jsArrotonda(jsDETRA1);
   jsDETRA2 = jsArrotonda(jsDETRA2);

   jsCALCOLATO = true;
}

// Funzione per controllare i dati inseriti nella Form
function jsCheckForm()
{
   var jsErrori = "Errori:"
   var jsErr = false;
   var jsForm = document.form;
   
   // Controllo che il valore dell'immobile sia numerico
   if (jsForm.selimmobile.selectedIndex == 0) 
   {
      jsErrori += "\n" + Errori['SelImm'];
      jsSeleziona(jsForm.selimmobile);
      jsErr = true;
   }

   // Controllo che il numero di possidenti sia numerico
   if (isNaN(jsForm.npossessori.value)) 
   {
      jsErrori += "\n" + Errori['ProNum'];
      if (!jsErr) jsSeleziona(jsForm.npossessori);
      jsErr = true;
   }
   
   // Controllo che il valore dell'immobile sia numerico
   if (isNaN(jsForm.valore.value)) 
   {
      jsErrori += "\n" + Errori['ImmNum'];
      if (!jsErr) jsSeleziona(jsForm.valore);
      jsErr = true;
   }

   // Se il valore dell'immobile č zero lo segnalo!
   if (jsForm.valore.value == 0)
   {
      jsErrori += "\n" + Errori['RenZer'];
      if (!jsErr) jsSeleziona(jsForm.valore);
      jsErr = true;
   }

   // Controllo che la percentuale di possesso dell'immobile sia numerica
   if (isNaN(jsForm.percpossesso.value)) 
   {
      jsErrori += "\n" + Errori['PerNum'];
      if (!jsErr) jsSeleziona(jsForm.percpossesso);
      jsErr = true;
   }
   
   // Controllo che i mesi di possesso dell'immobile siano coerenti
   if (jsForm.dalmese.selectedIndex > jsForm.almese.selectedIndex) 
   {
      jsErrori += "\n" + Errori['MesAnt'];
      if (!jsErr) jsSeleziona(jsForm.dalmese);
      jsErr = true;
   }

   if (jsForm.percpossesso.value > 100)
   {
      jsErrori += "\n" + Errori['PerPosInc'];
      if (!jsErr) jsSeleziona(jsForm.percpossesso);
      jsErr = true;
   }

   if ((jsForm.percpossesso.value == 100) && (jsForm.npossessori.value > 1))
   {
      jsErrori += "\n" + Errori['PerPosIncPro'];
      if (!jsErr) jsSeleziona(jsForm.npossessori);
      jsErr = true;
   }

   // In caso di errori
   if (jsErr) 
   {
      window.alert(jsErrori);
      return false;
   }
   // Se va tutto bene
   return true;
}

// Controllo la validitā delle detrazioni e delle riduzioni selezionate
function jsCheckDetrazioniRiduzioni()
{
   var jsErrori = "Errori:"
   var jsErr = false;
   var jsForm = document.form;

   var jsImmobileSel = jsForm.selimmobile.options.selectedIndex;
   if (!jsImmobileSel) return;
   
   var jsDetrazioneSel = jsForm.seldetrazione.options.selectedIndex;
   var jsRiduzioneSel = jsForm.selriduzione.options.selectedIndex;

   if ((jsDetrazioneSel != 0) 
    && (aliquote[jsImmobileSel].tipo != 5) 
    && (detrazioni[jsDetrazioneSel].tipo != aliquote[jsImmobileSel].tipo))
   {
      jsErrori += "\n" + Errori['DetConImm'];
      jsSeleziona(jsForm.seldetrazione);
      jsErr = true;
   }
/*
   if ((jsImmobileSel != 6) && (jsRiduzioneSel == 2)
    || (jsImmobileSel != 3) && (jsRiduzioneSel == 1))
   {
      jsErrori += "\n" + Errori['DetConImm'];
      jsSeleziona(jsForm.selriduzione);
      jsErr = true;
   }
*/
   if ((jsImmobileSel != 4) && (jsRiduzioneSel == 2)
    || (jsImmobileSel != 1) && (jsRiduzioneSel == 1))
   {
      jsErrori += "\n" + Errori['DetConImm'];
      jsSeleziona(jsForm.selriduzione);
      jsErr = true;
   }
   if ((jsDetrazioneSel != 0) && (jsRiduzioneSel != 0))
   {
      jsErrori += "\n" + Errori['CoeDetRid'];
      jsSeleziona(jsForm.selriduzione);
      jsErr = true;
   }

   // In caso di errori
   if (jsErr) 
   {
      window.alert(jsErrori);
      return false;
   }
   // Se va tutto bene
   return true;
}

// Funzione richiamata per totalizzare l'importo ICI appena calcolato
function jsCalcolaTot()
{
   if (!jsCheckCalcolaTot()) 
      return;

   with (document.form) {
      // Recupero gli indici delle select selezionati
      var jsImmobileSel = selimmobile.options.selectedIndex;
      var jsDetrazioneSel = seldetrazione.options.selectedIndex;
      var jsRiduzioneSel = selriduzione.options.selectedIndex;

      if (aliquote[jsImmobileSel].tipo == 1)
      {
         agri1.value = parseFloat(agri1.value) + jsIMPORTO1;
         agri2.value = parseFloat(agri2.value) + jsIMPORTO2;
      }
      if (aliquote[jsImmobileSel].tipo == 2)
      {
         fabb1.value = parseFloat(fabb1.value) + jsIMPORTO1;
         fabb2.value = parseFloat(fabb2.value) + jsIMPORTO2;
      }
      if (aliquote[jsImmobileSel].tipo == 3)
      {
         prin1.value = parseFloat(prin1.value) + jsIMPORTO1;
         prin2.value = parseFloat(prin2.value) + jsIMPORTO2;
         detr1.value = parseFloat(detr1.value) + jsDETRA1;
         detr2.value = parseFloat(detr2.value) + jsDETRA2;
      }
      if ((aliquote[jsImmobileSel].tipo == 4) ||
          (aliquote[jsImmobileSel].tipo == 6) ||
          (aliquote[jsImmobileSel].tipo == 7))
      {
         altr1.value = parseFloat(altr1.value) + jsIMPORTO1;
         altr2.value = parseFloat(altr2.value) + jsIMPORTO2;
      }
      if(aliquote[jsImmobileSel].tipo == 5)
      {
         altr1.value = parseFloat(altr1.value) + jsIMPORTO1;
         altr2.value = parseFloat(altr2.value) + jsIMPORTO2;
         detr11.value = parseFloat(detr11.value) + jsDETRA1;
         detr12.value = parseFloat(detr12.value) + jsDETRA2;
      }

      totedifici.value = ++jsTOTALEEDIFICI;

      // Aggiungo un nuovo immobile all'elenco di quelli calcolati
      jsMemoriaImm[jsTOTALEEDIFICI] = new Memoria(
           jsImmobileSel
	       , valore.value
	       , almese.options[dalmese.options.selectedIndex].value 
	       , almese.options[almese.options.selectedIndex].value
	       , jsDetrazioneSel 
	       , npossessori.value
	       , jsRiduzioneSel
           , percpossesso.value
	 );
   }

   // Reinizzializzo il form
   jsCALCOLATO = 0;
   jsResetta();
}

// Controllo che sia giusto calcolare il totale per i nuovi immobili 
function jsCheckCalcolaTot()
{
   var jsErrori = "Errori:"
   var jsErr = false;
   var jsForm = document.form;

   // Se non č stato calcolato nessun nuovo immobile
   if(!jsCALCOLATO)
   {
      jsErrori += "\n" + Errori['NesImm'];
      jsErr = true;
   }

   // Recupero gli indici delle select selezionati
   var jsImmobileSel = jsForm.selimmobile.options.selectedIndex;

   if (aliquote[jsImmobileSel].tipo == 3) 
   {
      if ((jsPOSSESSOPRIMACASA + jsPOSSESSO2) > 12)
      {
         jsErrori += "\n" + Errori['PerPosPriCas'];
         jsErr = true;
      }
      else jsPOSSESSOPRIMACASA += jsPOSSESSO2;
   }

   // In caso di errori
   if (jsErr)
   {
      window.alert(jsErrori);
      return false;
   }
   // Se va tutto bene
   return true;
}

// Funzione che apre una nuova finestra in pop-up con i totali
// centra la finestra e gli dā il focus
function jsTotali()
{
   var jsWidth = 600;
   var jsHeight = 500;

   jsNuova = window.open(jsNomePagina,"Totali",
      "scrollbars,width=" + jsWidth + ",height=" + jsHeight);

   jsNuova.moveTo((window.screen.availWidth - jsWidth) / 2, 
      (window.screen.availHeight - jsHeight) / 2);
      
   jsNuova.focus();
}

/////////////////////////////////////////////////////////////////////////////
// Altre funzioni di supporto
/////////////////////////////////////////////////////////////////////////////

// Funzione che sostituisce le occorrenze delle virgole con punti
function jsSostituisciVirgole(jsRif)
{
   return jsRif.replace(/,/gi,".");
}

// Funzione che seleziona il contenuto di un campo di una form
function jsSeleziona(jsRif)
{
   if (jsRif.select) jsRif.select();
   if (jsRif.focus) jsRif.focus();
}

function jsCalcolaImporto(jsVal, jsTipo, jsRivalutazione)
{
  // Rivalutazione della rendita catastale tipica dell'immobile
  var jsTmp = (jsVal * jsRivalutazione);
  // Rivalutazione del 5% della rendita catastale per tutti gli immobili
  // ma non per i terreni
  if (jsTipo != 1 && jsTipo != 2) 
     jsTmp *= 1.05;
  // Per i terreni
  if (jsTipo == 1) 
     jsTmp *= 1.25;
  // Ritorno il valore calcolato
  return jsTmp; 
}

// -->

