// La fonction constructeur : crée un objet Cookie pour le document
// spécifié, avec un nom et des attributs facultatifs.
// Arguments:
//   document: objet Document pour lequel le cookie est stocké. Requis.
//   name:     chaîne spécifiant un nom pour le cookie. Requis.
//   hours:    nombre facultatif spécifiant le nombre d’heures depuis
//             maintenant jusqu’à l’expiration du cookie.
//   path:     chaîne optionnelle spécifiant l’attribut path du cookie.
//   domain:   chaîne facultative spécifiant l’attribut domain du cookie.
//   secure:   valeur booléenne ; si true, requiert un cookie sécurisé.
//
function Cookie(document, name, hours, path, domain, secure)
{
    // Toutes les propriétés prédéfinies de cet objet débutent par '$'
    // pour les distinguer d’autres propriétés, qui sont les valeurs à
    // stocker dans le cookie
    this.$document = document;
    this.$name = name;
    if (hours)
        this.$expiration = new Date((new Date()).getTime(  ) + hours*3600000);
    else this.$expiration = null;
    if (path) this.$path = path; else this.$path = null;
    if (domain) this.$domain = domain; else this.$domain = null;
    if (secure) this.$secure = true; else this.$secure = false;
}

// Cette fonction est la méthode store() de l’objet Cookie
Cookie.prototype.store = function () {
    // Boucle d’abord dans les propriétés de l’objet Cookie et
    // assemble la valeur du cookie. Comme les cookies utilisent le signe
    // égal et le point-virgule comme séparateurs, nous allons utiliser
    // deux-points et le & pour les variables d’état individuelles 
    // que nous stockons dans une seule valeur de cookie. Notez que nous 
    // échappons la valeur de chaque variable d’état, au cas où elle 
    // contiendrait des signes de ponctuation ou des caractères illégaux.
    var cookieval = "";
    for(var prop in this) {
        // Ignore les propriétés dont le nom débute par '$' 
        //  et aussi les méthodes
        if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function')) 
            continue;
        if (cookieval != "") cookieval += '&';
        cookieval += prop + ':' + escape(this[prop]);
    }

    // Maintenant que nous avons la valeur du cookie, assemble la chaîne 
    // complète du cookie, comprenant le nom et les divers
    // attributs spécifiés lorsque l’objet Cookie a été créé
    var cookie = this.$name + '=' + cookieval;
    if (this.$expiration)
        cookie += '; expires=' + this.$expiration.toGMTString(  );
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    if (this.$secure) cookie += '; secure';

    // Stocke maintenant le cookie en définissant la propriété magique
    // Document.cookie
    this.$document.cookie = cookie;
}

// Cette fonction est la méthode load() de l’objet Cookie
Cookie.prototype.load = function() { 
    // Obtient une liste de tous les cookies concernés par ce document
    // Pour cela, lit la propriété Document.cookie
    var touscookies = this.$document.cookie;
    if (touscookies == "") return false;

    // Extrait maintenant de cette liste uniquement le cookie désigné
    var start = touscookies.indexOf(this.$name + '=');
    if (start == -1) return false;   // Cookie non défini pour cette page
    start += this.$name.length + 1;  // Saute le nom et le signe égal
    var end = touscookies.indexOf(';', start);
    if (end == -1) end = touscookies.length;
    var cookieval = touscookies.substring(start, end);

    // Maintenant que nous avons extrait la valeur du cookie nommé, nous
    // devons fractionner cette valeur en noms et valeurs de variables d’état 
    // individuels. Les paires nom/valeur sont séparées par des
    // esperluettes et les noms et valeurs individuels sont séparés
    // par des caractères deux-points. Nous utilisons la méthode split(  )
    // pour tout parser.
    var a = cookieval.split('&');  // a fractionne dans un tableau de
                                     // paires nom/valeur
    for(var i=0; i < a.length; i++)  // Place chaque paire dans un tableau
        a[i] = a[i].split(':');

    // Maintenant que nous avons parsé la valeur du cookie, 
    // définit tous les noms et les valeurs des variables d’état
    // dans cet objet Cookie. Notez l’utilisation de unescape(  ) sur la
    // valeur de la propriété, parce que nous avons utilisé escape(  )
    // au moment de la stocker.
    for(var i = 0; i < a.length; i++) {
        this[a[i][0]] = unescape(a[i][1]);
    }

    // C’est terminé ; on retourne le code de succès
    return true;
}

// Cette fonction est la méthode remove() de l’objet Cookie
Cookie.prototype.remove = function() {
    var cookie;
    cookie = this.$name + '=';
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';

    this.$document.cookie = cookie;
}
