// ================================================================================
// DATA DECLARATION
// ================================================================================
// ================================================================================
// DATA DECLARATION
// ================================================================================


         
// Constant MIT
var lnum_deduction = 150;  // delibera 2007
var lnum_minValue  = 10;
var lnum_Reduction = 0.5;  // (50% riduzione sulla tassa)
var lnum_Rival     = 1.05; //  5% rivalutazione 


// Cbo type of Building
//=====================
// Elementi:   
// 0  Descrizione Italiana
// 1  Altra Lingua
// 2  Aliquota
// 3  Deduzione I abitaz      ( true: con riduz. obbl., false: Non puo´ avere riduz. , null: puo´ ma non e´detto)
// 4  Riduzione inagibilitá   ( true: con deduz. obbl., false: Non puo´ avere deduz. , null: puo´ ma non e´detto)
// 5  Coeff. per 
// 6  Rif. Item in catRiepilogo
var larr_defaults = new Array(
  new Array("Abitazione principale + pertinenza",
            "xxxxxxx ", 
            6.0, true, false , 100,1), 
/* new Array("Pertinenze abitazione principale e similari",
            "xxxxxxx", 
            6.5, false, false , 100,1), */            
  new Array("Abitaz. non locate",
            "xxxxxxx", 
            7,false,false, 100 ,2), 
/*
  new Array("Abitaz. soggette all’imposta di soggiorno + pertinenze",
            "xxxxxxx",
            7.5, false, false, 100,2), 
  new Array("Abitaz. non locate per più di 180 gg. + pertinenze",
            "xxxxxxx", 
            7,false,false, 100 ,2), 
  new Array("Abitaz. concesse in comodato d’uso",
            "xxxxxxx",
            4,true,false,100, 1  ),           
  new Array("Uffici e studi privati, Alberghi,Teatri etc. (A/10 e Cat. D)",
            "xxxxxxx ", 
            6.25, false, null,50,2 ), 
  new Array("Negozi e botteghe (C/1)",
            "xxxxxxx ", 
            6.25, false, null, 34,2 ), 
  new Array("Abitaz. non locate per più di 2 anni + pertinenze",
            "xxxxxxx ", 
            9,false,false, 100 ,2), 
*/            
  new Array("Altri immobili",
            "xxxxxxx ", 
            6.25, false, null,100,2 ), 
  new Array("Aree fabbricabili",
            "xxxxxxx ", 
            6.25, false, false,1,0 )
 );

var larr_catRiepilogo = new Array(
         new Array("Aree fab.","xxxxxxxxx"),
         new Array("Ab.princ.","xxxxxxxxx"),
         new Array("Altri imm.","xxxxxxxxx")
           );

// Error messages descriptions
// 0  Descrizione Italiana
// 1  Altra Lingua
//=============================================================
var lmsg_desc = new Array(
         new Array("E´obbligatorio impostare un tipo di immobile","xxxxxxx"),
         new Array("Quota di proprietá non valida ( valida da 1 a 100)","xxxxxxx"),
         new Array("Il periodo di possesso non e´ valido","xxxxxxx"),
         new Array("La rendita indicata non puo´ essere 0","xxxxxxx"),
         new Array("Tipo immobile non congruo con impostazione \"Riduzione per inagibilitá\"","xxxxxxx"),
         new Array("Tipo immobile non congruo con impostazione \"Detrazione per abitazione principale\"","xxxxxx \"xxxxxx\" xxxxxx"),
         new Array("Il numero di proprietari residenti non puo´ essere 0","xxxxxxx"),
         new Array("Il periodo di possesso impostato per la pertinenza non valido","xxxxxxx"),
         new Array("Quota di proprietá della pertinenza non valida ( valida da 1 a 100)","xxxxxxx)"),
         new Array("",""),
         new Array("Nr. Proprietari non congruente con la quota di proprietá","xxxxxxx"),
         new Array("Cat.","xxxxxxx"),
         new Array("Aliquota","xxxxxxx"),
         new Array("I abitaz.","xxxxxxx"),
         new Array("Inagibilitá","xxxxxxx"),
         new Array("ICI","xxxxxxx"),
         new Array("Detrazione","xxxxxxx"),
         new Array("Importo","xxxxxxx"),
         new Array("Totale","xxxxxxx"),
         new Array("(*) Il versamento non e´ dovuto per importi annuali inferiori a € " + displayEuro(lnum_minValue) ,
                   "(*) xxxxxxx € " + displayEuro(lnum_minValue) + " xxxxxxx"),
         new Array("Imposta non dovuta","xxxxxxx"),
         new Array("1. rata","xxxxxxx"),
         new Array("Chiudi","xxxxxxx"),
         new Array("Riepilogo ICI ","xxxxxxx"),
         new Array("Detrazione applicata €","xxxxxxx"),
         new Array("Totale da versare  €","xxxxxxx"),
         new Array("1. rata","1. Rate"),
         new Array("2. rata","2. Rate"),
         new Array("Stampa","xxxxxxx"),
         new Array("","")
         );


function SIAG_parseNumber ( lstr_data ) {
var lstr_data2 = "";
var lobj_reg   = /\x2c/g;

   if (isNaN (parseFloat(lstr_data))) 
        {lstr_data2 = lstr_data;} 
   else {
       if (typeof(lstr_data) == "string") {lstr_data2 = lstr_data.toString().replace(lobj_reg,".");}
       else {lstr_data2 = lstr_data }
   }
//   alert(parseFloat(lstr_data2) + "\n" + lstr_data +" - " + typeof(lstr_data) );
   return (parseFloat(lstr_data2));
}

        
function parseErrors( larr_errors,lstr_lang) {
var lstr_result = "";
var llng_lang   = 0;
   if (lstr_lang == "D") { llng_lang = 1 };
   
   for (i=0; i<larr_errors.length; i++){
     lstr_result += "\n\n" + lmsg_desc[larr_errors[i]][llng_lang];
   }
   return (lstr_result);
}


// this structure takes data calculate every time
// Each elements is an Object of GhType
var larr_data    = new Array();
var lobj_current = new GhComputation();


//=============================================================
//=================== EVENT HANDLERS ==========================
//=============================================================

function clearAll (theForm){
   larr_data    = new Array();
   lobj_current = new GhComputation();
   resetInterface(theForm);
}

