
/**
 *  timeloop.js -> executa um loop com um tempo de espera entre as voltas
 *  -------------------------
 *  Autor: Cau Guanabara
 *  Email: caugb@ibest.com.br
 *  Data:  2005-11-07
 *  -------------------------

   Referência
	 ----------
	 
   timeLoop(string LOOP_STR, string COMMAND, integer DELAY [, string END_COMMAND])
   
   Parâmetros
   ----------
   LOOP_STR -> string contendo os parâmetros para o loop, como se fosse para um FOR,
               com algumas restrições. A string, deve conter 3 partes, divididas por ';'.
               1ª parte (inicialização da variável): 'nome_var = valor_numérico'
               2ª parte (condição para o loop): 'nome_var [< , > , <= ou >=] valor_numérico'
               3ª parte (incremento/decremento - há 3 possibilidades):
                    a. 'nome_var++' ou 'nome_var--'
									  b. 'nome_var += valor_numérico' ou 'nome_var -= valor_numérico'
                    c. 'nome_var = nome_var [+ ou -] valor_numérico'
		 Alguns exemplos válidos
		 -----------------------
		 'i = 0; i <= 11; i++'
		 'inc = 90; inc > 50; inc -= 2'
		 'x = 100; x >= 0; x = x - 5'
						
   COMMAND -> string contendo os comandos a serem executados em cada volta do loop.
   DELAY -> intervalo de tempo (em milisegundos) entre as voltas e após o término do loop.
	 END_COMMAND -> string contendo os comandos a serem executados ao final do loop. Esse 
	                parâmetro é fundamental se queremos executar algo quando o loop terminar. 
									Se timeLoop for chamada e na sequência chamarmos outra função, ela será 
									executada no meio do loop, não no fim. Resolva isso criando uma função para 
									continuar o processamento e mande uma chamada para ela como o 4º parâmetro.
*/

var tl_cmd, tl_endCmd, tl_delay, tl_varname, 
    tl_iniloop, tl_endloop, tl_operator, tl_increment, 
		tl_loopFunction, tl_tout = null;

function timeLoop(loopstr,cmd,delay,doatend) {
tl_cmd = cmd;
tl_delay = delay;
tl_endCmd = doatend;
  if(tl_parseStr(loopstr)) {
    tl_loopFunction = new Function(tl_cmd);
    tl_execute();
  }
}

function tl_execute() {
	if(tl_tout) clearTimeout(tl_tout);
  if(tl_proceed()) {
  tl_loopFunction();
  tl_iniloop += tl_increment;
  new Function(tl_varname+' = '+tl_iniloop+';')();
  tl_tout = setTimeout('tl_execute()', tl_delay);
  } else new Function(tl_endCmd)();
}

function tl_proceed() { //alert("var ret = (tl_iniloop "+tl_operator+" tl_endloop);");
new Function("var_ret = (tl_iniloop "+tl_operator+" tl_endloop);")(); 
return var_ret;
}

function tl_parseStr(loopstr) {
var arr = loopstr.split(/\s*;\s*/);
  if(arr.length != 3) return false; 
	
	if(/^([$a-zA-Z_][$\w]*)\s*=\s*(\-?\d+)$/.test(arr[0])) {
	tl_varname = RegExp.$1; 
	tl_iniloop = parseInt(RegExp.$2);
	} else return false;
	
	if(/^[$a-zA-Z_][$\w]*\s*([<>]=?)\s*(\-?\d+)$/.test(arr[1])) {
	tl_operator = RegExp.$1; tl_endloop = parseInt(RegExp.$2); 
	} else return false;
	
  if(/((\+)\+|(\-)\-)/.test(arr[2])) {
	tl_increment = parseInt((RegExp.$1 == '-' ? '-' : '')+'1'); 
	} else if(/^(.+(\+|\-)=\s*(\d+)|[$\w]+\s*=\s*[$\w]+\s*(\+|\-)\s*(\d+))$/.test(arr[2])) {
  tl_increment = parseInt((RegExp.$2 == '-' ? '-' : '')+RegExp.$3);
  } else return false;

new Function(tl_varname+' = '+tl_iniloop+';')();
return true;
}
