// Funkce konstruktor: vytváří objekt cookie pro specifikovaný 
// dokument, se specifikovaným názvem a volitelnými atributy.
// Argumenty:
//     document: objekt Document, pro který je cookie uchována. Povinný.
//     name: řetězec, který specifikuje název pro cookie. Povinný.   
//     hours: volitelné číslo, které specifikuje počet hodin od nynějška, kdy
//              by platnost cookie měla vypršet.
//     path: volitelný řetězec, který specifikuje atribut cesty cookie.
//     domain: volitelný řetězec, který specifikuje atribut domény cookie.
//     secure: volitelná logická hodnota, která, pokud je true, vyžaduje zabezpečení cookie.
//
function cookie(document, name, hours, path, domain, secure)
{
       // Všechny předdefinované vlastnosti tohoto objektu začínají znakem $,
       // aby se odlišily od ostatních vlastností, jež jsou hodnotami,
       // které mají být uloženy v 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;
}
// Tato funkce je metoda store() objektu cookie.
function _cookie_store()
{
       // Zaprvé,cyklujte přes vlastnosti objektu cookie
       // a dejte dohromady hodnotu cookie. Protože cookies
       // používají znaménka rovná se a středníky jako separátory, my
       // pro jednotlivé stavové proměnné, které ukládáme v rámci
       // jedné hodnoty cookie, použijeme dvojtečky a znaky &.
       // Všimněte si, že na hodnotu každé stavové
       // proměnné, v případě, že obsahuje interpunkci nebo
       // jiné nepovolené znaky, použijeme funkci escape.
       var cookieval = "";
       for(var prop in this) {
                 // Ignorujte vlastnosti s názvy, které začínají znakem $, a také metody.
                 if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function'))
                           continue;
                 if (cookieval != "") cookieval += '&';
                 cookieval += prop + ':' + escape(this[prop]);
       }
       // Nyní, když máme hodnotu cookie, dejme dohromady
       // kompletní řetězec cookie, který zahrnuje název a různé
       // atributy, které byly specifikovány, když byl vytvořen objekt cookie.
       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';
       //Nyní cookie uložíme nastavením magické vlastnosti Document.cookie.   
       this.$document.cookie = cookie;
}
// Tato funkce je metoda load() objektu cookie.
function _cookie_load()
{
       // Zaprvé obstaráme seznam všech cookies, kreré náleží k tomuto dokumentu.
       // Uděláme to tak, že přečteme magickou vlastnost Document.cookie.
       var allcookies = this.$document.cookie;
       if (allcookies == "") return false;
       // Nyní z tohoto seznamu extrahujeme pouze pojmenovanou cookie.
       var start = allcookies.indexOf(this.$name + '=');
       if (start == -1) return false;          // cookie pro tuto stránku není definivána
       start += this.$name.length + 1;         // přeskočíme název a znaménko rovná se
       var end = allcookies.indexOf(';', start);
       if (end == -1) end = allcookies.length;
       var cookieval = allcookies.substring(start, end);
       // Nyní, když jsme extrahovali hodnotu pojmenované cookie, musíme
       // tuto hodnotu rozdělit na názvy a hodnoty individuálních stavových
       // proměnných. Páry name/value (název/hodnota) jsou jeden od druhého
       // odděleny značkami & a individuální názvy a hodnoty jsou vzájemně odděleny
       // dvojtečkami. K separaci používáme metodu split.
       var a = cookieval.split('&');           // rozdělení na pole páru název/hodnota
       for(var i=0; i < a.length; i++)         // rozdělení každého páru na pole
                 a[i] = a [i].split(':'); 

       // Nyní jsme separovali hodnotu cookie, nastavili všechny názvy a hodnoty
       // stavových proměnných v tomto objektu cookie. Všimněte si, že jsme provedli 
       // unescape() hodnoty vlastnosti, protože jsme volali ecsape() když jsme ji ukládali.,
       for(var i = 0; i < a.length; i++) {
                 this[a[i][0]] = unescape(a[i][1]);
       }
       // Jsme hotovi, takže vrátíme úspěšný kód.
       return true;
}
// Tato funkce je metoda remove() objektu cookie.
function _cookie_remove()
{
       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;
}
// Vytvoří formální objekt cookie, abychom mohli použít prototypový objekt k začlenění 
// výše uvedených funkcí do metod.
new cookie();
cookie.prototype.store = _cookie_store;
cookie.prototype.load = _cookie_load;
cookie.prototype.remove = _cookie_remove;
//=========================================================================================
// Výše uvedený kód je definicí třídy cookie.
