function ajax_queue()
{
	this.queue = new Array();
	this.reading = false;
}
/**
 Indica si el ajax esta "trabajando"
 */
ajax_queue.prototype.isReading = function()
{
	return this.reading;
}
/**
 Setea el status. Si esta ejecutandose algun ajax, el valor que se le pasa deberia ser true. Si esta idle, deberia ser false;
 */
ajax_queue.prototype.setReadingStatus = function(newStatus)
{
	this.reading =newStatus;
}
/**
 agrega un request a la cola
 */
ajax_queue.prototype.addRequest = function(url, externalJS, method, parameters)
{
	var newRequest = new Array();
	newRequest['url'] = url;
	newRequest['external'] = externalJS;
	newRequest['method'] = method;
	newRequest['parameters'] = parameters;
	this.queue.push(newRequest);
}
/**
 Obtiene el primer elemento de la cola 
 */
ajax_queue.prototype.getFirst = function()
{
	return  this.queue.shift();
}
/**
 g
 */
ajax_queue.prototype.loadNextURL= function()
{
	var request = this.getFirst();
	
	if(request['method'] == 'get')
	{
		LoadURL_notfake(request['url'], request['external']);
	}else{
		LoadURLbyPost_notfake(request['url'], request['parameters'], request['external']);
	}
}
/**
 Devuelve la cantidad de elementos de la cola
 */
ajax_queue.prototype.length = function()
{
	return this.queue.length;
}
/**
 
 */
ajax_queue.prototype.request = function(url, externalJS, method, parameters)
{
	this.addRequest(url, externalJS, method, parameters);
	//alert(url + '  -- LEYENDO' + this.isReading() + ' -- ' + 'EN COLA' + this.length());
	if(!this.isReading() && this.length() <= 1){
		//alert('mando el siguiente');
		this.loadNextURL();
	}
}

var queue = new ajax_queue();

//var ajax_reading = false; // SEMAFORO!
function LoadURL(script, external) {
	//alert('mand');
	queue.request(script, external, 'get');
}

function LoadURLbyPost(script, parameters, external)
{
	queue.request(script, external, 'post', parameters)
}
/* -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
var ajax_req;  // OBJETO XML (ajax)
var ajax_result='';
var ajax_external='';

function loadXMLDoc(url) {
	// branch for native XMLHttpRequest object
	//alert('pidiendo: ' + url);
	if (window.XMLHttpRequest) {
		ajax_req = new XMLHttpRequest();
		ajax_req.onreadystatechange = processReqChange;
		ajax_req.open("GET", url, true);
		ajax_req.setRequestHeader("Referer", window.location);
		ajax_req.send(null);
	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		ajax_req = new ActiveXObject("Microsoft.XMLHTTP");
		if (ajax_req) {
			ajax_req.onreadystatechange = processReqChange;
			ajax_req.open("GET", url, true);
			ajax_req.send();
		}
	}
}

// FUNCION Q SE LLAMA EN CADA PETICION AL AJAX
function processReqChange() {
	// only if ajax_req shows "complete"
	if (ajax_req.readyState == 4) {
		// si "OK"
		try
		{
			if (ajax_req.status == 200) {
				// si anda todo bien, proceso...
				if (queue.isReading()) {
					//cargo el resultado de la url
					ajax_result=ajax_req.responseText;
				} else {
					ajax_result='ERROR:busy';
				}
			} else {
				ajax_result='ERROR:'+ajax_req.statusText;
			}
		}
		catch (E){
			queue.setReadingStatus(false);
		  	return false;
		}
		
		
		ajax_external = ajax_external; 
		
		//if (ajax_external!=''){
			eval(ajax_external);
		//}
		queue.setReadingStatus(false);
		if(queue.length() > 0){ 
			queue.loadNextURL(); 
		}
		
	}
	return false;
}

function LoadURL_notfake(url, external)
{
	queue.setReadingStatus(true);
	ajax_result='';
	
	var d = new Date()
	var uID = '' + d.getDate()+d.getMonth() +1+d.getFullYear()+d.getHours()+d.getMinutes()+d.getSeconds()+Math.random();
	if (url.indexOf('?')>0)
		url  = url+'&ajaxID='+uID;
	else
		url  = url+'?ajaxID='+uID;

	ajax_external=external;
	loadXMLDoc(url);
	
	return ajax_result;
}

function LoadURLbyPost_notfake(url, parameters, external)
{
	queue.setReadingStatus(true);
	ajax_result='';
	
	var d = new Date()
	var uID = '' + d.getDate()+d.getMonth() +1+d.getFullYear()+d.getHours()+d.getMinutes()+d.getSeconds()+Math.random();
	
	parameters = parameters+'&ajaxID='+uID;
	
	ajax_external=external;
	
	if (window.XMLHttpRequest) 
	{ // Mozilla, Safari,...
	ajax_req = new XMLHttpRequest();
	if (ajax_req.overrideMimeType) {
		// set type accordingly to anticipated content type
		//http_request.overrideMimeType('text/xml');
		ajax_req.overrideMimeType('text/html');
	}
	}else if (window.ActiveXObject) 
	{ // IE
		try{
			ajax_req = new ActiveXObject("Msxml2.XMLHTTP");
		}catch (e) {
			try {
				ajax_req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!ajax_req) {
		 alert('Cannot create XMLHTTP instance');
		 return false;
	}
	
	ajax_req.onreadystatechange = processReqChange;
	ajax_req.open('POST', url, true);
	ajax_req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	ajax_req.setRequestHeader("Content-length", parameters.length);
	ajax_req.setRequestHeader("Connection", "close");
	ajax_req.send(parameters);
}
