/*
 * ADDPLUS JS Random Text
 * Copyright 2007 ADDPLUS
 * Developed by Yuri D'Elia
 */


// conversion tables

var rndTable = new Array();

var rndChr = new Array
(
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  'w', 'x', 'y', 'z', '0', '1', '2', '3',
  '4', '5', '6', '7', '8', '9', '+', '/',
  ',', '!', '?', '(', ')', ':', '-', ' '
);


// global initialization

function rndInit()
{
  for(var i = 0; i != rndChr.length; ++i)
    rndTable[rndChr[i]] = i;
}

rndInit();


function RndText(obje, pool, delay)
{
  // defaults
  this.speed = 10;   // character update delay
  this.chrSpeed = 1; // character reveal speed per update

  // initialization
  var obje = obje.firstChild;
  var orig;
  var len;
  var rnd;
  var poolIdx = 0;
  var speed = this.speed;
  var chrSpeed = this.chrSpeed;
  var intId;


  function reset()
  {
    orig = (pool? nls.getCat(pool[poolIdx++ % pool.length]):
	    trimWs(obje.nodeValue));
    len = 0;

    // randomize all text
    var text = "";
    for(var i = 0; i != orig.length; ++i)
    {
      if(rndTable[orig.charAt(i)] === undefined)
	text += orig.charAt(i);
      else
	text += rndChr[parseInt(Math.random() * rndChr.length)];
    }

    // save and register
    rnd = text;
    obje.nodeValue = "";
    intId = setInterval(anim, speed);
  }


  function anim()
  {
    len = Math.min(len += chrSpeed, orig.length);
    var done = true;

    // alter the string
    var text = "";
    for(var i = 0; i != len; ++i)
    {
      if(rnd.charAt(i) != orig.charAt(i))
	text += rndChr[(rndTable[rnd.charAt(i)] + 1) % rndChr.length];
      else
	text += orig.charAt(i);
    }

    // save and register
    obje.nodeValue = text;
    text += rnd.slice(len);
    if(text != orig)
      rnd = text;
    else
    {
      clearInterval(intId);
      if(delay !== undefined)
	setTimeout(reset, delay);
    }
  }


  reset();
  return this;
}
