httpCall = function(getPost, urlA, paramsA, callback){
 var xmlhttp                                             ;
 var method  = getPost ? 'POST'  : 'GET'                 ;
 var urlP    = getPost ? urlA    : (urlA + '?' + paramsA);
 var paramsP = getPost ? paramsA : ''                    ;
 var locked  = false                                     ;
 try{xmlhttp = new ActiveXObject ("Msxml2.XMLHTTP"   );}catch(e){}
 try{xmlhttp = new ActiveXObject ("Microsoft.XMLHTTP");}catch(e){}
 try{xmlhttp = new XMLHttpRequest(                   );}catch(e){}
 try{
  xmlhttp.open(method, urlP, true);
  if(getPost){
   xmlhttp.setRequestHeader("Method", "POST " + urlA + " HTTP/1.1"                            );
   xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  }
  xmlhttp.onreadystatechange = function(){
   if((xmlhttp.readyState == 4) && !locked){
    locked = true;
    callback(xmlhttp.responseText);
   }
  };
   xmlhttp.send(paramsP);
 }catch(e){  
  callback();
 } 
}  

HttpMultiCall = function(){
 this.getsPosts = new Array();
 this.urls      = new Array();
 this.paramss   = new Array();
 this.todo      = 0          ;
}

HttpMultiCall.prototype.push = function(getPost, url, params){
 this.getsPosts.push(getPost);
 this.urls     .push(url    );
 this.paramss  .push(params );
 this.todo++                 ; 
 return this                 ;
} 
 
HttpMultiCall.prototype.call = function(callback){
 var todo                = this.todo      ;
 var done                = -1             ;
 var texte               = new Array(todo);
 var conditionalCallback = function(){if(++done == todo) callback(texte);}
 for(var lauf = 0; lauf < todo; ++lauf){
  eval('var transitionalCallback = function(arg){texte[' + lauf + '] = arg; conditionalCallback();}');
  httpCall(this.getsPosts[lauf], this.urls[lauf], this.paramss[lauf], transitionalCallback);
 }
 conditionalCallback();
} 
 
