/*
Usage de ces fonctions

SetCookie(name,value,expires,path,domain,secure)
    Fonction de mise en place ou de modification d'un cookie.
    Les paramètres name (nom du cookie) et value (valeur du cookie) sont obligatoires, les autres étant facultatifs. Rappelons que la paire name/value ne peut pas excéder 4'000 octets.
    Tous les paramètres doivent être passés dans l'ordre spécifié. Si un paramètre est omis, il faut passer l'argument null à sa place
    Si le paramètre expires est omis, le cookie est temporaire (expirera lorsque l'on quittera le navigateur)
    On spécifie généralement la date d'expiration à partir de la date courante en lui ajoutant la durée de vie désirée du cookie (définie en millisecondes) par les instructions JavaScript suivantes :

        duree_cookie = 100;         // durée de vie du cookie en jours
        expiration = new Date();    // date et heure courante en format texte
        expiration.setTime(expiration.getTime() + (duree_cookie * 24*60*60*1000));
                                    // => on peut utiliser la variable "expiration"

    Si le paramètre path est omis, le path enregistré avec le cookie sera celui du répertoire de la page ayant mis en place le cookie, et donc toutes les pages se trouvant dans ce répertoire ainsi que dans les répertoires subordonnés auront ultérieurement accès à ce cookie. Pour limiter l'accès au cookie à votre "page" uniquement, il faudrait donc spécifier un path complet incluant le nom de la "page" (on l'obtient, en JavaScript, avec path = location.pathname) ! A l'opposé, si toutes les "pages" d'un site doivent pouvoir accéder au cookie, il faudrait l'enregistrer avec le path /
    Si le paramètre domain est omis, le domain enregistré avec le cookie sera le nom complet serveur.domaine.tld du serveur (équivalent, en JavaScript. à location.hostname) ayant mis en place le cookie ; si la page est locale, c-à-d. avec URL file://..., le domain enregistré sera vide. Lorsque l'on spécifie un domain, il est possible d'omettre le nom de serveur, c'est-à-dire spécifier uniquement .domaine.tld, ce qui permettra à tous les serveurs du domaine en question d'accéder au cookie (pour autant que l'on aie par ailleurs spécifié le path /).
    Quant au paramètre secure, il permet de spécifier avec la valeur true que le cookie ne sera ensuite accessible que via une transaction sécurisée SSL (protocole HTTPS). Si l'on omet ce paramètre lors de l'enregistrement d'un cookie, il sera enregistré en mode false et donc accessible via des sessions HTTP standards (non sécurisées)
GetCookie(name)
    Fonction de récupération de la valeur du cookie dont on spécifie le nom.
    La valeur retournée sera "null" si aucun cookie du nom spécifié n'a pû être récupéré, soit parce que le cookie n'existe pas, ou parce que les permissions sont insuffisantes (requête provenant d'un autre domain où n'ayant pas le path correct).
DeleteCookie(name,path,domain)
    Fonction d'effacement d'un cookie. Il sera supprimé du fichier de cookies à la sortie du navigateur. (Si l'on examine le code de cette fonction, on voit que le cookie est en fait supprimé en le ré-enregistrant avec une date d'expiration appartenant au passé).
    Si le cookie a été créé sans spécifier de path et de domain, ces paramètres peuvent être omis ; sinon ils doivent être spécifiés et correspondre à ceux qui avaient été définis lors de la création du cookie. Pour que l'opération réussisse, il faut que la requête provienne du bon domain et ayant le path correct. 

Autres remarques

    * Si vous testez le mécanisme des cookies avec un navigateur Internet Explorer antérieur à la version 4, sachez qu'il n'est pas capable de créer de cookies et d'y accéder à partir de fichiers HTML locaux (non servis par un serveur Web).
    * Si vous développez des pages Web utilisant le mécanisme des cookies, ne stockez pas d'informations confidentielles (mot de passe, No de carte de crédit...) sous forme de cookies survivant à la session, car quiconque ayant physiquement accès à la machine pourrait donc afficher le contenu du fichier de cookies et y trouver ces informations. Les informations sensibles stockées sous forme de cookies devraient être encryptées, coté serveur, avant leur mise en place sur le navigateur.
    * Dans le cas d'une application de E-commerce, tout le traitement du "panier électronique" peut en général être traité par des cookies temporaires. 

L'exemple "le plus simple possible"
Nous donnons, ci-dessous, le code JavaScript à placer dans le <BODY> d'une page HTML (qui doit par ailleurs contenir, dans sa partie <HEAD>, les fonctions JavaScript de cookies présentées ci-dessus). Celui-ci demande, dans une fenêtre "prompt" JavaScript, le nom de l'utilisateur qu'il enregistre ensuite dans un cookie.

  <SCRIPT LANGUAGE="JavaScript">
    <!--
    nom_var = GetCookie("nom");
    if (nom_var == null) {
      nom_var = prompt("Quel est votre nom ?","");
      duree = 10;  // Durée de vie du cookie en jours
      date_expire = new Date();
      date_expire.setTime(date_expire.getTime() + (duree*24*60*60*1000));
      SetCookie("nom",nom_var,date_expire);
    }
    document.writeln("<H2 ALIGN=center>Hello " + nom_var + "</H2>");
    // -->
  </SCRIPT>
*/

