/**************************************************************
 * Routine generiche per il calcolo in virgola mobile
 *
 * 05/12/2003 18:05 - Axioma - Versione 1.1
 *
 * Includere questo file in tutti i pkg che eseguono calcoli 
 * Viene corretto l'errore che javascript fa quando sono 
 * coinvolti operatori non interi.
 * Javascript non supporta calcoli con più di 15 decimali
 * 
 **************************************************************/

/**************************************************************
 * Versione 1.1
 *
 * Troncata la precisione a 10 cifre decimali per evitare problemi
 * Aggiunte alcune funzioni di conversione dei numeri
 * 
 **************************************************************/

/**************************************************************
 * Funzione di calcolo
 *
 * Parametri:
 *
 * j_op1: 1° operando (numero o stringa, con separatore "." o ",")  
 * j_act: operazione  (+,-,*,/) 
 * j_op2: 2° operando (numero o stringa, con separatore "." o ",")  
 * ritorna un numero con separatore decimale "." 
 **************************************************************/

function calcola(j_op1, j_act, j_op2)
{
  var j_res;
  var j_dec;
  var j_res_round;
  var j_decimal;
  var j_length;
  var j_comma;
  var j_dec_max = 10;
  
  j_op1 = "" + j_op1;
  j_op2 = "" + j_op2;
      
  if (/[^+\-*/]/g.test(j_act) || j_act.length>1)
  {
    return null;
  }
  else if (/[^0-9.,\-]/g.test(j_op1))
  {
    return null;
  }
  else if (/[^0-9.,\-]/g.test(j_op2))
  {
    return null;
  }
  else
  {
    j_comma = j_op1.indexOf(",");
    j_op1 = j_op1.replace(/,/g,".");
    j_op2 = j_op2.replace(/,/g,".");
    j_op1 = parseFloat(j_op1);
    j_op2 = parseFloat(j_op2);
    
    if (j_act == "+")
    {
      j_res = j_op1 + j_op2;
    }
    else if (j_act == "-")
    {
      j_res = j_op1 - j_op2;
    }
    else if (j_act == "*")
    {
      j_res = j_op1 * j_op2;
    }
    else if (j_act == "/")
    {
      if (j_op2 != 0)
      {
        j_res = j_op1 / j_op2;
      }
      else
      {
        return null;
      }
    }
    j_decimal = (""+j_res).indexOf(".")
    j_length  = (""+j_res).length
        
    if (j_length != -1)
    { 
      j_dec =j_length - j_decimal
      //alert("Risultato:"+j_res+" Decimali:"+j_dec+" Punto:"+j_decimal)
      if (j_dec>=j_dec_max+2)
      {
        j_res_round = Math.round(j_res*Math.pow(10, j_dec_max))/Math.pow(10, j_dec_max);
        /*if (j_comma != -1)
        {
          //così però restitusce solo una stringa
          j_res_round = (""+j_res_round).replace(/\./g,",");//String.fromCharCode(44));
        }
        */
        return j_res_round;
      }
      else
      {
        return j_res;
      }
    }
    else
    {
      return j_res;
    }  
  }   
}

/**************************************************************
 * Funzione di conversione a float e modifica del separatore decimale
 *
 * Parametri:
 *
 * j_val: stringa contenente un numero su cui fare la conversione  
 * ritorna un numero in virgola mobile con separatore decimale "." 
 **************************************************************/

function tofloat(j_val)
{
  return (isNaN(parseFloat((""+j_val).replace(/\x2C/g,"."))))?0:parseFloat((""+j_val).replace(/\x2C/g,"."))
}

/**************************************************************
 * Funzione di conversione a intero e modifica del separatore decimale
 *
 * Parametri:
 *
 * j_val: stringa contenente un numero su cui fare la conversione  
 * ritorna un numero intero 
 **************************************************************/

function toint(j_val)
{
  return (isNaN(parseInt((""+j_val),10)))?0:parseInt((""+j_val),10)
}

/**************************************************************
 * Funzione di nvl (per non stampare gli 0)
 *
 * Parametri:
 *
 * j_val:   stringa contenente un numero su cui fare la conversione
 * j_subst: valore da sostituire se j_subst è nullo 
 * ritorna un numero o un carattere 
 **************************************************************/

function notnull(j_val,j_subst)
{
  var j_str 
  j_str = (j_subst)?j_subst:"";
  return ((j_val!=0)?j_val:j_str)
}

/**************************************************************
 * Funzione di conversione a carattere con sep. decimale ","
 *
 * Parametri:
 *
 * j_val:   stringa contenente un numero su cui fare la conversione
 * ritorna una stringa con il separatore decimale modificato 
 **************************************************************/

function tonumberformat(j_val)
{
  return j_val.replace(/\./g,",")
}

/**************************************************************
 * Funzione di conversione a carattere con sep. decimale "."
 *
 * Parametri:
 *
 * j_val:   stringa contenente un numero su cui fare la conversione
 * ritorna una stringa con il separatore decimale modificato 
 **************************************************************/

function tonumberparam(j_val)
{
  return j_val.replace(",",".")
}

/**************************************************************
 * Funzione di arrotondamento a n cifre decimali
 *
 * Parametri:
 *
 * j_val:   numero su cui fare la conversione
 * j_dec:   numero di cifre decimali
 * ritorna numero arrotondato al valore di cifre indicato 
 **************************************************************/

function rounddec(j_val, j_dec)
{
  j_dec = (j_dec)?j_dec:2;
  return Math.round(j_val * Math.pow(10, j_dec)) / Math.pow(10, j_dec);
}


/**************************************************************
 * Funzione di controllo di inserimento valore numerico
 *
 * Parametri:
 *
 * theElement:       nomeform.nomecampo
 **************************************************************/

function isNumber(theElement)
{
  s = theElement.value;
  if (isNaN(Math.abs(theElement.value)) && (s.charAt(0) != '#'))
  {
       
         for (var i=0; (i <= s.length && s.charAt(i) != '.'); )
         {
          if (((s.charAt(i) >= 0) && (s.charAt(i) <= 9)) ||
               (s.charAt(i) == ',' && i != 0 && i != s.length-1) || (s.charAt(i) == '.') )
                 i++; 
          else 
           { 
             theElement.focus(); 
             theElement.select(); 
             return false; 
           } 
         } 
        if (s.charAt(i) == '.') 
         { 
	     for (i++;i <= s.length; ) 
           { 
            if (((s.charAt(i) >= 0) && (s.charAt(i) <= 9))) 
              i++; 
            else 
            { 
             theElement.focus(); 
             theElement.select(); 
             return false;
            } 
           } 
         }  
  } 
  return true;
}