function initCategoria (theForm, lstr_lang){
var lstr_text = "";
var llng_lang = 1;

  if (lstr_lang == "I") { llng_lang = 0; }

  for (i=0; i < larr_defaults.length; i++){
     lstr_text = larr_defaults[i][llng_lang];
	   theForm.elements.Categoria.options[i] = new Option(lstr_text, i);
  }
}

function categoriaChanged (theForm) {
var larr_defaultValue ;
   if (theForm.Categoria.selectedIndex != -1) {
       larr_defaultValue = larr_defaults[theForm.Categoria.selectedIndex];
       theForm.elements.aliquota.value = larr_defaultValue[2];
       
       if (larr_defaultValue[3] != null) {  
	       theForm.elements.detrazione.checked = larr_defaultValue[3];
	       detrazioneChecked(theForm);
       } 
       if (larr_defaultValue[4] != null) {   
	       theForm.elements.inagibile.checked = larr_defaultValue[4];
	       inagibileChecked(theForm);
       } 
   } 

}

function inagibileChecked(theForm) {
var lbool_hasReduction  = theForm.elements.inagibile.checked;
/**** No more controls 
   // throw away incompatible checked values
   if (lbool_hasReduction) 
   {
		// Check on detrazione
		theForm.elements.detrazione.checked = false;
		detrazioneChecked(theForm);
   }
   // Category selected is not allowed
   if (larr_defaults[theForm.elements.Categoria.selectedIndex][4] != null  && larr_defaults[theForm.elements.Categoria.selectedIndex][4] != lbool_hasReduction ) {
	    theForm.elements.Categoria.selectedIndex = -1;
	    for ( i=0; i<larr_defaults.length; i++){
	      if ((larr_defaults[i][4] == null || larr_defaults[i][4] == lbool_hasReduction) && (larr_defaults[i][3]== null || larr_defaults[i][3] == !lbool_hasReduction )) {
	         theForm.elements.Categoria.selectedIndex = i;
	         categoriaChanged (theForm);
	         break;     
	      }
	    }
	}   
*************/   
}

function detrazioneChecked(theForm) {
/***
var lbool_hasDeduction  = theForm.elements.detrazione.checked;
var lstr_Category       = "";

   if (lbool_hasDeduction) {

		theForm.elements.inagibile.checked = false;
		inagibileChecked(theForm);
****/
/****		// Category selected is not allowed
		if (larr_defaults[theForm.elements.Categoria.selectedIndex][3] != null  && !larr_defaults[theForm.elements.Categoria.selectedIndex][3]) {
		    theForm.elements.Categoria.selectedIndex = -1;
		    for ( i=0; i<larr_defaults.length; i++){
		      if ((larr_defaults[i][3] == null || larr_defaults[i][3] == true) && (larr_defaults[i][4]== null || larr_defaults[i][4] == false )) {
		         theForm.elements.Categoria.selectedIndex = i;
		         categoriaChanged (theForm);
		         break;     
		      }
		    }
		}   
**********/
/***
		if (theForm.elements.Quotap1.value == 0)  theForm.elements.Quotap1.value = theForm.elements.Quota1.value;
		if (theForm.elements.dalMesep1.selectedIndex  == -1) theForm.elements.dalMesep1.selectedIndex = theForm.elements.dalMese1.selectedIndex;
		if (theForm.elements.alMesep1.selectedIndex  == -1) theForm.elements.alMesep1.selectedIndex = theForm.elements.alMese1.selectedIndex;
     
		if (window.top.MyDeduction != null) {window.top.MyDeduction.style.display = "block"; }
   } else {
		theForm.elements.ImpPertinenza.value = 0;
		theForm.elements.Quotap1.value = 0;
		theForm.elements.dalMesep1.selectedIndex = -1 ;
		theForm.elements.alMesep1.selectedIndex  = -1 ;   
		if (window.top.MyDeduction != null) {  window.top.MyDeduction.style.display = "none";}
   }

   // Category selected is not allowed
   if (larr_defaults[theForm.elements.Categoria.selectedIndex][3] != null  && larr_defaults[theForm.elements.Categoria.selectedIndex][3] != lbool_hasDeduction ) {
	    theForm.elements.Categoria.selectedIndex = -1;
	    for ( i=0; i<larr_defaults.length; i++){
	      if ((larr_defaults[i][3] == null || larr_defaults[i][3] == lbool_hasDeduction) && (larr_defaults[i][4]== null || larr_defaults[i][4] == !lbool_hasDeduction )) {
	         theForm.elements.Categoria.selectedIndex = i;
	         categoriaChanged (theForm);
	         break;     
	      }
	    }
	}   
****/   
}




function checkButtons(theForm) {
	theForm.elements.first.disabled = true;
	theForm.elements.last.disabled = true;
	theForm.elements.next.disabled = true;
	theForm.elements.prev.disabled = true;
	theForm.elements.cmddel.disabled = true;

    if (larr_data.length > 0 ) {
  	   theForm.elements.first.disabled = false;
  	   
  	   if (lobj_current.index != -1) {
  	      if (lobj_current.index > 0) {
  	         theForm.elements.prev.disabled = false;
  	      }
  	      if (lobj_current.index < larr_data.length -1) {
  	         theForm.elements.next.disabled = false;
  	         theForm.elements.last.disabled = false;
  	      }
  	   } else {
  	      theForm.elements.prev.disabled = false;
  	   }
    } 
	// Set status Text    
    if (lobj_current.index == -1) { theForm.elements.status.value = " * " }
    else {theForm.elements.status.value = (lobj_current.index + 1).toString() + " / " + larr_data.length.toString()
        theForm.elements.cmddel.disabled = false;
    }
}

function deleteData( theForm ) {
var lnum_index = lobj_current.index;

 if (lnum_index != -1) 
 {
     for (i= lnum_index; i< larr_data.length-1; i++) {
        larr_data[i] = larr_data[i+1];
        larr_data[i].index = i;
      } 
     larr_data[(larr_data.length -1)] = null; 
     if ( delete larr_data[(larr_data.length -1)]) larr_data.length--;

     
     if ( larr_data.length > lnum_index) {
       lobj_current = larr_data[lnum_index];
  	   resetInterface(theForm);
	   checkButtons(theForm); 
     }
     else {
		lobj_current = new GhComputation();
		resetInterface(theForm);
		checkButtons(theForm); 
		goLast(theForm);   
     
     }
 }
 else {
    lobj_current = new GhComputation();
    resetInterface(theForm);
    checkButtons(theForm); 
    goLast();   
 }
}