//  "Internal" function to return the decoded value of a cookie
function getCookieVal (offset) {
  var endstr = document.cookie.indexOf (";", offset);
  if (endstr == -1)
    endstr = document.cookie.length;
  return unescape(document.cookie.substring(offset, endstr));
}


//  Function to return the value of the cookie specified by "name".
//    name -    String object containing the cookie name.
//    returns - String object containing the cookie value,
//              or null if the cookie does not exist.
//
function getCookie (name) {
  var arg = name + "=";
  var alen = arg.length;
  var clen = document.cookie.length;
  var i = 0;
  while (i < clen) {
    var j = i + alen;
    if (document.cookie.substring(i, j) == arg)
      return getCookieVal (j);
	i = document.cookie.indexOf(" ", i) + 1;
    if (i == 0) break; 
  }
  return null;
}


//  Function to create or update a cookie.
//    name - String object containing the cookie name.
//    value - String object containing the cookie value.  May contain
//         any valid string characters.
//    [expires] - Date object containing the expiration data of the cookie.  If
//         omitted or null, expires the cookie at the end of the current session.
//    [path] - String object indicating the path for which the cookie is valid.
//         If omitted or null, uses the path of the calling document.
//    [domain] - String object indicating the domain for which the cookie is
//         valid. If omitted or null, uses the domain of the calling document.
//    [secure] - Boolean (true/false) value indicating whether cookie
//         transmission requires a secure channel (HTTPS).  
//
//  The first two parameters are required.  The others, if supplied, must
//  be passed in the order listed above.  To omit an unused optional field,
//  use null as a place holder.  For example, to call SetCookie using name,
//  value and path, you would code:
//
//      SetCookie ("myCookieName", "myCookieValue", null, "/");
//
//  Note that trailing omitted parameters do not require a placeholder.
//
//  To set a secure cookie for path "/myPath", that expires after the
//  current session, you might code:
//
//      SetCookie (myCookieVar, cookieValueVar, null, "/myPath", null, true);
//
function setCookie (name,value,expires,path,domain,secure) {
  document.cookie = name + "=" + escape (value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}


//  Function to delete a cookie. (Sets expiration date to start of epoch)
//    name -   String object containing the cookie name
//    path -   String object containing the path of the cookie to delete.
//             This MUST be the same as the path used to create the cookie, or
//             null/omitted if no path was specified when creating the cookie.
//    domain - String object containing the domain of the cookie to delete.
//             This MUST be the same as the domain used to create the cookie, or
//             null/omitted if no domain was specified when creating the cookie.
//
function deleteCookie (name,path,domain) {
  if (getCookie(name)) {
    document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}
