// 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 appele 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 appele lorsqu'une fonction est execute
  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 appele 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_string(queue.xmlhttp.responseText),queue.values[0]);
            //eval(queue.objects[0].id + "." + queue.functions[0] + "('" + escape_string(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_string(queue.xmlhttp.responseText) + '\', ' + queue.values[0] + ')');   
            }else{
              //alert(queue.xmlhttp.responseText + ' === ' + queue.functions[0] + '(\'' + escape_string(queue.xmlhttp.responseText) + '\')' );
              //eval(queue.functions[0] + '(\'' + escape_string(queue.xmlhttp.responseText) + '\')');
             window[queue.functions[0]](escape_string(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'){
        //alert(this.urls[0]);
        //alert(this.params[0]);
        this.xmlhttp.open(ajax_method, this.urls[0], true);
        this.xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; Charset=utf-8');
        //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');

