/*
Descrição: Retornar objeto XMLHttpRequest
Criado em: 22/03/2009
Autor: Hédi Carlos Minin - hedicarlos@gmail.com
*/

function XMLHTTP(){
	var request = null;
	try{
		request = new XMLHttpRequest()
	}catch(e){
		try{
			request = new ActiveXObject("Msxml2.XMLHTTP"); 
		}catch(e){
			try{
				request = new ActiveXObject("Microsoft.XMLHTTP");
			}catch(e){
				request = null;
				alert('Não foi possível criar o objeto XMLHttpRequest, algnus recursos podem estar indidponíveis.');
			} 
		}
	}
	return request;
}


//fila requisições
var queueRequests = Array();
var currentQueueRequest = false;
var queueResponseLimit = false;

ajaxQueue = new XMLHTTP();

function AjaxQueue(){
	
	this.id = 0;
	this.url = false;
	this.onComplete = 'DefaultQueueResponse';
	this.sendVars = 'default=0';
	this.displayLoad = true;
	this.loadMessage = 'Carregando...';
	this.responseLimit = 15000; //15 segundos
	this.onAbort = 'DefaultQueueAbort';
	
	this.Add = function(){
		queueRequests.push([this.id, this.url, this.onComplete, this.sendVars, this.responseLimit, this.onAbort]);
		
		if(this.displayLoad == true){
			document.getElementById(this.id).innerHTML = '<div class="ajaxload">' +this.loadMessage+ '</div>';
		}
	
		if(currentQueueRequest == false){
			ExecuteAjaxQueue();	
		}
	}
}

function ExecuteAjaxQueue(){
	
	currentQueueRequest = queueRequests.shift(); 

	ajaxQueue.open('POST',currentQueueRequest[1],true);
	ajaxQueue.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	ajaxQueue.onreadystatechange = function(){
		if(ajaxQueue.readyState == 4){
			//if(ajaxSend.status == 200){
					var response = ajaxQueue.responseText;

					if(currentQueueRequest[2] != false){
						eval(currentQueueRequest[2]+ '(\'' +currentQueueRequest[0]+ '\',\'' +response+ '\')');
					}
					
					clearTimeout(queueResponseLimit);
					
					if(queueRequests.length > 0){
						setTimeout("ExecuteAjaxQueue()",500);
					}else{
						currentQueueRequest = false;	
					}
			//}else{
			//	setTimeout("ajaxGetContent()",500);	
			//}
		}
	}
	ajaxQueue.send(currentQueueRequest[3]);
	queueResponseLimit = setTimeout('AbortQueue()',currentQueueRequest[4]);
	
}

function AbortQueue(){
	if(ajaxQueue.readyState != 0){
		ajaxQueue.onreadystatechange = function(){
			if(ajaxQueue.readyState == 4){
				if(currentQueueRequest[5] != false){
					eval(currentQueueRequest[5]+ '(\'' +currentQueueRequest[0]+ '\')');
				}
			}
		}
		ajaxQueue.abort();
		
		if(queueRequests.length > 0){
			ExecuteAjaxQueue();
		}
	}
}

function DefaultQueueResponse(id,response){
	if(document.getElementById(id)){
		document.getElementById(id).innerHTML = response;	
	}
}

function DefaultQueueAbort(id){
	if(document.getElementById(id)){
		document.getElementById(id).innerHTML = '<div class="ajaxabort">O servidor demorou muito para responder, tente novamente.</div>';	
	}
}
