/*******************************************************
dmsLiveList
Copyright (C) 2006 Rafael Dohms.
**************************

Author:
	Rafael Dohms (dooms at terra dot com dot br)
	http://www.rafaeldohms.com.br

*******************************************************
en:
This is an AJAX implementation of a Spy tool. It shows
a real-time list of whateever it is you want to display.

pt_br:
Este script é uma implementação AJAX de um script de
"Spy". Ou seja uma lista atualizada em tempo real de
qualquer itens que você possa desejar apresentar, por
exemplo, matérias de um RSS.
*******************************************************/

/******************************************************
USAGE:
----> example.htm

<script>
//Instanciar objeto
var AC = new dmsAutoComplete('string','acDiv');

//Definir função de retorno
AC.chooseFunc = function(id,label){
	alert(id+'-'+label);
}
</script>
*******************************************************/

function dmsLL(divname){
	
	var me = this;
	//Configuration (edit here or on local instance)
	this.effects 		= 1; //Usar ou não Script.aculo.us
	this.ajaxTarget 	= 'dmsSpy.php'; //Fonte dos dados
	this.updateInterval	= 5000; //em milisegundos
	this.listLength		= 5; //número de elementos a apresentar
	this.iniLoad		= this.listLength; //Número de itens a serem carregados no primeiro load
	
	//Do not Edit Below
	this._shown			= new Array;
	this._new 			= new Array;
	this._target 		= document.getElementById(divname);
	this._timer 		= "";
	this._olddiv		= undefined;
	this._firstLoad		= 1;
	this._resultReady 	= 0;
	this._loadingState 	= 0;

	//Crate AJAX Request
	this.ajaxReq = createRequest();
	
	this.init = function(){
		me.showLoading();
		me.getNewItems();
		if (me._firstLoad) me._firstLoad = 0;
		me.updateList();
	}

	this.showLoading = function (){
		me._target.innerHTML = "<div class='loading'><img src=load.gif></div>";	
		me._loadingState = 1;
	}

	this.hideLoading = function (){
		me._target.innerHTML = "";	
		me._loadingState = 0;
	}
	
	this.updateList = function(){
		
		if (!me.resultReady){
			me._timer = setTimeout( function(){ me.updateList(); }, 500);
			return false;
		}
		
		if (me._loadingState){
			me.hideLoading();	
		}
		
		while(me._new.length > 0){
			var it = me._new.shift();
			
			id = "spy_"+it['id'];
			newdiv = document.createElement('div');
			newdiv.id = id;
			newdiv.className = 'spy';
			newdiv.innerHTML = "<div>"+it['value']+"</div>";
			newdiv.style.display = 'none';
			
			me._target.insertBefore(newdiv,me._olddiv);
			me._olddiv = newdiv;
	
			me._shown.push(id);
	
			if (me._shown.length > me.listLength){
				var toRemove = me._shown.shift();
				if (me.effects){
					Effect.Fade(toRemove,'{duration: 1}');
				}else{
					var remdiv = document.getElementById(toRemove);
					me._target.removeChild(remdiv);
				}
			}
			
			if (me.effects){
				Effect.SlideDown(id,'{duration:2}');
			}else{
				newdiv.style.display = 'block';
			}
		}

		me.getNewItems();
		me._timer = setTimeout( function(){ me.updateList(); }, me.updateInterval);
	}
	
	this.getNewItems = function(init){
		
		me.resultReady = 0;
		
		if (me.ajaxReq != undefined){
				me.ajaxReq.open("POST", me.ajaxTarget, true);
				me.ajaxReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				me.ajaxReq.onreadystatechange = me.insertNewItems;
				if (me._firstLoad){
					params = "iniLoad="+this.iniLoad;
				}else{
					params = null;
				}
				me.ajaxReq.send(params);
		}
	
	}
	
	this.insertNewItems = function(){
		
		if (me.ajaxReq.readyState == 4){
			var xmlRes = me.ajaxReq.responseXML;
		
			var itens = xmlRes.getElementsByTagName('item');
			var itCnt = itens.length;

			if (itCnt > 0){
				for (i=0; i<itCnt; i++){
					
					var nitem = new Array;
					nitem['id'] =  itens[i].getAttribute("id");
					nitem['value'] =  unescape(itens[i].getAttribute("value"));
					me._new.push(nitem);
				}
			}
			
			me.resultReady = 1;
		}
	}
	
	this.pause = function(){
		clearTimeout(me._timer);
	}
}


//Função que cria AJAX Request
function createRequest() {
  try {
    request = new XMLHttpRequest();
  } catch (trymicrosoft) {
    try {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (othermicrosoft) {
      try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        request = false;
      }
    }
  }

  if (!request)
    alert("Error initializing XMLHttpRequest!");
  else
  	return request;
}