  // Yahoo!

  function xGetElementById(e)
  {
     if(typeof(e)!='string') return e;
     if(document.getElementById) e=document.getElementById(e);
           else if(document.all) e=document.all[e];
	                    else e=null;
     return e;
  }

  ////////////////////////////////////////////////////////////////
  // http://java.sun.com/developer/technicalArticles/J2EE/AJAX/RealtimeValidation/
  ////////////////////////////////////////////////////////////////
  // Nicolas : problème ne prévoit que 3 arguments pour l'appel de la callback
  function AJAXInteraction(url, callback, name, arg1, arg2, arg3)
  {
    var req = init();
    req.onreadystatechange = processRequest;

    function init() {
      if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
       } else if (window.ActiveXObject) {
        return new ActiveXObject("Microsoft.XMLHTTP");
       }
    }

    function processRequest () {
      // readyState of 4 signifies request is complete
      if (req.readyState == 4) {
        // status of 200 signifies sucessful HTTP call
        if (req.status == 200) {
          // if (callback) callback(req.responseXML, name, arg1, arg2, arg3);
          if (callback) callback(req, name, arg1, arg2, arg3);
        }
      }
    }

    this.doGet = function() {
      // make a HTTP GET request to the URL asynchronously
      req.open("GET", url, true);
      req.send(null);
    }
  }

  // Nicolas
  function form_to_url( elt )
  {
    var u='';
    var Telts =elt.childNodes;
    var nb_elt=Telts.length;

    for(var i=0; i<nb_elt; i++) {
      elt=Telts[i];
      // nodeType
      // ELEMENT_NODE : 1
      // TEXT_NODE : 3
      // nodeName : INPUT  FIELDSET...
      // Ignorer les champs 'button' sauf pour celui qui est actif...

      // if (elt && elt.type && elt.type=='submit')
      // {
      //   alert( 'n=' + elt.name + ' t=' + elt.type + ' v=' + elt.value +
      //          ' dv=' + elt.defaultvalue + ' s=' + elt.size + ' ml=' + elt.maxlength +
      //          ' c=' + elt.checked + ' d=' + elt.disabled + ' r=' + elt.readOnly);
      // }

      if (elt && elt.name && elt.value) {
        var key=encodeURIComponent(elt.name);
        var val=encodeURIComponent(elt.value);
        if (key!="AJAX") u+= "&" + key + "=" + val;
      }
      u+=form_to_url(elt);
    }
    return u;
  }

  // Nicolas
  function validate_form_ex(f, name, arg1, arg2, arg3, resetDiv)
  {
    // Si on veux faire une anim d'attente
    if (resetDiv!='')
    {
      var div = xGetElementById(resetDiv);
      if (div)
      {
        div.innerHTML = '<div align="center"><br clear="all" /><br />Chargement en cours...<br /><br /><img src="http://www.r7g.com/20043/m/img/loading.gif" alt="" /></div>';
      }
    }

    var url = "/php/main_new_api.php?AJAX=1";

    // Ajout des champs du formulaire qui vient d'être validé (format GET)
    if (f!=null) { url+=form_to_url(f); }

    url += "&PT_LIVRAISON="+arg1;

    // Appel du serveur avec le formulaire
    var ajax = new AJAXInteraction(url, validateCallback, name, arg1, arg2, arg3);
    ajax.doGet();

    // En attendant la réponse, ne rien faire
    return false;
  }

  // req : requete de retour :  req.responseXML et req.responseText
  // name : id du div pour l'affichage
  // arg1,arg2,arg3 : arguments perso...
  function validateCallback (req, name, arg1, arg2, arg3) 
  {
    // Attention, le div d'attente n'est pas remis à zéro (il l'est si name==div d'attente)
    // var msg = req.responseXML
    var msg = req.responseText;

    var el = xGetElementById (name);
    if (el)
    {
      el.innerHTML = msg;
    }
  }

  // Nicolas
  function update_pac_temp_cart( f , pt_livraison )
  {
    var name='pac_temp_cart'; // Nom du div principal
    var arg1=''+pt_livraison+''; // Numéro de catégorie ou autres infos utilises pour la suite (en JS)
    var arg2='';
    var arg3='';
    var resetDiv='pac_temp_cart'; // Nom du div d'attente

    return validate_form_ex(f, name, pt_livraison, arg2, arg3, resetDiv);
  }
  
   // Ghislain
  function update_pac_big_cart( f , pt_livraison )
  {
    var name=''; // Nom du div principal
    var arg1=''+pt_livraison+''; // Numéro de catégorie ou autres infos utilises pour la suite (en JS)
    var arg2='';
    var arg3='';
    var resetDiv=''; // Nom du div d'attente

    return validate_form_ex(f, name, pt_livraison, arg2, arg3, resetDiv);
  }
  
 
  
   // Appel direct sans passer par un formulaire
  function update_point_livraison( sel, id_session, id_category )
  {
    var selIndex=sel.selectedIndex;

    // On interdit la première entrée de la liste
    if (sel.selectedIndex==0) 
    {
      alert('Merci de sélectionner un point relais dans la liste.');
      return false;
    }
    var selVal=sel.options[ sel.selectedIndex ].value;

    // ATTENTION, sous IE, la variable 'sel' change de valeur par la suite
    // et devient alors inutilisable... Effet de bord ?

    var name='PAC_point_livraison'; // Nom du div principal
    var arg1=''; // Numéro de catégorie ou autres infos utilises pour la suite (en JS)
    var arg2='';
    var arg3='';
    var resetDiv='PAC_point_livraison'; // Nom du div d'attente

    // Si on veux faire une anim d'attente
    if (resetDiv!='')
    {
      var div = xGetElementById(resetDiv);
      if (div)
      {
        div.innerHTML = '<div align="center"><br clear="all" /><br />Chargement en cours...<br /><br /><img src="http://www.r7g.com/20043/m/img/loading.gif" alt="" /></div>';
      }
    }

    var url = "/php/main_new_api.php?AJAX=1";

    // Ajout des champs du formulaire qui vient d'être validé (format GET)
    url += "&EXEC=3";
    url += "&ID_SESSION="  + encodeURIComponent(id_session);
    url += "&ID_CATEGORY=" + encodeURIComponent(id_category);
    url += "&PR_SELECT="   + encodeURIComponent(selVal);
	
    // Appel du serveur avec le formulaire
    var ajax = new AJAXInteraction(url, validateCallback, name, arg1, arg2, arg3);
    ajax.doGet();

    // En attendant la réponse, ne rien faire
    return false;
  }
