		var NumDatos=12;

		//Funciones para CMA

    //Funcion que retorna un valor entero igual a Xi=(Exp(-i/CMA)*CMA)
    //Donde CMA = capacidad maxima de almacenamiento
    function ObtValor(CMA,Posi)
    {
      if ((Posi>=0) && (Posi<=2399))                 //MAXTAB=2399
        return(Math.floor(Math.exp(-Posi/CMA)*CMA));
      else
        return(-1);
    }

    //BuscarPosi: Algoritmo de busqueda binaria para encontrar
    //             el valor solicitado

    function BuscarPosi(CMA,Ini,Fin,Valor)
    {var PosMitad;
     var ValCalculado=-1;

      while ((Ini<=Fin) && (ValCalculado!=Valor))
      {
        PosMitad=Math.floor((Ini+Fin)/2)
        ValCalculado=Math.floor(Math.exp(-PosMitad/CMA)*CMA)
        if (ValCalculado>Valor)
          Ini=PosMitad+1;
        else if (ValCalculado<Valor)
          Fin=PosMitad-1;
      }
      if (ValCalculado==Valor)
        return(PosMitad);
      else
        return(-1);
    }

    function ObtPosi(CMA,Valor)
    {var PosTemp;
     var ValCalculado;

      if ((Valor>=0) && (Valor<=CMA))
      {
        PosTemp=BuscarPosi(CMA,0,2399 , Valor)
        if (PosTemp>0)
        {
          while (ObtValor(CMA,PosTemp)==Valor)
            PosTemp--;
          PosTemp++;
        }
      }
      return(PosTemp);
    }

    function ExistenPositivosNegativos(D) 
    {var j=0;
     var ExistenPos=false;
     var ExistenNeg=false;
    
      while ((j<=(NumDatos-1)) && ((ExistenNeg==false) || (ExistenPos==false)))
      {
        if (D[j]<0)
          ExistenNeg=true;
        else if (D[j]>0)
          ExistenPos=true;
        j++;
      }
      if ((ExistenPos==true) && (ExistenNeg==true))
        return(true);
      else
        return(false);
    }

    //Funcion PosMaySecNegativos:
    //Localiza la posición de la mayor secuencia deficit climaticos negativos
    function PosMaySecNegativos(D)
    {var i=0;
     var PosIni=0;
     var Posi=0;
     var inPosMayT=0;
     var inCanMayT=0;
     var inPosMay=0;
     var inCanMay=0;
     
      if ((D[0]<0) && (D[NumDatos-1]<0))
      {
        PosIni=NumDatos-1;
        while (((PosIni-1)>1) && (D[PosIni-1]<0))
          PosIni--;
        //Numero negativo que indica la cantidad de posiciones
        //atras en las que debe empezar la busqueda
        PosIni=-(NumDatos-PosIni);
      }
      else
        PosIni=0;

      while (i<=(NumDatos-1))
      {
        Posi=(i+(NumDatos+PosIni))%NumDatos;
        if (D[Posi]<0)
        {
          inPosMayT=Posi;
          while ((D[Posi]<0) && (i<=(NumDatos-1)))
          {
            inCanMayT++;
            i++;
            Posi=(i+(NumDatos+PosIni))%NumDatos;
          }
          if (inCanMayT>inCanMay)
          { 
            inCanMay=inCanMayT;
            inPosMay=inPosMayT;
          }
          inCanMayT=0;
          inPosMayT=0;
        }
        else
          i++;
      }
      return(inPosMay);
    }


    function Validar()
    {
      for (i=0; i<=(NumDatos-1); i++)
      {
        campo=eval("ETP"+i);
        if (isNaN(parseFloat(campo.value)))
          campo.value=0;
        campo=eval("ETP"+i);
        if (isNaN(parseFloat(campo.value)))
          campo.value=0;
      }

      if (isNaN(parseInt(CMAXAL.value)))
        CMAXAL.value=100;
      else if (parseInt(CMAXAL.value)<1)
        CMAXAL.value=1;
      else if (parseInt(CMAXAL.value)>400)
        CMAXAL.value=400;    
    }

    function Calcular() 
    {
      var i;
      var existenPositivos;
      var PosIni=0;
      var Posi;
      var PosiTemp;
      var SumNeg;
      var PPT= new Array();
      var ETP= new Array();
      var DEF= new Array();
      var NA= new Array();
      var HA= new Array();
      var MH= new Array();
      var ETR= new Array();
      var DEA= new Array();
      var EXC= new Array();
      var Campo;
      
      Validar();
      
      //Copia la PPT Y ETP de los controles al vector
      
      
      for (i=0; i<=(NumDatos-1); i++)
      {
        campo=eval("PPT"+i);
        PPT[i]=parseFloat(campo.value);
        campo=eval("ETP"+i);
        ETP[i]=parseFloat(campo.value);
      }
 
      CMA=parseInt(CMAXAL.value);
      //Hallamos el Deficit Climatico
      //Deficit climatico [i] = Precipitacion [i] - evapotranspiración potencial [i]
      //DEF[i]=PPT[i]-ETP[i]
      for (i=0;i<=(NumDatos-1);i++)
        DEF[i]=parseInt(PPT[i]-ETP[i]);

			//Determinar si existen DEFICIT positivos y negativos
      //existenPos=ExistenPositivos(DEF);
      //existenNeg=ExistenNegativos(DEF);


      //Encontrar la mayor secuencia de DEFICIT negativos
      //if ((existenPos==true)&&(existenNeg==true))
      if (ExistenPositivosNegativos(DEF)==true)
        PosIni=PosMaySecNegativos(DEF);

      //Hallamos el Negativo Acumulado y la Humedad Acumulada
      i=0;
      Posi=(i+PosIni)%NumDatos;
      if (DEF[Posi]<0)
      {
        NA[Posi]=DEF[Posi];
        HA[Posi]=ObtValor(CMA,Math.abs(NA[Posi]));
        SumNeg=NA[Posi];
      }
      else
      { 
        HA[Posi]=DEF[Posi];
        if (HA[Posi]>CMA)
          HA[Posi]=CMA;
        NA[Posi]=-ObtPosi(CMA,HA[Posi]);
        SumNeg=NA[Posi];
      }
      i++;
      while (i<=(NumDatos-1))
      {
        Posi=(i+PosIni)%NumDatos;
        PosiTemp=(Posi+(NumDatos-1))%NumDatos;
        if (DEF[Posi]<1)
        {
          SumNeg=-(Math.abs(SumNeg)+Math.abs(DEF[Posi]));
          PosiTemp=(Posi+(NumDatos-1))%NumDatos;
          if (DEF[PosiTemp]>=0)
            SumNeg=DEF[Posi];
          NA[Posi]=SumNeg;
          if (Math.abs(NA[Posi])<=2399)
            HA[Posi]=ObtValor(CMA,Math.abs(NA[Posi]));
          else
            HA[Posi]=0;
        }
        else
        {
          HA[Posi]=HA[PosiTemp]+DEF[Posi];
          if (HA[Posi]>CMA)
            HA[Posi]=CMA;
          NA[Posi]=-ObtPosi(CMA,HA[Posi]);
          SumNeg=NA[Posi];
        }
        i++;
      }

      //Hallamos el Movimiento de Humedad
      //MH(i)=HA(i)-HA(i-1)
      MH[0]=HA[0]-HA[NumDatos-1];
      for (i=1;i<=(NumDatos-1);i++)
        MH[i]=HA[i]-HA[i-1];

      //Hallamos la Evapotranspiración Real
      for (i=0;i<=(NumDatos-1);i++)
      {
        if (HA[i]==CMA)
          ETR[i]=ETP[i];
        else
        {
          if (DEF[i]<0)
            ETR[i]=PPT[i]+Math.abs(MH[i]);
          else
            ETR[i]=PPT[i]-MH[i];
        }
        ETR[i]=Math.floor(ETR[i]*100)/100;
      }
  
      //Hallamos la Deficiencia o el exceso
      for (i=0;i<=(NumDatos-1);i++)
      {
        if (ETP[i]>ETR[i])
        {
          DEA[i]=Math.floor(ETP[i]-ETR[i]);
          EXC[i]=0;
        }
        else if (ETP[i]==ETR[i])
        { 
          DEA[i]=0;
          EXC[i]=DEF[i]-MH[i];
        }
        else 
        {
          DEA[i]=0;
          EXC[i]=0;
        } 
      }

      //Copia de los vectores a los controles
      for (i=0; i<=(NumDatos-1); i++)
      {
        campo=eval("DEF"+i);
        campo.innerHTML=DEF[i];
        campo=eval("NA"+i);
        campo.innerHTML=NA[i];
        campo=eval("HA"+i);
        campo.innerHTML=HA[i];
        campo=eval("MH"+i);
        campo.innerHTML=MH[i];
        campo=eval("ETR"+i);
        campo.innerHTML=ETR[i];
        campo=eval("DEA"+i);
        campo.innerHTML=DEA[i];
        campo=eval("EXC"+i);
        campo.innerHTML=EXC[i];
      }      
    }

    function Aleatorio()
    {
      var campo;
      
      for (i=0; i<=(NumDatos-1); i++)
      {
        campo=eval("PPT"+i);
        campo.value=(Math.floor(Math.random()* 7500)+5000)/100;
        campo=eval("ETP"+i);
        campo.value=(Math.floor(Math.random()* 7500)+5000)/100;
      }
      CMA=parseInt(CMAXAL.value);
      LimpiarResultados();
    }
    
    function LimpiarEntradas()
    {
      var campo;
      
      
      for (i=0; i<=(NumDatos-1); i++)
      {
        campo=eval("PPT"+i);
        campo.value=0; 
        campo=eval("ETP"+i);
        campo.value=0;
      }
    }
    
    function LimpiarResultados()
    {
      var campo;
      
      for (i=0; i<=(NumDatos-1); i++)
      {
        campo=eval("DEF"+i);
        campo.innerHTML=""; 
        campo=eval("NA"+i);
        campo.innerHTML="";
        campo=eval("HA"+i);
        campo.innerHTML="";
        campo=eval("MH"+i);
        campo.innerHTML="";   
        campo=eval("ETR"+i);
        campo.innerHTML="";
        campo=eval("DEA"+i);
        campo.innerHTML="";
        campo=eval("EXC"+i);
        campo.innerHTML="";                                             
      }
    }
    
    function Nuevo()
    {
      LimpiarEntradas();
      LimpiarResultados();
    }

    function CrearTablaBH(contenedor)
    {
      var textoHTML;
      var i;
      var elem;

      elem=document.getElementById(contenedor);
      //while (elem.children.length>0)
      //  elem.removeChild(elem.children(0));
			textoHTML="";
			elem.innerHTML=textoHTML;
			if (NumDatos>=12)
			{
				textoHTML+="<table class=\"bh\" align=\"center\">";
				textoHTML+="<tr>";
				textoHTML+="<td class=\"titulo\" title=\"Número\">";
				textoHTML+="NUM</td>";
				textoHTML+="<td class=\"titulo\" title=\"Precipitación\">";
				textoHTML+="PPT</td>";
				textoHTML+="<td class=\"titulo\" title=\"ETP\">";
				textoHTML+="ETP</td>";
				textoHTML+="<td class=\"titulo\" title=\"DEF\">";
				textoHTML+="DEF</td>";
				textoHTML+="<td class=\"titulo\" title=\"NA\">";
				textoHTML+="NA</td>";
				textoHTML+="<td class=\"titulo\" title=\"HA\">";
				textoHTML+="HA</td>";
				textoHTML+="<td class=\"titulo\" title=\"MH\">";
				textoHTML+="MH</td>";
				textoHTML+="<td class=\"titulo\" title=\"ETR\">";
				textoHTML+="ETR</td>";
				textoHTML+="<td class=\"titulo\" title=\"DEF\">";
				textoHTML+="DEF</td>";
				textoHTML+="<td class=\"titulo\" title=\"EXC\">";
				textoHTML+="EXC</td>";
				textoHTML+="</tr>";
				for (i=0; i<NumDatos; i++)
				{
					textoHTML+="<tr>";
				  textoHTML+="<th>"+(i+1)+"</th>";
				  textoHTML+="<td>";
				  textoHTML+="<input type=\"text\" size=\"6\" value=\"0\" id=\"PPT"+i+"\"";
					textoHTML+=" onchange=\"LimpiarResultados()\">";
				  textoHTML+="</td>";
				  textoHTML+="<td>";
				  textoHTML+="<input type=\"text\" size=\"6\" value=\"0\" id=\"ETP"+i+"\"";
					textoHTML+=" onchange=\"LimpiarResultados()\">";
				  textoHTML+="</td>";
				  textoHTML+="<td class=\"resultado\">";
				  textoHTML+="<label id=\"DEF"+i+"\"></label>";
				  textoHTML+="</td>";
				  textoHTML+="<td class=\"resultado\">";
				  textoHTML+="<label id=\"NA"+i+"\"></label>";
				  textoHTML+="</td>";
				  textoHTML+="<td class=\"resultado\">";
				  textoHTML+="<label id=\"HA"+i+"\"></label>";
				  textoHTML+="</td>";
				  textoHTML+="<td class=\"resultado\">";
				  textoHTML+="<label id=\"MH"+i+"\"></label>";
				  textoHTML+="</td>";
				  textoHTML+="<td class=\"resultado\">";
				  textoHTML+="<label id=\"ETR"+i+"\"></label>";
				  textoHTML+="</td>";
				  textoHTML+="<td class=\"resultado\">";
				  textoHTML+="<label id=\"DEA"+i+"\"></label>";
				  textoHTML+="</td>";
				  textoHTML+="<td class=\"resultado\">";
				  textoHTML+="<label id=\"EXC"+i+"\"></label>";
				  textoHTML+="</td>";

					textoHTML+="</tr>";
				}

				textoHTML+="</table>";
			}
      elem.innerHTML=textoHTML;

		}
