function Ticker()
{
   var m_pszTickerVarName = "";
   var m_szEventEnd = "";

   var m_aszChars = new Array();
   var m_divTick;
   var m_szString;
   var m_aszStringSrc;
   var m_aszStringTrg;
   var m_szRemainChars;
   var m_nInterval;

   m_aszChars[0] = "0";
   m_aszChars[1] = "1";
   m_aszChars[2] = "2";
   m_aszChars[3] = "3";
   m_aszChars[4] = "4";
   m_aszChars[5] = "5";
   m_aszChars[6] = "6";
   m_aszChars[7] = "7";
   m_aszChars[8] = "8";
   m_aszChars[9] = "9";
   m_aszChars[10] = ":";
   m_aszChars[11] = ";";
   m_aszChars[12] = "<";
   m_aszChars[13] = "=";
   m_aszChars[14] = ">";
   m_aszChars[15] = "?";
   m_aszChars[16] = "F";
   m_aszChars[17] = "I";
   m_aszChars[18] = "J";
   m_aszChars[19] = "L";
   m_aszChars[20] = "a";
   m_aszChars[21] = "b";
   m_aszChars[22] = "c";
   m_aszChars[23] = "d";
   m_aszChars[24] = "e";
   m_aszChars[25] = "f";
   m_aszChars[26] = "g";
   m_aszChars[27] = "h";
   m_aszChars[28] = "i";
   m_aszChars[29] = "j";
   m_aszChars[30] = "k";
   m_aszChars[31] = "l";
   m_aszChars[32] = "n";
   m_aszChars[33] = "o";
   m_aszChars[34] = "p";
   m_aszChars[35] = "q";
   m_aszChars[36] = "r";
   m_aszChars[37] = "s";
   m_aszChars[38] = "t";
   m_aszChars[39] = "u";
   m_aszChars[40] = "v";
   m_aszChars[41] = "x";
   m_aszChars[42] = "y";
   m_aszChars[43] = "z";
   m_aszChars[0] = "0";
   m_aszChars[1] = "1";
   m_aszChars[2] = "2";
   m_aszChars[3] = "3";
   m_aszChars[4] = "4";
   m_aszChars[5] = "5";
   m_aszChars[6] = "6";
   m_aszChars[7] = "7";
   m_aszChars[8] = "8";
   m_aszChars[9] = "9";
   m_aszChars[10] = ":";
   m_aszChars[11] = ";";
   m_aszChars[12] = "@";
   m_aszChars[13] = "=";
   m_aszChars[14] = ">";
   m_aszChars[15] = "a";
   m_aszChars[16] = "F";
   m_aszChars[17] = "I";
   m_aszChars[18] = "J";
   m_aszChars[19] = "L";
   m_aszChars[20] = "[";
   m_aszChars[21] = "a";
   m_aszChars[22] = "]";
   m_aszChars[23] = "a";
   m_aszChars[24] = "a";
   m_aszChars[25] = "a";
   m_aszChars[26] = "a";
   m_aszChars[27] = "b";
   m_aszChars[28] = "c";
   m_aszChars[29] = "d";
   m_aszChars[30] = "e";
   m_aszChars[31] = "f";
   m_aszChars[32] = "g";
   m_aszChars[33] = "h";
   m_aszChars[34] = "i";
   m_aszChars[35] = "j";
   m_aszChars[36] = "k";
   m_aszChars[37] = "l";
   m_aszChars[38] = "n";
   m_aszChars[39] = "o";
   m_aszChars[40] = "p";
   m_aszChars[41] = "q";
   m_aszChars[42] = "r";
   m_aszChars[43] = "s";
   m_aszChars[44] = "t";
   m_aszChars[45] = "u";
   m_aszChars[46] = "v";
   m_aszChars[47] = "x";
   m_aszChars[48] = "y";
   m_aszChars[49] = "z";

   this.Tick = function(
   szTickerVarName,
   szEventEnd,
   nInterval,
   szDivTicker,
   szString)
   {
      var nCntChars = szString.length;
      var nTimes;

      /* Se inicializan las variables */
      m_pszTickerVarName = "";
      m_szEventEnd = "";
      m_divTick = null;
      m_szString = new Array();
      m_aszStringSrc = new Array();
      m_aszStringTrg = new Array();
      m_szRemainChars = "";
      m_nInterval = 0;

      /* Se toma el objeto donde se pintará el texto */
      m_divTick = document.getElementById(szDivTicker);

      /* Se almacenan los valores */
      m_szTickerVarName = szTickerVarName;
      m_szEventEnd = szEventEnd
      m_szString = szString;
      m_nInterval = nInterval;

      /* Se recorre la cadena */
      for (nChar = 0; nChar < nCntChars; nChar++)
      {
         /* Se toma la cadena en un array */
         m_aszStringSrc[nChar] = szString.substring(nChar, nChar +1);

         /* Se inicializa */
         m_aszStringTrg[nChar] = "|";

         /* Se toman los índices de los carácteres que se irán quitando */
         m_szRemainChars += "|" + nChar + ";";
      }

      /* Se lanza el "ticker" */
      this.TickEx();

   }

   this.TickEx = function()
   {
      var nCharIndex;
      var szKey;
      var szRndChar;
      var nPos = 0;
      var szBuffer;
      var szToken;
      var nTokenValue;

      if ( m_divTick == null )
      {
         return;
      }

      /* Se busca el carácter a poner */
      nCharIndex = Math.floor( Math.random() * ( m_szRemainChars.length / 3 ) );

      /* Se busca el valor */
      szToken = findTokenByIndex(m_szRemainChars, nCharIndex, "|", ";");

      /* Se quita el "Token" */
      m_szRemainChars = removeTokenByString(m_szRemainChars, szToken);

      nTokenValue = ExtractToken(szToken, "|", ";");

      /* Se traspasa el valor */
      m_aszStringTrg[nTokenValue] = m_aszStringSrc[nTokenValue];

      /* Se compone el resto de la cadena (carácteres ilegibles) */
      SimbolizeString();

      /* Se compone la cadena */
      szRndChar = m_aszStringTrg.join("");

      /* Se pinta el texto obtenido */
      m_divTick.innerHTML = szRndChar;

      /* Si ya no quedan más se sale */
      if ( m_szRemainChars.length == 0 )
      {
         /* Se vuelve a pintar */
         setTimeout(m_szEventEnd, 0);
         return;
      }

      /* Se vuelve a pintar */
      setTimeout(m_szTickerVarName + ".TickEx()", m_nInterval);
   }

   function rnd()
   {
      rnd.seed = (rnd.seed*9301+49297) % 233280; 
      return rnd.seed/(233280.0); 
   }
   
   function removeTokenByIndex(
   szString,
   nTokenToRemove,
   szPrefix,
   szSuffix)
   {
      var nPos = 0;
      var szBuffer;

      /* Se recorre la cadena hasta la posición deseada */
      for ( nSep = 0 ; nSep <= nTokenToRemove ; nSep++ )
      {
         nPos = szString.indexOf(szPrefix, nPos) + 1;
      }

      /* Se toma la parte inicial */
      szBuffer = szString.substring(0, nPos - 1);
      nPos = szString.indexOf(";", nPos);

      /* Se toma la parte final */
      szBuffer += szString.substring(nPos + 1);
      szString = szBuffer;

      /* Se retorna la cadena */
      return szString;
   }

   function removeTokenByString(
   szString,
   szToken)
   {
      return szString.replace(szToken, "");
   }

   function findTokenByIndex(
   szString,
   nToken,
   szPrefix,
   szSuffix)
   {
      var nPos = 0;
      var szBuffer;

      /* Se recorre la cadena hasta la posición deseada */
      for ( nSep = 0 ; nSep <= nToken ; nSep++ )
      {
         nPos = szString.indexOf(szPrefix, nPos) + 1;
      }

      /* Se toma la parte inicial */
      szString = szString.substring(nPos - 1);
      nPos = szString.indexOf(szSuffix);

      /* Se toma la parte final */
      szString = szString.substring(0, nPos + 1);

      /* Se retorna la cadena */
      return szString;
   }

   function ExistsTokenByValue(
   szString,
   szValue,
   szPrefix,
   szSuffix)
   {
      return (szString != szString.replace(szPrefix + szValue + szSuffix, "") );
   }

   function ExtractToken(
   szToken,
   szPrefix,
   szSuffix)
   {
      szToken = szToken.replace(szPrefix, "");
      szToken = szToken.replace(szSuffix, "");
      return szToken;
   }

   function SimbolizeString()
   {
      /* Se compone la cadena */
      for ( nChar = 0; nChar < m_aszStringTrg.length; nChar++ )
      {
         if ( ExistsTokenByValue(m_szRemainChars, nChar, "|", ";") )
         {
            m_aszStringTrg[nChar] = m_aszChars[ Math.floor( Math.random() * m_aszChars.length ) ];
         }
      }

      /* Se retorna */
      return m_aszStringTrg;
   }
}