function goNext (theForm){
   if (lobj_current.index > -1 && lobj_current.index < larr_data.length -1) {
      lobj_current = larr_data[lobj_current.index+1];
      resetInterface(theForm);
      checkButtons(theForm);
   }
}

function goPrev (theForm){
   if (lobj_current.index > 0 ) {
      lobj_current = larr_data[lobj_current.index-1];
      resetInterface(theForm);
      checkButtons(theForm);
   } else {
     if (lobj_current.index == -1 && larr_data.length > 0 ) goLast (theForm) ;
   }
   
}
function goFirst(theForm){
   if (larr_data.length > 0 ) {
      lobj_current = larr_data[0];
      resetInterface(theForm);
      checkButtons(theForm);
   }
}
function goLast (theForm){
   if (larr_data.length > 0 ) {
      lobj_current = larr_data[larr_data.length -1 ];
      resetInterface(theForm);
      checkButtons(theForm);
   }
}

function add_thisRates(theForm) {
   // check if element has some data....
   if (lobj_current.Taxable1 != 0 || lobj_current.TaxToPayRate2 != 0 ||lobj_current.TaxToPayRate1 != 0) {
        // save it
		if (lobj_current.index == -1 ) { lobj_current.index = larr_data.length; }
		larr_data[lobj_current.index] = lobj_current;
   }
   lobj_current = new GhComputation();
   resetInterface(theForm);
}


//======================================================================================
//======================================================================================
//=====   OBJECT DEFINITION                                                      =======
//======================================================================================
//======================================================================================


function GhComputation ( ){
  // version of object
  function getVersion() { return "1.0.0";}
  // Author
  function getAuthor() { return "Südtiroler Informatik AG - by Ghost!";}

  // internal functions...
  function getRate1_String(lang){
  var lstr_data = "";
  var lnum_item = 0;

     if (lang == "D") lnum_item = 1;

     lstr_data  = "<tr>";
     
     lstr_data += "<td align=left>" + larr_catRiepilogo[larr_defaults[this.Category][6]][lnum_item] + "</td>";
     lstr_data += "<td align=right>" + displayEuro (this.Percentage) + "°/oo </td>";
     lstr_data += "<td align=right>" + (this.hasDeduction?" X ":"--") +"</td>";
     lstr_data += "<td align=right>" + (this.hasReduction?" X ":"--") +"</td>";
     
     lstr_data += "<td align=right>" + displayEuro (this.TaxValue1) + "</td>";
     lstr_data += "<td align=right>" + displayEuro (this.DeductionRate1) + "</td>";
     lstr_data += "<td align=right>" + displayEuro (this.TaxToPayRate1) + "</td>";
     lstr_data += "</tr>";
     return  lstr_data; 
  }
  function getRate2_String(lang){
  var lstr_data = "";
  var lnum_item = 0;

     if (lang == "D") lnum_item = 1;

     lstr_data  = "<tr>";

     lstr_data += "<td align=left>" + larr_catRiepilogo[larr_defaults[this.Category][6]][lnum_item] + "</td>";
     lstr_data += "<td align=right>" + displayEuro (this.Percentage) + "°/oo </td>";
     lstr_data += "<td align=right>" + (this.hasDeduction?" X ":"--") +"</td>";
     lstr_data += "<td align=right>" + (this.hasReduction?" X ":"--") +"</td>";
     
     lstr_data += "<td align=right>" + displayEuro (this.TaxValue2) + "</td>";
     lstr_data += "<td align=right>" + displayEuro (this.DeductionRate2) + "</td>";
     lstr_data += "<td align=right>" + displayEuro (this.TaxToPayRate2) + "</td>";
     lstr_data += "</tr>";
     return  lstr_data; 
  }  
  function Overriden_toString(lang) {
    return getRate1_String(lang) + "\n" + getRate2_String(lang);
  }

  // public interface.
  this.toString = Overriden_toString; 
  this.toStringRate1 = getRate1_String;
  this.toStringRate2 = getRate2_String;
  this.Version  = getVersion;
  this.Author   = getAuthor;
  
  this.index        = -1;
  this.Category     = -1;
  this.interest1    = 0;
  this.Taxable1     = 0;
  this.Percentage   = 6;
  this.Quota1       = 100;
  this.fromMonth1   = 1;
  this.toMonth1     = 12;
  this.Month1       = 0;
  this.TotalMonth1  = 12;
  this.hasDeduction = false;
  this.hasReduction = false;
  this.NumOwners    = 1;

  this.interestp1    = 0;
  this.Taxablep1     = 0;
  this.Quotap1       = 100;
  this.Monthp1       = 0;
  this.fromMonthp1   = 1;
  this.toMonthp1     = 12;

  this.interestp2    = 0;
  this.Taxablep2     = 0;
  this.Quotap2       = 100;
  this.Monthp2       = 0;
  this.fromMonthp2   = 1;
  this.toMonthp2     = 12;

  // Totals
  this.TotalTax       = 0;
  this.TotalDeduction = 0;
  // Rate1
  this.TaxValue1      = 0;
  this.DeductionRate1 = 0;
  this.TaxRate1       = 0;
  this.TaxToPayRate1  = 0;
  // Rate2
  this.TaxValue2      = 0;
  this.DeductionRate2 = 0;
  this.TaxRate2       = 0;
  this.TaxToPayRate2  = 0;
  
}
function resetInterface(theForm) {

 theForm.elements.aliquota.value = lobj_current.Percentage.toString() ;
 theForm.elements.Categoria.selectedIndex =  lobj_current.Category;

 if (lobj_current.fromMonth1 != -1) theForm.elements.dalMese1.selectedIndex = lobj_current.fromMonth1 - 1;
 if (lobj_current.toMonth1   != -1) theForm.elements.alMese1.selectedIndex = lobj_current.toMonth1 - 1;
 if (lobj_current.fromMonthp1 != -1) theForm.elements.dalMesep1.selectedIndex = lobj_current.fromMonthp1 - 1;
 if (lobj_current.toMonthp1   != -1) theForm.elements.alMesep1.selectedIndex = lobj_current.toMonthp1 - 1;

 if (lobj_current.fromMonthp2 != -1) theForm.elements.dalMesep2.selectedIndex = lobj_current.fromMonthp2 - 1;
 if (lobj_current.toMonthp2   != -1) theForm.elements.alMesep2.selectedIndex = lobj_current.toMonthp2 - 1;



 theForm.elements.Rendita1.value         = lobj_current.interest1 ;
 theForm.elements.Renditap1.value         = lobj_current.interestp1 ;
 theForm.elements.Renditap2.value         = lobj_current.interestp2 ;

 theForm.elements.NrProp.value           = lobj_current.NumOwners;
 theForm.elements.Quota1.value           = lobj_current.Quota1;
 theForm.elements.detrazione.checked     = lobj_current.hasDeduction;
 theForm.elements.inagibile.checked      = lobj_current.hasReduction;

 theForm.elements.Quotap1.value           = lobj_current.Quotap1;
 theForm.elements.Quotap2.value           = lobj_current.Quotap2;

 theForm.elements.DetrazioneR1.value     = lobj_current.DeductionRate1;
 theForm.elements.ImpostaR1.value        = lobj_current.TaxValue1;
 theForm.elements.VersamentoR1.value     = lobj_current.TaxToPayRate1;
 theForm.elements.ImpostaR2.value        = lobj_current.TaxValue2;
 theForm.elements.DetrazioneR2.value     = lobj_current.DeductionRate2;
 theForm.elements.VersamentoR2.value     = lobj_current.TaxToPayRate2;
 theForm.elements.TotaleR1.value         = lobj_current.TaxRate1;
 theForm.elements.TotaleR2.value         = lobj_current.TaxRate2;

//************************************ CHECK CATEG!!!*********************
//************************************************************************
 detrazioneChecked( theForm );
 checkButtons(theForm);
 return;
}

