// Requete HTTP en JSON
function sendRequest(url, ajaxFunction, paramsList, responseHandler)
{
  // Creation de la requete tout sauf IE6
  if (window.XMLHttpRequest)
    var request = new XMLHttpRequest();
  else
    // Creation de la requete pour IE6
    if (window.ActiveXObject)
      var request = new ActiveXObject("Microsoft.XMLHTTP");
    
  // On verifie que la requete est prette
  if (request.readyState == 4 || request.readyState == 0)
  {
    // On selectionne le service ajax
    request.open("POST", url, true);
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    // On definit la fonction de reponse
    request.onreadystatechange =  function (handler)
                                  {
                                    response(request, responseHandler);
                                  };
      
    // On declare les parametres
    var params = 'function=' + ajaxFunction;
      
    params += '&parameters=' + json_encode(paramsList);
      
    // On envoie la requete
    request.send(params);
  }
}

// Reponse de la requete
function response(request, responseHandler)
{
  // On verifie que la connection est disponible
  if (request.readyState == 4)
  {
    try
    {
      // On convertit le message json en un objet javascript
      var response = json_decode(request.responseText);
    }
    catch (e)
    {
      alert('json error:' + request.responseText);
    }
      
    // On envoie la reponse
    responseHandler(response);
  }
}

// Convertion d'un objet javascript en message JSON
function json_encode(js)
{
  json = '{'
    
  if (js)
    for (i = 0; i < js.length; i++)
    {
      if (isNumeric(js[i].value))
        json += '"' + js[i].name + '":'  + js[i].value;
      else
        json += '"' + js[i].name + '":"' + addslashes(js[i].value) + '"';
        
      if (i < js.length - 1)
        json += ',';
    }
    
  json += '}';
  
  //alert('json_encode: ' + json);
  
  return json;
}

// Convertion d'un message JSON en objet javascript
function json_decode(json)
{
  //alert('json_decode: ' + json);  

  return eval("(" + json + ")");
}

// Test de la nature d'une variable
function isNumeric(value)
{
  if (value == null || !value.toString().match(/^[-]?\d*\.?\d*$/))
    return false;
    
  return true;
}

// Traitement des caracteres d'echappement
function addslashes(string)
{
  string = string.replace(/\\/g, '\\\\');
  string = string.replace(/"/g, '\\"');
    
  return string;
}

