// Classe ajax_queue
// --------------------------------------------------------------------------------------
function ajax_queue(method){
	if(method=='POST'){
		this.method=method;
	}else{
		this.method='GET';
	}
	this.state = 0;							// En marche ou non
		
	this.urls = new Array();
	this.params = new Array();
	this.functions = new Array();
	this.objects = new Array();
	this.values = new Array();
	this.methods = new Array();
	
	// ------------------------------------------------------------------------------------
	
	// Fonction add
	// -------------
	// Est appelé pour ajouter un url et une fonction dans la queue
	this.add = function(url, params, function_name, object, values, methods){
//		console.log('Ajout dans la queue de la fonction : ' + function_name);
//		console.log('Ajout dans la queue de url : ' + url);
		this.urls[ this.urls.length ] = url; 												//URL of the page to call
		this.params[ this.params.length ] = params; 								//POST values in a string formatted like GET but no "?" at the beginning ex: 'id=3&sway=bouteba'
		this.functions[ this.functions.length ] = function_name;		//Callback function name in a string, NOT a pointer to a function
		this.objects[ this.objects.length ] = object;								//Object containing the callback function (optional)
		this.values[ this.values.length ] = values;									//Additional parameters to pass to the callback function once called
		this.methods[ this.methods.length ] = methods;									//Additional parameters to pass to the method
		
		// Si on est pas deja en mode execution, alors on execute
		if( this.state == 0 ){
			this.execute();
		}
	}
	
	// Fonction done
	// -------------
	// Est appelé lorsqu'une fonction est exécuté
	this.done = function(){
		this.state = 0;								// On le remet libre		
		this.urls.splice(0,1);
		this.params.splice(0,1);
		this.functions.splice(0,1);
		this.objects.splice(0,1);
		this.values.splice(0,1);
		this.methods.splice(0,1);

		// S'il reste des taches en queue, on les fait
		if( this.urls.length > 0 ){			
			this.execute();
		}
	}
	
	// Fonction execute
	// -------------
	// Est appelé pour executer une fonction s'il y en a une, et si on est pas deja en train de l'executer
	this.execute = function(){
		if( this.state == 0 && this.urls.length > 0 ){	// Si aucun est en marche, et qu'il y en a dans la pile...
			this.xmlhttp = get_xmlhttp();
			this.xmlhttp.onreadystatechange = function(){
				if( queue.xmlhttp.readyState==4 || queue.xmlhttp.readyState=='complete' ){
									
					if(queue.objects[0]!=null){
						queue.objects[0][queue.functions[0]](escape(queue.xmlhttp.responseText),queue.values[0]);
						//eval(queue.objects[0].id + "." + queue.functions[0] + "('" + escape(queue.xmlhttp.responseText) + "', " + queue.values[0] + ")");
					}else if(queue.functions[0] != null){  
            if(queue.values[0] != null && queue.values[0] != ''){            
              eval(queue.functions[0] + '(\'' + escape(queue.xmlhttp.responseText) + '\', ' + queue.values[0] + ')');   
            }else{
              eval(queue.functions[0] + '(\'' + escape(queue.xmlhttp.responseText) + '\')');
            }					
					}
					queue.done();														// On a fini l'execution
				}
			}     
      
      
			var ajax_method = this.method;
			
			
			
			if( this.methods[0] != null ){
				ajax_method = this.methods[0];
			}			
			
			this.state = 1;
			
			if(ajax_method == 'POST'){
				this.xmlhttp.open(ajax_method, this.urls[0], true);
				this.xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
				this.xmlhttp.setRequestHeader('Content-length', this.params[0].length);
				this.xmlhttp.setRequestHeader('Connection', 'close');
				this.xmlhttp.send(this.params[0]);
			}else{
				this.xmlhttp.open(ajax_method, this.urls[0]+'?'+this.params[0], true);
				this.xmlhttp.send(null);
			}
				
		}
	}	
};

// --------------------------------------------------------------------------------------

queue = new ajax_queue('GET');