function showTotals (lang){
var lobj_win; 
var lstr_resultsR1 = "<table border=0 width=\"100%\">"
var lstr_resultsR2 = "<table border=0 width=\"100%\">"
var lstr_Report    = "";
var lnum_TotVersR1 = 0;
var lnum_TotVersR2 = 0;
var lnum_TotDetrR1 = 0;
var lnum_TotDetrR2 = 0;
var lnum_RiportoR1 = 0;
var lnum_RiportoR2 = 0;
var lnum_totalsR1  = new Array(new Array(0,0),new Array(0,0),new Array(0,0) );
var lnum_totalsR2  = new Array(new Array(0,0),new Array(0,0),new Array(0,0) );
var lnum_item      = 0;
var lbool_printx   = false;
    
    if (lang=="D") lnum_item = 1;



    lstr_resultsR1 += "<tr><td colspan=7>" + lmsg_desc[26][lnum_item] + "</td></tr>";
    lstr_resultsR2 += "<tr><td colspan=7>" + lmsg_desc[27][lnum_item] + "</td></tr>";


    lstr_resultsR1 += "<tr><td align=Center class=\"rowheader\">" + lmsg_desc[11][lnum_item] + "</td>"
    lstr_resultsR1 += "<td align=Center class=\"rowheader\">" + lmsg_desc[12][lnum_item] + "</td>"
    lstr_resultsR1 += "<td align=Center class=\"rowheader\">" + lmsg_desc[13][lnum_item] + "</td>"
    lstr_resultsR1 += "<td align=Center class=\"rowheader\">" + lmsg_desc[14][lnum_item] + "</td>"
    lstr_resultsR1 += "<td align=center class=\"rowheader\">" + lmsg_desc[15][lnum_item] + "</td><td align=center class=\"rowheader\">" + lmsg_desc[16][lnum_item] + "</td><td align=center class=\"rowheader\">" + lmsg_desc[17][lnum_item] + "</td></tr>";

    lstr_resultsR2 += "<tr><td align=Center class=\"rowheader\">" + lmsg_desc[11][lnum_item] + "</td>"
    lstr_resultsR2 += "<td align=Center class=\"rowheader\">" + lmsg_desc[12][lnum_item] + "</td>"
    lstr_resultsR2 += "<td align=Center class=\"rowheader\">" + lmsg_desc[13][lnum_item] + "</td>"
    lstr_resultsR2 += "<td align=Center class=\"rowheader\">" + lmsg_desc[14][lnum_item] + "</td>"
    lstr_resultsR2 += "<td align=center class=\"rowheader\">" + lmsg_desc[15][lnum_item] + "</td><td align=center class=\"rowheader\">" + lmsg_desc[16][lnum_item] + "</td><td align=center class=\"rowheader\">" + lmsg_desc[17][lnum_item] + "</td></tr>";


    for ( i=0 ; i < larr_data.length; i++) {
       lstr_resultsR1 += larr_data[i].toStringRate1(lang);
       lstr_resultsR2 += larr_data[i].toStringRate2(lang);
	
       // Riepiloghi
       lnum_totalsR1[ larr_defaults[larr_data[i].Category][6]][0] +=Math.round(larr_data[i].DeductionRate1 *100) / 100;
       lnum_totalsR2[ larr_defaults[larr_data[i].Category][6]][0] +=Math.round(larr_data[i].DeductionRate2 *100) / 100;
       lnum_totalsR1[ larr_defaults[larr_data[i].Category][6]][1] +=Math.round(larr_data[i].TaxToPayRate1 *100) / 100;
       lnum_totalsR2[ larr_defaults[larr_data[i].Category][6]][1] +=Math.round(larr_data[i].TaxToPayRate2 *100) / 100;

 	   lnum_TotVersR1 += Math.round(larr_data[i].TaxToPayRate1 *100) / 100;
	   lnum_TotVersR2 += Math.round(larr_data[i].TaxToPayRate2 *100) / 100;
	   lnum_TotDetrR1 += Math.round(larr_data[i].DeductionRate1 *100) / 100; 
	   lnum_TotDetrR2 += Math.round(larr_data[i].DeductionRate2 *100) / 100; 
    }

   lstr_resultsR1 += "<tr><td colspan=7><hr></td></tr>";
   lstr_resultsR2 += "<tr><td colspan=7><hr></td></tr>";

   // Add Report.
    for ( i=0 ; i < lnum_totalsR1.length; i++) {
      lstr_resultsR1 += "<tr><td align=right colspan=5>" + larr_catRiepilogo[i][lnum_item] +"</td><td align=right>" ;
      lstr_resultsR1 += displayEuro (lnum_totalsR1[i][0]) +"</td><td align=right>"
      lstr_resultsR1 += displayEuro (lnum_totalsR1[i][1]) +"</td></tr>" ;

      lstr_resultsR2 += "<tr><td align=right colspan=5>" + larr_catRiepilogo[i][lnum_item] +"</td><td align=right>" ;
      lstr_resultsR2 += displayEuro (lnum_totalsR2[i][0]) +"</td><td align=right>"
      lstr_resultsR2 += displayEuro (lnum_totalsR2[i][1]) +"</td></tr>" ;
    }
   lstr_resultsR1 += "<tr><td colspan=5>&nbsp;<td colspan=2><hr></td></tr>";
   lstr_resultsR2 += "<tr><td colspan=5>&nbsp;<td colspan=2><hr></td></tr>";


//====================
   if (lnum_TotVersR1 <= lnum_minValue) {
       lnum_RiportoR1 = lnum_TotVersR1;
       lnum_TotVersR1 = 0;

       lstr_resultsR1 += "<tr><td align=right colspan=5>" + lmsg_desc[18][lnum_item] + "</td><td align=right>" + displayEuro (lnum_TotDetrR1) + "</td><td align=right><font color=red>" + displayEuro (lnum_RiportoR1) + "(*)</font></td></tr>" ;
       lbool_printx = true;
   } else {
       lnum_RiportoR1 = 0;
       lstr_resultsR1 += "<tr><td align=right colspan=5>" + lmsg_desc[18][lnum_item] + "</td><td align=right>" + displayEuro (lnum_TotDetrR1) + "</td><td align=right>" + displayRoundedEuro (lnum_TotVersR1) + "</td></tr>" ;
   }

   if (lnum_RiportoR1 > 0 ) {
       lnum_TotVersR2 += lnum_RiportoR1;
       lstr_resultsR2 += "<tr><td align=right colspan=5>" + lmsg_desc[18][lnum_item] + "</td><td align=right>" + displayEuro (lnum_TotDetrR2) + "</td><td align=right><font color=red>" + displayEuro (lnum_TotVersR2) + "</font></td></tr>" ;
       if (lnum_TotVersR2 <= lnum_minValue) {
           lstr_resultsR2 += "<tr><td align=right colspan=5>&nbsp;</td><td align=right colspan=2>"+  lmsg_desc[20][lnum_item] + " (*)</td></tr>" ;
           lbool_printx = true;
       } else {
           lstr_resultsR2 += "<tr><td align=right colspan=5>&nbsp;</td><td align=right colspan=2> € " + displayRoundedEuro (lnum_TotVersR2 - lnum_RiportoR1) + " + </td></tr>" ;
           lstr_resultsR2 += "<tr><td align=right colspan=5>&nbsp;</td><td align=right colspan=2> € " + displayEuro (lnum_RiportoR1) + lmsg_desc[21][lnum_item] +"</td></tr>" ;
       }
   } else {
		if (lnum_TotVersR2 <= lnum_minValue) {
		    lstr_resultsR2 += "<tr><td align=right colspan=5>" + lmsg_desc[18][lnum_item] + "</td><td align=right>" + displayEuro (lnum_TotDetrR2) + "</td><td align=right><font color=red>" + displayEuro (lnum_TotVersR2) + "</font> (*)</td></tr>" ;
		    lbool_printx = true;
		} else {
		    lstr_resultsR2 += "<tr><td align=right colspan=5>" + lmsg_desc[18][lnum_item] + "</td><td align=right>" + displayEuro (lnum_TotDetrR2) + "</td><td align=right>" + displayRoundedEuro (lnum_TotVersR2) + "</td></tr>" ;
		}
   }

  lstr_resultsR1 += "</table>";
  lstr_resultsR2 += "</table>";


//===================   
   lstr_Report = "<html><head><style>.rowheader { background-color: #E1CCB5; color:#FFFFFF; } TD {font-family: verdana ; font-size:12px;} </style></head><body bgcolor=#FFFFFF style=\"font-family: verdana ; font-size:11px; \">" ;
   lstr_Report += "<br>CITTA' DI CARIGNANO<br>";
   lstr_Report += "<br>Imposta Comunale sugli Immobili Anno 2008<br>";
   lstr_Report += "<br><br>"; 
   lstr_Report += lstr_resultsR1; 
   lstr_Report += "<br><br>"; 
   lstr_Report += lstr_resultsR2;
  
  
   lstr_Report += "<br>"+ lmsg_desc[23][lnum_item] + "<br>";
   lstr_Report += "<table><tr><td align=right> " + lmsg_desc[24][lnum_item] + "</td><td align=right>";
   lstr_Report += displayEuro (lnum_TotDetrR1+lnum_TotDetrR2) + "</td></tr>";
   lstr_Report += "<tr><td align=right>" + lmsg_desc[25][lnum_item] + "</td><td align=right>" ;
   lstr_Report += displayRoundedEuro (lnum_TotVersR1+lnum_TotVersR2) + "</td></tr></table>";
   lstr_Report += "<br><br>";
   lstr_Report += "<br>Attenzione!! Si rammenta che il calcolo è effettuato sui dati dichiarati dal contribuente.E' pertanto necessario che il contribuente controlli con cura tutti i dati degli immobili di proprietà indicati sulla presente scheda.L'Amministrazione comunale non si assume alcuna responsabilità circa l'inesattezza dei dati medesimi. <br>"; 
   
   
   if (lbool_printx) {
   lstr_Report += "<br>" + lmsg_desc[19][lnum_item]
   
   }
   
   lstr_Report += "<br><br><form><input type=button value=\"" + lmsg_desc[22][lnum_item] + "\" onClick=\"window.close();\"> <input type=button value=\"" + lmsg_desc[28][lnum_item] + "\" onclick=\"window.print()\"> </form>"; 
   lstr_Report += "</body></html>"; 

   lobj_win = window.open();
   lobj_win.document.open();
   lobj_win.document.write( lstr_Report );
   lobj_win.document.close();
}

function displayEuro ( lnum_data ) {
var lnum_Number = parseFloat(lnum_data);
var lstr_tmp    = "";
var lstr_result = "";

    if (!isNaN(lnum_Number)) {
        lstr_tmp = Math.round ( lnum_Number * 100).toString();
        if (Math.abs(parseInt(lstr_tmp)) < 100) {
           if (parseInt(lstr_tmp) == 0) {
               lstr_result = "0.00";
           } else {
              lstr_result = lstr_tmp.substr(0,lstr_tmp.length -2) + "0." + lstr_tmp.substr(lstr_tmp.length -2,2);
           }
        } else {   
           lstr_result = lstr_tmp.substr(0,lstr_tmp.length -2) + "." + lstr_tmp.substr(lstr_tmp.length -2,2);
        }
    }
    return (lstr_result);
}

function displayRoundedEuro ( lnum_data ) {
var lnum_Number = parseFloat(lnum_data);
var lstr_tmp    = "";
var lstr_result = "";

    if (!isNaN(lnum_Number)) 
	{
        lstr_tmp = Math.round ( lnum_Number * 100).toString();
        if (Math.abs(parseInt(lstr_tmp)) < 100) 
		{
           if (parseInt(lstr_tmp) == 0) 
		   {
               lstr_result = "0.00";
           } else 
		   {
		      // arrotondamento qui
		      if ( parseInt ( lstr_tmp ) > 49 )
			  {
			     lstr_result = lstr_tmp.substr(0,lstr_tmp.length -2) + "1.00";
			  }
			  else
			  {
				lstr_result = lstr_tmp.substr(0,lstr_tmp.length -2) + "0.00";
			  }
           }
        } else 
		{   
		   var lnum_dec = parseInt ( lstr_tmp.substr(lstr_tmp.length -2,2) );
		   if ( lnum_dec > 49 )
		   {
		       lnum_dec = parseInt ( lstr_tmp.substr(0,lstr_tmp.length -2) ) + 1 ;
			   lstr_result = lnum_dec.toString() + ".00";
		   }
		   else
		   {
				lstr_result = lstr_tmp.substr(0,lstr_tmp.length -2) + ".00";
		   }
        }
    }
    return (lstr_result);
}
//  Compute Taxable value
//
function get_BaseImponibile (lnum_interest, lnum_coeff ){
var lnum_result = 0.0;
     //
     // For areas, there is no need of an increase of 5%
     // MIT
     if (lnum_coeff == 1 ) 
     {
         lnum_result = lnum_interest ;  
     }
     else 
     {
         lnum_result = Math.round (lnum_interest * lnum_coeff * 100 * lnum_Rival) / 100;
     }
    return (lnum_result);
}





function calcolaRate(theForm, lstr_lang){
var lnum_error       = 0;   //  1: Err in ImpostaBase1
                            //  2: Err. Quota poss. 1
                            //  4: Mesi totali1 > 12, <= 0 
                            //  8: Nr. Proprietari non valido
                            // 16:  Err in ImpostaBase2
                            // 32:  Err. Quota poss. 2
                            // 64:  Err. Mesi totali2 > 12, <= 0 

var larr_errors = new Array();
var lnum_rendita1 ;
var lnum_Renditap1 ;
var lnum_Renditap2 ;
var lnum_TotalDeduction;
var lnum_impostaBase1;
var lnum_impostaSpettanza1;
var lnum_impostalorda1;

var lnum_impostaBasep1;
var lnum_impostaSpettanzap1;
var lnum_impostalordap1;

var lnum_impostaBasep2;
var lnum_impostaSpettanzap2;
var lnum_impostalordap2;



var lnum_tempIndex    = 0;

    inagibileChecked(theForm);
    detrazioneChecked(theForm);

if (lobj_current.index != -1) {
   lnum_tempIndex = lobj_current.index;
   lobj_current = new GhComputation(); 
   lobj_current.index = lnum_tempIndex;
}

// reload values....
// =============


// Some general check  on selected category
if (theForm.elements.Categoria.selectedIndex != -1 ) {
  if (larr_defaults[theForm.elements.Categoria.selectedIndex][4] != null  && larr_defaults[theForm.elements.Categoria.selectedIndex][4] != theForm.elements.inagibile.checked ) {
       larr_errors[larr_errors.length] = 4;
  }   
  if (larr_defaults[theForm.elements.Categoria.selectedIndex][3] != null  && larr_defaults[theForm.elements.Categoria.selectedIndex][3] != theForm.elements.detrazione.checked ) {
       larr_errors[larr_errors.length] = 5;
  }   
} else { larr_errors[larr_errors.length] = 0; }


// check Taxable 1

 if (isNaN (SIAG_parseNumber(theForm.elements.Rendita1.value) ) || SIAG_parseNumber(theForm.elements.Rendita1.value) == 0 ) {
   // Errore non vale per la categoria di solo Pertinenza.
   if (theForm.elements.Categoria.selectedIndex != 1) {
	   larr_errors[larr_errors.length] = 3;
	   lobj_current.Taxable1 = 0;
   }
 } else {
   if ( theForm.elements.Categoria.selectedIndex != -1) {
      lobj_current.interest1 = SIAG_parseNumber(theForm.elements.Rendita1.value);
      lobj_current.Taxable1 = get_BaseImponibile (lobj_current.interest1,larr_defaults[theForm.elements.Categoria.selectedIndex][5] );
   };
 } ;


/**** NO- È DISABILITATA !!!!!!!!!!***********************************
// Errore non vale per la categoria di solo Pertinenza e nel caso sia indicato valore VA TOLTO!!!!
if (theForm.elements.Categoria.selectedIndex == 1) 
   {  
     theForm.elements.Rendita1.value = "0";
     lobj_current.interest1 = 0 ;
     lobj_current.Taxable1 = 0;
     lobj_current.TotalDeduction =0;
   }
************************/



 // Taxablep1
 if (isNaN (SIAG_parseNumber(theForm.elements.Renditap1.value) ) || SIAG_parseNumber(theForm.elements.Renditap1.value) == 0) {
   lobj_current.Taxablep1 = 0;
   lobj_current.interestp1 = 0;
 } else {
      lobj_current.interestp1 = SIAG_parseNumber(theForm.elements.Renditap1.value);
      lobj_current.Taxablep1  = get_BaseImponibile (lobj_current.interestp1,100 );

      lobj_current.Quotap1    = SIAG_parseNumber(theForm.elements.Quotap1.value);
	  if (isNaN(lobj_current.Quotap1) || lobj_current.Quotap1 <= 0 || lobj_current.Quotap1 > 100 ) {
		 larr_errors[larr_errors.length] = 8;
      }
 } ;

 // Taxablep2
 if (isNaN (SIAG_parseNumber(theForm.elements.Renditap2.value) ) || SIAG_parseNumber(theForm.elements.Renditap2.value) == 0) {
   lobj_current.Taxablep2 = 0;
   lobj_current.interestp2 = 0;
 } else {
      lobj_current.interestp2 = SIAG_parseNumber(theForm.elements.Renditap2.value);
      lobj_current.Taxablep2  = get_BaseImponibile (lobj_current.interestp2,100 );

      lobj_current.Quotap2    = SIAG_parseNumber(theForm.elements.Quotap2.value);
	  if (isNaN(lobj_current.Quotap2) || lobj_current.Quotap2 <= 0 || lobj_current.Quotap2 > 100 ) {
		 larr_errors[larr_errors.length] = 8;
      }
 } ;
 
 
 if ( theForm.elements.Categoria.selectedIndex != -1) {
      lobj_current.Percentage = SIAG_parseNumber(larr_defaults[theForm.elements.Categoria.selectedIndex][2]);
      lobj_current.Category   = theForm.elements.Categoria.selectedIndex;
 } else {
      // error already logged!
      lobj_current.Percentage = 0;
      lobj_current.Category   = 0;
 }
 
 
 lobj_current.Quota1       = SIAG_parseNumber(theForm.elements.Quota1.value);
 if (isNaN(lobj_current.Quota1) || lobj_current.Quota1 <= 0 || lobj_current.Quota1 > 100 ) {
     larr_errors[larr_errors.length] = 1;
 }
 



 lobj_current.fromMonth1 = theForm.elements.dalMese1.selectedIndex + 1;
 lobj_current.toMonth1   = theForm.elements.alMese1.selectedIndex + 1;
 
 if ( lobj_current.toMonth1 < lobj_current.fromMonth1 || lobj_current.fromMonth1 <= 0 ){
    larr_errors[larr_errors.length] = 2;
 }

 // checks on month 
 lobj_current.fromMonthp1 = theForm.elements.dalMesep1.selectedIndex + 1;
 lobj_current.toMonthp1   = theForm.elements.alMesep1.selectedIndex + 1;
 if ( lobj_current.toMonthp1 < lobj_current.fromMonthp1 || lobj_current.fromMonthp1 <= 0 ){
    larr_errors[larr_errors.length] = 7;
 }
 lobj_current.fromMonthp2 = theForm.elements.dalMesep2.selectedIndex + 1;
 lobj_current.toMonthp2   = theForm.elements.alMesep2.selectedIndex + 1;
 if ( lobj_current.toMonthp2 < lobj_current.fromMonthp2 || lobj_current.fromMonthp2 <= 0 ){
    larr_errors[larr_errors.length] = 7;
 }


 lobj_current.Month1       = (lobj_current.toMonth1 > 6 ? 6:lobj_current.toMonth1) - lobj_current.fromMonth1 + 1;
 if (lobj_current.Month1 < 0 ) lobj_current.Month1 = 0;
 
 lobj_current.TotalMonth1  = lobj_current.toMonth1 - lobj_current.fromMonth1 + 1;
 
 lobj_current.hasDeduction = theForm.elements.detrazione.checked;
 lobj_current.hasReduction = theForm.elements.inagibile.checked;
 
 
 lobj_current.Monthp1       = (lobj_current.toMonthp1 > 6 ? 6:lobj_current.toMonthp1) - lobj_current.fromMonthp1 + 1;
 if (lobj_current.Monthp1 < 0 ) lobj_current.Monthp1 = 0; 
 lobj_current.toMonthp1  = lobj_current.toMonthp1 - lobj_current.fromMonthp1 + 1;
 lobj_current.Monthp2       = (lobj_current.toMonthp2 > 6 ? 6:lobj_current.toMonthp2) - lobj_current.fromMonthp2 + 1;
 if (lobj_current.Monthp2 < 0 ) lobj_current.Monthp2 = 0; 
 lobj_current.toMonthp2  = lobj_current.toMonthp2 - lobj_current.fromMonthp2 + 1;


 lobj_current.NumOwners    = parseInt(theForm.elements.NrProp.value);
 if (isNaN (lobj_current.NumOwners) || lobj_current.NumOwners <= 0 ) {
     larr_errors[larr_errors.length] = 6;
 }

/*

 By MIT    Quota = 100 && Prop > 1 are incompatible parameters.
                         
*/

 if ( lobj_current.Quota1 == 100 && lobj_current.NumOwners > 1 ) {
     larr_errors[larr_errors.length] = 10;
 }

	// First step : compute Base value for Tax
	if ( isNaN (lobj_current.Taxable1) || isNaN(lobj_current.Percentage) ) {
	    // this is first exception!!!!
   	    lnum_impostaBase1 = 0 ;
	} else {
	    lnum_impostaBase1 = Math.round(lobj_current.Taxable1 * 100 * lobj_current.Percentage / 1000) / 100;
	}
	
	
    // compute annual tax for quota
	if (!( isNaN (lobj_current.Quota1) || lobj_current.Quota1 <= 0 || lobj_current.Quota1 > 100 )) {
	   lnum_impostaSpettanza1 = Math.round (  lnum_impostaBase1 * lobj_current.Quota1 )  / 100; 
	}
	
	// compute annual tax for time 
	if (!( isNaN (lobj_current.TotalMonth1) || lobj_current.TotalMonth1 <= 0 || lobj_current.TotalMonth1 > 12 )) {
	   lnum_impostalorda1 =  Math.round( lnum_impostaSpettanza1 * lobj_current.TotalMonth1 * 100 / 12) / 100 ; 
	}
	
	if (lobj_current.hasReduction && !isNaN(lnum_impostalorda1) ) {
	   // Apply 50% Reduction!!!!
	   lnum_impostalorda1 = Math.round( (lnum_impostalorda1 * 100) * lnum_Reduction ) / 100;
	}
	
	
	
	lnum_TotalDeduction = 0;
	lnum_impostalordap1  = 0;
	lnum_impostalordap2  = 0;
	
	//
	//
	//   BIG CHANGES ARE HERE!!!!!
	//   =========================
	//
	//
	
	
	
	if (lobj_current.hasDeduction) {
	    // compute quote for deduction 
		if ( !isNaN (lobj_current.NumOwners) && lobj_current.NumOwners > 0 ) {
		   lnum_TotalDeduction = Math.round( lnum_deduction * 100 / lobj_current.NumOwners) / 100 ; 
		}
	    // Compute deduction for time
	    
	    lobj_current.TotalDeduction = Math.round( lnum_TotalDeduction * lobj_current.TotalMonth1  / 12 * 100) / 100 ;
	}
	else {
	   lobj_current.TotalDeduction = 0;
	};
	
	//
	//
	//
	//
	//
		    
	    // Compute eventually "PERTINENZA1"
	    // ================================
		// First step : compute Base value for Tax
		lnum_impostaBasep1 = Math.round( lobj_current.Taxablep1 * 100 * lobj_current.Percentage  / 1000) /100;
		// compute annual tax for quota
		if (!( isNaN (lobj_current.Quotap1) || lobj_current.Quotap1 <= 0 || lobj_current.Quotap1 > 100 )) {
 	       lnum_impostaSpettanzap1 = Math.round (  lnum_impostaBasep1 * lobj_current.Quotap1 )  / 100; 
		}
		// compute annual tax for time 
		if (!( isNaN ( lobj_current.toMonthp1 ) || lobj_current.toMonthp1 <= 0 || lobj_current.toMonthp1 > 12 )) {
  	       lnum_impostalordap1 =  Math.round( lnum_impostaSpettanzap1 * lobj_current.toMonthp1 * 100 / 12) / 100 ; 
		}

	    // Compute eventually "PERTINENZA2"
	    // ================================
		// First step : compute Base value for Tax
		lnum_impostaBasep2 = Math.round( lobj_current.Taxablep2 * 100 * lobj_current.Percentage  / 1000) /100;
		// compute annual tax for quota
		if (!( isNaN (lobj_current.Quotap2) || lobj_current.Quotap2 <= 0 || lobj_current.Quotap2 > 100 )) {
 	       lnum_impostaSpettanzap2 = Math.round (  lnum_impostaBasep2 * lobj_current.Quotap2 )  / 100; 
		}
		// compute annual tax for time 
		if (!( isNaN ( lobj_current.toMonthp2 ) || lobj_current.toMonthp2 <= 0 || lobj_current.toMonthp2 > 12 )) {
  	       lnum_impostalordap2 =  Math.round( lnum_impostaSpettanzap2 * lobj_current.toMonthp2 * 100 / 12) / 100 ; 
		}

	
    if  ( larr_errors.length == 0 ) {
        // Totals....
        lobj_current.TotalTax = Math.round( (lnum_impostalorda1 * 100)  + (lnum_impostalordap1 * 100)  + (lnum_impostalordap2 * 100)  ) / 100  ;
        
        
//		alert ("Lordo principale: " + lnum_impostalorda1 + "\n" +
//		       "Lordo P 1       :" + lnum_impostalordap1 + "\n" +
//		       "Lordo P 2       :" + lnum_impostalordap2 + "\n" +
//		       "Totale Tassa    :" + lobj_current.TotalTax );
//      
        
				
	    // First Rate Computation
	    lobj_current.TaxValue1  = Math.round(lnum_impostalorda1 * 100 / lobj_current.TotalMonth1 * lobj_current.Month1 )  / 100 ;

		if ( !isNaN(lnum_impostalordap1) &&  lnum_impostalordap1 != 0) {
		   lobj_current.TaxValue1 +=  Math.round(lnum_impostalordap1 * 100 / lobj_current.toMonthp1 * lobj_current.Monthp1 ) / 100;
		} 
		if ( !isNaN(lnum_impostalordap2) &&  lnum_impostalordap2 != 0) {
		   lobj_current.TaxValue1 +=  Math.round(lnum_impostalordap2 * 100 / lobj_current.toMonthp2 * lobj_current.Monthp2 ) / 100;
		} 
		
		
		lobj_current.DeductionRate1 = Math.round(lobj_current.TotalDeduction  * 100 / lobj_current.TotalMonth1 * lobj_current.Month1) / 100  ;
     
        lobj_current.TaxRate1 = Math.round( (lobj_current.TaxValue1 * 100) - (lobj_current.DeductionRate1 * 100)) / 100;

        // if (lobj_current.TaxRate1 <= lnum_minValue) {
        // 
        // Round to mimal value is done when doing report of all data!!!!
        // 10.05.2002 By Ghost!   20.10 It´s Late but someone should do this!!!! :-( 
        if (lobj_current.TaxRate1 <= 0) {
           lobj_current.TaxToPayRate1 = 0
        } else {
           lobj_current.TaxToPayRate1 = lobj_current.TaxRate1;
        }
        
        
        lobj_current.TaxValue2      = Math.round( (lobj_current.TotalTax  * 100) - (lobj_current.TaxValue1 * 100) ) /100;
		lobj_current.DeductionRate2 = Math.round( (lobj_current.TotalDeduction * 100) - (lobj_current.DeductionRate1 * 100)) / 100;
        lobj_current.TaxRate2       = Math.round( (lobj_current.TaxValue2   * 100) - (lobj_current.DeductionRate2 * 100)) / 100;
        lobj_current.TaxToPayRate2  = Math.round( (lobj_current.TotalTax  * 100) - (lobj_current.TotalDeduction * 100) - ( lobj_current.TaxToPayRate1 * 100)) / 100;

        //if (lobj_current.TaxToPayRate2 <= lnum_minValue) {
        //By Ghost! Same as above!!
        if (lobj_current.TaxToPayRate2 <= 0 ) {
            lobj_current.TaxToPayRate2 = 0
        }

        theForm.elements.ImpostaR1.value = displayEuro(lobj_current.TaxValue1);
        theForm.elements.ImpostaR2.value = displayEuro(lobj_current.TaxValue2);
        theForm.elements.DetrazioneR1.value = displayEuro(lobj_current.DeductionRate1);
        theForm.elements.DetrazioneR2.value = displayEuro(lobj_current.DeductionRate2);
        theForm.elements.TotaleR1.value     = displayEuro(lobj_current.TaxRate1);
        theForm.elements.TotaleR2.value     = displayEuro(lobj_current.TaxRate2);
        theForm.elements.VersamentoR1.value = displayRoundedEuro(lobj_current.TaxToPayRate1);
        theForm.elements.VersamentoR2.value = displayRoundedEuro(lobj_current.TaxToPayRate2);

    } else  {
       alert ( parseErrors(larr_errors,lstr_lang) );
    }
}



// ================================================================================
// DATA DECLARATION
// ================================================================================
// ================================================================================
// DATA DECLARATION
// ================================================================================

